1
0
Fork 0

now asking for notification permission on the very first start

This commit is contained in:
sspanak 2025-05-09 19:06:53 +03:00 committed by Dimo Karaivanov
parent c58a6d7a23
commit b802593f11
6 changed files with 71 additions and 7 deletions

View file

@ -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" />
</application>
</manifest>

View file

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

View file

@ -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);
}
}

View file

@ -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));
}

View file

@ -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);
}
}

View file

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