From 0ed13f1247fb31471a8cb064a16f55615968b88c Mon Sep 17 00:00:00 2001 From: Alexander Kolmachikhin <“alexanderkolmachikhin@gmail.com”> Date: Tue, 6 Dec 2022 02:29:32 +0700 Subject: [PATCH 1/5] #54 add compose support --- README.md | 15 +++ build.gradle.kts | 1 + gradle/libs.versions.toml | 7 ++ permissions-compose/build.gradle.kts | 24 ++++ .../src/androidMain/AndroidManifest.xml | 2 + .../moko/permissions/compose/BindEffect.kt | 22 ++++ sample/compose-android-app/build.gradle.kts | 25 ++++ .../src/main/AndroidManifest.xml | 31 +++++ .../main/java/com/icerockdev/MainActivity.kt | 118 ++++++++++++++++++ .../com/icerockdev/library/SampleViewModel.kt | 2 +- settings.gradle.kts | 2 + 11 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 permissions-compose/build.gradle.kts create mode 100755 permissions-compose/src/androidMain/AndroidManifest.xml create mode 100644 permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt create mode 100644 sample/compose-android-app/build.gradle.kts create mode 100755 sample/compose-android-app/src/main/AndroidManifest.xml create mode 100644 sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt diff --git a/README.md b/README.md index 1599b3d..a056e23 100755 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ project **build.gradle** ```groovy dependencies { commonMainApi("dev.icerock.moko:permissions:0.13.0") + commonMainApi("dev.icerock.moko:permissions-compose:0.13.0") // permissions api + compose extensions commonTestImplementation("dev.icerock.moko:permissions-test:0.13.0") } ``` @@ -95,6 +96,20 @@ override fun onCreate(savedInstanceState: Bundle?) { } ``` +Compose: +```kotlin +@Composable +fun TestScreen() { + val viewModel = getViewModel { + // Pass the platform implementation of the permission controller to a common code. + ViewModel(PermissionsController()) + } + + // Binds the permissions controller to the LocalLifecycleOwner lifecycle. + BindEffect(viewModel.permissionsController) +} +``` + iOS: ```swift // Just pass the platform implementation of the permission controller to a common code. diff --git a/build.gradle.kts b/build.gradle.kts index b27ad2e..28e770b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,6 +16,7 @@ buildscript { classpath(libs.mokoGradlePlugin) classpath(libs.mobileMultiplatformGradlePlugin) classpath(libs.kotlinSerializationGradlePlugin) + classpath(libs.composeJetBrainsGradlePlugin) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0e8fc84..9fb37c7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,16 +1,22 @@ [versions] kotlinVersion = "1.6.10" androidAppCompatVersion = "1.2.0" +composeCompilerVersion = "1.1.1" +composeMaterialVersion = "1.3.1" +composeActivityVersion = "1.6.1" materialDesignVersion = "1.0.0" androidLifecycleVersion = "2.1.0" androidCoreTestingVersion = "2.1.0" coroutinesVersion = "1.6.0-native-mt" mokoMvvmVersion = "0.12.0" mokoPermissionsVersion = "0.13.0" +composeJetBrainsVersion = "1.1.1" [libraries] appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } material = { module = "com.google.android.material:material", version.ref = "materialDesignVersion" } +composeMaterial = { module = "androidx.compose.material:material", version.ref = "composeMaterialVersion" } +composeActivity = { module = "androidx.activity:activity-compose", version.ref = "composeActivityVersion" } lifecycle = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "androidLifecycleVersion" } coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutinesVersion" } mokoMvvmCore = { module = "dev.icerock.moko:mvvm-core", version.ref = "mokoMvvmVersion" } @@ -26,3 +32,4 @@ firebaseGradlePlugin = { module = "com.google.firebase:firebase-crashlytics-grad mokoGradlePlugin = { module = "dev.icerock.moko:moko-gradle-plugin", version = "0.1.0" } mobileMultiplatformGradlePlugin = { module = "dev.icerock:mobile-multiplatform", version = "0.14.1" } kotlinSerializationGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlinVersion" } +composeJetBrainsGradlePlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "composeJetBrainsVersion" } diff --git a/permissions-compose/build.gradle.kts b/permissions-compose/build.gradle.kts new file mode 100644 index 0000000..5c371dd --- /dev/null +++ b/permissions-compose/build.gradle.kts @@ -0,0 +1,24 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("dev.icerock.moko.gradle.multiplatform.mobile") + id("dev.icerock.moko.gradle.publication") + id("dev.icerock.moko.gradle.stub.javadoc") + id("dev.icerock.moko.gradle.detekt") + id("dev.icerock.mobile.multiplatform.android-manifest") + id("org.jetbrains.compose") +} + +kotlin { + android() +} + +dependencies { + androidMainApi(projects.permissions) + androidMainApi(compose.runtime) + androidMainApi(libs.appCompat) + androidMainApi(libs.composeActivity) +} + diff --git a/permissions-compose/src/androidMain/AndroidManifest.xml b/permissions-compose/src/androidMain/AndroidManifest.xml new file mode 100755 index 0000000..d0e0b3c --- /dev/null +++ b/permissions-compose/src/androidMain/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt b/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt new file mode 100644 index 0000000..a82555f --- /dev/null +++ b/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.permissions.compose + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.fragment.app.FragmentActivity +import dev.icerock.moko.permissions.PermissionsController + +@Composable +fun BindEffect(permissionsController: PermissionsController) { + val lifecycleOwner = LocalLifecycleOwner.current + val fragmentManager = (LocalContext.current as FragmentActivity).supportFragmentManager + + LaunchedEffect(true) { + permissionsController.bind(lifecycleOwner.lifecycle, fragmentManager) + } +} \ No newline at end of file diff --git a/sample/compose-android-app/build.gradle.kts b/sample/compose-android-app/build.gradle.kts new file mode 100644 index 0000000..a0317f0 --- /dev/null +++ b/sample/compose-android-app/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("dev.icerock.moko.gradle.android.application") + id("dev.icerock.moko.gradle.detekt") + id("kotlin-kapt") +} + +android { + defaultConfig { + applicationId = "dev.icerock.moko.samples.permissions" + minSdk = 21 + versionCode = 1 + versionName = "0.1.0" + } + + buildFeatures.compose = true + composeOptions.kotlinCompilerExtensionVersion = libs.versions.composeCompilerVersion.get() +} + +dependencies { + implementation(libs.appCompat) + implementation(libs.composeActivity) + implementation(libs.composeMaterial) + implementation(projects.sample.mppLibrary) + implementation(projects.permissionsCompose) +} diff --git a/sample/compose-android-app/src/main/AndroidManifest.xml b/sample/compose-android-app/src/main/AndroidManifest.xml new file mode 100755 index 0000000..c9491fb --- /dev/null +++ b/sample/compose-android-app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt b/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt new file mode 100644 index 0000000..167e496 --- /dev/null +++ b/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt @@ -0,0 +1,118 @@ +package com.icerockdev + +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Button +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Scaffold +import androidx.compose.material.SnackbarDuration +import androidx.compose.material.SnackbarResult +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.rememberScaffoldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalLifecycleOwner +import com.icerockdev.library.SampleViewModel +import dev.icerock.moko.mvvm.dispatcher.eventsDispatcherOnMain +import dev.icerock.moko.mvvm.getViewModel +import dev.icerock.moko.permissions.DeniedAlwaysException +import dev.icerock.moko.permissions.DeniedException +import dev.icerock.moko.permissions.Permission +import dev.icerock.moko.permissions.PermissionsController +import dev.icerock.moko.permissions.compose.BindEffect +import kotlinx.coroutines.launch + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + MaterialTheme { + Surface(modifier = Modifier.background(Color.White)) { + TestScreen( + viewModel = getViewModel { + SampleViewModel( + eventsDispatcher = eventsDispatcherOnMain(), + permissionsController = PermissionsController( + applicationContext = applicationContext + ), + permissionType = Permission.CAMERA + ) + } + ) + } + } + } + } +} + +@Composable +fun TestScreen(viewModel: SampleViewModel) { + val scaffoldState = rememberScaffoldState() + val coroutineScope = rememberCoroutineScope() + + val eventsListener = remember { + object : SampleViewModel.EventListener { + override fun onSuccess() { + coroutineScope.launch { + scaffoldState.snackbarHostState.showSnackbar( + message = "Permission successfully granted!" + ) + } + } + + override fun onDenied(exception: DeniedException) { + coroutineScope.launch { + scaffoldState.snackbarHostState.showSnackbar( + message = "Permission denied!" + ) + } + } + + override fun onDeniedAlways(exception: DeniedAlwaysException) { + coroutineScope.launch { + val result = scaffoldState.snackbarHostState.showSnackbar( + message = "Permission is always denied", + duration = SnackbarDuration.Long, + actionLabel = "Settings" + ) + + if (result == SnackbarResult.ActionPerformed) { + viewModel.permissionsController.openAppSettings() + } + } + } + } + } + + val lifecycleOwner = LocalLifecycleOwner.current + LaunchedEffect(true) { + viewModel.eventsDispatcher.bind(lifecycleOwner, eventsListener) + } + + BindEffect(viewModel.permissionsController) + + Scaffold(scaffoldState = scaffoldState) { + Box( + modifier = Modifier + .fillMaxSize() + .padding(it), + contentAlignment = Alignment.Center + ) { + Button( + onClick = viewModel::onRequestPermissionButtonPressed, + content = { Text("Request permission") } + ) + } + } +} \ No newline at end of file diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/SampleViewModel.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/SampleViewModel.kt index 3634f45..e561af0 100755 --- a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/SampleViewModel.kt +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/SampleViewModel.kt @@ -17,7 +17,7 @@ class SampleViewModel( init { viewModelScope.launch { - val startState = permissionsController.getPermissionState(Permission.RECORD_AUDIO) + val startState = permissionsController.getPermissionState(permissionType) println(startState) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index d39c65e..36919fb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,6 +13,8 @@ dependencyResolutionManagement { } include(":permissions") +include(":permissions-compose") include(":permissions-test") include(":sample:android-app") +include(":sample:compose-android-app") include(":sample:mpp-library") From 441451f31122e15174fccf69fe4855587b0a18ed Mon Sep 17 00:00:00 2001 From: timur-muminov1 Date: Tue, 6 Dec 2022 20:12:13 +0300 Subject: [PATCH 2/5] #68, #69 Bugs fixed --- gradle/libs.versions.toml | 3 +++ permissions/build.gradle.kts | 2 +- .../permissions/PermissionsControllerImpl.kt | 25 +++++++++++-------- .../moko/permissions/ResolverFragment.kt | 25 +++++++++++-------- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0e8fc84..c505450 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,11 +7,13 @@ androidCoreTestingVersion = "2.1.0" coroutinesVersion = "1.6.0-native-mt" mokoMvvmVersion = "0.12.0" mokoPermissionsVersion = "0.13.0" +lifecycleRuntime = "2.5.1" [libraries] appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } material = { module = "com.google.android.material:material", version.ref = "materialDesignVersion" } lifecycle = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "androidLifecycleVersion" } +lifecycleRuntime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleRuntime" } coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutinesVersion" } mokoMvvmCore = { module = "dev.icerock.moko:mvvm-core", version.ref = "mokoMvvmVersion" } mokoMvvmTest = { module = "dev.icerock.moko:mvvm-test", version.ref = "mokoMvvmVersion" } @@ -26,3 +28,4 @@ firebaseGradlePlugin = { module = "com.google.firebase:firebase-crashlytics-grad mokoGradlePlugin = { module = "dev.icerock.moko:moko-gradle-plugin", version = "0.1.0" } mobileMultiplatformGradlePlugin = { module = "dev.icerock:mobile-multiplatform", version = "0.14.1" } kotlinSerializationGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlinVersion" } + diff --git a/permissions/build.gradle.kts b/permissions/build.gradle.kts index c28c218..292b0de 100644 --- a/permissions/build.gradle.kts +++ b/permissions/build.gradle.kts @@ -12,6 +12,6 @@ plugins { dependencies { commonMainImplementation(libs.coroutines) - androidMainImplementation(libs.appCompat) + androidMainImplementation(libs.lifecycleRuntime) } \ No newline at end of file diff --git a/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/PermissionsControllerImpl.kt b/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/PermissionsControllerImpl.kt index 1c12bd8..00b3755 100755 --- a/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/PermissionsControllerImpl.kt +++ b/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/PermissionsControllerImpl.kt @@ -22,6 +22,8 @@ import androidx.lifecycle.OnLifecycleEvent import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlin.coroutines.suspendCoroutine @Suppress("TooManyFunctions") @@ -30,6 +32,7 @@ class PermissionsControllerImpl( private val applicationContext: Context ) : PermissionsController { private val fragmentManagerHolder = MutableStateFlow(null) + private val mutex: Mutex = Mutex() override fun bind(lifecycle: Lifecycle, fragmentManager: FragmentManager) { this.fragmentManagerHolder.value = fragmentManager @@ -45,15 +48,17 @@ class PermissionsControllerImpl( } override suspend fun providePermission(permission: Permission) { - val fragmentManager: FragmentManager = awaitFragmentManager() - val resolverFragment: ResolverFragment = getOrCreateResolverFragment(fragmentManager) - - val platformPermission = permission.toPlatformPermission() - suspendCoroutine { continuation -> - resolverFragment.requestPermission( - permission, - platformPermission - ) { continuation.resumeWith(it) } + mutex.withLock { + val fragmentManager: FragmentManager = awaitFragmentManager() + val resolverFragment: ResolverFragment = getOrCreateResolverFragment(fragmentManager) + + val platformPermission = permission.toPlatformPermission() + suspendCoroutine { continuation -> + resolverFragment.requestPermission( + permission, + platformPermission + ) { continuation.resumeWith(it) } + } } } @@ -124,7 +129,7 @@ class PermissionsControllerImpl( fragmentManager .beginTransaction() .add(fragment, resolverFragmentTag) - .commitNow() + .commit() } } } diff --git a/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/ResolverFragment.kt b/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/ResolverFragment.kt index 88a95b4..635053e 100644 --- a/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/ResolverFragment.kt +++ b/permissions/src/androidMain/kotlin/dev/icerock/moko/permissions/ResolverFragment.kt @@ -7,6 +7,7 @@ package dev.icerock.moko.permissions import android.content.pm.PackageManager import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope internal class ResolverFragment : Fragment() { init { @@ -20,20 +21,22 @@ internal class ResolverFragment : Fragment() { permissions: List, callback: (Result) -> Unit ) { - val context = requireContext() - val toRequest = permissions.filter { - ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED - } + lifecycleScope.launchWhenCreated { + val context = requireContext() + val toRequest = permissions.filter { + ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED + } - if (toRequest.isEmpty()) { - callback.invoke(Result.success(Unit)) - return - } + if (toRequest.isEmpty()) { + callback.invoke(Result.success(Unit)) + return@launchWhenCreated + } - val requestCode = (permissionCallbackMap.keys.maxOrNull() ?: 0) + 1 - permissionCallbackMap[requestCode] = PermissionCallback(permission, callback) + val requestCode = (permissionCallbackMap.keys.maxOrNull() ?: 0) + 1 + permissionCallbackMap[requestCode] = PermissionCallback(permission, callback) - requestPermissions(toRequest.toTypedArray(), requestCode) + requestPermissions(toRequest.toTypedArray(), requestCode) + } } override fun onRequestPermissionsResult( From 8b8fbda8d977e4b50e3a0d255db416dd94b2a755 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 18 Dec 2022 15:31:33 +0600 Subject: [PATCH 3/5] #54 fix detekt --- .../kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt | 3 ++- .../src/main/java/com/icerockdev/MainActivity.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt b/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt index a82555f..517f725 100644 --- a/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt +++ b/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.fragment.app.FragmentActivity import dev.icerock.moko.permissions.PermissionsController +@Suppress("FunctionNaming") @Composable fun BindEffect(permissionsController: PermissionsController) { val lifecycleOwner = LocalLifecycleOwner.current @@ -19,4 +20,4 @@ fun BindEffect(permissionsController: PermissionsController) { LaunchedEffect(true) { permissionsController.bind(lifecycleOwner.lifecycle, fragmentManager) } -} \ No newline at end of file +} diff --git a/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt b/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt index 167e496..e42c1c8 100644 --- a/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt +++ b/sample/compose-android-app/src/main/java/com/icerockdev/MainActivity.kt @@ -56,6 +56,7 @@ class MainActivity : AppCompatActivity() { } } +@Suppress("FunctionNaming") @Composable fun TestScreen(viewModel: SampleViewModel) { val scaffoldState = rememberScaffoldState() @@ -115,4 +116,4 @@ fun TestScreen(viewModel: SampleViewModel) { ) } } -} \ No newline at end of file +} From c41693ab6bae67c7364d854dbd8fc4586d9c394f Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 18 Dec 2022 15:53:59 +0600 Subject: [PATCH 4/5] #54 fix publication of android-only module --- permissions-compose/build.gradle.kts | 18 ++++++------------ .../{androidMain => main}/AndroidManifest.xml | 0 .../moko/permissions/compose/BindEffect.kt | 0 3 files changed, 6 insertions(+), 12 deletions(-) rename permissions-compose/src/{androidMain => main}/AndroidManifest.xml (100%) rename permissions-compose/src/{androidMain => main}/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt (100%) diff --git a/permissions-compose/build.gradle.kts b/permissions-compose/build.gradle.kts index 5c371dd..13a2422 100644 --- a/permissions-compose/build.gradle.kts +++ b/permissions-compose/build.gradle.kts @@ -3,22 +3,16 @@ */ plugins { - id("dev.icerock.moko.gradle.multiplatform.mobile") - id("dev.icerock.moko.gradle.publication") + id("dev.icerock.moko.gradle.android.library") + id("dev.icerock.moko.gradle.android.publication") id("dev.icerock.moko.gradle.stub.javadoc") id("dev.icerock.moko.gradle.detekt") - id("dev.icerock.mobile.multiplatform.android-manifest") id("org.jetbrains.compose") } -kotlin { - android() -} - dependencies { - androidMainApi(projects.permissions) - androidMainApi(compose.runtime) - androidMainApi(libs.appCompat) - androidMainApi(libs.composeActivity) + api(projects.permissions) + api(compose.runtime) + api(libs.appCompat) + api(libs.composeActivity) } - diff --git a/permissions-compose/src/androidMain/AndroidManifest.xml b/permissions-compose/src/main/AndroidManifest.xml similarity index 100% rename from permissions-compose/src/androidMain/AndroidManifest.xml rename to permissions-compose/src/main/AndroidManifest.xml diff --git a/permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt b/permissions-compose/src/main/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt similarity index 100% rename from permissions-compose/src/androidMain/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt rename to permissions-compose/src/main/kotlin/dev/icerock/moko/permissions/compose/BindEffect.kt From 7438163000de0b07f6cd82f81a0d323221aa9f05 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Sun, 18 Dec 2022 16:15:01 +0600 Subject: [PATCH 5/5] up version --- README.md | 6 +++--- gradle/libs.versions.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a056e23..b1f07af 100755 --- a/README.md +++ b/README.md @@ -38,9 +38,9 @@ allprojects { project **build.gradle** ```groovy dependencies { - commonMainApi("dev.icerock.moko:permissions:0.13.0") - commonMainApi("dev.icerock.moko:permissions-compose:0.13.0") // permissions api + compose extensions - commonTestImplementation("dev.icerock.moko:permissions-test:0.13.0") + commonMainApi("dev.icerock.moko:permissions:0.14.0") + androidMainApi("dev.icerock.moko:permissions-compose:0.14.0") // permissions api + compose extensions + commonTestImplementation("dev.icerock.moko:permissions-test:0.14.0") } ``` diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3c747cc..08f69c8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ androidLifecycleVersion = "2.1.0" androidCoreTestingVersion = "2.1.0" coroutinesVersion = "1.6.0-native-mt" mokoMvvmVersion = "0.12.0" -mokoPermissionsVersion = "0.13.0" +mokoPermissionsVersion = "0.14.0" composeJetBrainsVersion = "1.1.1" lifecycleRuntime = "2.5.1"