Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes class cast exception #42

Merged
merged 2 commits into from
Apr 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@

package no.nordicsemi.android.common.permission.bluetooth

import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.content.BroadcastReceiver
import android.content.Context
Expand All @@ -40,8 +39,8 @@ import android.content.IntentFilter
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import no.nordicsemi.android.common.permission.util.*
import no.nordicsemi.android.common.permission.util.Available
import no.nordicsemi.android.common.permission.util.FeatureNotAvailableReason
import no.nordicsemi.android.common.permission.util.LocalDataProvider
import no.nordicsemi.android.common.permission.util.NotAvailable
import no.nordicsemi.android.common.permission.util.PermissionUtils
Expand Down Expand Up @@ -84,8 +83,8 @@ class BluetoothStateManager @Inject constructor(
dataProvider.bluetoothPermissionRequested = true
}

fun isBluetoothScanPermissionDeniedForever(activity: Activity): Boolean {
return utils.isBluetoothScanPermissionDeniedForever(activity)
fun isBluetoothScanPermissionDeniedForever(): Boolean {
return utils.isBluetoothScanPermissionDeniedForever()
}

private fun getBluetoothPermissionState() = when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@

package no.nordicsemi.android.common.permission.location

import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
Expand Down Expand Up @@ -81,8 +80,8 @@ internal class LocationStateManager @Inject constructor(
dataProvider.locationPermissionRequested = true
}

fun isLocationPermissionDeniedForever(activity: Activity): Boolean {
return utils.isLocationPermissionDeniedForever(activity)
fun isLocationPermissionDeniedForever(): Boolean {
return utils.isLocationPermissionDeniedForever()
}

private fun getLocationState(): FeatureState {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

@file:Suppress("unused")

package no.nordicsemi.android.common.permission.util

import android.Manifest
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Context
import android.content.ContextWrapper
import android.content.pm.PackageManager
import android.location.LocationManager
import androidx.core.content.ContextCompat
Expand All @@ -46,10 +49,10 @@ internal class PermissionUtils(
private val dataProvider: LocalDataProvider,
) {
val isBleEnabled: Boolean
get() {
val adapter = BluetoothAdapter.getDefaultAdapter()
return adapter != null && adapter.isEnabled
}
get() = (context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager)
.adapter
.isEnabled


val isLocationEnabled: Boolean
get() = if (dataProvider.isMarshmallowOrAbove) {
Expand Down Expand Up @@ -95,17 +98,36 @@ internal class PermissionUtils(
dataProvider.locationPermissionRequested = true
}

fun isBluetoothScanPermissionDeniedForever(activity: Activity): Boolean {
fun isBluetoothScanPermissionDeniedForever(): Boolean {
return dataProvider.isSOrAbove &&
!isBluetoothScanPermissionGranted && // Bluetooth Scan permission must be denied
dataProvider.bluetoothPermissionRequested && // Permission must have been requested before
!activity.shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_SCAN)
!context.findActivity()
.shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_SCAN)
}

fun isLocationPermissionDeniedForever(activity: Activity): Boolean {
fun isLocationPermissionDeniedForever(): Boolean {
return dataProvider.isMarshmallowOrAbove &&
!isLocationPermissionGranted // Location permission must be denied
&& dataProvider.locationPermissionRequested // Permission must have been requested before
&& !activity.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
&& !context.findActivity()
.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
}

/**
* Finds the activity from the given context.
*
* https://github.com/google/accompanist/blob/6611ebda55eb2948eca9e1c89c2519e80300855a/permissions/src/main/java/com/google/accompanist/permissions/PermissionsUtil.kt#L99
*
* @throws IllegalStateException if no activity was found.
* @return the activity.
*/
fun Context.findActivity(): Activity {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
context = context.baseContext
}
throw IllegalStateException("no activity")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ import no.nordicsemi.android.common.theme.view.WarningView
internal fun BluetoothPermissionRequiredView() {
val viewModel = hiltViewModel<PermissionViewModel>()
val activity = LocalContext.current as Activity
var permissionDenied by remember { mutableStateOf(viewModel.isBluetoothScanPermissionDeniedForever(activity)) }
var permissionDenied by remember { mutableStateOf(viewModel.isBluetoothScanPermissionDeniedForever()) }

WarningView(
imageVector = Icons.Default.BluetoothDisabled,
Expand All @@ -89,7 +89,7 @@ internal fun BluetoothPermissionRequiredView() {
ActivityResultContracts.RequestMultiplePermissions()
) {
viewModel.markBluetoothPermissionRequested()
permissionDenied = viewModel.isBluetoothScanPermissionDeniedForever(activity)
permissionDenied = viewModel.isBluetoothScanPermissionDeniedForever()
viewModel.refreshBluetoothPermission()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
package no.nordicsemi.android.common.permission.view

import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
Expand Down Expand Up @@ -66,14 +65,14 @@ import no.nordicsemi.android.common.theme.view.WarningView
@Composable
internal fun LocationPermissionRequiredView() {
val viewModel = hiltViewModel<PermissionViewModel>()
val activity = LocalContext.current as Activity
var permissionDenied by remember { mutableStateOf(viewModel.isLocationPermissionDeniedForever(activity)) }
val context = LocalContext.current
var permissionDenied by remember { mutableStateOf(viewModel.isLocationPermissionDeniedForever()) }

val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) {
viewModel.markLocationPermissionRequested()
permissionDenied = viewModel.isLocationPermissionDeniedForever(activity)
permissionDenied = viewModel.isLocationPermissionDeniedForever()
viewModel.refreshLocationPermission()
}

Expand All @@ -85,7 +84,7 @@ internal fun LocationPermissionRequiredView() {
)
launcher.launch(requiredPermissions)
},
onOpenSettingsClicked = { openPermissionSettings(activity) },
onOpenSettingsClicked = { openPermissionSettings(context) },
)
}

Expand Down Expand Up @@ -137,3 +136,4 @@ private fun LocationPermissionRequiredView_Preview() {
)
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@

package no.nordicsemi.android.common.permission.viewmodel

import android.app.Activity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
Expand Down Expand Up @@ -78,11 +77,11 @@ internal class PermissionViewModel @Inject internal constructor(
bluetoothManager.markBluetoothPermissionRequested()
}

fun isBluetoothScanPermissionDeniedForever(activity: Activity): Boolean {
return bluetoothManager.isBluetoothScanPermissionDeniedForever(activity)
fun isBluetoothScanPermissionDeniedForever(): Boolean {
return bluetoothManager.isBluetoothScanPermissionDeniedForever()
}

fun isLocationPermissionDeniedForever(activity: Activity): Boolean {
return locationManager.isLocationPermissionDeniedForever(activity)
fun isLocationPermissionDeniedForever(): Boolean {
return locationManager.isLocationPermissionDeniedForever()
}
}