package openfoodfacts.github.scrachx.openfood.fragments; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.media.AudioManager; import android.media.ToneGenerator; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.view.MenuItemCompat; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.afollestad.materialdialogs.MaterialDialog; import com.google.zxing.BarcodeFormat; import com.google.zxing.Result; import java.util.Arrays; import me.dm7.barcodescanner.zxing.ZXingScannerView; import openfoodfacts.github.scrachx.openfood.R; import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIClient; import openfoodfacts.github.scrachx.openfood.views.SaveProductOfflineActivity; public class BarCodeScannerFragment extends BaseFragment implements MessageDialogFragment.MessageDialogListener, ZXingScannerView.ResultHandler, CameraSelectorDialogFragment.CameraSelectorDialogListener { private static final String FLASH_STATE = "FLASH_STATE"; private static final String AUTO_FOCUS_STATE = "AUTO_FOCUS_STATE"; private static final String CAMERA_ID = "CAMERA_ID"; private static final String RING_STATE = "RING_STATE"; private ZXingScannerView mScannerView; private boolean mFlash; private boolean mRing; private boolean mAutoFocus; private int mCameraId = -1; private OpenFoodAPIClient api; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { final SharedPreferences settings = getActivity().getSharedPreferences("camera", 0); mScannerView = new ZXingScannerView(getActivity()); api = new OpenFoodAPIClient(getActivity()); if(state != null) { mRing = state.getBoolean(RING_STATE, false); mFlash = state.getBoolean(FLASH_STATE, false); mAutoFocus = state.getBoolean(AUTO_FOCUS_STATE, true); mCameraId = state.getInt(CAMERA_ID, -1); } else { mRing = settings.getBoolean("ring", false); mFlash = settings.getBoolean("flash", false); mAutoFocus = settings.getBoolean("focus", true); mCameraId = -1; } setupFormats(); return mScannerView; } @Override public void onCreate(Bundle state) { super.onCreate(state); setHasOptionsMenu(true); } public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); MenuItem ringMenuItem = menu.add(Menu.NONE, R.id.menu_ring, 0, mRing ? R.string.ring_on : R.string.ring_off); MenuItemCompat.setShowAsAction(ringMenuItem, MenuItem.SHOW_AS_ACTION_NEVER); MenuItem flashMenuItem = menu.add(Menu.NONE, R.id.menu_flash, 0, mFlash ? R.string.flash_on : R.string.flash_off); MenuItemCompat.setShowAsAction(flashMenuItem, MenuItem.SHOW_AS_ACTION_NEVER); MenuItem focusMenuItem = menu.add(Menu.NONE, R.id.menu_auto_focus, 0, mAutoFocus ? R.string.auto_focus_on : R.string.auto_focus_off); MenuItemCompat.setShowAsAction(focusMenuItem, MenuItem.SHOW_AS_ACTION_NEVER); MenuItem cameraMenuItem = menu.add(Menu.NONE, R.id.menu_camera_selector, 0, R.string.select_camera); MenuItemCompat.setShowAsAction(cameraMenuItem, MenuItem.SHOW_AS_ACTION_NEVER); MenuItem aboutMenuItem = menu.add(Menu.NONE, R.id.menu_about, 0, R.string.action_about); MenuItemCompat.setShowAsAction(aboutMenuItem, MenuItem.SHOW_AS_ACTION_NEVER); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items final SharedPreferences settings = getActivity().getSharedPreferences("camera", 0); SharedPreferences.Editor editor = settings.edit(); switch (item.getItemId()) { case R.id.menu_ring: mRing = !mRing; if(mRing) { item.setTitle(R.string.ring_on); editor.putBoolean("ring", true); } else { item.setTitle(R.string.ring_off); editor.putBoolean("ring", false); } editor.apply(); return true; case R.id.menu_flash: mFlash = !mFlash; if(mFlash) { item.setTitle(R.string.flash_on); editor.putBoolean("flash", true); } else { item.setTitle(R.string.flash_off); editor.putBoolean("flash", false); } editor.apply(); mScannerView.setFlash(mFlash); return true; case R.id.menu_auto_focus: mAutoFocus = !mAutoFocus; if(mAutoFocus) { item.setTitle(R.string.auto_focus_on); editor.putBoolean("focus", true); } else { item.setTitle(R.string.auto_focus_off); editor.putBoolean("focus", false); } editor.apply(); mScannerView.setAutoFocus(mAutoFocus); return true; case R.id.menu_camera_selector: mScannerView.stopCamera(); DialogFragment cFragment = CameraSelectorDialogFragment.newInstance(this, mCameraId); cFragment.show(getActivity().getSupportFragmentManager(), "camera_selector"); return true; case R.id.menu_about: new MaterialDialog.Builder(this.getActivity()) .title(R.string.action_about) .content(R.string.txtAbout) .neutralText(R.string.txtOk) .show(); default: return super.onOptionsItemSelected(item); } } @Override public void onResume() { super.onResume(); mScannerView.setResultHandler(this); mScannerView.startCamera(mCameraId); mScannerView.setFlash(mFlash); mScannerView.setAutoFocus(mAutoFocus); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(FLASH_STATE, mFlash); outState.putBoolean(AUTO_FOCUS_STATE, mAutoFocus); outState.putBoolean(RING_STATE, mRing); } @Override public void handleResult(Result rawResult) { if (mRing) { try { ToneGenerator beep = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100); beep.startTone(ToneGenerator.TONE_PROP_BEEP); } catch (Exception e) { Log.e("SCAN RING", e.getMessage(), e); } } if (rawResult.getText().isEmpty()) { return; } ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { api.getProduct(rawResult.getText(), getActivity(), mScannerView, this); } else { Intent intent = new Intent(getActivity(), SaveProductOfflineActivity.class); intent.putExtra("barcode", rawResult.getText()); getActivity().startActivity(intent); getActivity().finish(); } } @Override public void onDialogPositiveClick(DialogFragment dialog) { // Resume the camera mScannerView.resumeCameraPreview(this); } @Override public void onCameraSelected(int cameraId) { mCameraId = cameraId; mScannerView.startCamera(mCameraId); mScannerView.setFlash(mFlash); mScannerView.setAutoFocus(mAutoFocus); } public void setupFormats() { mScannerView.setFormats(Arrays.asList(BarcodeFormat.UPC_A, BarcodeFormat.UPC_E, BarcodeFormat.EAN_13, BarcodeFormat.EAN_8, BarcodeFormat.RSS_14, BarcodeFormat.CODE_39, BarcodeFormat.CODE_93, BarcodeFormat.CODE_128, BarcodeFormat.ITF)); } @Override public void onPause() { super.onPause(); mScannerView.stopCamera(); } }