diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2a05daac..36ed2cff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -84,6 +84,6 @@ android:excludeFromRecents="true" android:label="" android:name="io.github.sspanak.tt9.ui.dialogs.RequestPermissionDialog" - android:theme="@style/TTheme.Preferences" /> + android:theme="@style/TTheme.AddWord" /> diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java index bd41c63d..022be18e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -1,5 +1,6 @@ package io.github.sspanak.tt9.ime; +import android.Manifest; import android.app.Dialog; import android.content.Intent; import android.os.Handler; @@ -22,7 +23,9 @@ import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.dialogs.ChangeLanguageDialog; import io.github.sspanak.tt9.ui.dialogs.PopupDialog; +import io.github.sspanak.tt9.ui.dialogs.RequestPermissionDialog; import io.github.sspanak.tt9.util.Logger; +import io.github.sspanak.tt9.util.sys.DeviceInfo; import io.github.sspanak.tt9.util.sys.SystemSettings; public class TraditionalT9 extends MainViewHandler { @@ -175,6 +178,8 @@ public class TraditionalT9 extends MainViewHandler { DictionaryLoader.autoLoad(this, mLanguage); } + askForNotifications(); + return true; } @@ -226,6 +231,14 @@ public class TraditionalT9 extends MainViewHandler { } + private void askForNotifications() { + if (DeviceInfo.AT_LEAST_ANDROID_13 && !InputModeKind.isPassthrough(mInputMode) && settings.shouldAskForNotifications()) { + settings.setNotificationsApproved(false); + RequestPermissionDialog.show(this, Manifest.permission.POST_NOTIFICATIONS); + } + } + + /** * On Android 11+ the IME is sometimes not killed when the user switches to a different one. * Here we attempt to detect if we are disabled, then hide and kill ourselves. diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/VoiceHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/VoiceHandler.java index fdca4f1f..2c2141b2 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/VoiceHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/VoiceHandler.java @@ -1,5 +1,7 @@ package io.github.sspanak.tt9.ime; +import android.Manifest; + import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.ime.voice.VoiceInputError; import io.github.sspanak.tt9.ime.voice.VoiceInputOps; @@ -90,7 +92,7 @@ abstract class VoiceHandler extends TypingHandler { Logger.e(LOG_TAG, "Failed to listen. " + error.debugMessage); statusBar.setError(error.toString()); if (error.isNoPermission()) { - RequestPermissionDialog.show(this); + RequestPermissionDialog.show(this, Manifest.permission.RECORD_AUDIO); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java index a47c1c08..742a09ac 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java @@ -6,6 +6,7 @@ import android.view.Gravity; import androidx.appcompat.app.AppCompatDelegate; +import io.github.sspanak.tt9.BuildConfig; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.util.Logger; import io.github.sspanak.tt9.util.sys.DeviceInfo; @@ -41,6 +42,17 @@ public class SettingsUI extends SettingsTyping { return prefs.getBoolean("add_word_no_confirmation", false); } + public boolean shouldAskForNotifications() { + return getStringifiedInt("pref_asked_for_notifications_version", 0) < BuildConfig.VERSION_CODE; + } + + public void setNotificationsApproved(boolean yes) { + prefsEditor.putString( + "pref_asked_for_notifications_version", + Integer.toString(yes ? Integer.MAX_VALUE : BuildConfig.VERSION_CODE) + ); + } + public boolean isStatusIconEnabled() { return prefs.getBoolean("pref_status_icon", DeviceInfo.IS_QIN_F21 || !DeviceInfo.noKeyboard(context)); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/RequestPermissionDialog.java b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/RequestPermissionDialog.java index f60aba82..0902b936 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/RequestPermissionDialog.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/RequestPermissionDialog.java @@ -11,23 +11,32 @@ import androidx.appcompat.app.AppCompatActivity; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.ime.TraditionalT9; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.util.sys.Permissions; public class RequestPermissionDialog extends AppCompatActivity { + public static final String PARAMETER_PERMISSION = "tt9.popup_dialog.parameter.permission"; + private final Permissions permissions; + public RequestPermissionDialog() { super(); permissions = new Permissions(this); } + @Override protected void onCreate(Bundle savedData) { super.onCreate(savedData); + render(getPermission()); + } - // currently there is only one permission to request, so we don't ovecomplicate it - permissions.requestRecordAudio(); + @Override + public void finish() { + super.finish(); + reviveMain(); } @Override @@ -35,9 +44,9 @@ public class RequestPermissionDialog extends AppCompatActivity { super.onRequestPermissionsResult(requestCode, permissions, grantResults); showPermissionRequiredMessage(permissions, grantResults); finish(); - reviveMain(); } + private void reviveMain() { Intent intent = new Intent(this, TraditionalT9.class); intent.putExtra(PopupDialog.INTENT_CLOSE, ""); @@ -52,13 +61,38 @@ public class RequestPermissionDialog extends AppCompatActivity { if (permissions[0].equals(Manifest.permission.RECORD_AUDIO) && grantResults[0] == PackageManager.PERMISSION_DENIED) { UI.toastLong(this, R.string.voice_input_mic_permission_is_needed); } + + if (permissions[0].equals(Manifest.permission.POST_NOTIFICATIONS)) { + new SettingsStore(this).setNotificationsApproved(grantResults[0] == PackageManager.PERMISSION_GRANTED); + } } - public static void show(InputMethodService ims) { + + @NonNull + private String getPermission() { + Intent i = getIntent(); + String permission = i != null ? i.getStringExtra(PARAMETER_PERMISSION) : ""; + return permission != null ? permission : ""; + } + + + private void render(@NonNull String permission) { + if (permission.equals(Manifest.permission.RECORD_AUDIO) && permissions.noRecordAudio()) { + permissions.requestRecordAudio(); + } else if (permission.equals(Manifest.permission.POST_NOTIFICATIONS) && permissions.noPostNotifications()) { + permissions.requestPostNotifications(); + } else { + finish(); + } + } + + + public static void show(InputMethodService ims, String permission) { Intent intent = new Intent(ims, RequestPermissionDialog.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + intent.putExtra(PARAMETER_PERMISSION, permission); ims.startActivity(intent); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/util/sys/Permissions.java b/app/src/main/java/io/github/sspanak/tt9/util/sys/Permissions.java index aa0acaf3..ec656eae 100644 --- a/app/src/main/java/io/github/sspanak/tt9/util/sys/Permissions.java +++ b/app/src/main/java/io/github/sspanak/tt9/util/sys/Permissions.java @@ -34,6 +34,9 @@ public class Permissions { } } + public boolean noRecordAudio() { + return DeviceInfo.AT_LEAST_ANDROID_6 && isRefused(Manifest.permission.RECORD_AUDIO); + } public void requestRecordAudio() { requestPermission(Manifest.permission.RECORD_AUDIO);