mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-28 20:45:17 +00:00
Use Flow
This commit is contained in:
parent
182d3f6973
commit
0d901ef510
@ -8,7 +8,6 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Telephony.Mms.Addr
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
@ -21,7 +20,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.flow.filter
|
|
||||||
import kotlinx.coroutines.flow.filterNotNull
|
import kotlinx.coroutines.flow.filterNotNull
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@ -185,9 +183,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
|||||||
// subscribe to outdated config updates, this should be removed after long enough time for device migration
|
// subscribe to outdated config updates, this should be removed after long enough time for device migration
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
TextSecurePreferences.events.filter { it == TextSecurePreferences.HAS_RECEIVED_LEGACY_CONFIG.name }.collect {
|
prefs.hasLegacyConfigFlow().collect(::updateLegacyConfigView)
|
||||||
updateLegacyConfigView()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,10 +220,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
updateProfileButton()
|
prefs.profileNameFlow().collect(::updateProfileButton)
|
||||||
TextSecurePreferences.events.filter { it == TextSecurePreferences.PROFILE_NAME_PREF.name }.collect {
|
|
||||||
updateProfileButton()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,8 +323,8 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
|||||||
binding.newConversationButton.isVisible = !isShown
|
binding.newConversationButton.isVisible = !isShown
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateLegacyConfigView() {
|
private fun updateLegacyConfigView(hasLegacyConfig: Boolean = textSecurePreferences.getHasLegacyConfig()) {
|
||||||
binding.configOutdatedView.isVisible = textSecurePreferences.getHasLegacyConfig()
|
binding.configOutdatedView.isVisible = hasLegacyConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
@ -382,9 +375,9 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateProfileButton() {
|
private fun updateProfileButton(profileName: String? = textSecurePreferences.getProfileName()) {
|
||||||
binding.profileButton.publicKey = publicKey
|
binding.profileButton.publicKey = publicKey
|
||||||
binding.profileButton.displayName = textSecurePreferences.getProfileName()
|
binding.profileButton.displayName = profileName
|
||||||
binding.profileButton.recycle()
|
binding.profileButton.recycle()
|
||||||
binding.profileButton.update()
|
binding.profileButton.update()
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@ import kotlinx.coroutines.flow.StateFlow
|
|||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.debounce
|
import kotlinx.coroutines.flow.debounce
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.filter
|
|
||||||
import kotlinx.coroutines.flow.flowOn
|
import kotlinx.coroutines.flow.flowOn
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.mapLatest
|
import kotlinx.coroutines.flow.mapLatest
|
||||||
@ -60,11 +59,6 @@ class HomeViewModel @Inject constructor(
|
|||||||
::Data
|
::Data
|
||||||
).stateIn(viewModelScope, SharingStarted.Eagerly, null)
|
).stateIn(viewModelScope, SharingStarted.Eagerly, null)
|
||||||
|
|
||||||
private fun hasHiddenMessageRequests() = TextSecurePreferences.events
|
|
||||||
.filter { it == TextSecurePreferences.HAS_HIDDEN_MESSAGE_REQUESTS.name }
|
|
||||||
.map { prefs.hasHiddenMessageRequests() }
|
|
||||||
.onStart { emit(prefs.hasHiddenMessageRequests()) }
|
|
||||||
|
|
||||||
private fun observeTypingStatus(): Flow<Set<Long>> =
|
private fun observeTypingStatus(): Flow<Set<Long>> =
|
||||||
ApplicationContext.getInstance(context).typingStatusRepository
|
ApplicationContext.getInstance(context).typingStatusRepository
|
||||||
.typingThreads
|
.typingThreads
|
||||||
@ -74,7 +68,7 @@ class HomeViewModel @Inject constructor(
|
|||||||
|
|
||||||
private fun messageRequests() = combine(
|
private fun messageRequests() = combine(
|
||||||
unapprovedConversationCount(),
|
unapprovedConversationCount(),
|
||||||
hasHiddenMessageRequests(),
|
prefs.hasHiddenMessageRequestsFlow(),
|
||||||
latestUnapprovedConversationTimestamp(),
|
latestUnapprovedConversationTimestamp(),
|
||||||
::createMessageRequests
|
::createMessageRequests
|
||||||
).flowOn(Dispatchers.IO)
|
).flowOn(Dispatchers.IO)
|
||||||
|
@ -12,8 +12,6 @@ import kotlinx.coroutines.flow.asSharedFlow
|
|||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.flow.filter
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.flow.flowOn
|
|
||||||
import kotlinx.coroutines.flow.onStart
|
|
||||||
import kotlinx.coroutines.flow.timeout
|
import kotlinx.coroutines.flow.timeout
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@ -44,10 +42,8 @@ internal class LoadingViewModel @Inject constructor(
|
|||||||
init {
|
init {
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
TextSecurePreferences.events
|
prefs.configurationMessageSyncedFlow()
|
||||||
.filter { it == TextSecurePreferences.CONFIGURATION_SYNCED.name }
|
.filter { it }
|
||||||
.onStart { emit(TextSecurePreferences.CONFIGURATION_SYNCED.name) }
|
|
||||||
.filter { prefs.getConfigurationMessageSynced() }
|
|
||||||
.timeout(TIMEOUT_TIME)
|
.timeout(TIMEOUT_TIME)
|
||||||
.collectLatest { onSuccess() }
|
.collectLatest { onSuccess() }
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
@ -2,6 +2,7 @@ package org.session.libsession.utilities
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||||
import android.hardware.Camera
|
import android.hardware.Camera
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
@ -12,9 +13,9 @@ import androidx.preference.Preference
|
|||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import kotlinx.coroutines.channels.BufferOverflow
|
import kotlinx.coroutines.channels.awaitClose
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.asSharedFlow
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
import org.session.libsession.R
|
import org.session.libsession.R
|
||||||
import org.session.libsession.utilities.TextSecurePreferences.Companion.instance
|
import org.session.libsession.utilities.TextSecurePreferences.Companion.instance
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
@ -42,7 +43,6 @@ fun Pref(name: String, default: String) = Pref(name, default, { _, _ -> getStrin
|
|||||||
fun Pref(name: String) = Pref(name, null, SharedPreferences::getString, SharedPreferences.Editor::putStringOrRemove)
|
fun Pref(name: String) = Pref(name, null, SharedPreferences::getString, SharedPreferences.Editor::putStringOrRemove)
|
||||||
fun Pref(name: String, default: Set<String>) = Pref(name, default, SharedPreferences::getStringSet, SharedPreferences.Editor::putStringSet)
|
fun Pref(name: String, default: Set<String>) = Pref(name, default, SharedPreferences::getStringSet, SharedPreferences.Editor::putStringSet)
|
||||||
|
|
||||||
|
|
||||||
private fun SharedPreferences.Editor.putStringOrRemove(name: String, value: String?) = value?.let { putString(name, it) } ?: run { remove(name) }
|
private fun SharedPreferences.Editor.putStringOrRemove(name: String, value: String?) = value?.let { putString(name, it) } ?: run { remove(name) }
|
||||||
|
|
||||||
operator fun <T> SharedPreferences.get(pref: Pref<T>): T = pref.get(this)
|
operator fun <T> SharedPreferences.get(pref: Pref<T>): T = pref.get(this)
|
||||||
@ -76,9 +76,6 @@ class TextSecurePreferences @Inject constructor(
|
|||||||
|
|
||||||
var instance: TextSecurePreferences? = null
|
var instance: TextSecurePreferences? = null
|
||||||
|
|
||||||
internal val _events = MutableSharedFlow<String>(0, 64, BufferOverflow.DROP_OLDEST)
|
|
||||||
val events get() = _events.asSharedFlow()
|
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
var pushSuffix = ""
|
var pushSuffix = ""
|
||||||
|
|
||||||
@ -165,19 +162,26 @@ class TextSecurePreferences @Inject constructor(
|
|||||||
fun <T> set(pref: Pref<T>, value: T?) = sharedPreferences.set(pref, value)
|
fun <T> set(pref: Pref<T>, value: T?) = sharedPreferences.set(pref, value)
|
||||||
fun <T> remove(pref: Pref<T>) = sharedPreferences.set(pref, null)
|
fun <T> remove(pref: Pref<T>) = sharedPreferences.set(pref, null)
|
||||||
fun <T> has(pref: Pref<T>) = sharedPreferences.contains(pref.name)
|
fun <T> has(pref: Pref<T>) = sharedPreferences.contains(pref.name)
|
||||||
|
fun <T> flow(pref: Pref<T>) = callbackFlow {
|
||||||
|
OnSharedPreferenceChangeListener { _, _ -> trySend(sharedPreferences[pref]) }.let {
|
||||||
|
trySend(sharedPreferences[pref])
|
||||||
|
|
||||||
|
sharedPreferences.registerOnSharedPreferenceChangeListener(it)
|
||||||
|
|
||||||
|
awaitClose {
|
||||||
|
sharedPreferences.unregisterOnSharedPreferenceChangeListener(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun getConfigurationMessageSynced(): Boolean = sharedPreferences[CONFIGURATION_SYNCED]
|
fun getConfigurationMessageSynced(): Boolean = sharedPreferences[CONFIGURATION_SYNCED]
|
||||||
|
fun configurationMessageSyncedFlow() = flow(CONFIGURATION_SYNCED)
|
||||||
fun setConfigurationMessageSynced(value: Boolean) {
|
fun setConfigurationMessageSynced(value: Boolean) = set(CONFIGURATION_SYNCED, value)
|
||||||
set(CONFIGURATION_SYNCED, value)
|
|
||||||
_events.tryEmit(CONFIGURATION_SYNCED.name)
|
|
||||||
}
|
|
||||||
fun isPushEnabled(): Boolean = sharedPreferences[IS_PUSH_ENABLED]
|
fun isPushEnabled(): Boolean = sharedPreferences[IS_PUSH_ENABLED]
|
||||||
fun setPushEnabled(value: Boolean) = sharedPreferences.set(IS_PUSH_ENABLED, value)
|
fun setPushEnabled(value: Boolean) = sharedPreferences.set(IS_PUSH_ENABLED, value)
|
||||||
fun getPushToken(): String? = sharedPreferences[PUSH_TOKEN]
|
fun getPushToken(): String? = sharedPreferences[PUSH_TOKEN]
|
||||||
fun setPushToken(value: String) = set(PUSH_TOKEN, value)
|
fun setPushToken(value: String) = set(PUSH_TOKEN, value)
|
||||||
fun getPushRegisterTime(): Long = sharedPreferences[PUSH_REGISTER_TIME]
|
fun getPushRegisterTime(): Long = sharedPreferences[PUSH_REGISTER_TIME]
|
||||||
|
|
||||||
fun setPushRegisterTime(value: Long) = set(PUSH_REGISTER_TIME, value)
|
fun setPushRegisterTime(value: Long) = set(PUSH_REGISTER_TIME, value)
|
||||||
fun isScreenLockEnabled() = sharedPreferences[SCREEN_LOCK]
|
fun isScreenLockEnabled() = sharedPreferences[SCREEN_LOCK]
|
||||||
fun setScreenLockEnabled(value: Boolean) = set(SCREEN_LOCK, value)
|
fun setScreenLockEnabled(value: Boolean) = set(SCREEN_LOCK, value)
|
||||||
@ -202,11 +206,9 @@ class TextSecurePreferences @Inject constructor(
|
|||||||
fun setIsGifSearchInGridLayout(isGrid: Boolean) = set(GIF_GRID_LAYOUT, isGrid)
|
fun setIsGifSearchInGridLayout(isGrid: Boolean) = set(GIF_GRID_LAYOUT, isGrid)
|
||||||
fun getProfileKey(): String? = sharedPreferences[PROFILE_KEY_PREF]
|
fun getProfileKey(): String? = sharedPreferences[PROFILE_KEY_PREF]
|
||||||
fun setProfileKey(key: String?) = set(PROFILE_KEY_PREF, key)
|
fun setProfileKey(key: String?) = set(PROFILE_KEY_PREF, key)
|
||||||
fun setProfileName(name: String?) {
|
fun setProfileName(name: String?) = sharedPreferences.set(PROFILE_NAME_PREF, name)
|
||||||
sharedPreferences[PROFILE_NAME_PREF] = name
|
|
||||||
_events.tryEmit(PROFILE_NAME_PREF.name)
|
|
||||||
}
|
|
||||||
fun getProfileName(): String? = sharedPreferences[PROFILE_NAME_PREF]
|
fun getProfileName(): String? = sharedPreferences[PROFILE_NAME_PREF]
|
||||||
|
fun profileNameFlow() = flow(PROFILE_NAME_PREF)
|
||||||
fun setProfileAvatarId(id: Int) = set(PROFILE_AVATAR_ID_PREF, id)
|
fun setProfileAvatarId(id: Int) = set(PROFILE_AVATAR_ID_PREF, id)
|
||||||
fun getProfileAvatarId(): Int = sharedPreferences[PROFILE_AVATAR_ID_PREF]
|
fun getProfileAvatarId(): Int = sharedPreferences[PROFILE_AVATAR_ID_PREF]
|
||||||
fun setProfilePictureURL(url: String?) = set(PROFILE_AVATAR_URL_PREF, url)
|
fun setProfilePictureURL(url: String?) = set(PROFILE_AVATAR_URL_PREF, url)
|
||||||
@ -220,10 +222,8 @@ class TextSecurePreferences @Inject constructor(
|
|||||||
fun setLocalRegistrationId(registrationId: Int) = set(LOCAL_REGISTRATION_ID_PREF, registrationId)
|
fun setLocalRegistrationId(registrationId: Int) = set(LOCAL_REGISTRATION_ID_PREF, registrationId)
|
||||||
fun getLocalNumber(): String? = sharedPreferences[LOCAL_NUMBER_PREF]
|
fun getLocalNumber(): String? = sharedPreferences[LOCAL_NUMBER_PREF]
|
||||||
fun getHasLegacyConfig(): Boolean = sharedPreferences[HAS_RECEIVED_LEGACY_CONFIG]
|
fun getHasLegacyConfig(): Boolean = sharedPreferences[HAS_RECEIVED_LEGACY_CONFIG]
|
||||||
fun setHasLegacyConfig(newValue: Boolean) {
|
fun hasLegacyConfigFlow(): Flow<Boolean> = flow(HAS_RECEIVED_LEGACY_CONFIG)
|
||||||
sharedPreferences[HAS_RECEIVED_LEGACY_CONFIG] = newValue
|
fun setHasLegacyConfig(newValue: Boolean) = sharedPreferences.set(HAS_RECEIVED_LEGACY_CONFIG, newValue)
|
||||||
_events.tryEmit(HAS_RECEIVED_LEGACY_CONFIG.name)
|
|
||||||
}
|
|
||||||
fun setLocalNumber(localNumber: String) = set(LOCAL_NUMBER_PREF, localNumber.lowercase())
|
fun setLocalNumber(localNumber: String) = set(LOCAL_NUMBER_PREF, localNumber.lowercase())
|
||||||
fun isEnterSendsEnabled() = sharedPreferences[ENTER_SENDS_PREF]
|
fun isEnterSendsEnabled() = sharedPreferences[ENTER_SENDS_PREF]
|
||||||
fun isPasswordDisabled(): Boolean = sharedPreferences[DISABLE_PASSPHRASE_PREF]
|
fun isPasswordDisabled(): Boolean = sharedPreferences[DISABLE_PASSPHRASE_PREF]
|
||||||
@ -278,6 +278,7 @@ class TextSecurePreferences @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fun hasHiddenMessageRequests(): Boolean = sharedPreferences[HAS_HIDDEN_MESSAGE_REQUESTS]
|
fun hasHiddenMessageRequests(): Boolean = sharedPreferences[HAS_HIDDEN_MESSAGE_REQUESTS]
|
||||||
|
fun hasHiddenMessageRequestsFlow() = flow(HAS_HIDDEN_MESSAGE_REQUESTS)
|
||||||
fun setHasHiddenMessageRequests() = set(HAS_HIDDEN_MESSAGE_REQUESTS, true)
|
fun setHasHiddenMessageRequests() = set(HAS_HIDDEN_MESSAGE_REQUESTS, true)
|
||||||
fun removeHasHiddenMessageRequests() = remove(HAS_HIDDEN_MESSAGE_REQUESTS)
|
fun removeHasHiddenMessageRequests() = remove(HAS_HIDDEN_MESSAGE_REQUESTS)
|
||||||
fun getFingerprintKeyGenerated(): Boolean = sharedPreferences[FINGERPRINT_KEY_GENERATED]
|
fun getFingerprintKeyGenerated(): Boolean = sharedPreferences[FINGERPRINT_KEY_GENERATED]
|
||||||
|
Loading…
Reference in New Issue
Block a user