From f44ccd739ebba3a8914fd44c53577ef9eff1577f Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 21 Jan 2022 13:50:51 +0000 Subject: [PATCH] storing an retrieving the use case selection by user - will enable multi account support in the future --- .../vector/app/core/extensions/DataStore.kt | 30 +++++++++++++++++++ .../im/vector/app/features/MainActivity.kt | 10 +++---- .../onboarding/OnboardingViewModel.kt | 2 +- .../onboarding/store/OnboardingStore.kt | 21 ++++++------- 4 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/core/extensions/DataStore.kt diff --git a/vector/src/main/java/im/vector/app/core/extensions/DataStore.kt b/vector/src/main/java/im/vector/app/core/extensions/DataStore.kt new file mode 100644 index 0000000000..72e2408591 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/extensions/DataStore.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.extensions + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit + +suspend fun DataStore.removeKeysWithPrefix(prefix: String) { + edit { preferences -> + val keysToRemove = preferences.asMap().keys.filter { key -> key.name.startsWith(prefix) } + keysToRemove.forEach { + preferences.remove(it) + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/MainActivity.kt b/vector/src/main/java/im/vector/app/features/MainActivity.kt index 89ce4a0545..98a967e925 100644 --- a/vector/src/main/java/im/vector/app/features/MainActivity.kt +++ b/vector/src/main/java/im/vector/app/features/MainActivity.kt @@ -151,7 +151,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity // Just do the local cleanup Timber.w("Account deactivated, start app") sessionHolder.clearActiveSession() - doLocalCleanup(clearPreferences = true) + doLocalCleanup(clearPreferences = true, userId = session.myUserId) startNextActivityAndFinish() } } @@ -165,14 +165,14 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity } Timber.w("SIGN_OUT: success, start app") sessionHolder.clearActiveSession() - doLocalCleanup(clearPreferences = true) + doLocalCleanup(clearPreferences = true, userId = session.myUserId) startNextActivityAndFinish() } } args.clearCache -> { lifecycleScope.launch { session.clearCache() - doLocalCleanup(clearPreferences = false) + doLocalCleanup(clearPreferences = false, userId = session.myUserId) session.startSyncing(applicationContext) startNextActivityAndFinish() } @@ -185,7 +185,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity Timber.w("Ignoring invalid token global error") } - private suspend fun doLocalCleanup(clearPreferences: Boolean) { + private suspend fun doLocalCleanup(clearPreferences: Boolean, userId: String) { // On UI Thread Glide.get(this@MainActivity).clearMemory() @@ -195,7 +195,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity pinLocker.unlock() pinCodeStore.deleteEncodedPin() vectorAnalytics.onSignOut() - onboardingStore.clear() + onboardingStore.clear(userId) } withContext(Dispatchers.IO) { // On BG thread diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 07a7933d4b..530f2e62a5 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -753,7 +753,7 @@ class OnboardingViewModel @AssistedInject constructor( private suspend fun onSessionCreated(session: Session) { awaitState().useCase?.let { useCase -> - onboardingStore.setUseCase(useCase) + onboardingStore.setUseCase(userId = session.myUserId, useCase) } activeSessionHolder.setActiveSession(session) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/store/OnboardingStore.kt b/vector/src/main/java/im/vector/app/features/onboarding/store/OnboardingStore.kt index cc4d324aa0..96ad6ec050 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/store/OnboardingStore.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/store/OnboardingStore.kt @@ -22,6 +22,7 @@ import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import im.vector.app.core.extensions.removeKeysWithPrefix import im.vector.app.features.onboarding.FtueUseCase import kotlinx.coroutines.flow.first import javax.inject.Inject @@ -35,25 +36,25 @@ private val Context.dataStore: DataStore by preferencesDataStore(na class OnboardingStore @Inject constructor( private val context: Context ) { - private val useCaseKey = stringPreferencesKey("use_case") - - suspend fun readUseCase() = context.dataStore.data.first().let { preferences -> - preferences[useCaseKey]?.let { FtueUseCase.from(it) } + suspend fun readUseCase(userId: String) = context.dataStore.data.first().let { preferences -> + preferences[userId.toUseCaseKey()]?.let { FtueUseCase.from(it) } } - suspend fun setUseCase(useCase: FtueUseCase) { + suspend fun setUseCase(userId: String, useCase: FtueUseCase) { context.dataStore.edit { settings -> - settings[useCaseKey] = useCase.persistableValue + settings[userId.toUseCaseKey()] = useCase.persistableValue } } - suspend fun resetUseCase() { + suspend fun resetUseCase(userId: String) { context.dataStore.edit { settings -> - settings.remove(useCaseKey) + settings.remove(userId.toUseCaseKey()) } } - suspend fun clear() { - context.dataStore.edit { it.clear() } + suspend fun clear(userId: String) { + context.dataStore.removeKeysWithPrefix(userId) } + + private fun String.toUseCaseKey() = stringPreferencesKey("$this-use_case") }