diff --git a/app/src/main/java/protect/card_locker/ScanActivity.java b/app/src/main/java/protect/card_locker/ScanActivity.java
index fddabaedc..13119515e 100644
--- a/app/src/main/java/protect/card_locker/ScanActivity.java
+++ b/app/src/main/java/protect/card_locker/ScanActivity.java
@@ -1,11 +1,16 @@
package protect.card_locker;
+import android.Manifest;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.graphics.Color;
+import android.net.Uri;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
+import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -14,9 +19,12 @@ import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
+import androidx.core.content.ContextCompat;
+
import com.google.zxing.ResultPoint;
import com.google.zxing.client.android.Intents;
import com.journeyapps.barcodescanner.BarcodeCallback;
@@ -36,6 +44,7 @@ import protect.card_locker.databinding.ScanActivityBinding;
* originally licensed under Apache 2.0
*/
public class ScanActivity extends CatimaAppCompatActivity {
+
private ScanActivityBinding binding;
private CustomBarcodeScannerBinding customBarcodeScannerBinding;
private static final String TAG = "Catima";
@@ -116,6 +125,8 @@ public class ScanActivity extends CatimaAppCompatActivity {
protected void onResume() {
super.onResume();
capture.onResume();
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
+ showCameraPermissionMissingText(false);
}
@Override
@@ -221,4 +232,34 @@ public class ScanActivity extends CatimaAppCompatActivity {
Log.e(TAG, "No activity found to handle intent", e);
}
}
+
+ private void showCameraPermissionMissingText(boolean show) {
+ customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> {
+ navigateToSystemPermissionSetting();
+ } : null);
+ customBarcodeScannerBinding.background.setBackgroundColor(show ? obtainThemeAttribute(R.attr.colorSurface) : Color.TRANSPARENT);
+ customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE);
+
+ }
+
+ private int obtainThemeAttribute(int attribute) {
+ TypedValue typedValue = new TypedValue();
+ getTheme().resolveAttribute(attribute, typedValue, true);
+ return typedValue.data;
+ }
+
+ private void navigateToSystemPermissionSetting() {
+ Intent permissionIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null));
+ permissionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(permissionIntent);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == CaptureManager.getCameraPermissionReqCode())
+ showCameraPermissionMissingText(grantResults[0] != PackageManager.PERMISSION_GRANTED);
+
+ }
+
}
diff --git a/app/src/main/res/drawable/camera_permission_denied.xml b/app/src/main/res/drawable/camera_permission_denied.xml
new file mode 100644
index 000000000..5f2204567
--- /dev/null
+++ b/app/src/main/res/drawable/camera_permission_denied.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/camera_permission_failed_layout.xml b/app/src/main/res/layout/camera_permission_failed_layout.xml
new file mode 100644
index 000000000..daee5822e
--- /dev/null
+++ b/app/src/main/res/layout/camera_permission_failed_layout.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/custom_barcode_scanner.xml b/app/src/main/res/layout/custom_barcode_scanner.xml
index fc679fa88..19c478c46 100644
--- a/app/src/main/res/layout/custom_barcode_scanner.xml
+++ b/app/src/main/res/layout/custom_barcode_scanner.xml
@@ -19,23 +19,39 @@
app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>
-
+ android:padding="@dimen/activity_scanner_padding">
+
+
+ android:text="@string/addFromImage"
+ app:layout_constraintBottom_toTopOf="@+id/add_manually"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
-
+ android:text="@string/addManually"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index f24358963..d3179c577 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -95,6 +95,8 @@
从文件系统导入
导出的数据将储存至你选择的位置.
在导入导出前需要获得外部储存权限
+ 我们不能访问您的相机
+ Catima需要访问您的相机来扫描条形码. 轻触这里以更改您的权限设置。
导出中…
导入中…
无法导出卡片
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 8cd574cbd..7b983da28 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -32,7 +32,8 @@
8dp
16dp
-
+
+ 10dp
66sp
48dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 39c72e507..29f003754 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -66,6 +66,8 @@
Importing…
Exporting…
Grant external storage permission to import or export data
+ We can\'t access the camera
+ To scan barcodes, Catima will need access to your camera. Tap here to change your permission settings.
The data will be written to a location of your choice.
Import from filesystem
Choose a specific file from the filesystem.