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