diff --git a/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/app/MainActivity.kt b/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/app/MainActivity.kt index 1256bc9..2d1827c 100644 --- a/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/app/MainActivity.kt +++ b/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/app/MainActivity.kt @@ -4,18 +4,26 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.MaterialTheme +import androidx.compose.material.Scaffold import androidx.compose.material.Surface import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.rememberNavController import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import tt.co.jesses.moonlight.android.R import tt.co.jesses.moonlight.android.domain.EventNames import tt.co.jesses.moonlight.android.domain.Logger import tt.co.jesses.moonlight.android.view.AboutScreen @@ -40,15 +48,31 @@ class MainActivity : ComponentActivity() { color = MaterialTheme.colors.background ) { rememberNavController() - rememberCoroutineScope() - rememberScaffoldState() + val coroutineScope = rememberCoroutineScope() + val scaffoldState = rememberScaffoldState() val viewModel: MoonlightViewModel = viewModel() val pagerState = rememberPagerState( pageCount = { Screens.values().size }, initialPage = 0, ) + val hasSwiped by viewModel.hasSwiped.collectAsState(initial = false) + + LaunchedEffect(key1 = hasSwiped) { + if (!hasSwiped) { + coroutineScope.launch { + delay(5000) + scaffoldState.snackbarHostState.showSnackbar( + message = getString(R.string.swipe_to_see_more) + ) + } + } + } + LaunchedEffect(pagerState) { snapshotFlow { pagerState.currentPage }.collect { page -> + if (page > 0) { + viewModel.setHasSwiped(true) + } val screen = when(page) { 0 -> EventNames.Screen.MOONLIGHT_SCREEN 1 -> EventNames.Screen.DATA_SCREEN @@ -59,14 +83,18 @@ class MainActivity : ComponentActivity() { logger.logConsole("Page changed to $screen") } } - HorizontalPager( - state = pagerState, - modifier = Modifier.fillMaxSize() - ) { page -> - when (page) { - 0 -> MoonlightScreen(viewModel = viewModel) - 1 -> DataScreen(viewModel = viewModel) - 2 -> AboutScreen(viewModel = viewModel) + Scaffold(scaffoldState = scaffoldState) { paddingValues -> + HorizontalPager( + state = pagerState, + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + ) { page -> + when (page) { + 0 -> MoonlightScreen(viewModel = viewModel) + 1 -> DataScreen(viewModel = viewModel) + 2 -> AboutScreen(viewModel = viewModel) + } } } } diff --git a/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/view/state/MoonlightViewModel.kt b/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/view/state/MoonlightViewModel.kt index 0b21fd1..0347647 100644 --- a/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/view/state/MoonlightViewModel.kt +++ b/app/androidApp/src/main/java/tt/co/jesses/moonlight/android/view/state/MoonlightViewModel.kt @@ -23,6 +23,8 @@ class MoonlightViewModel @Inject constructor( private val _uiState = MutableStateFlow(MoonlightUiState()) val uiState: StateFlow = _uiState.asStateFlow() + val hasSwiped = userPreferencesRepository.hasSwiped + val refreshCycle: Duration get() { return 30.seconds // todo figure out Debug flag @@ -40,6 +42,12 @@ class MoonlightViewModel @Inject constructor( } } + fun setHasSwiped(hasSwiped: Boolean) { + viewModelScope.launch { + userPreferencesRepository.setHasSwiped(hasSwiped) + } + } + private fun shouldShowAnalyticsModal() { viewModelScope.launch { val userPreferences = userPreferencesRepository.fetchInitialPreferences() diff --git a/app/androidApp/src/main/res/values/strings.xml b/app/androidApp/src/main/res/values/strings.xml index 050ac62..a3c6e15 100644 --- a/app/androidApp/src/main/res/values/strings.xml +++ b/app/androidApp/src/main/res/values/strings.xml @@ -7,6 +7,8 @@ data about + Swipe to see more + Fraction Phase diff --git a/app/common/src/main/java/tt/co/jesses/moonlight/common/data/repository/UserPreferencesRepository.kt b/app/common/src/main/java/tt/co/jesses/moonlight/common/data/repository/UserPreferencesRepository.kt index d2339e8..09f1b61 100644 --- a/app/common/src/main/java/tt/co/jesses/moonlight/common/data/repository/UserPreferencesRepository.kt +++ b/app/common/src/main/java/tt/co/jesses/moonlight/common/data/repository/UserPreferencesRepository.kt @@ -2,10 +2,13 @@ package tt.co.jesses.moonlight.common.data.repository import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import tt.co.jesses.moonlight.common.data.model.AnalyticsAcceptance import tt.co.jesses.moonlight.common.data.model.UserPreferences import javax.inject.Inject @@ -15,6 +18,16 @@ class UserPreferencesRepository @Inject constructor( ) { private val _isAnalyticsPreferencePending = MutableStateFlow(true) + val hasSwiped: Flow = dataStore.data.map { preferences -> + preferences[PreferencesKeys.HAS_SWIPED] ?: false + } + + suspend fun setHasSwiped(hasSwiped: Boolean) { + dataStore.edit { preferences -> + preferences[PreferencesKeys.HAS_SWIPED] = hasSwiped + } + } + suspend fun fetchInitialPreferences(): UserPreferences { val preferences = dataStore.data.first().toPreferences() return UserPreferences( @@ -30,6 +43,7 @@ class UserPreferencesRepository @Inject constructor( private object PreferencesKeys { val ANALYTICS_ACCEPTANCE = intPreferencesKey("analytics_acceptance") + val HAS_SWIPED = booleanPreferencesKey("has_swiped") } companion object {