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:excludeFromRecents="true"
android:label="" android:label=""
android:name="io.github.sspanak.tt9.ui.dialogs.RequestPermissionDialog" android:name="io.github.sspanak.tt9.ui.dialogs.RequestPermissionDialog"
android:theme="@style/TTheme.Preferences" /> android:theme="@style/TTheme.AddWord" />
</application> </application>
</manifest> </manifest>

View file

@ -1,5 +1,6 @@
package io.github.sspanak.tt9.ime; package io.github.sspanak.tt9.ime;
import android.Manifest;
import android.app.Dialog; import android.app.Dialog;
import android.content.Intent; import android.content.Intent;
import android.os.Handler; 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.UI;
import io.github.sspanak.tt9.ui.dialogs.ChangeLanguageDialog; import io.github.sspanak.tt9.ui.dialogs.ChangeLanguageDialog;
import io.github.sspanak.tt9.ui.dialogs.PopupDialog; 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.Logger;
import io.github.sspanak.tt9.util.sys.DeviceInfo;
import io.github.sspanak.tt9.util.sys.SystemSettings; import io.github.sspanak.tt9.util.sys.SystemSettings;
public class TraditionalT9 extends MainViewHandler { public class TraditionalT9 extends MainViewHandler {
@ -175,6 +178,8 @@ public class TraditionalT9 extends MainViewHandler {
DictionaryLoader.autoLoad(this, mLanguage); DictionaryLoader.autoLoad(this, mLanguage);
} }
askForNotifications();
return true; 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. * 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. * 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; package io.github.sspanak.tt9.ime;
import android.Manifest;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.ime.voice.VoiceInputError; import io.github.sspanak.tt9.ime.voice.VoiceInputError;
import io.github.sspanak.tt9.ime.voice.VoiceInputOps; 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); Logger.e(LOG_TAG, "Failed to listen. " + error.debugMessage);
statusBar.setError(error.toString()); statusBar.setError(error.toString());
if (error.isNoPermission()) { 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 androidx.appcompat.app.AppCompatDelegate;
import io.github.sspanak.tt9.BuildConfig;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.util.Logger; import io.github.sspanak.tt9.util.Logger;
import io.github.sspanak.tt9.util.sys.DeviceInfo; 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); 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() { public boolean isStatusIconEnabled() {
return prefs.getBoolean("pref_status_icon", DeviceInfo.IS_QIN_F21 || !DeviceInfo.noKeyboard(context)); 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.R;
import io.github.sspanak.tt9.ime.TraditionalT9; 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.ui.UI;
import io.github.sspanak.tt9.util.sys.Permissions; import io.github.sspanak.tt9.util.sys.Permissions;
public class RequestPermissionDialog extends AppCompatActivity { public class RequestPermissionDialog extends AppCompatActivity {
public static final String PARAMETER_PERMISSION = "tt9.popup_dialog.parameter.permission";
private final Permissions permissions; private final Permissions permissions;
public RequestPermissionDialog() { public RequestPermissionDialog() {
super(); super();
permissions = new Permissions(this); permissions = new Permissions(this);
} }
@Override @Override
protected void onCreate(Bundle savedData) { protected void onCreate(Bundle savedData) {
super.onCreate(savedData); super.onCreate(savedData);
render(getPermission());
}
// currently there is only one permission to request, so we don't ovecomplicate it @Override
permissions.requestRecordAudio(); public void finish() {
super.finish();
reviveMain();
} }
@Override @Override
@ -35,9 +44,9 @@ public class RequestPermissionDialog extends AppCompatActivity {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
showPermissionRequiredMessage(permissions, grantResults); showPermissionRequiredMessage(permissions, grantResults);
finish(); finish();
reviveMain();
} }
private void reviveMain() { private void reviveMain() {
Intent intent = new Intent(this, TraditionalT9.class); Intent intent = new Intent(this, TraditionalT9.class);
intent.putExtra(PopupDialog.INTENT_CLOSE, ""); 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) { if (permissions[0].equals(Manifest.permission.RECORD_AUDIO) && grantResults[0] == PackageManager.PERMISSION_DENIED) {
UI.toastLong(this, R.string.voice_input_mic_permission_is_needed); 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 intent = new Intent(ims, RequestPermissionDialog.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 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.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.putExtra(PARAMETER_PERMISSION, permission);
ims.startActivity(intent); 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() { public void requestRecordAudio() {
requestPermission(Manifest.permission.RECORD_AUDIO); requestPermission(Manifest.permission.RECORD_AUDIO);