Skip to content
This repository was archived by the owner on Aug 23, 2023. It is now read-only.

Commit f0c291c

Browse files
committed
Add datastore preferences
This is used to drive some of the UI, and later will be used to resume updates when the device restarts. Bug: 217264751 Change-Id: Ie3453c7ce60fe614e9ff0cdeb6bfc6e850e8dfa7
1 parent fc4b5ce commit f0c291c

File tree

7 files changed

+110
-15
lines changed

7 files changed

+110
-15
lines changed

ActivityRecognition/app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ android {
6868
dependencies {
6969
implementation 'androidx.core:core-ktx:1.7.0'
7070
implementation 'androidx.appcompat:appcompat:1.4.1'
71+
implementation "androidx.datastore:datastore-preferences:1.0.0"
7172
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
7273
implementation 'androidx.activity:activity-compose:1.4.0'
7374

ActivityRecognition/app/src/main/java/com/google/android/gms/location/sample/activityrecognition/ActivityRecognitionApp.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
package com.google.android.gms.location.sample.activityrecognition
1818

1919
import android.app.Application
20+
import androidx.datastore.core.DataStore
21+
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
22+
import androidx.datastore.preferences.core.Preferences
23+
import androidx.datastore.preferences.preferencesDataStoreFile
2024
import com.google.android.gms.common.GoogleApiAvailability
2125
import dagger.Module
2226
import dagger.Provides
@@ -37,4 +41,12 @@ object AppModule {
3741
@Provides
3842
@Singleton
3943
fun provideGoogleApiAvailability() = GoogleApiAvailability.getInstance()
44+
45+
@Provides
46+
@Singleton
47+
fun provideDataStore(application: Application): DataStore<Preferences> {
48+
return PreferenceDataStoreFactory.create {
49+
application.preferencesDataStoreFile("prefs")
50+
}
51+
}
4052
}

ActivityRecognition/app/src/main/java/com/google/android/gms/location/sample/activityrecognition/MainActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.google.android.gms.location.sample.activityrecognition
1818

1919
import android.os.Bundle
20-
import android.util.Log
2120
import androidx.activity.ComponentActivity
2221
import androidx.activity.compose.setContent
2322
import androidx.activity.viewModels
@@ -49,7 +48,7 @@ class MainActivity : ComponentActivity() {
4948

5049
val permissionState = ActivityRecognitionPermissionState(this) {
5150
if (it.permissionGranted) {
52-
Log.d("ActivityRecognition", "TODO: start activity recognition")
51+
viewModel.toggleActivityTransitionUpdates()
5352
}
5453
}
5554

@@ -81,7 +80,9 @@ fun MainScreen(
8180
Initializing -> InitializingScreen()
8281
PlayServicesUnavailable -> ServiceUnavailableScreen()
8382
PlayServicesAvailable -> {
83+
val isOn by viewModel.isActivityTransitionUpdatesTurnedOn.collectAsState()
8484
ActivityRecognitionScreen(
85+
isActivityUpdatesTurnedOn = isOn,
8586
showDegradedExperience = permissionState.showDegradedExperience,
8687
needsPermissionRationale = permissionState.needsRationale,
8788
onButtonClick = { permissionState.requestPermission() }

ActivityRecognition/app/src/main/java/com/google/android/gms/location/sample/activityrecognition/MainViewModel.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ import androidx.lifecycle.viewModelScope
2121
import com.google.android.gms.location.sample.activityrecognition.PlayServicesAvailableState.Initializing
2222
import com.google.android.gms.location.sample.activityrecognition.PlayServicesAvailableState.PlayServicesAvailable
2323
import com.google.android.gms.location.sample.activityrecognition.PlayServicesAvailableState.PlayServicesUnavailable
24+
import com.google.android.gms.location.sample.activityrecognition.data.AppPreferences
2425
import com.google.android.gms.location.sample.activityrecognition.data.PlayServicesAvailabilityChecker
2526
import dagger.hilt.android.lifecycle.HiltViewModel
2627
import kotlinx.coroutines.flow.SharingStarted
2728
import kotlinx.coroutines.flow.flow
2829
import kotlinx.coroutines.flow.stateIn
30+
import kotlinx.coroutines.launch
2931
import javax.inject.Inject
3032

3133
/**
@@ -34,7 +36,8 @@ import javax.inject.Inject
3436
*/
3537
@HiltViewModel
3638
class MainViewModel @Inject constructor(
37-
playServicesAvailabilityChecker: PlayServicesAvailabilityChecker
39+
playServicesAvailabilityChecker: PlayServicesAvailabilityChecker,
40+
private val appPreferences: AppPreferences
3841
) : ViewModel() {
3942

4043
/**
@@ -52,6 +55,30 @@ class MainViewModel @Inject constructor(
5255
)
5356
}.stateIn(viewModelScope, SharingStarted.Eagerly, Initializing)
5457

58+
val isActivityTransitionUpdatesTurnedOn = appPreferences.isActivityTransitionUpdatesTurnedOn
59+
.stateIn(viewModelScope, SharingStarted.Eagerly, false)
60+
61+
fun toggleActivityTransitionUpdates() {
62+
if (isActivityTransitionUpdatesTurnedOn.value) {
63+
stopActivityTransitionUpdates()
64+
} else {
65+
startActivityTransitionUpdates()
66+
}
67+
}
68+
69+
private fun startActivityTransitionUpdates() {
70+
// TODO request activity transition updates
71+
viewModelScope.launch {
72+
appPreferences.setActivityTransitionUpdatesTurnedOn(true)
73+
}
74+
}
75+
76+
private fun stopActivityTransitionUpdates() {
77+
// TODO remove activity transition updates
78+
viewModelScope.launch {
79+
appPreferences.setActivityTransitionUpdatesTurnedOn(false)
80+
}
81+
}
5582
}
5683

5784
enum class PlayServicesAvailableState {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2022 Google, Inc
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.android.gms.location.sample.activityrecognition.data
18+
19+
import androidx.datastore.core.DataStore
20+
import androidx.datastore.preferences.core.Preferences
21+
import androidx.datastore.preferences.core.booleanPreferencesKey
22+
import androidx.datastore.preferences.core.edit
23+
import kotlinx.coroutines.flow.map
24+
import javax.inject.Inject
25+
26+
class AppPreferences @Inject constructor(
27+
private val dataStore: DataStore<Preferences>
28+
) {
29+
val isActivityTransitionUpdatesTurnedOn = dataStore.data.map {
30+
it[ACTIVITY_TRANSITION_UPDATES_TURNED_ON] ?: false
31+
}
32+
33+
suspend fun setActivityTransitionUpdatesTurnedOn(isOn: Boolean) {
34+
dataStore.edit {
35+
it[ACTIVITY_TRANSITION_UPDATES_TURNED_ON] = isOn
36+
}
37+
}
38+
39+
private companion object {
40+
val ACTIVITY_TRANSITION_UPDATES_TURNED_ON =
41+
booleanPreferencesKey("activity_transition_updates_on")
42+
}
43+
}

ActivityRecognition/app/src/main/java/com/google/android/gms/location/sample/activityrecognition/ui/ActivityRecognitionScreen.kt

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.google.android.gms.location.sample.activityrecognition.ui.theme.Activ
4141
/** The main UI of the app when Google Play Services is available. */
4242
@Composable
4343
fun ActivityRecognitionScreen(
44+
isActivityUpdatesTurnedOn: Boolean,
4445
showDegradedExperience: Boolean,
4546
needsPermissionRationale: Boolean,
4647
onButtonClick: () -> Unit
@@ -71,20 +72,29 @@ fun ActivityRecognitionScreen(
7172
.fillMaxSize()
7273
.padding(16.dp)
7374
) {
75+
val buttonText = if (isActivityUpdatesTurnedOn) {
76+
stringResource(id = R.string.stop_activity_recognition)
77+
} else {
78+
stringResource(id = R.string.start_activity_recognition)
79+
}
7480
Button(onClick = { onClick() }) {
75-
Text(text = stringResource(id = R.string.start))
81+
Text(text = buttonText)
7682
}
7783

78-
val message = if (showDegradedExperience) {
79-
stringResource(id = R.string.please_allow_permission)
80-
} else {
81-
stringResource(id = R.string.not_started)
84+
if (showDegradedExperience) {
85+
Text(
86+
text = stringResource(id = R.string.please_allow_permission),
87+
style = MaterialTheme.typography.h6,
88+
textAlign = TextAlign.Center
89+
)
90+
} else if (!isActivityUpdatesTurnedOn) {
91+
Text(
92+
text = stringResource(id = R.string.not_started),
93+
style = MaterialTheme.typography.h6,
94+
textAlign = TextAlign.Center
95+
)
8296
}
83-
Text(
84-
text = message,
85-
style = MaterialTheme.typography.h6,
86-
textAlign = TextAlign.Center
87-
)
97+
// TODO else show most recent events
8898
}
8999
}
90100

@@ -119,6 +129,7 @@ fun PermissionRationaleDialog(
119129
fun LocationUpdatesScreenPreview() {
120130
ActivityRecognitionTheme {
121131
ActivityRecognitionScreen(
132+
isActivityUpdatesTurnedOn = true,
122133
showDegradedExperience = false,
123134
needsPermissionRationale = false,
124135
onButtonClick = {}

ActivityRecognition/app/src/main/res/values/strings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
<string name="app_name">Activity Recognition</string>
1919
<string name="initializing"> Initializing</string>
2020
<string name="play_services_unavailable">Google Play Services are unavailable on this device.</string>
21-
<string name="start">Start</string>
22-
<string name="stop">Stop</string>
21+
<string name="start_activity_recognition">Start activity recognition</string>
22+
<string name="stop_activity_recognition">Stop activity recognition</string>
2323
<string name="not_started">Tap Start to begin activity recognition</string>
2424
<string name="please_allow_permission">Please allow permission for activity recognition</string>
2525
<string name="permission_rationale_dialog_title">Permission needed</string>

0 commit comments

Comments
 (0)