Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ class MoonlightViewModel @Inject constructor(
private val _uiState = MutableStateFlow(MoonlightUiState())
val uiState: StateFlow<MoonlightUiState> = _uiState.asStateFlow()

val hasSwiped = userPreferencesRepository.hasSwiped

val refreshCycle: Duration
get() {
return 30.seconds // todo figure out Debug flag
Expand All @@ -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()
Expand Down
2 changes: 2 additions & 0 deletions app/androidApp/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
<string name="title_data">data</string>
<string name="title_about">about</string>

<string name="swipe_to_see_more">Swipe to see more</string>

<!-- Data -->
<string name="data_fraction">Fraction</string>
<string name="data_phase">Phase</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -15,6 +18,16 @@ class UserPreferencesRepository @Inject constructor(
) {
private val _isAnalyticsPreferencePending = MutableStateFlow(true)

val hasSwiped: Flow<Boolean> = 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(
Expand All @@ -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 {
Expand Down