Skip to content

Instantly share code, notes, and snippets.

View ngengesenior's full-sized avatar

Ngenge Senior ngengesenior

View GitHub Profile
@Composable
@Preview(showBackground = true, showSystemUi = true)
fun PieChart(
items: List<Item> = sampleItems
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
@Composable
@Preview(showBackground = true, showSystemUi = true)
fun PieChartNoAnimation(
items: List<Item> = sampleItems
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import kotlinx.coroutines.CancellableContinuation
import kotlinx.coroutines.suspendCancellableCoroutine
import platform.CoreLocation.CLAuthorizationStatus
import platform.CoreLocation.CLLocation
import platform.CoreLocation.CLLocationManager
import platform.CoreLocation.CLLocationManagerDelegateProtocol
import platform.CoreLocation.kCLAuthorizationStatusAuthorizedAlways
import platform.CoreLocation.kCLAuthorizationStatusAuthorizedWhenInUse
import platform.CoreLocation.kCLAuthorizationStatusDenied
import platform.CoreLocation.kCLAuthorizationStatusNotDetermined
override fun locationManager(manager: CLLocationManager, didUpdateLocations: List<*>) {
val location = didUpdateLocations.firstOrNull() as? CLLocation?
locationResultContinuation?.let {
if (it.isActive) {
if (location != null) {
it.resume(Result.success(location))
} else {
it.resumeWithException(Exception("No valid location found"))
}
locationResultContinuation = null
override fun locationManager(manager: CLLocationManager, didFailWithError: NSError) {
locationPermissionStatusCancellableContinuation?.let {
if (it.isActive) {
it.resume(LocationPermissionStatus.RESTRICTED_OR_DENIED)
locationPermissionStatusCancellableContinuation = null
}
}
locationResultContinuation?.let {
if (it.isActive) {
override fun locationManager(
manager: CLLocationManager,
didChangeAuthorizationStatus: CLAuthorizationStatus
) {
locationPermissionStatusCancellableContinuation?.let {
// Ensure that continuation is resumed only once
if (it.isActive) {
when (didChangeAuthorizationStatus) {
kCLAuthorizationStatusRestricted,
kCLAuthorizationStatusDenied -> it.resume(
override fun locationManager(
manager: CLLocationManager,
didChangeAuthorizationStatus: CLAuthorizationStatus
) {
locationPermissionStatusCancellableContinuation?.let {
// Ensure that continuation is resumed only once
if (it.isActive) {
when (didChangeAuthorizationStatus) {
kCLAuthorizationStatusRestricted, kCLAuthorizationStatusDenied -> it.resume(
LocationPermissionStatus.RESTRICTED_OR_DENIED
suspend fun requestCurrentLocation(): Result<CLLocation> =
suspendCancellableCoroutine { continuation ->
locationResultContinuation = continuation
locationManager.requestLocation()
}
import kotlinx.coroutines.CancellableContinuation
import kotlinx.coroutines.suspendCancellableCoroutine
import platform.CoreLocation.CLAuthorizationStatus
import platform.CoreLocation.CLLocation
import platform.CoreLocation.CLLocationManager
import platform.CoreLocation.CLLocationManagerDelegateProtocol
import platform.CoreLocation.kCLAuthorizationStatusAuthorizedAlways
import platform.CoreLocation.kCLAuthorizationStatusAuthorizedWhenInUse
import platform.CoreLocation.kCLAuthorizationStatusDenied
import platform.CoreLocation.kCLAuthorizationStatusNotDetermined