Commit c8233083 by Aleksandr

Added requesting for notifications on details screen

parent 46b4ce28
...@@ -11,6 +11,7 @@ import androidx.annotation.StringDef ...@@ -11,6 +11,7 @@ import androidx.annotation.StringDef
Argument.ID, Argument.ID,
Argument.INFO, Argument.INFO,
Argument.MARKER, Argument.MARKER,
Argument.HAS_NOTIFICATION_PERMISSION,
) )
annotation class Argument { annotation class Argument {
companion object { companion object {
...@@ -22,5 +23,6 @@ annotation class Argument { ...@@ -22,5 +23,6 @@ annotation class Argument {
const val INFO = "INFO" const val INFO = "INFO"
const val MARKER = "MARKER" const val MARKER = "MARKER"
const val DISTANCE = "DISTANCE" const val DISTANCE = "DISTANCE"
const val HAS_NOTIFICATION_PERMISSION = "HAS_NOTIFICATION_PERMISSION"
} }
} }
...@@ -10,6 +10,7 @@ import com.isidroid.c23.data.mapper.createListItem ...@@ -10,6 +10,7 @@ import com.isidroid.c23.data.mapper.createListItem
import com.isidroid.c23.domain.dto.PrintJobListItem import com.isidroid.c23.domain.dto.PrintJobListItem
import com.isidroid.c23.ext.getPrintJobStatus import com.isidroid.c23.ext.getPrintJobStatus
import com.isidroid.c23.ext.getPrintJobStatusColor import com.isidroid.c23.ext.getPrintJobStatusColor
import com.isidroid.c23.ext.hasNotificationPermission
import com.isidroid.c23.ext.isDebug import com.isidroid.c23.ext.isDebug
import com.isidroid.core.FlowResult import com.isidroid.core.FlowResult
import com.isidroid.job.repository.JobRepository import com.isidroid.job.repository.JobRepository
...@@ -41,6 +42,9 @@ class DetailsUseCase @Inject constructor( ...@@ -41,6 +42,9 @@ class DetailsUseCase @Inject constructor(
throw NoLocationPermissionException() throw NoLocationPermissionException()
} }
val hasNotificationPermission = context.hasNotificationPermission
val job = jobRepository.readLocalList(ids = listOf(id)).firstOrNull() ?: throw JobNotFoundException() val job = jobRepository.readLocalList(ids = listOf(id)).firstOrNull() ?: throw JobNotFoundException()
val richSpot = spotRepository.findLocalRichSpots(ids = listOf(job.spotId))?.firstOrNull() val richSpot = spotRepository.findLocalRichSpots(ids = listOf(job.spotId))?.firstOrNull()
...@@ -77,7 +81,8 @@ class DetailsUseCase @Inject constructor( ...@@ -77,7 +81,8 @@ class DetailsUseCase @Inject constructor(
Argument.LATITUDE to location.first, Argument.LATITUDE to location.first,
Argument.LONGITUDE to location.second, Argument.LONGITUDE to location.second,
Argument.MARKER to mapMarker, Argument.MARKER to mapMarker,
Argument.DISTANCE to distance Argument.DISTANCE to distance,
Argument.HAS_NOTIFICATION_PERMISSION to hasNotificationPermission
) )
) )
) )
......
package com.isidroid.c23.ui.screen.content package com.isidroid.c23.ui.screen.content
import android.Manifest import android.Manifest
import android.os.Build
import android.widget.Toast import android.widget.Toast
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
...@@ -75,7 +76,10 @@ fun ContentScreen( ...@@ -75,7 +76,10 @@ fun ContentScreen(
LaunchedEffect(state.value.documentHash) { if (state.value.documentHash != null) launcher.launch("application/pdf") } LaunchedEffect(state.value.documentHash) { if (state.value.documentHash != null) launcher.launch("application/pdf") }
LaunchedEffect(state.value.wordHash) { if (state.value.wordHash != null) launcher.launch("application/msword") } LaunchedEffect(state.value.wordHash) { if (state.value.wordHash != null) launcher.launch("application/msword") }
LaunchedEffect(state.value.documentTreeHash) { if (state.value.documentTreeHash != null) openDocumentTreeLauncher.launch(null) } LaunchedEffect(state.value.documentTreeHash) { if (state.value.documentTreeHash != null) openDocumentTreeLauncher.launch(null) }
LaunchedEffect("not_perm_${state.value.hasNotificationPermission}") { if (state.value.hasNotificationPermission == false) notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) } LaunchedEffect("not_perm_${state.value.hasNotificationPermission}") {
if (state.value.hasNotificationPermission == false && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
LaunchedEffect(SIDE_EFFECTS_KEY) { LaunchedEffect(SIDE_EFFECTS_KEY) {
......
...@@ -52,7 +52,9 @@ class ContentViewModel @Inject constructor( ...@@ -52,7 +52,9 @@ class ContentViewModel @Inject constructor(
} }
private suspend fun create() { private suspend fun create() {
useCase.create().flowOn(Dispatchers.IO).collect { useCase.create()
.flowOn(Dispatchers.IO)
.collect {
val (data, hasPermission) = it val (data, hasPermission) = it
if (data == null) if (data == null)
......
package com.isidroid.c23.ui.screen.details package com.isidroid.c23.ui.screen.details
import com.isidroid.c23.domain.dto.PrintJobListItem import com.isidroid.c23.domain.dto.PrintJobListItem
import com.isidroid.c23.ui.screen.content.ContentContract.Event
import com.isidroid.core.vm.ViewEvent import com.isidroid.core.vm.ViewEvent
import com.isidroid.core.vm.ViewSideEffect import com.isidroid.core.vm.ViewSideEffect
import com.isidroid.core.vm.ViewState import com.isidroid.core.vm.ViewState
...@@ -12,6 +13,8 @@ class JobDetailsContract { ...@@ -12,6 +13,8 @@ class JobDetailsContract {
data object DismissBuildRouteConfirmation: Event data object DismissBuildRouteConfirmation: Event
data object OpenNavigationApp: Event data object OpenNavigationApp: Event
data object LocationPermissionGranted: Event data object LocationPermissionGranted: Event
data object CheckNotificationPermission : Event
} }
sealed interface Effect : ViewSideEffect { sealed interface Effect : ViewSideEffect {
...@@ -31,5 +34,7 @@ class JobDetailsContract { ...@@ -31,5 +34,7 @@ class JobDetailsContract {
val distance: String? = null, val distance: String? = null,
val renderProgress: Pair<Int, Int>? = null, val renderProgress: Pair<Int, Int>? = null,
val uploadProgress: Pair<Int, Int>? = null, val uploadProgress: Pair<Int, Int>? = null,
val hasNotificationPermission: Boolean? = null,
) : ViewState ) : ViewState
} }
\ No newline at end of file
package com.isidroid.c23.ui.screen.details package com.isidroid.c23.ui.screen.details
import android.Manifest
import android.os.Build
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.isidroid.c23.ui.screen.content.ContentContract
import com.isidroid.c23.ui.screen.details.component.DetailsV2 import com.isidroid.c23.ui.screen.details.component.DetailsV2
import com.isidroid.c23.ui.screen.map._components.RequestLocationPermissionComponent import com.isidroid.c23.ui.screen.map._components.RequestLocationPermissionComponent
import com.isidroid.core.vm.SIDE_EFFECTS_KEY import com.isidroid.core.vm.SIDE_EFFECTS_KEY
...@@ -26,6 +31,15 @@ fun JobDetailsScreen( ...@@ -26,6 +31,15 @@ fun JobDetailsScreen(
onGranted = { onEventSent(JobDetailsContract.Event.LocationPermissionGranted) } onGranted = { onEventSent(JobDetailsContract.Event.LocationPermissionGranted) }
) )
val notificationLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) {
onEventSent(JobDetailsContract.Event.CheckNotificationPermission)
}
LaunchedEffect("not_perm_${state.value.hasNotificationPermission}") {
if (state.value.hasNotificationPermission == false && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
LaunchedEffect(SIDE_EFFECTS_KEY) { LaunchedEffect(SIDE_EFFECTS_KEY) {
effectFlow?.collect { effect -> effectFlow?.collect { effect ->
when (effect) { when (effect) {
......
...@@ -52,6 +52,7 @@ class JobDetailsViewModel @Inject constructor( ...@@ -52,6 +52,7 @@ class JobDetailsViewModel @Inject constructor(
JobDetailsContract.Event.DismissBuildRouteConfirmation -> setState { copy(routeConfirmationVisible = false) } JobDetailsContract.Event.DismissBuildRouteConfirmation -> setState { copy(routeConfirmationVisible = false) }
JobDetailsContract.Event.OpenNavigationApp -> openNavigationApp() JobDetailsContract.Event.OpenNavigationApp -> openNavigationApp()
JobDetailsContract.Event.LocationPermissionGranted -> locationPermissionGranted() JobDetailsContract.Event.LocationPermissionGranted -> locationPermissionGranted()
JobDetailsContract.Event.CheckNotificationPermission -> setState { copy(hasNotificationPermission = null) }
} }
} }
...@@ -94,17 +95,23 @@ class JobDetailsViewModel @Inject constructor( ...@@ -94,17 +95,23 @@ class JobDetailsViewModel @Inject constructor(
lat = res.result[Argument.LATITUDE] as? Double, lat = res.result[Argument.LATITUDE] as? Double,
lng = res.result[Argument.LONGITUDE] as? Double, lng = res.result[Argument.LONGITUDE] as? Double,
mapMarker = res.result[Argument.MARKER] as? MapMarker, mapMarker = res.result[Argument.MARKER] as? MapMarker,
distance = res.result[Argument.DISTANCE] as? String distance = res.result[Argument.DISTANCE] as? String,
hasNotificationPermission = res.result[Argument.HAS_NOTIFICATION_PERMISSION] as? Boolean
) )
} }
} }
} }
private suspend fun onDetails(item: PrintJobListItem?, lat: Double?, lng: Double?, mapMarker: MapMarker?, distance: String?) { private suspend fun onDetails(item: PrintJobListItem?,
lat: Double?,
lng: Double?,
mapMarker: MapMarker?,
distance: String?,
hasNotificationPermission: Boolean?) {
val myLocation = MapMarker(id = "my_location", lat = lat ?: 0.0, lng = lng ?: 0.0, name = "My location", imageVector = Icons.Outlined.AccountCircle) val myLocation = MapMarker(id = "my_location", lat = lat ?: 0.0, lng = lng ?: 0.0, name = "My location", imageVector = Icons.Outlined.AccountCircle)
_spotResultStateFlow.emit(listOfNotNull(mapMarker, myLocation)) _spotResultStateFlow.emit(listOfNotNull(mapMarker, myLocation))
setState { copy(isLoading = false, printJob = item, lat = lat, lng = lng, distance = distance) } setState { copy(isLoading = false, printJob = item, lat = lat, lng = lng, distance = distance, hasNotificationPermission = hasNotificationPermission) }
} }
private fun openNavigationApp() { private fun openNavigationApp() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment