Skip to content

Commit

Permalink
Refactoring Android Location for Android12 (#4)
Browse files Browse the repository at this point in the history
* Refactoring Android Location for Android12
  • Loading branch information
rockry authored Dec 1, 2021
1 parent 8b0d6ee commit c21c20b
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 26 deletions.
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.cli.common.toBooleanLenient
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

val isSnapshotUpload = System.getProperty("snapshot").toBooleanLenient() ?: false
val libVersion = "0.2.6"
val libVersion = "0.2.7"
val gitName = "abc-${project.name}"

buildscript {
Expand Down Expand Up @@ -153,7 +153,7 @@ kotlin {
val androidMain by getting {
dependencies {
implementation("com.google.android.gms:play-services-location:18.0.0")
implementation("androidx.startup:startup-runtime:1.0.0")
implementation("androidx.startup:startup-runtime:1.1.0")
}
}
val androidAndroidTestRelease by getting {
Expand Down
2 changes: 1 addition & 1 deletion kmm_location.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |spec|
spec.name = 'kmm_location'
spec.version = '0.2.6'
spec.version = '0.2.7'
spec.homepage = ''
spec.source = { :git => "Not Published", :tag => "Cocoapods/#{spec.name}/#{spec.version}" }
spec.authors = ''
Expand Down
46 changes: 32 additions & 14 deletions src/androidMain/kotlin/com/linecorp/abc/location/LocationManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.linecorp.abc.location
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
Expand All @@ -12,7 +13,9 @@ import android.provider.Settings
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.linecorp.abc.location.ABCLocation.Companion.notifyOnLocationUnavailable
import com.linecorp.abc.location.observers.ActivityLifecycleObserver
import com.linecorp.abc.location.utils.LocationUtil
import java.lang.ref.WeakReference

internal actual class LocationManager {

Expand All @@ -30,21 +33,27 @@ internal actual class LocationManager {
actual fun removeListeners(target: Any) { }

actual fun requestPermission() {
focusedActivity?.let {
ActivityCompat.requestPermissions(
it,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
),
requestPermissionsRequestCode
)
val activity = focusedActivity ?: run {
notifyOnLocationUnavailable()
return
}

ActivityCompat.requestPermissions(
activity,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
),
requestPermissionsRequestCode
)
}

@SuppressLint("MissingPermission")
actual fun startLocationUpdating() {
val activity = focusedActivity ?: return
val activity = focusedActivity ?: run {
notifyOnLocationUnavailable()
return
}

if (!isPermissionAllowed()) {
requestPermission()
Expand All @@ -69,10 +78,15 @@ internal actual class LocationManager {
// Internal
// -------------------------------------------------------------------------------------------

@SuppressLint("StaticFieldLeak")
internal var activity: Activity? = null
internal var activity: WeakReference<Activity>? = null

internal fun configure(context: Context) {
val application = context.applicationContext as? Application
application?.registerActivityLifecycleCallbacks(ActivityLifecycleObserver) ?: run {
val activity = context.applicationContext as? Activity
this.activity = WeakReference(activity)
}

fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
Expand Down Expand Up @@ -124,7 +138,11 @@ internal actual class LocationManager {
}

internal fun showNotificationSetting() {
val activity = focusedActivity ?: return
val activity = focusedActivity ?: run {
notifyOnLocationUnavailable()
return
}

Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
Expand All @@ -140,7 +158,7 @@ internal actual class LocationManager {
private val requestPermissionsRequestCode = 4885

private val focusedActivity: Activity?
get() = activity?.let {
get() = activity?.get()?.let {
if (it.isFinishing) null else { it }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.linecorp.abc.location.extension

import android.app.Activity
import android.app.Application
import android.content.Context
import com.linecorp.abc.location.ABCLocation
import com.linecorp.abc.location.ABCLocationRequest
import com.linecorp.abc.location.observers.ActivityLifecycleObserver
import java.lang.ref.WeakReference

fun ABCLocation.Companion.processRequestPermissionsResult(
requestCode: Int,
Expand All @@ -25,12 +24,8 @@ fun ABCLocation.Companion.setLocationRequest(locationRequest: ABCLocationRequest


internal var ABCLocation.Companion.activity: Activity?
get() = locationManager.activity
set(value) { locationManager.activity = value }
get() = locationManager.activity?.get()
set(value) { locationManager.activity = WeakReference(value) }

internal fun ABCLocation.Companion.configure(context: Context) {
internal fun ABCLocation.Companion.configure(context: Context) =
locationManager.configure(context)

val application = context.applicationContext as? Application ?: return
application.registerActivityLifecycleCallbacks(ActivityLifecycleObserver)
}

0 comments on commit c21c20b

Please sign in to comment.