Workaround contacts permission required for picking contacts

pull/194/head
M66B 4 years ago
parent 436dd06d08
commit c982e696a3

@ -311,7 +311,9 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc
visible = true; visible = true;
boolean contacts = hasPermission(Manifest.permission.READ_CONTACTS); 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); Log.i("Contacts permission=" + contacts);
finish(); finish();
startActivity(getIntent()); startActivity(getIntent());

@ -271,6 +271,9 @@ public class FragmentCompose extends FragmentBase {
private Uri photoURI = null; private Uri photoURI = null;
private int pickRequest;
private Uri pickUri;
private OpenPgpServiceConnection pgpService; private OpenPgpServiceConnection pgpService;
private String[] pgpUserIds; private String[] pgpUserIds;
private long[] pgpKeyIds; private long[] pgpKeyIds;
@ -297,6 +300,7 @@ public class FragmentCompose extends FragmentBase {
private static final int REQUEST_LINK = 12; private static final int REQUEST_LINK = 12;
private static final int REQUEST_DISCARD = 13; private static final int REQUEST_DISCARD = 13;
private static final int REQUEST_SEND = 14; private static final int REQUEST_SEND = 14;
private static final int REQUEST_PERMISSION = 15;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -454,6 +458,7 @@ public class FragmentCompose extends FragmentBase {
return; return;
} }
// https://developer.android.com/guide/topics/providers/contacts-provider#Intents
Intent pick = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); Intent pick = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
startActivityForResult(Helper.getChooser(getContext(), pick), request); startActivityForResult(Helper.getChooser(getContext(), pick), request);
} }
@ -1149,6 +1154,9 @@ public class FragmentCompose extends FragmentBase {
outState.putBoolean("fair:show_images", show_images); outState.putBoolean("fair:show_images", show_images);
outState.putParcelable("fair:photo", photoURI); outState.putParcelable("fair:photo", photoURI);
outState.putInt("fair:pickRequest", pickRequest);
outState.putParcelable("fair:pickUri", pickUri);
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
} }
@ -1206,6 +1214,9 @@ public class FragmentCompose extends FragmentBase {
show_images = savedInstanceState.getBoolean("fair:show_images"); show_images = savedInstanceState.getBoolean("fair:show_images");
photoURI = savedInstanceState.getParcelable("fair:photo"); photoURI = savedInstanceState.getParcelable("fair:photo");
pickRequest = savedInstanceState.getInt("fair:pickRequest");
pickUri = savedInstanceState.getParcelable("fair:pickUri");
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString("action", working < 0 ? "new" : "edit"); args.putString("action", working < 0 ? "new" : "edit");
args.putLong("id", working); args.putLong("id", working);
@ -2051,6 +2062,10 @@ public class FragmentCompose extends FragmentBase {
ContactsContract.Contacts.DISPLAY_NAME ContactsContract.Contacts.DISPLAY_NAME
}, },
null, null, null)) { 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()) { if (cursor != null && cursor.moveToFirst()) {
int colEmail = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS); int colEmail = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
int colName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); int colName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
@ -2108,11 +2123,26 @@ public class FragmentCompose extends FragmentBase {
@Override @Override
protected void onException(Bundle args, Throwable ex) { 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"); }.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) { private void onAddImage(boolean photo) {
if (photo) { if (photo) {
// https://developer.android.com/training/camera/photobasics // https://developer.android.com/training/camera/photobasics

Loading…
Cancel
Save