Skip to content

Commit b0dd19c

Browse files
committed
Abstract permissions
1 parent 787dc1e commit b0dd19c

File tree

15 files changed

+189
-81
lines changed

15 files changed

+189
-81
lines changed

composeApp/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ kotlin {
8888
androidMain.dependencies {
8989
implementation(compose.preview)
9090
implementation(libs.bundles.android)
91+
implementation(libs.bundles.mobile)
9192
}
9293
commonMain {
9394
dependencies {
@@ -112,6 +113,7 @@ kotlin {
112113
}
113114
iosMain.dependencies {
114115
implementation(libs.sqldelight.native)
116+
implementation(libs.bundles.mobile)
115117
}
116118
val desktopMain by getting {
117119
dependencies {

composeApp/src/androidMain/kotlin/org/ooni/probe/AndroidApplication.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,11 @@ class AndroidApplication : Application() {
9090
)
9191
}
9292

93-
private fun readAssetFile(path: String) =
94-
assets.open(path).bufferedReader().use { it.readText() }
93+
private fun readAssetFile(path: String) = assets.open(path).bufferedReader().use { it.readText() }
9594

9695
private val connectivityManager get() = getSystemService(ConnectivityManager::class.java)
9796

98-
private fun buildDatabaseDriver(): SqlDriver =
99-
AndroidSqliteDriver(Database.Schema, this, "v2.db")
97+
private fun buildDatabaseDriver(): SqlDriver = AndroidSqliteDriver(Database.Schema, this, "v2.db")
10098

10199
private fun buildDataStore(): DataStore<Preferences> =
102100
Dependencies.getDataStore(
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.ooni.probe.ui.shared
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.remember
5+
import dev.icerock.moko.permissions.DeniedAlwaysException
6+
import dev.icerock.moko.permissions.DeniedException
7+
import dev.icerock.moko.permissions.RequestCanceledException
8+
import dev.icerock.moko.permissions.compose.BindEffect
9+
import dev.icerock.moko.permissions.compose.PermissionsControllerFactory
10+
import dev.icerock.moko.permissions.compose.rememberPermissionsControllerFactory
11+
import dev.icerock.moko.permissions.notifications.REMOTE_NOTIFICATION
12+
13+
@Composable
14+
actual fun buildPermissionsController(): PermissionsController {
15+
val mokoFactory: PermissionsControllerFactory = rememberPermissionsControllerFactory()
16+
val mokoController = remember(mokoFactory) { mokoFactory.createPermissionsController() }
17+
BindEffect(mokoController)
18+
val controller = remember(mokoController) {
19+
object : PermissionsController {
20+
override suspend fun providePermission(permission: Permission) {
21+
try {
22+
mokoController.providePermission(
23+
when (permission) {
24+
Permission.RemoteNotification ->
25+
dev.icerock.moko.permissions.Permission.REMOTE_NOTIFICATION
26+
},
27+
)
28+
} catch (e: DeniedException) {
29+
throw PermissionDeniedException()
30+
} catch (e: DeniedAlwaysException) {
31+
throw PermissionDeniedAlwaysException()
32+
} catch (e: RequestCanceledException) {
33+
throw PermissionRequestCanceledException()
34+
}
35+
}
36+
}
37+
}
38+
return controller
39+
}

composeApp/src/commonMain/kotlin/org/ooni/probe/shared/PlatformInfo.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ data class PlatformInfo(
1515
enum class Platform {
1616
Android,
1717
Ios,
18-
Desktop;
18+
Desktop,
19+
;
1920

2021
val value
2122
get() = when (this) {

composeApp/src/commonMain/kotlin/org/ooni/probe/ui/onboarding/OnboardingScreen.kt

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ import androidx.compose.ui.platform.testTag
4747
import androidx.compose.ui.text.style.TextAlign
4848
import androidx.compose.ui.unit.dp
4949
import androidx.compose.ui.window.DialogProperties
50+
import co.touchlab.kermit.Logger
5051
import kotlinx.coroutines.CoroutineScope
52+
import kotlinx.coroutines.launch
5153
import ooniprobe.composeapp.generated.resources.Modal_Autorun_BatteryOptimization_Onboarding
5254
import ooniprobe.composeapp.generated.resources.Modal_Cancel
5355
import ooniprobe.composeapp.generated.resources.Modal_EnableNotifications_Paragraph
@@ -83,6 +85,11 @@ import org.jetbrains.compose.resources.painterResource
8385
import org.jetbrains.compose.resources.stringResource
8486
import org.ooni.probe.config.OrganizationConfig
8587
import org.ooni.probe.ui.shared.MarkdownViewer
88+
import org.ooni.probe.ui.shared.Permission
89+
import org.ooni.probe.ui.shared.PermissionDeniedAlwaysException
90+
import org.ooni.probe.ui.shared.PermissionDeniedException
91+
import org.ooni.probe.ui.shared.PermissionRequestCanceledException
92+
import org.ooni.probe.ui.shared.buildPermissionsController
8693
import org.ooni.probe.ui.shared.isHeightCompact
8794
import org.ooni.probe.ui.theme.LocalCustomColors
8895

@@ -282,7 +289,10 @@ fun ColumnScope.AutomatedTestingStep(
282289
Text(stringResource(Res.string.Modal_Cancel))
283290
}
284291
},
285-
properties = DialogProperties(dismissOnClickOutside = false, dismissOnBackPress = false),
292+
properties = DialogProperties(
293+
dismissOnClickOutside = false,
294+
dismissOnBackPress = false,
295+
),
286296
)
287297
}
288298
}
@@ -322,9 +332,7 @@ fun ColumnScope.CrashReportingStep(onEvent: (OnboardingViewModel.Event) -> Unit)
322332

323333
@Composable
324334
fun ColumnScope.RequestPermissionStep(onEvent: (OnboardingViewModel.Event) -> Unit) {
325-
// val factory: PermissionsControllerFactory = rememberPermissionsControllerFactory()
326-
// val controller = remember(factory) { factory.createPermissionsController() }
327-
// BindEffect(controller)
335+
val permissionsController = buildPermissionsController()
328336
val coroutineScope: CoroutineScope = rememberCoroutineScope()
329337

330338
OnboardingImage(OrganizationConfig.onboardingImages.image3)
@@ -351,26 +359,23 @@ fun ColumnScope.RequestPermissionStep(onEvent: (OnboardingViewModel.Event) -> Un
351359
OnboardingMainButton(
352360
text = Res.string.Onboarding_Crash_Button_Yes,
353361
onClick = {
354-
/*
355362
coroutineScope.launch {
356363
try {
357-
controller.providePermission(Permission.REMOTE_NOTIFICATION)
364+
permissionsController.providePermission(Permission.RemoteNotification)
358365
onEvent(OnboardingViewModel.Event.RequestNotificationsPermissionClicked)
359-
} catch (e: DeniedException) {
366+
} catch (e: PermissionDeniedException) {
360367
Logger.i("Permission denied")
361368
onEvent(OnboardingViewModel.Event.NextClicked)
362-
} catch (e: DeniedAlwaysException) {
369+
} catch (e: PermissionDeniedAlwaysException) {
363370
Logger.i("Permission already denied")
364371
onEvent(OnboardingViewModel.Event.NextClicked)
365-
} catch (e: RequestCanceledException) {
372+
} catch (e: PermissionRequestCanceledException) {
366373
Logger.i("Permission request cancelled")
367374
// Nothing to do here
368375
} catch (e: Exception) {
369376
Logger.e("Error requesting permission", e)
370377
}
371378
}
372-
*/
373-
onEvent(OnboardingViewModel.Event.RequestNotificationsPermissionClicked)
374379
},
375380
modifier = Modifier
376381
.padding(horizontal = 8.dp)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.ooni.probe.ui.shared
2+
3+
import androidx.compose.runtime.Composable
4+
5+
interface PermissionsController {
6+
@Throws(Exception::class)
7+
suspend fun providePermission(permission: Permission)
8+
}
9+
10+
@Composable
11+
expect fun buildPermissionsController(): PermissionsController
12+
13+
enum class Permission {
14+
RemoteNotification,
15+
}
16+
17+
abstract class PermissionException : Exception()
18+
19+
class PermissionDeniedException : PermissionException()
20+
21+
class PermissionDeniedAlwaysException : PermissionException()
22+
23+
class PermissionRequestCanceledException : PermissionException()

composeApp/src/desktopMain/kotlin/org/ooni/probe/dependencies.kt renamed to composeApp/src/desktopMain/kotlin/org/ooni/probe/BuildDependencies.kt

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,21 @@ val dependencies = Dependencies(
3939
startDescriptorsUpdate = ::startDescriptorsUpdate,
4040
launchAction = ::launchAction,
4141
batteryOptimization = object : BatteryOptimization {},
42+
isWebViewAvailable = ::isWebViewAvailable,
4243
flavorConfig = DesktopFlavorConfig(),
4344
)
4445

4546
// TODO: Desktop - PlatformInfo
46-
private fun buildPlatformInfo() = PlatformInfo(
47-
buildName = "1.0",
48-
buildNumber = "1",
49-
platform = Platform.Desktop,
50-
osVersion = "1.0",
51-
model = "model",
52-
needsToRequestNotificationsPermission = false,
53-
sentryDsn = "",
54-
)
47+
private fun buildPlatformInfo() =
48+
PlatformInfo(
49+
buildName = "1.0",
50+
buildNumber = "1",
51+
platform = Platform.Desktop,
52+
osVersion = "1.0",
53+
model = "model",
54+
needsToRequestNotificationsPermission = false,
55+
sentryDsn = "",
56+
)
5557

5658
private fun readAssetFile(path: String): String {
5759
// TODO: Desktop - readAssetFile
@@ -69,8 +71,7 @@ private fun buildDatabaseDriver(): JdbcSqliteDriver {
6971
private fun networkTypeFinder() = NetworkType.Wifi
7072

7173
// TODO: Desktop - Confirm appropriate path and configuration
72-
private fun buildDataStore() =
73-
PreferenceDataStoreFactory.create { "$BASE_FILES_DIR/probe.preferences_pb".toPath().toFile() }
74+
private fun buildDataStore() = PreferenceDataStoreFactory.create { "$BASE_FILES_DIR/probe.preferences_pb".toPath().toFile() }
7475

7576
private fun isBatteryCharging(): Boolean {
7677
// TODO: Desktop - isBatteryCharging
@@ -105,6 +106,11 @@ private fun launchAction(action: PlatformAction): Boolean {
105106
return true
106107
}
107108

109+
private fun isWebViewAvailable(): Boolean {
110+
// TODO: Desktop - isWebViewAvailable
111+
return true
112+
}
113+
108114
private class DesktopFlavorConfig : FlavorConfigInterface {
109115
override val optionalFeatures = setOf(OptionalFeature.CrashReporting)
110116
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.ooni.probe
2+
3+
import androidx.compose.ui.window.Window
4+
import androidx.compose.ui.window.application
5+
6+
fun main() {
7+
application {
8+
Window(
9+
onCloseRequest = ::exitApplication,
10+
title = "GoDesktop",
11+
) {
12+
App(
13+
dependencies = dependencies,
14+
deepLink = null,
15+
onDeeplinkHandled = {},
16+
)
17+
}
18+
}
19+
}

composeApp/src/desktopMain/kotlin/org/ooni/probe/main.kt

Lines changed: 0 additions & 38 deletions
This file was deleted.

composeApp/src/desktopMain/kotlin/org/ooni/probe/ui/shared/OoniWebView.desktop.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ import androidx.compose.ui.Modifier
77
actual fun OoniWebView(
88
controller: OoniWebViewController,
99
modifier: Modifier,
10-
allowedDomains: List<String>
10+
allowedDomains: List<String>,
1111
) {
1212
}

0 commit comments

Comments
 (0)