* fix(#65): request POST_NOTIFICATIONS runtime permission on Android 13+ On API 33+ the manifest declaration alone is not enough — the app must request POST_NOTIFICATIONS via ActivityResultContracts.RequestPermission at runtime before it can show any notification, including the foreground service notification from ChatNotificationService. - Added rememberLauncherForActivityResult for POST_NOTIFICATIONS - Added LaunchedEffect(Unit) that fires the permission request on first composition when running on API 33+ and permission is not yet granted - The next lifecycle event (ON_STOP → NotificationHelper.start) picks up the permission if granted * fix: add missing import android.os.Build for POST_NOTIFICATIONS permission check * fix: add missing import for rememberLauncherForActivityResult (androidx.activity.compose) --------- Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
1 parent
27a896c634
commit
cc52442be3
1 file changed
+24
@@ -1,5 +1,8 @@
|
|||||||
package com.m57.hermescontrol.ui.chat
|
package com.m57.hermescontrol.ui.chat
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.animateContentSize
|
import androidx.compose.animation.animateContentSize
|
||||||
import androidx.compose.animation.core.LinearEasing
|
import androidx.compose.animation.core.LinearEasing
|
||||||
@@ -85,6 +88,7 @@ import androidx.compose.ui.text.font.FontWeight
|
|||||||
import androidx.compose.ui.text.input.ImeAction
|
import androidx.compose.ui.text.input.ImeAction
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
import com.m57.hermescontrol.notification.NotificationHelper
|
import com.m57.hermescontrol.notification.NotificationHelper
|
||||||
@@ -136,6 +140,26 @@ fun ChatScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Request POST_NOTIFICATIONS runtime permission on Android 13+ (API 33).
|
||||||
|
// The manifest declaration alone is insufficient — on API 33+ the system
|
||||||
|
// requires a runtime permission prompt before the app can post any
|
||||||
|
// notification, including the foreground service notification.
|
||||||
|
val requestNotificationPermission =
|
||||||
|
rememberLauncherForActivityResult(
|
||||||
|
contract = ActivityResultContracts.RequestPermission(),
|
||||||
|
) { /* granted — next lifecycle event will pick it up */ }
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
val permission = android.Manifest.permission.POST_NOTIFICATIONS
|
||||||
|
if (
|
||||||
|
ContextCompat.checkSelfPermission(context, permission) !=
|
||||||
|
android.content.pm.PackageManager.PERMISSION_GRANTED
|
||||||
|
) {
|
||||||
|
requestNotificationPermission.launch(permission)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Auto-scroll to bottom on new messages
|
// Auto-scroll to bottom on new messages
|
||||||
LaunchedEffect(state.messages.size, state.currentStreamingText) {
|
LaunchedEffect(state.messages.size, state.currentStreamingText) {
|
||||||
if (state.messages.isNotEmpty()) {
|
if (state.messages.isNotEmpty()) {
|
||||||
|
|||||||
Reference in new issue
Block a user