diff --git a/app/src/main/java/me/impy/aegis/ui/ScannerActivity.java b/app/src/main/java/me/impy/aegis/ui/ScannerActivity.java index 8175f547..85df64ec 100644 --- a/app/src/main/java/me/impy/aegis/ui/ScannerActivity.java +++ b/app/src/main/java/me/impy/aegis/ui/ScannerActivity.java @@ -2,7 +2,10 @@ package me.impy.aegis.ui; import android.content.Context; import android.content.Intent; +import android.hardware.Camera; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; import android.widget.Toast; import com.google.zxing.BarcodeFormat; @@ -12,14 +15,20 @@ import java.util.Collections; import me.dm7.barcodescanner.core.IViewFinder; import me.dm7.barcodescanner.zxing.ZXingScannerView; +import me.impy.aegis.R; import me.impy.aegis.crypto.KeyInfo; import me.impy.aegis.crypto.KeyInfoException; import me.impy.aegis.db.DatabaseEntry; import me.impy.aegis.helpers.SquareFinderView; import me.impy.aegis.ui.views.KeyProfile; +import static android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK; +import static android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT; + public class ScannerActivity extends AegisActivity implements ZXingScannerView.ResultHandler { private ZXingScannerView _scannerView; + private Menu _menu; + private int _facing = CAMERA_FACING_BACK; @Override protected void onCreate(Bundle state) { @@ -33,11 +42,51 @@ public class ScannerActivity extends AegisActivity implements ZXingScannerView.R }; _scannerView.setResultHandler(this); _scannerView.setFormats(Collections.singletonList(BarcodeFormat.QR_CODE)); - _scannerView.startCamera(); + + int camera = getRearCameraId(); + if (camera == -1) { + camera = getFrontCameraId(); + if (camera == -1) { + Toast.makeText(this, "No cameras available", Toast.LENGTH_LONG).show(); + finish(); + } + _facing = CAMERA_FACING_FRONT; + } + _scannerView.startCamera(camera); setContentView(_scannerView); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + _menu = menu; + getMenuInflater().inflate(R.menu.menu_scanner, menu); + updateCameraIcon(); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_camera: + _scannerView.stopCamera(); + switch (_facing) { + case CAMERA_FACING_BACK: + _facing = CAMERA_FACING_FRONT; + break; + case CAMERA_FACING_FRONT: + _facing = CAMERA_FACING_BACK; + break; + } + _scannerView.startCamera(getCameraId(_facing)); + updateCameraIcon(); + return true; + case R.id.action_lock: + default: + return super.onOptionsItemSelected(item); + } + } + @Override protected void setPreferredTheme(boolean nightMode) { @@ -46,6 +95,7 @@ public class ScannerActivity extends AegisActivity implements ZXingScannerView.R @Override public void onResume() { super.onResume(); + _scannerView.startCamera(); } @Override @@ -72,4 +122,42 @@ public class ScannerActivity extends AegisActivity implements ZXingScannerView.R _scannerView.resumeCameraPreview(this); } + + private void updateCameraIcon() { + if (_menu != null) { + MenuItem item = _menu.findItem(R.id.action_camera); + boolean dual = getFrontCameraId() != -1 && getRearCameraId() != -1; + if (dual) { + switch (_facing) { + case CAMERA_FACING_BACK: + item.setIcon(R.drawable.ic_camera_front_24dp); + break; + case CAMERA_FACING_FRONT: + item.setIcon(R.drawable.ic_camera_rear_24dp); + break; + } + } + item.setVisible(dual); + } + } + + private static int getCameraId(int facing) { + Camera.CameraInfo info = new Camera.CameraInfo(); + for (int i = 0; i < Camera.getNumberOfCameras(); ++i) { + Camera.getCameraInfo(i, info); + if (info.facing == facing) { + return i; + } + } + + return -1; + } + + private static int getRearCameraId() { + return getCameraId(CAMERA_FACING_BACK); + } + + private static int getFrontCameraId() { + return getCameraId(CAMERA_FACING_FRONT); + } } diff --git a/app/src/main/res/drawable/ic_camera_front_24dp.xml b/app/src/main/res/drawable/ic_camera_front_24dp.xml new file mode 100644 index 00000000..0f70d89b --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_front_24dp.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_rear_24dp.xml b/app/src/main/res/drawable/ic_camera_rear_24dp.xml new file mode 100644 index 00000000..1c9724b0 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_rear_24dp.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/menu/menu_scanner.xml b/app/src/main/res/menu/menu_scanner.xml new file mode 100644 index 00000000..68bc0bed --- /dev/null +++ b/app/src/main/res/menu/menu_scanner.xml @@ -0,0 +1,13 @@ + + + + +