diff --git a/app/build.gradle b/app/build.gradle index 10f4ec0019..5167158916 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,6 +90,8 @@ android { buildConfigField "String", "CHANGELOG", "\"https://github.com/M66B/FairEmail/releases/\"" buildConfigField "String", "GITHUB_LATEST_API", "\"https://api.github.com/repos/M66B/open-source-email/releases/latest\"" buildConfigField "String", "OPENKEYCHAIN_URI", "\"https://f-droid.org/en/packages/org.sufficientlysecure.keychain/\"" + buildConfigField "String", "CAMERA_URI", "\"https://f-droid.org/en/packages/net.sourceforge.opencamera/\"" + buildConfigField "String", "RECORDER_URI", "\"https://f-droid.org/packages/com.github.axet.audiorecorder/\"" buildConfigField "String", "APPS_URI", "\"https://github.com/M66B?tab=repositories/\"" } play_beta { @@ -101,6 +103,8 @@ android { buildConfigField "String", "CHANGELOG", "\"\"" buildConfigField "String", "GITHUB_LATEST_API", "\"\"" buildConfigField "String", "OPENKEYCHAIN_URI", "\"https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain\"" + buildConfigField "String", "CAMERA_URI", "\"https://play.google.com/store/apps/details?id=net.sourceforge.opencamera\"" + buildConfigField "String", "RECORDER_URI", "\"https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder\"" buildConfigField "String", "APPS_URI", "\"https://play.google.com/store/apps/dev?id=8420080860664580239\"" } play_release { @@ -112,6 +116,8 @@ android { buildConfigField "String", "CHANGELOG", "\"\"" buildConfigField "String", "GITHUB_LATEST_API", "\"\"" buildConfigField "String", "OPENKEYCHAIN_URI", "\"https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain\"" + buildConfigField "String", "CAMERA_URI", "\"https://play.google.com/store/apps/details?id=net.sourceforge.opencamera\"" + buildConfigField "String", "RECORDER_URI", "\"https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder\"" buildConfigField "String", "APPS_URI", "\"https://play.google.com/store/apps/dev?id=8420080860664580239\"" } } diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 4a75ba07ae..990e7870b0 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -582,12 +582,6 @@ public class FragmentCompose extends FragmentBase { } }); - PackageManager pm = getContext().getPackageManager(); - Intent take_photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - Intent record_audio = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); - media_bar.getMenu().findItem(R.id.menu_take_photo).setVisible(take_photo.resolveActivity(pm) != null); - media_bar.getMenu().findItem(R.id.menu_record_audio).setVisible(record_audio.resolveActivity(pm) != null); - media_bar.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { @@ -1269,30 +1263,54 @@ public class FragmentCompose extends FragmentBase { } private void onActionRecordAudio() { + // https://developer.android.com/reference/android/provider/MediaStore.Audio.Media.html#RECORD_SOUND_ACTION + PackageManager pm = getContext().getPackageManager(); Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); - try { - startActivityForResult(intent, REQUEST_RECORD_AUDIO); - } catch (SecurityException ex) { - Log.w(ex); - Snackbar.make(view, getString(R.string.title_no_viewer, intent.getAction()), Snackbar.LENGTH_LONG).show(); - } + if (intent.resolveActivity(pm) == null) { + Snackbar snackbar = Snackbar.make(view, getString(R.string.title_no_recorder), Snackbar.LENGTH_INDEFINITE); + snackbar.setAction(R.string.title_fix, new View.OnClickListener() { + @Override + public void onClick(View v) { + Helper.view(getContext(), Uri.parse(BuildConfig.RECORDER_URI), false); + } + }); + snackbar.show(); + } else + try { + startActivityForResult(intent, REQUEST_RECORD_AUDIO); + } catch (SecurityException ex) { + Log.w(ex); + Snackbar.make(view, getString(R.string.title_no_viewer, intent.getAction()), Snackbar.LENGTH_INDEFINITE).show(); + } } private void onActionTakePhoto() { - File dir = new File(getContext().getCacheDir(), "photo"); - if (!dir.exists()) - dir.mkdir(); - File file = new File(dir, working + ".jpg"); - // https://developer.android.com/training/camera/photobasics + PackageManager pm = getContext().getPackageManager(); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - try { - photoURI = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file); - intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); - startActivityForResult(intent, REQUEST_TAKE_PHOTO); - } catch (SecurityException ex) { - Log.w(ex); - Snackbar.make(view, getString(R.string.title_no_viewer, intent.getAction()), Snackbar.LENGTH_LONG).show(); + if (intent.resolveActivity(pm) == null) { + Snackbar snackbar = Snackbar.make(view, getString(R.string.title_no_camera), Snackbar.LENGTH_LONG); + snackbar.setAction(R.string.title_fix, new View.OnClickListener() { + @Override + public void onClick(View v) { + Helper.view(getContext(), Uri.parse(BuildConfig.CAMERA_URI), false); + } + }); + snackbar.show(); + } else { + File dir = new File(getContext().getCacheDir(), "photo"); + if (!dir.exists()) + dir.mkdir(); + File file = new File(dir, working + ".jpg"); + + try { + photoURI = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file); + intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + startActivityForResult(intent, REQUEST_TAKE_PHOTO); + } catch (SecurityException ex) { + Log.w(ex); + Snackbar.make(view, getString(R.string.title_no_viewer, intent.getAction()), Snackbar.LENGTH_LONG).show(); + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 82f96dc261..55d5db18ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -664,6 +664,8 @@ No reply templates defined No viewer app available for %1$s + No suitable audio recorder app available + No suitable camera app available Storage access framework not available An outdated app sent a file path instead of a file stream Contact picker not available