diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index a58c4197e3..b46a49918f 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -311,7 +311,9 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc visible = true; boolean contacts = hasPermission(Manifest.permission.READ_CONTACTS); - if (!this.getClass().equals(ActivitySetup.class) && this.contacts != contacts) { + if (this.contacts != contacts && + !this.getClass().equals(ActivitySetup.class) && + !this.getClass().equals(ActivityCompose.class)) { Log.i("Contacts permission=" + contacts); finish(); startActivity(getIntent()); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 5c382d027c..a944eca25a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -271,6 +271,9 @@ public class FragmentCompose extends FragmentBase { private Uri photoURI = null; + private int pickRequest; + private Uri pickUri; + private OpenPgpServiceConnection pgpService; private String[] pgpUserIds; private long[] pgpKeyIds; @@ -297,6 +300,7 @@ public class FragmentCompose extends FragmentBase { private static final int REQUEST_LINK = 12; private static final int REQUEST_DISCARD = 13; private static final int REQUEST_SEND = 14; + private static final int REQUEST_PERMISSION = 15; @Override public void onCreate(Bundle savedInstanceState) { @@ -454,6 +458,7 @@ public class FragmentCompose extends FragmentBase { return; } + // https://developer.android.com/guide/topics/providers/contacts-provider#Intents Intent pick = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); startActivityForResult(Helper.getChooser(getContext(), pick), request); } @@ -1149,6 +1154,9 @@ public class FragmentCompose extends FragmentBase { outState.putBoolean("fair:show_images", show_images); outState.putParcelable("fair:photo", photoURI); + outState.putInt("fair:pickRequest", pickRequest); + outState.putParcelable("fair:pickUri", pickUri); + super.onSaveInstanceState(outState); } @@ -1206,6 +1214,9 @@ public class FragmentCompose extends FragmentBase { show_images = savedInstanceState.getBoolean("fair:show_images"); photoURI = savedInstanceState.getParcelable("fair:photo"); + pickRequest = savedInstanceState.getInt("fair:pickRequest"); + pickUri = savedInstanceState.getParcelable("fair:pickUri"); + Bundle args = new Bundle(); args.putString("action", working < 0 ? "new" : "edit"); args.putLong("id", working); @@ -2051,6 +2062,10 @@ public class FragmentCompose extends FragmentBase { ContactsContract.Contacts.DISPLAY_NAME }, null, null, null)) { + // https://developer.android.com/guide/topics/providers/content-provider-basics#DisplayResults + if (cursor != null && cursor.getCount() == 0) + throw new SecurityException("Could not retrieve selected contact"); + if (cursor != null && cursor.moveToFirst()) { int colEmail = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS); int colName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); @@ -2108,11 +2123,26 @@ public class FragmentCompose extends FragmentBase { @Override protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(getParentFragmentManager(), ex); + if (ex instanceof SecurityException) { + pickRequest = requestCode; + pickUri = uri; + String permission = Manifest.permission.READ_CONTACTS; + requestPermissions(new String[]{permission}, REQUEST_PERMISSION); + } else + Log.unexpectedError(getParentFragmentManager(), ex); } }.execute(this, args, "compose:picked"); } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + for (int i = 0; i < permissions.length; i++) + if (Manifest.permission.READ_CONTACTS.equals(permissions[i])) + if (pickUri != null && + grantResults[i] == PackageManager.PERMISSION_GRANTED) + onPickContact(pickRequest, new Intent().setData(pickUri)); + } + private void onAddImage(boolean photo) { if (photo) { // https://developer.android.com/training/camera/photobasics