Commit 2f11e146 authored by Muhammad Suryono's avatar Muhammad Suryono

update form

parent fc1d5171
...@@ -45,6 +45,7 @@ dependencies { ...@@ -45,6 +45,7 @@ dependencies {
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'com.github.bumptech.glide:glide:4.3.1' implementation 'com.github.bumptech.glide:glide:4.3.1'
implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1'
implementation project(':library') implementation project(':library')
def room_version = "2.2.5" def room_version = "2.2.5"
......
...@@ -15,6 +15,7 @@ import android.os.Environment; ...@@ -15,6 +15,7 @@ import android.os.Environment;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.provider.Settings; import android.provider.Settings;
import android.util.Base64;
import android.util.Log; import android.util.Log;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
...@@ -34,6 +35,8 @@ import androidx.lifecycle.ViewModelProviders; ...@@ -34,6 +35,8 @@ import androidx.lifecycle.ViewModelProviders;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.jaredrummler.materialspinner.MaterialSpinner; import com.jaredrummler.materialspinner.MaterialSpinner;
import com.yono.messeripos.api.client.Client;
import com.yono.messeripos.api.service.ProductService;
import com.yono.messeripos.databinding.FormProductBinding; import com.yono.messeripos.databinding.FormProductBinding;
import com.yono.messeripos.models.CategoryModels; import com.yono.messeripos.models.CategoryModels;
import com.yono.messeripos.models.MainViewModels; import com.yono.messeripos.models.MainViewModels;
...@@ -41,14 +44,22 @@ import com.yono.messeripos.models.ProductModels; ...@@ -41,14 +44,22 @@ import com.yono.messeripos.models.ProductModels;
import com.yono.messeripos.response.DataResponse; import com.yono.messeripos.response.DataResponse;
import com.yono.messeripos.utils.Utils; import com.yono.messeripos.utils.Utils;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.http.Multipart;
public class FormProductActivity extends AppCompatActivity { public class FormProductActivity extends AppCompatActivity {
...@@ -62,6 +73,7 @@ public class FormProductActivity extends AppCompatActivity { ...@@ -62,6 +73,7 @@ public class FormProductActivity extends AppCompatActivity {
private static final int REQUEST_PERMISSIONS = 448; private static final int REQUEST_PERMISSIONS = 448;
private boolean isUpdate = false; private boolean isUpdate = false;
String kondisi_spin; String kondisi_spin;
String locationPath = null;
private static final String[] ANDROID_VERSIONS = { private static final String[] ANDROID_VERSIONS = {
"Cupcake", "Cupcake",
...@@ -83,6 +95,7 @@ public class FormProductActivity extends AppCompatActivity { ...@@ -83,6 +95,7 @@ public class FormProductActivity extends AppCompatActivity {
Manifest.permission.WRITE_EXTERNAL_STORAGE}; Manifest.permission.WRITE_EXTERNAL_STORAGE};
private Utils utils = new Utils(); private Utils utils = new Utils();
ProgressDialog progressDialog; ProgressDialog progressDialog;
Client client = new Client();
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
...@@ -117,9 +130,6 @@ public class FormProductActivity extends AppCompatActivity { ...@@ -117,9 +130,6 @@ public class FormProductActivity extends AppCompatActivity {
categoryModels.add("SELECT CATEGORY"); categoryModels.add("SELECT CATEGORY");
setSpinner(); setSpinner();
} }
private void setSpinner() { private void setSpinner() {
...@@ -144,12 +154,15 @@ public class FormProductActivity extends AppCompatActivity { ...@@ -144,12 +154,15 @@ public class FormProductActivity extends AppCompatActivity {
productModels.setStockProduct(Integer.parseInt(binding.etStock.getText().toString())); productModels.setStockProduct(Integer.parseInt(binding.etStock.getText().toString()));
productModels.setCategoryProduct(binding.listCategory.getSelectedIndex()); productModels.setCategoryProduct(binding.listCategory.getSelectedIndex());
Log.i("save_path", "saveProduct: "+locationPath);
if (productModels.getImageProduct() != null){ if (locationPath != null){
file = new File(productModels.getImageProduct()); File fileImage = new File(locationPath);
if (file.exists()){ Log.i("save", "saveProduct: "+locationPath);
if (fileImage.exists()){
progressDialog.show();
// Toast.makeText(this, productModels.getImageProduct()+" "+productModels.getProductName(), Toast.LENGTH_LONG).show(); // Toast.makeText(this, productModels.getImageProduct()+" "+productModels.getProductName(), Toast.LENGTH_LONG).show();
// RequestBody file = RequestBody.create(MediaType) utils.toastMessage(FormProductActivity.this, utils.convertGson(productModels));
} }
} }
} }
...@@ -198,10 +211,16 @@ public class FormProductActivity extends AppCompatActivity { ...@@ -198,10 +211,16 @@ public class FormProductActivity extends AppCompatActivity {
if (requestCode == 100 && resultCode == RESULT_OK && data != null) { if (requestCode == 100 && resultCode == RESULT_OK && data != null) {
Uri selectedImage = data.getData(); Uri selectedImage = data.getData();
Log.d("Get filepath photo", "" + getRealPathFromURI(selectedImage));
binding.setPhoto(getRealPathFromURI(selectedImage)); binding.setPhoto(getRealPathFromURI(selectedImage));
productModels.setImageProduct(getRealPathFromURI(selectedImage));
locationPath = getRealPathFromURI(selectedImage);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] imageBytes = baos.toByteArray();
imageBytes = Base64.decode(utils.convertImageBase64File(getRealPathFromURI(selectedImage)), Base64.DEFAULT);
Bitmap decodeImages = BitmapFactory.decodeByteArray(imageBytes,0,imageBytes.length);
binding.ivProduct.setImageBitmap(decodeImages);
productModels.setImageProduct(utils.convertImageBase64File(getRealPathFromURI(selectedImage)));
} }
} }
......
...@@ -32,6 +32,8 @@ import com.google.android.material.appbar.MaterialToolbar; ...@@ -32,6 +32,8 @@ import com.google.android.material.appbar.MaterialToolbar;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.yono.messeripos.adapter.CategoryAdapter; import com.yono.messeripos.adapter.CategoryAdapter;
import com.yono.messeripos.adapter.ProductAdapter; import com.yono.messeripos.adapter.ProductAdapter;
import com.yono.messeripos.api.client.Client;
import com.yono.messeripos.api.service.ProductService;
import com.yono.messeripos.databinding.ActivityMainBinding; import com.yono.messeripos.databinding.ActivityMainBinding;
import com.yono.messeripos.models.CategoryModels; import com.yono.messeripos.models.CategoryModels;
import com.yono.messeripos.models.MainViewModels; import com.yono.messeripos.models.MainViewModels;
...@@ -44,6 +46,10 @@ import com.yono.messeripos.utils.Utils; ...@@ -44,6 +46,10 @@ import com.yono.messeripos.utils.Utils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
MaterialToolbar toolbar; MaterialToolbar toolbar;
MainViewModels mainViewModels; MainViewModels mainViewModels;
...@@ -60,6 +66,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -60,6 +66,7 @@ public class MainActivity extends AppCompatActivity {
public static Boolean selectCategory = false; public static Boolean selectCategory = false;
public static String orderId; public static String orderId;
private static final String ORDER_ID = "orderId"; private static final String ORDER_ID = "orderId";
Client client = new Client();
@SuppressLint("LongLogTag") @SuppressLint("LongLogTag")
@Override @Override
...@@ -128,15 +135,16 @@ public class MainActivity extends AppCompatActivity { ...@@ -128,15 +135,16 @@ public class MainActivity extends AppCompatActivity {
} }
}else if (id == R.id.update){ }else if (id == R.id.update){
status_update = true; status_update = true;
binding.topAppBar.setVisibility(View.GONE); // binding.topAppBar.setVisibility(View.GONE);
binding.rvCategory.setVisibility(View.GONE); binding.rvCategory.setVisibility(View.GONE);
// binding.appBarUpdate.setVisibility(View.VISIBLE); // binding.appBarUpdate.setVisibility(View.VISIBLE);
// MaterialToolbar toolbars = findViewById(R.id.appBarUpdate); MaterialToolbar toolbars = findViewById(R.id.topAppBar);
// setSupportActionBar(toolbars); setSupportActionBar(toolbars);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setTitle("Update Product"); getSupportActionBar().setTitle("Update Product");
// toolbars.setNavigationOnClickListener(view -> updateFinish()); toolbars.setNavigationOnClickListener(view -> updateFinish());
productAdapter.notifyDataSetChanged(); productAdapter.notifyDataSetChanged();
}else if (id == R.id.create) { }else if (id == R.id.create) {
...@@ -240,7 +248,18 @@ public class MainActivity extends AppCompatActivity { ...@@ -240,7 +248,18 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void onDelete(ProductModels product) { public void onDelete(ProductModels product) {
ProductService productService = client.Client(ProductService.class);
productService.deleteProducts(product.getIdProduct()).enqueue(new Callback<DataResponse<ProductModels>>() {
@Override
public void onResponse(Call<DataResponse<ProductModels>> call, Response<DataResponse<ProductModels>> response) {
}
@Override
public void onFailure(Call<DataResponse<ProductModels>> call, Throwable t) {
}
});
} }
@Override @Override
......
...@@ -148,6 +148,8 @@ public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.MyViewHo ...@@ -148,6 +148,8 @@ public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.MyViewHo
MainActivity.cartIsEmpty = true; MainActivity.cartIsEmpty = true;
} }
}); });
binding.btnDelete.setOnClickListener(view -> listener.onDelete(products));
} }
} }
} }
package com.yono.messeripos.api; package com.yono.messeripos.api;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yono.messeripos.BuildConfig;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit; import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.converter.gson.GsonConverterFactory;
...@@ -9,9 +20,37 @@ public class ApiHelper { ...@@ -9,9 +20,37 @@ public class ApiHelper {
public static final String BASE_URL_IMAGE = "https://storage.googleapis.com/rest-api-meser.appspot.com/images/"; public static final String BASE_URL_IMAGE = "https://storage.googleapis.com/rest-api-meser.appspot.com/images/";
public static Retrofit request(String baseUrl){ public static Retrofit request(String baseUrl){
OkHttpClient.Builder okHttp = new OkHttpClient().newBuilder();
okHttp.retryOnConnectionFailure(true);
okHttp.connectTimeout(60, TimeUnit.SECONDS);
okHttp.writeTimeout(60, TimeUnit.SECONDS);
okHttp.readTimeout(60, TimeUnit.SECONDS);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(s -> Log.e("API-LOG", s));
interceptor.level(HttpLoggingInterceptor.Level.BODY);
if (BuildConfig.DEBUG) okHttp.addInterceptor(interceptor);
okHttp.addInterceptor(chain -> {
Request request = chain.request();
Request newReq = request.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.addHeader("Accept-Encoding", "identity")
.addHeader("Connection", "close")
.addHeader("Transfer-Encoding", "chunked")
.build();
return chain.proceed(newReq);
});
OkHttpClient client = okHttp.build();
Retrofit retrofit = new Retrofit.Builder() Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl) .baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create()) // .client(client)
.addConverterFactory(GsonConverterFactory.create(
new GsonBuilder().setLenient().create()
))
.build(); .build();
return retrofit; return retrofit;
......
...@@ -5,25 +5,43 @@ import com.yono.messeripos.models.CategoryModels; ...@@ -5,25 +5,43 @@ import com.yono.messeripos.models.CategoryModels;
import com.yono.messeripos.models.ProductModels; import com.yono.messeripos.models.ProductModels;
import com.yono.messeripos.response.DataResponse; import com.yono.messeripos.response.DataResponse;
import java.util.HashMap;
import java.util.List; import java.util.List;
import okhttp3.MultipartBody;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.http.DELETE;
import retrofit2.http.GET; import retrofit2.http.GET;
import retrofit2.http.Multipart; import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part; import retrofit2.http.Part;
import retrofit2.http.Path;
public interface ProductService { public interface ProductService {
@GET(ApiHelper.VERSI_API_1+"product-categories") @GET(ApiHelper.VERSI_API_1+"product-categories")
Call<DataResponse<List<ProductModels<CategoryModels>>>> getProducts(); Call<DataResponse<List<ProductModels<CategoryModels>>>> getProducts();
@DELETE(ApiHelper.VERSI_API_1+"product/{id}")
Call<DataResponse<ProductModels>> deleteProducts(@Path("id") int id);
@Multipart
@POST(ApiHelper.VERSI_API_1+"product")
Call<HashMap<String, Object>> postProduct(
@Part MultipartBody.Part image,
@Part("name") RequestBody name,
@Part("price") RequestBody price,
@Part("stock") RequestBody stock,
@Part("category_id") RequestBody category_id
);
@Multipart @Multipart
@GET(ApiHelper.VERSI_API_1+"product") @POST(ApiHelper.VERSI_API_1+"product")
Call<DataResponse<ProductModels>> postProduct( Call<DataResponse<ProductModels>> postProducts(
@Part("image\"; filename=\"messer_file.jpg\"")RequestBody image, @Part MultipartBody.Part image,
@Part RequestBody name, @Part("name") RequestBody name,
@Part RequestBody price, @Part("price") Integer price,
@Part RequestBody stock, @Part("stock") Integer stock,
@Part RequestBody category_id @Part("category_id") int category_id
); );
} }
...@@ -64,6 +64,21 @@ public class MainViewModels extends ViewModel { ...@@ -64,6 +64,21 @@ public class MainViewModels extends ViewModel {
return transactions; return transactions;
} }
public void deleteProducts(int id){
ProductService productService = client.Client(ProductService.class);
productService.deleteProducts(id).enqueue(new Callback<DataResponse<ProductModels>>() {
@Override
public void onResponse(Call<DataResponse<ProductModels>> call, Response<DataResponse<ProductModels>> response) {
Log.i("Delete", "onResponse: "+utils.convertGson(response.body()));
}
@Override
public void onFailure(Call<DataResponse<ProductModels>> call, Throwable t) {
Log.e("error delete", "onFailure: ",t );
}
});
}
private void getDataTransaction() { private void getDataTransaction() {
TransactionService transactionService = client.Client(TransactionService.class); TransactionService transactionService = client.Client(TransactionService.class);
......
package com.yono.messeripos.utils; package com.yono.messeripos.utils;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build; import android.os.Build;
import android.util.Base64;
import android.widget.Toast;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import com.google.gson.Gson; import com.google.gson.Gson;
import java.io.ByteArrayOutputStream;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols; import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -73,4 +78,18 @@ public class Utils { ...@@ -73,4 +78,18 @@ public class Utils {
String localDate = localDateTime.format(localFormatter); String localDate = localDateTime.format(localFormatter);
return localDate; return localDate;
} }
public String convertImageBase64File(String pathname){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeFile(pathname);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String encodeImage = Base64.encodeToString(b, Base64.DEFAULT);
return encodeImage;
}
public void toastMessage(Context context, String message){
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment