Advertisement
BlackZerg

Untitled

Sep 12th, 2021
1,060
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.65 KB | None | 0 0
  1. // ExtensionsDataStore.kt
  2. private const val USER_DATA_STORAGE = "user_data.pb"
  3.  
  4. val Context.userDataStore: DataStore<UserData> by dataStore(
  5.     fileName = USER_DATA_STORAGE,
  6.     serializer = UserDataSerializer
  7. )
  8.  
  9. //
  10. interface UserData {
  11.     /**
  12.      * Watch info stored insight DataStore
  13.      */
  14.     val watchUserData: Flow<UserData>
  15.  
  16.     /**
  17.      * Write auth cookie to DataStore
  18.      */
  19.     suspend fun updateAuthCookie(authCookie: String)
  20.  
  21.     /**
  22.      * Set info Light or Dark theme
  23.      */
  24.     suspend fun updateAppTheme(isDarkTheme: Boolean = false)
  25.  
  26.     /**
  27.      * Clear DataStore info
  28.      */
  29.     suspend fun clearDataStore()
  30.     suspend fun clearAuthCookie()
  31.     suspend fun clearAppTheme()
  32. }
  33.  
  34. // UserDataRepository.kt
  35. class UserDataRepository(
  36.     private val userDataPreferences: DataStore<bz.lement.pro.proto.UserData>
  37. ) : UserData {
  38.  
  39.     override val watchUserData: Flow<bz.lement.pro.proto.UserData>
  40.         get() = userDataPreferences
  41.             .data
  42.             .catch { exception ->
  43.                 // dataStore.data throws an IOException when an error is encountered when reading data
  44.                 if (exception is IOException) emit(bz.lement.pro.proto.UserData.getDefaultInstance())
  45.                 else throw exception
  46.             }
  47.  
  48.     override suspend fun updateAuthCookie(authCookie: String) {
  49.         userDataPreferences.updateData { preferences ->
  50.             preferences.toBuilder().setCookieAuth(authCookie).build()
  51.         }
  52.     }
  53.  
  54.     override suspend fun updateAppTheme(isDarkTheme: Boolean) {
  55.         userDataPreferences.updateData { preferences ->
  56.             preferences.toBuilder().setAppTheme(isDarkTheme).build()
  57.         }
  58.     }
  59.  
  60.     override suspend fun clearDataStore() {
  61.         userDataPreferences.updateData { preferences ->
  62.             preferences.toBuilder().clear().build()
  63.         }
  64.     }
  65.  
  66.     override suspend fun clearAuthCookie() {
  67.         userDataPreferences.updateData { preferences ->
  68.             preferences.toBuilder().clearCookieAuth().build()
  69.         }
  70.     }
  71.  
  72.     override suspend fun clearAppTheme() {
  73.         userDataPreferences.updateData { preferences ->
  74.             preferences.toBuilder().clearAppTheme().build()
  75.         }
  76.     }
  77. }
  78.  
  79. // Koin modules
  80. val repositoryModule = module {
  81.     single { provideUserDataStore(context = androidContext()) }
  82.     single<UserData> { UserDataRepository(userDataPreferences = get()) }
  83. }
  84.  
  85. //
  86. val viewModelModule = module {
  87.     viewModel { SplashVM(dataStore = get()) }
  88. }
  89.  
  90. // ViewModel
  91. class SplashVM(
  92.     private val dataStore: UserDataRepository
  93. ) : ViewModel() {
  94.  
  95.     val watchAuthCookies: Flow<String>
  96.         get() = _authCookie
  97.  
  98.     private val _authCookie = MutableSharedFlow<String>()
  99.  
  100.     init {
  101.         viewModelScope.launch {
  102.             launch {
  103.                 dataStore
  104.                     .watchUserData
  105.                     .collect { data ->
  106.                         _authCookie.emit(data.cookieAuth)
  107.                     }
  108.             }
  109.         }
  110.     }
  111. }
  112.  
  113. // Activity
  114. class SplashActivity : ComponentActivity() {
  115.  
  116.     private val viewModel by inject<SplashVM>()
  117.  
  118.     override fun onCreate(savedInstanceState: Bundle?) {
  119.         super.onCreate(savedInstanceState)
  120.         setContent {
  121.             SplashScreenTheme {
  122.                 // A surface container using the 'background' color from the theme
  123.                 Surface(color = MaterialTheme.colors.background) {
  124.                     SplashCL()
  125.                 }
  126.             }
  127.         }
  128.  
  129.         lifecycleScope.launch {
  130.             delay(SPLASH_TIME_OUT)
  131.             viewModel.watchAuthCookies.collect {
  132.  
  133.             }
  134.         }
  135.     }
  136. }
  137.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement