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;
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());

@ -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

Loading…
Cancel
Save