Skip to content

Commit

Permalink
Merge pull request #152 from icerockdev/develop
Browse files Browse the repository at this point in the history
Release 0.19.0
  • Loading branch information
Alex009 authored Feb 8, 2025
2 parents b31c943 + 48c7693 commit 378e0fd
Show file tree
Hide file tree
Showing 68 changed files with 949 additions and 360 deletions.
58 changes: 38 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,34 +39,52 @@ allprojects {
project **build.gradle**
```groovy
dependencies {
commonMainApi("dev.icerock.moko:permissions:0.18.1")
commonMainApi("dev.icerock.moko:permissions:0.19.0")
// specific permissions support
commonMainImplementation("dev.icerock.moko:permissions-bluetooth:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-camera:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-contacts:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-gallery:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-location:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-microphone:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-motion:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-notifications:0.19.0")
commonMainImplementation("dev.icerock.moko:permissions-storage:0.19.0")
// compose multiplatform
commonMainApi("dev.icerock.moko:permissions-compose:0.18.1") // permissions api + compose extensions
commonMainApi("dev.icerock.moko:permissions-compose:0.19.0") // permissions api + compose extensions
commonTestImplementation("dev.icerock.moko:permissions-test:0.18.1")
commonTestImplementation("dev.icerock.moko:permissions-test:0.19.0")
}
```

## List of supported permissions

The full list can be found in `dev.icerock.moko.permissions.Permission` enum.

* Camera: **Permission.CAMERA**
* Gallery: **Permission.GALLERY**
* Storage read: **Permission.STORAGE**
* Storage write: **Permission.WRITE_STORAGE**
* Fine location: **Permission.LOCATION**
* Coarse location: **Permission.COARSE_LOCATION**
* Background location: **Permission.BACKGROUND_LOCATION**
* Remote notifications: **Permission.REMOTE_NOTIFICATION**
* Audio recording: **Permission.RECORD_AUDIO**
* Bluetooth LE: **Permission.BLUETOOTH_LE**
* Bluetooth Scan: **Permission.BLUETOOTH_SCAN**
* Bluetooth Connect: **Permission.BLUETOOTH_CONNECT**
* Bluetooth Advertise: **Permission.BLUETOOTH_ADVERTISE**
* Contacts: **Permission.CONTACTS**
* Motion: **Permission.MOTION**
* `dev.icerock.moko:permissions-bluetooth`
* Bluetooth LE: **Permission.BLUETOOTH_LE**
* Bluetooth Scan: **Permission.BLUETOOTH_SCAN**
* Bluetooth Connect: **Permission.BLUETOOTH_CONNECT**
* Bluetooth Advertise: **Permission.BLUETOOTH_ADVERTISE**
* `dev.icerock.moko:permissions-camera`
* Camera: **Permission.CAMERA**
* `dev.icerock.moko:permissions-contacts`
* Contacts: **Permission.CONTACTS**
* `dev.icerock.moko:permissions-gallery`
* Gallery: **Permission.GALLERY**
* `dev.icerock.moko:permissions-location`
* Fine location: **Permission.LOCATION**
* Coarse location: **Permission.COARSE_LOCATION**
* Background location: **Permission.BACKGROUND_LOCATION**
* `dev.icerock.moko:permissions-microphone`
* Audio recording: **Permission.RECORD_AUDIO**
* `dev.icerock.moko:permissions-motion`
* Motion: **Permission.MOTION**
* `dev.icerock.moko:permissions-notifications`
* Remote notifications: **Permission.REMOTE_NOTIFICATION**
* `dev.icerock.moko:permissions-storage`
* Storage read: **Permission.STORAGE**
* Storage write: **Permission.WRITE_STORAGE**

## Usage

Expand Down
4 changes: 3 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[versions]
kotlinVersion = "1.9.10"
androidAppCompatVersion = "1.6.1"
androidxCoreVersion = "1.9.0" # TODO we have two versions (1.8 + 1.9) - unify them
composeMaterialVersion = "1.4.1"
composeActivityVersion = "1.7.0"
activityVersion = "1.7.0"
Expand All @@ -9,12 +10,13 @@ androidLifecycleVersion = "2.2.0"
androidCoreTestingVersion = "2.2.0"
coroutinesVersion = "1.6.4"
mokoMvvmVersion = "0.16.0"
mokoPermissionsVersion = "0.18.1"
mokoPermissionsVersion = "0.19.0"
composeJetBrainsVersion = "1.5.1"
lifecycleRuntime = "2.6.1"
composeUiVersion = "1.0.1"

[libraries]
androidxCore = { module = "androidx.core:core", version.ref = "androidxCoreVersion" }
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" }
Expand Down
36 changes: 36 additions & 0 deletions permissions-avfoundation/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

import dev.icerock.moko.gradle.utils.connectTargetsToSourceSet
import dev.icerock.moko.gradle.utils.createMainTest
import dev.icerock.moko.gradle.utils.setupDependency

plugins {
id("org.jetbrains.kotlin.multiplatform")
id("dev.icerock.moko.gradle.publication")
id("dev.icerock.moko.gradle.detekt")
}

kotlin {
iosArm64()
iosX64()
iosSimulatorArm64()

with(this.sourceSets) {
// creation
createMainTest("ios")

// ios dependencies
setupDependency("ios", "common")
connectTargetsToSourceSet(
targetNames = listOf("iosX64", "iosArm64", "iosSimulatorArm64"),
sourceSetPrefix = "ios"
)
}
}

dependencies {
commonMainApi(projects.permissions)
commonMainImplementation(libs.coroutines)
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
/*
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.ios
package dev.icerock.moko.permissions.avfoundation

import dev.icerock.moko.permissions.DeniedAlwaysException
import dev.icerock.moko.permissions.Permission
import dev.icerock.moko.permissions.PermissionDelegate
import dev.icerock.moko.permissions.PermissionState
import dev.icerock.moko.permissions.mainContinuation
import platform.AVFoundation.AVAuthorizationStatus
Expand All @@ -20,7 +21,7 @@ import platform.AVFoundation.requestAccessForMediaType
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine

internal class AVCapturePermissionDelegate(
class AVCaptureDelegate(
private val type: AVMediaType,
private val permission: Permission
) : PermissionDelegate {
Expand Down
19 changes: 19 additions & 0 deletions permissions-bluetooth/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Copyright 2024 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")
}

android {
namespace = "dev.icerock.moko.permissions.bluetooth"
}

dependencies {
commonMainApi(projects.permissions)
commonMainImplementation(libs.coroutines)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.bluetooth

import android.Manifest
import android.content.Context
import android.os.Build
import dev.icerock.moko.permissions.PermissionDelegate

/**
* @see https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
*/

actual val bluetoothLEDelegate = object : PermissionDelegate {
override fun getPermissionStateOverride(applicationContext: Context) = null

override fun getPlatformPermission() = allBluetoothPermissions()

/**
* Bluetooth permissions
*
* @see https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
*/
private fun allBluetoothPermissions(): List<String> = buildSet {
addAll(bluetoothConnectCompat())
addAll(bluetoothScanCompat())
addAll(bluetoothAdvertiseCompat())
}.toList()

private fun bluetoothScanCompat(): List<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(Manifest.permission.BLUETOOTH_SCAN)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
listOf(Manifest.permission.ACCESS_FINE_LOCATION)
} else {
listOf(Manifest.permission.ACCESS_COARSE_LOCATION)
}
}

private fun bluetoothAdvertiseCompat(): List<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(Manifest.permission.BLUETOOTH_ADVERTISE)
} else {
listOf(Manifest.permission.BLUETOOTH)
}
}

private fun bluetoothConnectCompat(): List<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(Manifest.permission.BLUETOOTH_CONNECT)
} else {
listOf(Manifest.permission.BLUETOOTH)
}
}
}

actual val bluetoothScanDelegate = object : PermissionDelegate {
override fun getPermissionStateOverride(applicationContext: Context) = null

override fun getPlatformPermission() =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(Manifest.permission.BLUETOOTH_SCAN)
} else {
listOf(Manifest.permission.BLUETOOTH)
}
}

actual val bluetoothAdvertiseDelegate = object : PermissionDelegate {
override fun getPermissionStateOverride(applicationContext: Context) = null

override fun getPlatformPermission() =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(Manifest.permission.BLUETOOTH_ADVERTISE)
} else {
listOf(Manifest.permission.BLUETOOTH)
}
}

actual val bluetoothConnectDelegate = object : PermissionDelegate {
override fun getPermissionStateOverride(applicationContext: Context) = null

override fun getPlatformPermission() =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(Manifest.permission.BLUETOOTH_CONNECT)
} else {
listOf(Manifest.permission.BLUETOOTH)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.bluetooth

import dev.icerock.moko.permissions.Permission
import dev.icerock.moko.permissions.PermissionDelegate

internal expect val bluetoothLEDelegate: PermissionDelegate
internal expect val bluetoothScanDelegate: PermissionDelegate
internal expect val bluetoothAdvertiseDelegate: PermissionDelegate
internal expect val bluetoothConnectDelegate: PermissionDelegate

object BluetoothLEPermission : Permission {
override val delegate get() = bluetoothLEDelegate
}

object BluetoothScanPermission : Permission {
override val delegate get() = bluetoothScanDelegate
}

object BluetoothAdvertisePermission : Permission {
override val delegate get() = bluetoothAdvertiseDelegate
}

object BluetoothConnectPermission : Permission {
override val delegate get() = bluetoothConnectDelegate
}

val Permission.Companion.BLUETOOTH_LE get() = BluetoothLEPermission
val Permission.Companion.BLUETOOTH_SCAN get() = BluetoothScanPermission
val Permission.Companion.BLUETOOTH_ADVERTISE get() = BluetoothAdvertisePermission
val Permission.Companion.BLUETOOTH_CONNECT get() = BluetoothConnectPermission
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.ios
package dev.icerock.moko.permissions.bluetooth

import dev.icerock.moko.permissions.DeniedAlwaysException
import dev.icerock.moko.permissions.DeniedException
import dev.icerock.moko.permissions.Permission
import dev.icerock.moko.permissions.PermissionDelegate
import dev.icerock.moko.permissions.PermissionState
import kotlinx.cinterop.ExperimentalForeignApi
import platform.CoreBluetooth.CBCentralManager
Expand Down Expand Up @@ -97,3 +98,12 @@ internal class BluetoothPermissionDelegate(
}
}
}

actual val bluetoothLEDelegate: PermissionDelegate =
BluetoothPermissionDelegate(BluetoothLEPermission)
actual val bluetoothScanDelegate: PermissionDelegate =
BluetoothPermissionDelegate(BluetoothScanPermission)
actual val bluetoothAdvertiseDelegate: PermissionDelegate =
BluetoothPermissionDelegate(BluetoothAdvertisePermission)
actual val bluetoothConnectDelegate: PermissionDelegate =
BluetoothPermissionDelegate(BluetoothConnectPermission)
20 changes: 20 additions & 0 deletions permissions-camera/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2024 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")
}

android {
namespace = "dev.icerock.moko.permissions.camera"
}

dependencies {
commonMainApi(projects.permissions)
iosMainImplementation(projects.permissionsAvfoundation)
commonMainImplementation(libs.coroutines)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.camera

import android.Manifest
import android.content.Context
import dev.icerock.moko.permissions.PermissionDelegate

actual val cameraDelegate = object : PermissionDelegate {
override fun getPermissionStateOverride(applicationContext: Context) = null
override fun getPlatformPermission() = listOf(Manifest.permission.CAMERA)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.camera

import dev.icerock.moko.permissions.Permission
import dev.icerock.moko.permissions.PermissionDelegate

internal expect val cameraDelegate: PermissionDelegate

object CameraPermission : Permission {
override val delegate get() = cameraDelegate
}

val Permission.Companion.CAMERA get() = CameraPermission
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.permissions.camera

import dev.icerock.moko.permissions.Permission
import dev.icerock.moko.permissions.PermissionDelegate
import dev.icerock.moko.permissions.avfoundation.AVCaptureDelegate
import platform.AVFoundation.AVMediaTypeVideo

actual val cameraDelegate: PermissionDelegate = AVCaptureDelegate(
AVMediaTypeVideo,
Permission.CAMERA
)
Loading

0 comments on commit 378e0fd

Please sign in to comment.