From 83df2e799e6b2d85a527b510b8877f1fcdb7337f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 15 Jan 2024 19:39:53 +0530 Subject: [PATCH] Request and respect notification settings Signed-off-by: Aayush Gupta --- .../relabs/service/PushNotificationService.kt | 2 + .../relabs/ui/screens/alerts/AlertsScreen.kt | 40 +++++++++++++++++++ .../res/drawable/ic_notifications_edit.xml | 11 +++++ 3 files changed, 53 insertions(+) create mode 100644 app/src/main/res/drawable/ic_notifications_edit.xml diff --git a/app/src/main/java/io/aayush/relabs/service/PushNotificationService.kt b/app/src/main/java/io/aayush/relabs/service/PushNotificationService.kt index 9a4bec6..e112686 100644 --- a/app/src/main/java/io/aayush/relabs/service/PushNotificationService.kt +++ b/app/src/main/java/io/aayush/relabs/service/PushNotificationService.kt @@ -9,6 +9,7 @@ import android.content.SharedPreferences import android.os.Build import android.util.Log import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.core.content.edit import com.google.firebase.messaging.FirebaseMessagingService @@ -72,6 +73,7 @@ class PushNotificationService : FirebaseMessagingService(), override fun onMessageReceived(message: RemoteMessage) { super.onMessageReceived(message) Log.i(TAG, "Got FCM push notification!") + if (!NotificationManagerCompat.from(this).areNotificationsEnabled()) return val pendingIntent = PendingIntent.getActivity( this, diff --git a/app/src/main/java/io/aayush/relabs/ui/screens/alerts/AlertsScreen.kt b/app/src/main/java/io/aayush/relabs/ui/screens/alerts/AlertsScreen.kt index afd31b0..4db4a80 100644 --- a/app/src/main/java/io/aayush/relabs/ui/screens/alerts/AlertsScreen.kt +++ b/app/src/main/java/io/aayush/relabs/ui/screens/alerts/AlertsScreen.kt @@ -1,5 +1,14 @@ package io.aayush.relabs.ui.screens.alerts +import android.Manifest +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.os.Build +import android.provider.Settings +import android.util.Log +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -11,6 +20,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastAny @@ -24,15 +34,29 @@ import io.aayush.relabs.ui.components.AlertItem import io.aayush.relabs.ui.components.MainTopAppBar import io.aayush.relabs.ui.navigation.Screen +private const val TAG = "AlertsScreen" + @Composable fun AlertsScreen( navHostController: NavHostController, viewModel: AlertsViewModel = hiltViewModel() ) { + val context = LocalContext.current val loading: Boolean by viewModel.loading.collectAsStateWithLifecycle() val alerts: List? by viewModel.alerts.collectAsStateWithLifecycle() val postInfo: PostInfo by viewModel.postInfo.collectAsStateWithLifecycle() + val permissionRequestLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission(), + onResult = { Log.i(TAG, "Notification permission: $it") } + ) + + LaunchedEffect(key1 = Unit) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + permissionRequestLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } + } + LaunchedEffect(key1 = postInfo) { if (postInfo.post.thread_id != 0) { navHostController.navigate(Screen.Thread.withID(postInfo.post.thread_id)) @@ -44,6 +68,12 @@ fun AlertsScreen( modifier = Modifier.fillMaxSize(), topBar = { MainTopAppBar(screen = Screen.Alerts, navHostController = navHostController) { + IconButton(onClick = { openNotificationSettings(context) }) { + Icon( + painter = painterResource(id = R.drawable.ic_notifications_edit), + contentDescription = "" + ) + } IconButton( onClick = { viewModel.markAllAlerts(read = true) }, enabled = alerts?.fastAny { it.read_date == 0 } == true @@ -81,3 +111,13 @@ fun AlertsScreen( } } } + +@SuppressLint("InlinedApi") +private fun openNotificationSettings(context: Context) { + val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { + putExtra("app_package", context.packageName) + putExtra("app_uid", context.applicationInfo.uid) + putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) + } + context.startActivity(intent) +} diff --git a/app/src/main/res/drawable/ic_notifications_edit.xml b/app/src/main/res/drawable/ic_notifications_edit.xml new file mode 100644 index 0000000..6182c90 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_edit.xml @@ -0,0 +1,11 @@ + + + +