diff options
author | Daniel Lublin <daniel@lublin.se> | 2023-09-02 12:22:06 +0300 |
---|---|---|
committer | Daniel Lublin <daniel@lublin.se> | 2023-09-02 12:26:35 +0300 |
commit | c66076442af14b72923466d2c98d71c1284c4a28 (patch) | |
tree | 31b4e5a3183ba5375ada6c722cc41293ca2c5c4b | |
parent | 03f3977b81381c18ccfc2cbb7bbc262932342de2 (diff) |
Request permission to send notifications on Android 13
The use of shouldShowRequestPermissionRational() makes Mumla ask for the
POST_NOTIFICATIONS permission 2 times, and then not again. The
mPermPostNotificationsAsked variable makes it so that the 2nd time will
take place after a complete restart of Mumla. Seems good. Noting that I
don't see any "Never ask again" button in the dialog, which I kind of
expected.
-rw-r--r-- | app/src/main/AndroidManifest.xml | 1 | ||||
-rw-r--r-- | app/src/main/java/se/lublin/mumla/app/MumlaActivity.java | 81 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 1 |
3 files changed, 62 insertions, 21 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8443c08..6613f90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,7 @@ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> + <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <queries> <!-- We're using guardianproject's OrbotHelper to check if Orbot is installed --> diff --git a/app/src/main/java/se/lublin/mumla/app/MumlaActivity.java b/app/src/main/java/se/lublin/mumla/app/MumlaActivity.java index a33ed11..a9681ae 100644 --- a/app/src/main/java/se/lublin/mumla/app/MumlaActivity.java +++ b/app/src/main/java/se/lublin/mumla/app/MumlaActivity.java @@ -29,6 +29,7 @@ import android.content.res.Configuration; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.media.AudioManager; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; @@ -122,7 +123,9 @@ public class MumlaActivity extends AppCompatActivity implements ListView.OnItemC private DrawerAdapter mDrawerAdapter; private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 1; + private static final int PERMISSIONS_REQUEST_POST_NOTIFICATIONS = 2; private Server mServerPendingPerm = null; + private boolean mPermPostNotificationsAsked = false; private ProgressDialog mConnectingDialog; private AlertDialog mErrorDialog; @@ -541,18 +544,39 @@ public class MumlaActivity extends AppCompatActivity implements ListView.OnItemC } public void connectToServer(final Server server) { - mServerPendingPerm = null; + mServerPendingPerm = server; + connectToServerWithPerm(); + } + public void connectToServerWithPerm() { if (ContextCompat.checkSelfPermission(MumlaActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MumlaActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO); - mServerPendingPerm = server; return; } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !mPermPostNotificationsAsked) { + if (ContextCompat.checkSelfPermission(MumlaActivity.this, + Manifest.permission.POST_NOTIFICATIONS) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(MumlaActivity.this, + new String[]{Manifest.permission.POST_NOTIFICATIONS}, + PERMISSIONS_REQUEST_POST_NOTIFICATIONS); + return; + } + } + + if (mServerPendingPerm == null) { + Log.w(TAG, "No pending server after getting permissions"); + return; + } + + Server server = mServerPendingPerm; + mServerPendingPerm = null; + // Check if we're already connected to a server; if so, inform user. if(mService != null && mService.isConnected()) { AlertDialog.Builder adb = new AlertDialog.Builder(this); @@ -599,6 +623,40 @@ public class MumlaActivity extends AppCompatActivity implements ListView.OnItemC connectTask.execute(server); } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (grantResults.length == 0) { + return; + } + + switch (requestCode) { + case PERMISSIONS_REQUEST_RECORD_AUDIO: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + connectToServerWithPerm(); + } else { + Toast.makeText(MumlaActivity.this, getString(R.string.grant_perm_microphone), + Toast.LENGTH_LONG).show(); + } + break; + case PERMISSIONS_REQUEST_POST_NOTIFICATIONS: + mPermPostNotificationsAsked = true; + if (grantResults[0] == PackageManager.PERMISSION_DENIED) { + // This is inspired by https://stackoverflow.com/a/34612503 + if (ActivityCompat.shouldShowRequestPermissionRationale(MumlaActivity.this, + Manifest.permission.POST_NOTIFICATIONS)) { + Toast.makeText(MumlaActivity.this, + getString(R.string.grant_perm_notifications), Toast.LENGTH_LONG).show(); + } + } + connectToServerWithPerm(); + break; + } + } + private boolean isPortOpen(final String host, final int port, final int timeout) { final AtomicBoolean open = new AtomicBoolean(false); try { @@ -624,25 +682,6 @@ public class MumlaActivity extends AppCompatActivity implements ListView.OnItemC } return false; } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - if (mServerPendingPerm != null) { - connectToServer(mServerPendingPerm); - } else { - Log.w(TAG, "No pending server after record audio permission was granted"); - } - } else { - Toast.makeText(MumlaActivity.this, getString(R.string.grant_perm_microphone), - Toast.LENGTH_LONG).show(); - } - } - } - public void connectToPublicServer(final PublicServer server) { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 78829f2..1f188c5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,6 +196,7 @@ <string name="shout_target">Shouting to %s</string> <string name="shout_configure">Configure Voice Target</string> <string name="grant_perm_microphone">Please grant microphone permission.</string> + <string name="grant_perm_notifications">Please grant permission to send notifications.</string> <string name="grant_perm_storage">Please grant external storage permission.</string> <string name="grant_perm_draw_over_apps">Please grant permission to display over other apps.</string> <string name="orbot_not_installed">The Orbot app is not installed. Not using Tor.</string> |