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

[WIP] Android RN location perms fix #378

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
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
2 changes: 1 addition & 1 deletion sdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ apply plugin: "org.jetbrains.dokka"
apply plugin: 'io.radar.mvnpublish'

ext {
radarVersion = '3.13.3'
radarVersion = '3.13.4-beta.1'
}

String buildNumber = ".${System.currentTimeMillis()}"
Expand Down
45 changes: 42 additions & 3 deletions sdk/src/main/java/io/radar/sdk/RadarLocationPermissionManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,23 @@ import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import io.radar.sdk.model.RadarLocationPermissionStatus

class RadarLocationPermissionManager(private val context: Context, private val activity: Activity?): Application.ActivityLifecycleCallbacks {

private var danglingSettingsPermissionRequest = false
private var danglingForegroundPermissionRequest = false
private var danglingBackgroundPermissionRequest = false

private lateinit var requestForegroundLocationPermissionLauncher: ActivityResultLauncher<String>
Expand All @@ -25,6 +30,7 @@ class RadarLocationPermissionManager(private val context: Context, private val a

init {
if (activity is ComponentActivity) {
Log.d("LocPermissionManager", "Activity is a ComponentActivity")
requestForegroundLocationPermissionLauncher = activity.registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
Expand All @@ -44,27 +50,46 @@ class RadarLocationPermissionManager(private val context: Context, private val a
Radar.sendLocationPermissionStatus(RadarLocationPermissionStatus.initWithStatus(context, activity))
// TODO: sync the user's permissions status here
}
}
} else {
Log.d("LocPermissionManager", "Activity is not a ComponentActivity")
}
}

@RequiresApi(Build.VERSION_CODES.Q)
fun requestBackgroundLocationPermission() {
Log.d("LocPermissionManager", "requesting background")
if (activity is ComponentActivity) {
Log.d("LocPermissionManager", "calling activity")
context.getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).getString("x_platform_sdk_type",null)?.let {
if (it != null) {
Log.d("LocPermissionManager", "x platform side channel")
danglingBackgroundPermissionRequest = true
}
}
requestBackgroundLocationPermissionLauncher.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
// TODO: sync the user's location permissions action with the their permissions status here
}
}

fun requestForegroundLocationPermission() {
Log.d("LocPermissionManager", "requesting foreground")
if (activity is ComponentActivity) {
Log.d("LocPermissionManager", "calling activity")
context.getSharedPreferences("RadarSDK", Context.MODE_PRIVATE).getString("x_platform_sdk_type",null)?.let {
if (it != null) {
Log.d("LocPermissionManager", "x platform side channel")
danglingForegroundPermissionRequest = true
}
}
Radar.sendLocationPermissionStatus(RadarLocationPermissionStatus.initWithStatus(context,activity,true))
requestForegroundLocationPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)

// TODO: sync the user's location permissions action with the their permissions status here
}
}

fun openAppSettings() {
danglingBackgroundPermissionRequest = true
danglingSettingsPermissionRequest = true
val intent = Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
val uri = Uri.fromParts("package", context.packageName, null)
Expand Down Expand Up @@ -106,11 +131,25 @@ class RadarLocationPermissionManager(private val context: Context, private val a
}

override fun onActivityResumed(activity: Activity) {
if (danglingBackgroundPermissionRequest) {
if (danglingSettingsPermissionRequest) {
Radar.sendLocationPermissionStatus(RadarLocationPermissionStatus.initWithStatus(context,activity))
// TODO: sync the user's location permissions action with the their permissions status here
}
if (danglingForegroundPermissionRequest) {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
RadarLocationPermissionStatus.savePreviouslyDeniedForeground(context,true)
}
Radar.sendLocationPermissionStatus(RadarLocationPermissionStatus.initWithStatus(context,activity))
}
if (danglingBackgroundPermissionRequest) {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED){
RadarLocationPermissionStatus.savePreviouslyDeniedBackground(context,true)
}
Radar.sendLocationPermissionStatus(RadarLocationPermissionStatus.initWithStatus(context,activity))
}
danglingSettingsPermissionRequest = false
danglingBackgroundPermissionRequest = false
danglingForegroundPermissionRequest = false
}

}
Loading