Commit c8233083 by Aleksandr

Added requesting for notifications on details screen

parent 46b4ce28
......@@ -11,6 +11,7 @@ import androidx.annotation.StringDef
Argument.ID,
Argument.INFO,
Argument.MARKER,
Argument.HAS_NOTIFICATION_PERMISSION,
)
annotation class Argument {
companion object {
......@@ -22,5 +23,6 @@ annotation class Argument {
const val INFO = "INFO"
const val MARKER = "MARKER"
const val DISTANCE = "DISTANCE"
const val HAS_NOTIFICATION_PERMISSION = "HAS_NOTIFICATION_PERMISSION"
}
}
......@@ -10,6 +10,7 @@ import com.isidroid.c23.data.mapper.createListItem
import com.isidroid.c23.domain.dto.PrintJobListItem
import com.isidroid.c23.ext.getPrintJobStatus
import com.isidroid.c23.ext.getPrintJobStatusColor
import com.isidroid.c23.ext.hasNotificationPermission
import com.isidroid.c23.ext.isDebug
import com.isidroid.core.FlowResult
import com.isidroid.job.repository.JobRepository
......@@ -41,6 +42,9 @@ class DetailsUseCase @Inject constructor(
throw NoLocationPermissionException()
}
val hasNotificationPermission = context.hasNotificationPermission
val job = jobRepository.readLocalList(ids = listOf(id)).firstOrNull() ?: throw JobNotFoundException()
val richSpot = spotRepository.findLocalRichSpots(ids = listOf(job.spotId))?.firstOrNull()
......@@ -77,7 +81,8 @@ class DetailsUseCase @Inject constructor(
Argument.LATITUDE to location.first,
Argument.LONGITUDE to location.second,
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
import android.Manifest
import android.os.Build
import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.activity.compose.rememberLauncherForActivityResult
......@@ -75,7 +76,10 @@ fun ContentScreen(
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.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) {
......
......@@ -52,7 +52,9 @@ class ContentViewModel @Inject constructor(
}
private suspend fun create() {
useCase.create().flowOn(Dispatchers.IO).collect {
useCase.create()
.flowOn(Dispatchers.IO)
.collect {
val (data, hasPermission) = it
if (data == null)
......
package com.isidroid.c23.ui.screen.details
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.ViewSideEffect
import com.isidroid.core.vm.ViewState
......@@ -12,6 +13,8 @@ class JobDetailsContract {
data object DismissBuildRouteConfirmation: Event
data object OpenNavigationApp: Event
data object LocationPermissionGranted: Event
data object CheckNotificationPermission : Event
}
sealed interface Effect : ViewSideEffect {
......@@ -31,5 +34,7 @@ class JobDetailsContract {
val distance: String? = null,
val renderProgress: Pair<Int, Int>? = null,
val uploadProgress: Pair<Int, Int>? = null,
val hasNotificationPermission: Boolean? = null,
) : ViewState
}
\ No newline at end of file
package com.isidroid.c23.ui.screen.details
import android.Manifest
import android.os.Build
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.LaunchedEffect
import androidx.compose.runtime.State
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.map._components.RequestLocationPermissionComponent
import com.isidroid.core.vm.SIDE_EFFECTS_KEY
......@@ -26,6 +31,15 @@ fun JobDetailsScreen(
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) {
effectFlow?.collect { effect ->
when (effect) {
......
......@@ -52,6 +52,7 @@ class JobDetailsViewModel @Inject constructor(
JobDetailsContract.Event.DismissBuildRouteConfirmation -> setState { copy(routeConfirmationVisible = false) }
JobDetailsContract.Event.OpenNavigationApp -> openNavigationApp()
JobDetailsContract.Event.LocationPermissionGranted -> locationPermissionGranted()
JobDetailsContract.Event.CheckNotificationPermission -> setState { copy(hasNotificationPermission = null) }
}
}
......@@ -94,17 +95,23 @@ class JobDetailsViewModel @Inject constructor(
lat = res.result[Argument.LATITUDE] as? Double,
lng = res.result[Argument.LONGITUDE] as? Double,
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)
_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() {
......
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