diff --git a/app/src/main/java/eu/faircode/email/FragmentSetup.java b/app/src/main/java/eu/faircode/email/FragmentSetup.java index a3a18117d2..44fbacdfc4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentSetup.java @@ -704,8 +704,6 @@ public class FragmentSetup extends FragmentBase { grpDataSaver.setVisibility(View.GONE); tvStamina.setVisibility(View.GONE); - setGrantedPermissions(); - return view; } @@ -804,6 +802,9 @@ public class FragmentSetup extends FragmentBase { cm.registerDefaultNetworkCallback(networkCallback); } + // Permissions + setGrantedPermissions(); + // Doze boolean isIgnoring = !Boolean.FALSE.equals(Helper.isIgnoringOptimizations(getContext())); boolean canScheduleExact = AlarmManagerCompatEx.canScheduleExactAlarms(getContext()); @@ -969,6 +970,33 @@ public class FragmentSetup extends FragmentBase { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { setGrantedPermissions(); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + SharedPreferences.Editor editor = prefs.edit(); + + int denied = 0; + for (int i = 0; i < Math.min(permissions.length, grantResults.length); i++) { + String key = "requested." + permissions[i]; + + if (grantResults[i] == PackageManager.PERMISSION_DENIED && + grantResults[i] == prefs.getInt(key, PackageManager.PERMISSION_GRANTED)) + denied++; + + if (grantResults[i] == PackageManager.PERMISSION_GRANTED && + Manifest.permission.READ_CONTACTS.equals(permissions[i])) + ContactInfo.init(getContext().getApplicationContext()); + + editor.putInt(key, grantResults[i]); + } + + editor.apply(); + + if (denied > 0) { + Intent settings = new Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.parse("package:" + BuildConfig.APPLICATION_ID)); + startActivity(settings); + } } private List getDesiredPermissions() { @@ -985,9 +1013,6 @@ public class FragmentSetup extends FragmentBase { if (hasPermission(permission)) granted.add(permission); - if (granted.contains(Manifest.permission.READ_CONTACTS)) - ContactInfo.init(getContext().getApplicationContext()); - boolean all = true; for (String permission : getDesiredPermissions()) if (!granted.contains(permission)) {