package openfoodfacts.github.scrachx.openfood.fragments;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import butterknife.OnItemClick;
import butterknife.OnItemLongClick;
import openfoodfacts.github.scrachx.openfood.R;
import openfoodfacts.github.scrachx.openfood.models.ProductImageField;
import openfoodfacts.github.scrachx.openfood.models.SaveItem;
import openfoodfacts.github.scrachx.openfood.models.SendProduct;
import openfoodfacts.github.scrachx.openfood.models.SendProductDao;
import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIClient;
import openfoodfacts.github.scrachx.openfood.utils.Utils;
import openfoodfacts.github.scrachx.openfood.views.SaveProductOfflineActivity;
import openfoodfacts.github.scrachx.openfood.views.adapters.SaveListAdapter;
import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
public class OfflineEditFragment extends BaseFragment {
public static final String LOG_TAG = "OFFLINE_EDIT";
@BindView(R.id.listOfflineSave) ListView listView;
@BindView(R.id.buttonSendAll) Button buttonSend;
private List<SaveItem> saveItems;
private String loginS, passS;
private SendProductDao mSendProductDao;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return createView(inflater, container, R.layout.fragment_offline_edit);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mSendProductDao = Utils.getAppDaoSession(getActivity()).getSendProductDao();
final SharedPreferences settingsLogin = getContext().getSharedPreferences("login", 0);
final SharedPreferences settingsUsage = getContext().getSharedPreferences("usage", 0);
saveItems = new ArrayList<>();
loginS = settingsLogin.getString("user", "");
passS = settingsLogin.getString("pass", "");
boolean firstUse = settingsUsage.getBoolean("firstOffline", false);
if(!firstUse) {
new MaterialDialog.Builder(getContext())
.title(R.string.title_info_dialog)
.content(R.string.text_offline_info_dialog)
.onPositive((dialog, which) -> {
SharedPreferences.Editor editor = settingsUsage.edit();
editor.putBoolean("firstOffline", true);
editor.apply();
})
.positiveText(R.string.txtOk)
.show();
}
buttonSend.setEnabled(false);
}
@OnItemClick(R.id.listOfflineSave)
protected void OnClickListOffline(int position) {
Intent intent = new Intent(getActivity(), SaveProductOfflineActivity.class);
SaveItem si = (SaveItem) listView.getItemAtPosition(position);
intent.putExtra("barcode", si.getBarcode());
startActivity(intent);
}
@OnItemLongClick(R.id.listOfflineSave)
protected boolean OnLongClickListOffline(int position) {
final int lapos = position;
new MaterialDialog.Builder(getActivity())
.title(R.string.txtDialogsTitle)
.content(R.string.txtDialogsContentDelete)
.positiveText(R.string.txtYes)
.negativeText(R.string.txtNo)
.onPositive((dialog, which) -> {
String barcode = saveItems.get(lapos).getBarcode();
mSendProductDao.deleteInTx(mSendProductDao.queryBuilder().where(SendProductDao.Properties.Barcode.eq(barcode)).list());
final SaveListAdapter sl = (SaveListAdapter) listView.getAdapter();
saveItems.remove(lapos);
getActivity().runOnUiThread(() -> sl.notifyDataSetChanged());
})
.show();
return true;
}
@OnClick(R.id.buttonSendAll)
protected void onSendAllProducts() {
new MaterialDialog.Builder(getActivity())
.title(R.string.txtDialogsTitle)
.content(R.string.txtDialogsContentSend)
.positiveText(R.string.txtYes)
.negativeText(R.string.txtNo)
.onPositive((dialog, which) -> {
OpenFoodAPIClient apiClient = new OpenFoodAPIClient(getActivity());
final List<SendProduct> listSaveProduct = mSendProductDao.loadAll();
for (final SendProduct product : listSaveProduct) {
if (isEmpty(product.getBarcode()) || isEmpty(product.getImgupload_front())) {
continue;
}
if(!loginS.isEmpty() && !passS.isEmpty()) {
product.setUserId(loginS);
product.setPassword(passS);
}
if(isNotEmpty(product.getImgupload_ingredients())) {
product.compress(ProductImageField.INGREDIENTS);
}
if(isNotEmpty(product.getImgupload_nutrition())) {
product.compress(ProductImageField.NUTRITION);
}
if(isNotEmpty(product.getImgupload_front())) {
product.compress(ProductImageField.FRONT);
}
apiClient.post(getActivity(), product, value -> {
if (value) {
int productIndex = listSaveProduct.indexOf(product);
if (productIndex >= 0 && productIndex < saveItems.size()) {
saveItems.remove(productIndex);
}
((SaveListAdapter) listView.getAdapter()).notifyDataSetChanged();
mSendProductDao.deleteInTx(mSendProductDao.queryBuilder().where(SendProductDao.Properties.Barcode.eq(product.getBarcode())).list());
}
});
}
})
.show();
}
@Override
public void onResume() {
super.onResume();
new FillAdapter().execute(getActivity());
}
public class FillAdapter extends AsyncTask<Context, Void, Context> {
@Override
protected void onPreExecute() {
saveItems.clear();
List<SendProduct> listSaveProduct = mSendProductDao.loadAll();
if (listSaveProduct.size() == 0) {
Toast.makeText(getActivity(), R.string.txtNoData, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), R.string.txtLoading, Toast.LENGTH_LONG).show();
}
}
@Override
protected Context doInBackground(Context... ctx) {
List<SendProduct> listSaveProduct = mSendProductDao.loadAll();
int imageIcon = R.drawable.ic_ok;
for (SendProduct product : listSaveProduct) {
if (isEmpty(product.getBarcode()) || isEmpty(product.getImgupload_front())
|| isEmpty(product.getBrands()) || isEmpty(product.getWeight()) || isEmpty(product.getName())) {
imageIcon = R.drawable.ic_no;
}
Bitmap bitmap = Utils.decodeFile(new File(product.getImgupload_front()));
if (bitmap == null) {
Log.e(LOG_TAG, "Unable to load the image of the product: " + product.getBarcode());
continue;
}
Bitmap imgUrl = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
saveItems.add(new SaveItem(product.getName(), imageIcon, imgUrl, product.getBarcode()));
}
return ctx[0];
}
@Override
protected void onPostExecute(Context ctx) {
List<SendProduct> listSaveProduct = mSendProductDao.loadAll();
if (listSaveProduct.isEmpty()) {
return;
}
SaveListAdapter adapter = new SaveListAdapter(ctx, saveItems);
listView.setAdapter(adapter);
boolean canSend = true;
for (SendProduct sp : listSaveProduct) {
if (isEmpty(sp.getBarcode()) || isEmpty(sp.getImgupload_front())) {
canSend = false;
break;
}
}
buttonSend.setEnabled(canSend);
}
}
}