-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathMainActivity.kt
More file actions
118 lines (112 loc) · 4.52 KB
/
MainActivity.kt
File metadata and controls
118 lines (112 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.sdevprem.runtrack.ui
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.compose.rememberNavController
import com.sdevprem.runtrack.common.extension.hasAllPermission
import com.sdevprem.runtrack.common.extension.hasLocationPermission
import com.sdevprem.runtrack.common.extension.openAppSetting
import com.sdevprem.runtrack.common.utils.PermissionUtils
import com.sdevprem.runtrack.data.tracking.location.LocationUtils
import com.sdevprem.runtrack.ui.common.compose.component.LocationPermissionRequestDialog
import com.sdevprem.runtrack.ui.screen.main.MainScreen
import com.sdevprem.runtrack.ui.theme.AppTheme
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AppTheme {
PermissionRequester()
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
MainScreen(rememberNavController())
}
}
}
}
@Composable
private fun PermissionRequester() {
var showPermissionDeclinedRationale by rememberSaveable { mutableStateOf(false) }
var showRationale by rememberSaveable { mutableStateOf(false) }
val permissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestMultiplePermissions(),
onResult = {
it.forEach { (permission, isGranted) ->
if (!isGranted && PermissionUtils.locationPermissions.contains(permission)) {
showPermissionDeclinedRationale = true
}
}
}
)
if (showPermissionDeclinedRationale)
LocationPermissionRequestDialog(
onDismissClick = {
if (!hasLocationPermission())
finish()
else showPermissionDeclinedRationale = false
},
onOkClick = { openAppSetting() }
)
if (showRationale)
LocationPermissionRequestDialog(
onDismissClick = ::finish,
onOkClick = {
showRationale = false
permissionLauncher.launch(PermissionUtils.allPermissions)
}
)
LaunchedEffect(key1 = Unit) {
when {
hasAllPermission() -> return@LaunchedEffect
PermissionUtils.locationPermissions.any { shouldShowRequestPermissionRationale(it) } -> showRationale =
true
else -> permissionLauncher.launch(PermissionUtils.allPermissions)
}
}
}
@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == LocationUtils.LOCATION_ENABLE_REQUEST_CODE && resultCode != Activity.RESULT_OK) {
Toast.makeText(
this,
"Please enable GPS to get proper running statistics.",
Toast.LENGTH_LONG
).show()
}
}
}
@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
AppTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
MainScreen(rememberNavController())
}
}
}