diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70275a0d..402cf16c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,8 +35,8 @@ - - + + new AlertDialog.Builder(context) - .setMessage(R.string.permission_readtorrent) + .setMessage(explainer) .setPositiveButton(android.R.string.ok, (dialog, which) -> ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode)) .show()); return false; } // Permission not granted (and we asked for it already before) - ActivityCompat.requestPermissions(activity, new String[]{permission}, REQUEST_TORRENT_READ_PERMISSION); + ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode); return false; } - private boolean hasPermission(String requiredPermission) { + public boolean hasPermission(String requiredPermission) { return ContextCompat.checkSelfPermission(context, requiredPermission) == PackageManager.PERMISSION_GRANTED; } - public Boolean handleTorrentReadPermissionResult(int requestCode, int[] grantResults) { - if (requestCode == REQUEST_TORRENT_READ_PERMISSION) { - // Return permission granting result - return grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; - } - return null; - } - - public Boolean handleSettingsReadPermissionResult(int requestCode, int[] grantResults) { - if (requestCode == REQUEST_SETTINGS_READ_PERMISSION) { + public Boolean handleNotificationPermissionResult(int requestCode, int[] grantResults) { + if (requestCode == REQUEST_NOTIFICATIONS_PERMISSION) { // Return permission granting result return grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; } - return null; - } - - public Boolean handleSettingsWritePermissionResult(int requestCode, int[] grantResults) { - if (requestCode == REQUEST_SETTINGS_WRITE_PERMISSION) { - // Return permission granting result - return grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; - } - return null; + return false; } /** diff --git a/app/src/main/java/org/transdroid/core/gui/settings/NotificationSettingsActivity.java b/app/src/main/java/org/transdroid/core/gui/settings/NotificationSettingsActivity.java index 5495b7af..a64208f5 100644 --- a/app/src/main/java/org/transdroid/core/gui/settings/NotificationSettingsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/settings/NotificationSettingsActivity.java @@ -21,6 +21,7 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.androidannotations.annotations.Bean; @@ -28,12 +29,15 @@ import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.OptionsItem; import org.transdroid.R; import org.transdroid.core.app.settings.NotificationSettings; +import org.transdroid.core.gui.navigation.NavigationHelper; import org.transdroid.core.service.RssCheckerJob; import org.transdroid.core.service.ServerCheckerJob; @EActivity public class NotificationSettingsActivity extends PreferenceCompatActivity implements OnSharedPreferenceChangeListener { + @Bean + protected NavigationHelper navigationHelper; @Bean protected NotificationSettings notificationSettings; @@ -45,9 +49,19 @@ public class NotificationSettingsActivity extends PreferenceCompatActivity imple // Load the notification-related preferences from XML and update availability thereof addPreferencesFromResource(R.xml.pref_notifications); - boolean disabled = !notificationSettings.isEnabledForRss() && !notificationSettings.isEnabledForTorrents(); - updatePrefsEnabled(disabled); + updatePrefsEnabled(); + + } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (navigationHelper.handleNotificationPermissionResult(requestCode, grantResults)) { + // Now that we have permission, schedule the jobs + ServerCheckerJob.schedule(getApplicationContext()); + RssCheckerJob.schedule(getApplicationContext()); + updatePrefsEnabled(); + } } @Override @@ -76,11 +90,18 @@ public class NotificationSettingsActivity extends PreferenceCompatActivity imple @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + boolean needsPermission = notificationSettings.isEnabledForRss() || notificationSettings.isEnabledForTorrents(); + if (needsPermission && !navigationHelper.checkOrRequestNotificationPermission(this)) { + return; + } + // Already have permission to show notifications, so update the jobs now ServerCheckerJob.schedule(getApplicationContext()); RssCheckerJob.schedule(getApplicationContext()); + updatePrefsEnabled(); } - private void updatePrefsEnabled(boolean disabled) { + private void updatePrefsEnabled() { + boolean disabled = !notificationSettings.isEnabledForRss() && !notificationSettings.isEnabledForTorrents(); findPreference("notifications_interval").setEnabled(!disabled); findPreference("notifications_sound").setEnabled(!disabled); findPreference("notifications_vibrate").setEnabled(!disabled); diff --git a/app/src/main/java/org/transdroid/core/gui/settings/SystemSettingsActivity.java b/app/src/main/java/org/transdroid/core/gui/settings/SystemSettingsActivity.java index 0a12c99f..86401617 100644 --- a/app/src/main/java/org/transdroid/core/gui/settings/SystemSettingsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/settings/SystemSettingsActivity.java @@ -24,6 +24,7 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.text.TextUtils; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceManager; @@ -64,6 +65,7 @@ public class SystemSettingsActivity extends PreferenceCompatActivity { protected ErrorLogSender errorLogSender; @Bean protected SettingsPersistence settingsPersistence; + private OnPreferenceClickListener onImportSettingsClick = preference -> { showDialog(DIALOG_IMPORTSETTINGS); return true; @@ -73,7 +75,10 @@ public class SystemSettingsActivity extends PreferenceCompatActivity { return true; }; private OnPreferenceClickListener onCheckUpdatesClick = preference -> { - AppUpdateJob.schedule(getApplicationContext()); + if (!navigationHelper.checkOrRequestNotificationPermission(this)) { + // Already have permission: continue + AppUpdateJob.schedule(getApplicationContext()); + } return true; }; private OnPreferenceClickListener onClearSearchClick = preference -> { @@ -137,6 +142,15 @@ public class SystemSettingsActivity extends PreferenceCompatActivity { MainSettingsActivity_.intent(this).flags(Intent.FLAG_ACTIVITY_CLEAR_TOP).start(); } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (navigationHelper.handleNotificationPermissionResult(requestCode, grantResults)) { + // Now that we have permission, schedule the job + AppUpdateJob.schedule(getApplicationContext()); + } + } + private void importSettingsFromFile() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a9b77ea5..e6a34d46 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -462,9 +462,7 @@ 86400 - Transdroid requires read access to your file storage in order to read local .torrent files - Transdroid requires read access to your file storage if you want to read from a local settings file - Transdroid requires write access to your file storage to write the local settings file + Transdroid requires permission if you want to receive notifications Error during communication; check your connection Your torrent client does not support this operation