diff --git a/app/src/main/java/om/sstvencoder/MainActivity.java b/app/src/main/java/om/sstvencoder/MainActivity.java index 3200efd..05b9588 100644 --- a/app/src/main/java/om/sstvencoder/MainActivity.java +++ b/app/src/main/java/om/sstvencoder/MainActivity.java @@ -49,9 +49,11 @@ import om.sstvencoder.TextOverlay.Label; public class MainActivity extends AppCompatActivity { private static final String CLASS_NAME = "ClassName"; - private static final int REQUEST_PERMISSION = 1; - private static final int REQUEST_PICK_IMAGE = 2; - private static final int REQUEST_IMAGE_CAPTURE = 3; + private static final int REQUEST_LOAD_IMAGE_PERMISSION = 1; + private static final int REQUEST_SAVE_WAVE_PERMISSION = 2; + private static final int REQUEST_IMAGE_CAPTURE_PERMISSION = 3; + private static final int REQUEST_PICK_IMAGE = 11; + private static final int REQUEST_IMAGE_CAPTURE = 12; private Settings mSettings; private TextOverlayTemplate mTextOverlayTemplate; private CropView mCropView; @@ -112,9 +114,8 @@ public class MainActivity extends AppCompatActivity { try { stream = resolver.openInputStream(uri); } catch (Exception ex) { // e.g. FileNotFoundException, SecurityException - if (ex.getCause() instanceof ErrnoException - && ((ErrnoException) ex.getCause()).errno == OsConstants.EACCES) { - requestPermissions(); + if (isPermissionException(ex) && needsRequestReadPermission()) { + requestReadPermission(REQUEST_LOAD_IMAGE_PERMISSION); return false; } showFileNotLoadedMessage(ex, verbose); @@ -148,26 +149,72 @@ public class MainActivity extends AppCompatActivity { return type != null && type.startsWith("image/"); } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private boolean isPermissionException(Exception ex) { + return ex.getCause() instanceof ErrnoException + && ((ErrnoException) ex.getCause()).errno == OsConstants.EACCES; + } + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - private void requestPermissions() { - if (Build.VERSION_CODES.JELLY_BEAN > Build.VERSION.SDK_INT) - return; - int permissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); - if (permissionState != PackageManager.PERMISSION_GRANTED) { - String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}; - ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION); - } + private boolean needsRequestReadPermission() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) + return false; + String permission = Manifest.permission.READ_EXTERNAL_STORAGE; + int state = ContextCompat.checkSelfPermission(this, permission); + return state != PackageManager.PERMISSION_GRANTED; + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private boolean needsRequestWritePermission() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) + return false; + String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE; + int state = ContextCompat.checkSelfPermission(this, permission); + return state != PackageManager.PERMISSION_GRANTED; + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private void requestReadPermission(int requestCode) { + String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}; + ActivityCompat.requestPermissions(this, permissions, requestCode); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private void requestWritePermission(int requestCode) { + String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}; + ActivityCompat.requestPermissions(this, permissions, requestCode); } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { - if (requestCode == REQUEST_PERMISSION - && grantResults.length > 0 - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - loadImage(mSettings.getImageUri(), false); + public void onRequestPermissionsResult(int requestCode, + @NonNull String permissions[], + @NonNull int[] grantResults) { + switch (requestCode) { + case REQUEST_LOAD_IMAGE_PERMISSION: + if (permissionGranted(grantResults)) + loadImage(mSettings.getImageUri(), false); + else { + mCropView.setNoBitmap(); + mSettings.setImageUri(null); + } + break; + case REQUEST_IMAGE_CAPTURE_PERMISSION: + if (permissionGranted(grantResults)) + dispatchTakePictureIntent(); + break; + case REQUEST_SAVE_WAVE_PERMISSION: + if (permissionGranted(grantResults)) + save(); + break; + default: + break; } } + private boolean permissionGranted(@NonNull int[] grantResults) { + return grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; + } + private void showFileNotLoadedMessage(Exception ex, boolean verbose) { String s; if (verbose) @@ -243,10 +290,13 @@ public class MainActivity extends AppCompatActivity { dispatchPickPictureIntent(); return true; case R.id.action_take_picture: - dispatchTakePictureIntent(); + takePicture(); return true; case R.id.action_save_wave: - save(); + if (needsRequestWritePermission()) + requestWritePermission(REQUEST_SAVE_WAVE_PERMISSION); + else + save(); return true; case R.id.action_play: play(); @@ -270,6 +320,22 @@ public class MainActivity extends AppCompatActivity { } } + private void takePicture() { + if (!hasCamera()) { + Toast.makeText(this, getString(R.string.message_no_camera), Toast.LENGTH_LONG).show(); + return; + } + if (needsRequestWritePermission()) + requestWritePermission(REQUEST_IMAGE_CAPTURE_PERMISSION); + else + dispatchTakePictureIntent(); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) + private boolean hasCamera() { + return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY); + } + public void startEditTextActivity(@NonNull Label label) { Intent intent = new Intent(this, EditTextActivity.class); intent.putExtra(EditTextActivity.EXTRA, label); @@ -277,10 +343,6 @@ public class MainActivity extends AppCompatActivity { } private void dispatchTakePictureIntent() { - if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { - Toast.makeText(this, "Device has no camera.", Toast.LENGTH_LONG).show(); - return; - } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (intent.resolveActivity(getPackageManager()) != null) { mFile = Utility.createImageFilePath(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ef6a1d..15ad11a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,6 +28,7 @@ Image orientation error Unsupported content. Previous image could not be loaded. + Device has no camera. Send Email OK SSTV Encoder - Bug Report