diff --git a/livedata-location/build.gradle b/livedata-location/build.gradle index 297284c..84156d0 100644 --- a/livedata-location/build.gradle +++ b/livedata-location/build.gradle @@ -16,4 +16,6 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.google.android.gms:play-services-location:$versions.location" + + implementation "com.huawei.hms:location:$versions.hmsLocation" } diff --git a/livedata-location/src/main/java/ru/touchin/livedata/location/HuaweiLocationLiveData.kt b/livedata-location/src/main/java/ru/touchin/livedata/location/HuaweiLocationLiveData.kt new file mode 100644 index 0000000..0bd4615 --- /dev/null +++ b/livedata-location/src/main/java/ru/touchin/livedata/location/HuaweiLocationLiveData.kt @@ -0,0 +1,61 @@ +package ru.touchin.livedata.location + +import android.Manifest.permission.ACCESS_COARSE_LOCATION +import android.Manifest.permission.ACCESS_FINE_LOCATION +import android.content.Context +import android.location.Location +import androidx.annotation.RequiresPermission +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import com.huawei.hms.location.FusedLocationProviderClient +import com.huawei.hms.location.LocationAvailability +import com.huawei.hms.location.LocationCallback +import com.huawei.hms.location.LocationRequest +import com.huawei.hms.location.LocationResult +import com.huawei.hms.location.LocationServices + +class HuaweiLocationLiveData( + context: Context, + private val request: LocationRequest +) : LiveData() { + + private val fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context) + private val locationCallback = object : LocationCallback() { + override fun onLocationResult(result: LocationResult) { + postValue(result.lastLocation) + } + + override fun onLocationAvailability(availability: LocationAvailability) { + if (!availability.isLocationAvailable) postValue(null) + } + } + + @RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION]) + override fun observe(owner: LifecycleOwner, observer: Observer) { + super.observe(owner, observer) + } + + @RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION]) + override fun onActive() { + startListening() + } + + override fun onInactive() { + stopListening() + } + + private fun stopListening() { + fusedLocationClient.removeLocationUpdates(locationCallback) + } + + @RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION]) + private fun startListening() { + fusedLocationClient.requestLocationUpdates( + request, + locationCallback, + null + ) + } + +}