package openfoodfacts.github.scrachx.openfood.fragments; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; import com.squareup.picasso.Picasso; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.OnClick; import openfoodfacts.github.scrachx.openfood.R; import openfoodfacts.github.scrachx.openfood.models.HeaderNutrimentItem; import openfoodfacts.github.scrachx.openfood.models.NutrimentItem; import openfoodfacts.github.scrachx.openfood.models.Nutriments; import openfoodfacts.github.scrachx.openfood.models.Nutriments.Nutriment; import openfoodfacts.github.scrachx.openfood.models.Product; import openfoodfacts.github.scrachx.openfood.models.ProductImage; import openfoodfacts.github.scrachx.openfood.models.State; import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIClient; import openfoodfacts.github.scrachx.openfood.utils.Utils; import openfoodfacts.github.scrachx.openfood.views.FullScreenImage; import openfoodfacts.github.scrachx.openfood.views.adapters.NutrimentsRecyclerViewAdapter; import pl.aprilapps.easyphotopicker.DefaultCallback; import pl.aprilapps.easyphotopicker.EasyImage; import static android.Manifest.permission.CAMERA; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; import static android.text.TextUtils.isEmpty; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.CARBOHYDRATES; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.CARBO_MAP; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.ENERGY; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.FAT; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.FAT_MAP; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.MINERALS_MAP; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.PROTEINS; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.PROT_MAP; import static openfoodfacts.github.scrachx.openfood.models.Nutriments.VITAMINS_MAP; import static openfoodfacts.github.scrachx.openfood.models.ProductImageField.FRONT; import static openfoodfacts.github.scrachx.openfood.models.ProductImageField.NUTRITION; import static openfoodfacts.github.scrachx.openfood.utils.Utils.MY_PERMISSIONS_REQUEST_CAMERA; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.StringUtils.isNotEmpty; public class NutritionInfoProductFragment extends BaseFragment { @BindView(R.id.textPerPortion) TextView mTextPerPortion; @BindView(R.id.imageViewNutrition) ImageView mImageNutrition; @BindView(R.id.addPhotoLabel) TextView addPhotoLabel; @BindView(R.id.nutriments_recycler_view) RecyclerView nutrimentsRecyclerView; private String mUrlImage; private String barcode; private OpenFoodAPIClient api; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { api = new OpenFoodAPIClient(getActivity()); return createView(inflater, container, R.layout.fragment_nutrition_info_product); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Intent intent = getActivity().getIntent(); State state = (State) intent.getExtras().getSerializable("state"); final Product product = state.getProduct(); barcode = product.getCode(); Nutriments nutriments = product.getNutriments(); List<NutrimentItem> nutrimentItems = new ArrayList<>(); if (isNotBlank(product.getServingSize())) { mTextPerPortion.setText(getString(R.string.nutriment_serving_size) + " " + product.getServingSize()); } else { mTextPerPortion.setVisibility(View.GONE); } if (isNotBlank(product.getImageNutritionUrl())) { addPhotoLabel.setVisibility(View.GONE); Picasso.with(view.getContext()) .load(product.getImageNutritionUrl()) .into(mImageNutrition); mUrlImage = product.getImageNutritionUrl(); } if (nutriments == null) { return; } // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView nutrimentsRecyclerView.setHasFixedSize(true); // use a linear layout manager LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); nutrimentsRecyclerView.setLayoutManager(mLayoutManager); nutrimentsRecyclerView.setNestedScrollingEnabled(false); // use VERTICAL divider DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(nutrimentsRecyclerView.getContext(), VERTICAL); nutrimentsRecyclerView.addItemDecoration(dividerItemDecoration); // Header hack nutrimentItems.add(new NutrimentItem(null, null, null, null)); // Energy Nutriment energy = nutriments.get(ENERGY); if (energy != null) { nutrimentItems.add(new NutrimentItem(getString(R.string.nutrition_energy_short_name), getEnergy(energy.getFor100g()), getEnergy(energy.getForServing()), "kcal")); } // Fat Nutriment fat = nutriments.get(FAT); if (fat != null) { nutrimentItems.add(new HeaderNutrimentItem(getString(R.string.nutrition_fat), fat.getFor100g(), fat.getForServing(), fat.getUnit())); nutrimentItems.addAll(getNutrimentItems(nutriments, FAT_MAP)); } // Carbohydrates Nutriment carbohydrates = nutriments.get(CARBOHYDRATES); if (carbohydrates != null) { nutrimentItems.add(new HeaderNutrimentItem(getString(R.string.nutrition_carbohydrate), carbohydrates.getFor100g(), carbohydrates.getForServing(), carbohydrates.getUnit())); nutrimentItems.addAll(getNutrimentItems(nutriments, CARBO_MAP)); } // fiber nutrimentItems.addAll(getNutrimentItems(nutriments, Collections.singletonMap(Nutriments.FIBER, R.string.nutrition_fiber))); // Proteins Nutriment proteins = nutriments.get(PROTEINS); if (proteins != null) { nutrimentItems.add(new HeaderNutrimentItem(getString(R.string.nutrition_proteins), proteins.getFor100g(), proteins.getForServing(), proteins.getUnit())); nutrimentItems.addAll(getNutrimentItems(nutriments, PROT_MAP)); } // salt and alcohol Map<String, Integer> map = new HashMap<>(); map.put(Nutriments.SALT, R.string.nutrition_salt); map.put(Nutriments.SODIUM, R.string.nutrition_sodium); map.put(Nutriments.ALCOHOL, R.string.nutrition_alcohol); nutrimentItems.addAll(getNutrimentItems(nutriments, map)); // Vitamins if (nutriments.hasVitamins()) { nutrimentItems.add(new HeaderNutrimentItem(getString(R.string.nutrition_vitamins))); nutrimentItems.addAll(getNutrimentItems(nutriments, VITAMINS_MAP)); } // Minerals if (nutriments.hasMinerals()) { nutrimentItems.add(new HeaderNutrimentItem(getString(R.string.nutrition_minerals))); nutrimentItems.addAll(getNutrimentItems(nutriments, MINERALS_MAP)); } RecyclerView.Adapter adapter = new NutrimentsRecyclerViewAdapter(nutrimentItems); nutrimentsRecyclerView.setAdapter(adapter); } private List<NutrimentItem> getNutrimentItems(Nutriments nutriments, Map<String, Integer> nutrimentMap) { List<NutrimentItem> items = new ArrayList<>(); for (Map.Entry<String, Integer> entry : nutrimentMap.entrySet()) { Nutriment nutriment = nutriments.get(entry.getKey()); if (nutriment != null) { items.add(new NutrimentItem(getString(entry.getValue()), nutriment.getFor100g(), nutriment.getForServing(), nutriment.getUnit())); } } return items; } private String getEnergy(String value) { String defaultValue = "0"; if (defaultValue.equals(value) || isEmpty(value)) { return defaultValue; } try { int energyKcal = convertKjToKcal(Integer.parseInt(value)); return String.valueOf(energyKcal); } catch (NumberFormatException e) { return defaultValue; } } private int convertKjToKcal(int kj) { return kj != 0 ? Double.valueOf(((double) kj) / 4.1868d).intValue() : -1; } @OnClick(R.id.imageViewNutrition) public void openFullScreen(View v) { if (mUrlImage != null) { Intent intent = new Intent(v.getContext(), FullScreenImage.class); Bundle bundle = new Bundle(); bundle.putString("imageurl", mUrlImage); intent.putExtras(bundle); startActivity(intent); } else { // take a picture if (ContextCompat.checkSelfPermission(getActivity(), CAMERA) != PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); } else { EasyImage.openCamera(this, 0); } } } private void onPhotoReturned(File photoFile) { ProductImage image = new ProductImage(barcode, NUTRITION, photoFile); api.postImg(getContext(), image); addPhotoLabel.setVisibility(View.GONE); mUrlImage = photoFile.getAbsolutePath(); Picasso.with(getContext()) .load(photoFile) .fit() .into(mImageNutrition); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); EasyImage.handleActivityResult(requestCode, resultCode, data, getActivity(), new DefaultCallback() { @Override public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) { //Some error handling } @Override public void onImagesPicked(List<File> imageFiles, EasyImage.ImageSource source, int type) { onPhotoReturned(imageFiles.get(0)); } @Override public void onCanceled(EasyImage.ImageSource source, int type) { //Cancel handling, you might wanna remove taken photo if it was canceled if (source == EasyImage.ImageSource.CAMERA) { File photoFile = EasyImage.lastlyTakenButCanceledPhoto(getContext()); if (photoFile != null) photoFile.delete(); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_CAMERA: { if (grantResults.length <= 0 || grantResults[0] != PERMISSION_GRANTED) { new MaterialDialog.Builder(getActivity()) .title(R.string.permission_title) .content(R.string.permission_denied) .negativeText(R.string.txtNo) .positiveText(R.string.txtYes) .onPositive((dialog, which) -> { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null); intent.setData(uri); startActivity(intent); }) .show(); } else { EasyImage.openCamera(this, 0); } } } } }