Convert SignalStore to kotlin.

This commit is contained in:
Greyson Parrelli
2024-06-20 11:30:30 -04:00
parent 341c474610
commit 863b443317
382 changed files with 1934 additions and 1952 deletions

View File

@@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.storage.StorageSyncHelper
class WhoCanFindMeByPhoneNumberRepository {
fun getCurrentState(): WhoCanFindMeByPhoneNumberState {
return when (SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode) {
return when (SignalStore.phoneNumberPrivacy.phoneNumberDiscoverabilityMode) {
PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.DISCOVERABLE -> WhoCanFindMeByPhoneNumberState.EVERYONE
PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE -> WhoCanFindMeByPhoneNumberState.NOBODY
PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.UNDECIDED -> WhoCanFindMeByPhoneNumberState.EVERYONE
@@ -25,11 +25,11 @@ class WhoCanFindMeByPhoneNumberRepository {
return Completable.fromAction {
when (whoCanFindMeByPhoneNumberState) {
WhoCanFindMeByPhoneNumberState.EVERYONE -> {
SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode = PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.DISCOVERABLE
SignalStore.phoneNumberPrivacy.phoneNumberDiscoverabilityMode = PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.DISCOVERABLE
}
WhoCanFindMeByPhoneNumberState.NOBODY -> {
SignalStore.phoneNumberPrivacy().phoneNumberSharingMode = PhoneNumberPrivacyValues.PhoneNumberSharingMode.NOBODY
SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode = PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE
SignalStore.phoneNumberPrivacy.phoneNumberSharingMode = PhoneNumberPrivacyValues.PhoneNumberSharingMode.NOBODY
SignalStore.phoneNumberPrivacy.phoneNumberDiscoverabilityMode = PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE
}
}

View File

@@ -99,7 +99,7 @@ class EditProfileFragment : LoggingFragment() {
binding.manageProfileUsernameContainer.setOnClickListener { v: View ->
if (!viewModel.isRegisteredAndUpToDate) {
onClickWhenUnregisteredOrDeprecated()
} else if (SignalStore.account().username != null) {
} else if (SignalStore.account.username != null) {
MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Signal_MaterialAlertDialog_List)
.setItems(R.array.username_edit_entries) { _: DialogInterface?, w: Int ->
when (w) {
@@ -255,28 +255,28 @@ class EditProfileFragment : LoggingFragment() {
binding.manageProfileUsername.text = username
}
if (SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) {
if (SignalStore.account.usernameSyncState == AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) {
binding.usernameErrorIndicator.visibility = View.VISIBLE
} else {
binding.usernameErrorIndicator.visibility = View.GONE
}
if (SignalStore.account().username != null && SignalStore.account().usernameSyncState != AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) {
if (SignalStore.account.username != null && SignalStore.account.usernameSyncState != AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) {
binding.usernameLinkContainer.setOnClickListener {
findNavController().safeNavigate(EditProfileFragmentDirections.actionManageProfileFragmentToUsernameLinkFragment())
}
if (SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.LINK_CORRUPTED) {
if (SignalStore.account.usernameSyncState == AccountValues.UsernameSyncState.LINK_CORRUPTED) {
binding.linkErrorIndicator.visibility = View.VISIBLE
} else {
binding.linkErrorIndicator.visibility = View.GONE
}
if (SignalStore.tooltips().showProfileSettingsQrCodeTooltop()) {
if (SignalStore.tooltips.showProfileSettingsQrCodeTooltop()) {
binding.usernameLinkTooltip.visibility = View.VISIBLE
binding.linkTooltipCloseButton.setOnClickListener {
binding.usernameLinkTooltip.visibility = View.GONE
SignalStore.tooltips().markProfileSettingsQrCodeTooltipSeen()
SignalStore.tooltips.markProfileSettingsQrCodeTooltipSeen()
}
}
@@ -344,7 +344,7 @@ class EditProfileFragment : LoggingFragment() {
private fun displayConfirmUsernameDeletionDialog() {
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.ManageProfileFragment__delete_username_dialog_title)
.setMessage(requireContext().getString(R.string.ManageProfileFragment__delete_username_dialog_body, SignalStore.account().username))
.setMessage(requireContext().getString(R.string.ManageProfileFragment__delete_username_dialog_body, SignalStore.account.username))
.setPositiveButton(R.string.delete) { _, _ -> onUserConfirmedUsernameDeletion() }
.setNegativeButton(android.R.string.cancel) { d: DialogInterface?, w: Int -> }
.show()

View File

@@ -44,15 +44,15 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
defaultValue = State(
buttonState = ButtonState.SUBMIT_DISABLED,
usernameStatus = UsernameStatus.NONE,
usernameState = SignalStore.account().username?.let { UsernameState.Set(Username(it)) } ?: UsernameState.NoUsername
usernameState = SignalStore.account.username?.let { UsernameState.Set(Username(it)) } ?: UsernameState.NoUsername
),
scheduler = Schedulers.computation()
)
private val stateMachineStore = RxStore<UsernameEditStateMachine.State>(
defaultValue = UsernameEditStateMachine.NoUserEntry(
nickname = SignalStore.account().username?.split(Usernames.DELIMITER)?.first() ?: "",
discriminator = SignalStore.account().username?.split(Usernames.DELIMITER)?.last() ?: "",
nickname = SignalStore.account.username?.split(Usernames.DELIMITER)?.first() ?: "",
discriminator = SignalStore.account.username?.split(Usernames.DELIMITER)?.last() ?: "",
stateModifier = UsernameEditStateMachine.StateModifier.SYSTEM
),
scheduler = Schedulers.computation()
@@ -68,8 +68,8 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
.subscribeBy(onNext = this::onUsernameStateUpdateDebounced)
if (mode == UsernameEditMode.RECOVERY) {
onNicknameUpdated(SignalStore.account().username?.split(Usernames.DELIMITER)?.first() ?: "")
onDiscriminatorUpdated(SignalStore.account().username?.split(Usernames.DELIMITER)?.last() ?: "")
onNicknameUpdated(SignalStore.account.username?.split(Usernames.DELIMITER)?.first() ?: "")
onDiscriminatorUpdated(SignalStore.account.username?.split(Usernames.DELIMITER)?.last() ?: "")
}
}
@@ -81,7 +81,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
fun onNicknameUpdated(nickname: String) {
uiState.update { state: State ->
if (nickname.isBlank() && SignalStore.account().username != null) {
if (nickname.isBlank() && SignalStore.account.username != null) {
return@update State(
buttonState = ButtonState.DELETE,
usernameStatus = UsernameStatus.NONE,
@@ -103,7 +103,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
fun onDiscriminatorUpdated(discriminator: String) {
uiState.update { state: State ->
if (discriminator.isBlank() && SignalStore.account().username != null) {
if (discriminator.isBlank() && SignalStore.account.username != null) {
return@update State(
buttonState = ButtonState.DELETE,
usernameStatus = UsernameStatus.NONE,
@@ -124,7 +124,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
}
fun onUsernameSkipped() {
SignalStore.uiHints().markHasSetOrSkippedUsernameCreation()
SignalStore.uiHints.markHasSetOrSkippedUsernameCreation()
events.onNext(Event.SKIPPED)
}
@@ -132,7 +132,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
val usernameState = uiState.state.usernameState
return mode == UsernameEditMode.RECOVERY &&
usernameState is UsernameState.Reserved &&
usernameState.requireUsername().username.lowercase() == SignalStore.account().username?.lowercase()
usernameState.requireUsername().username.lowercase() == SignalStore.account.username?.lowercase()
}
/**
@@ -148,7 +148,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
val usernameState = uiState.state.usernameState
val isCaseChange = isCaseChange(editState)
if (!isCaseChange && SignalStore.account().username.isNotNullOrBlank() && !userConfirmedResetOk) {
if (!isCaseChange && SignalStore.account.username.isNotNullOrBlank() && !userConfirmedResetOk) {
events.onNext(Event.NEEDS_CONFIRM_RESET)
return
}
@@ -159,7 +159,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
return
}
if (usernameState.requireUsername().username == SignalStore.account().username && mode != UsernameEditMode.RECOVERY) {
if (usernameState.requireUsername().username == SignalStore.account.username && mode != UsernameEditMode.RECOVERY) {
Log.d(TAG, "Username was submitted, but was identical to the current username. Ignoring.")
uiState.update { it.copy(buttonState = ButtonState.SUBMIT_DISABLED, usernameStatus = UsernameStatus.NONE) }
return
@@ -186,7 +186,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
when (result) {
UsernameSetResult.SUCCESS -> {
SignalStore.uiHints().markHasSetOrSkippedUsernameCreation()
SignalStore.uiHints.markHasSetOrSkippedUsernameCreation()
uiState.update { State(ButtonState.SUBMIT_DISABLED, UsernameStatus.NONE, it.usernameState) }
events.onNext(Event.SUBMIT_SUCCESS)
}
@@ -252,7 +252,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
}
val newLower = state.nickname.lowercase()
val oldLower = SignalStore.account().username?.split(Usernames.DELIMITER)?.firstOrNull()?.lowercase()
val oldLower = SignalStore.account.username?.split(Usernames.DELIMITER)?.firstOrNull()?.lowercase()
return newLower == oldLower
}
@@ -280,7 +280,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
}
if (isCaseChange(state)) {
val discriminator = SignalStore.account().username?.split(Usernames.DELIMITER)?.lastOrNull() ?: error("Unexpected case change, no discriminator!")
val discriminator = SignalStore.account.username?.split(Usernames.DELIMITER)?.lastOrNull() ?: error("Unexpected case change, no discriminator!")
uiState.update {
State(
buttonState = ButtonState.SUBMIT,

View File

@@ -130,17 +130,17 @@ object UsernameRepository {
@WorkerThread
@JvmStatic
fun reclaimUsernameIfNecessary(): UsernameReclaimResult {
if (!SignalStore.misc().needsUsernameRestore) {
if (!SignalStore.misc.needsUsernameRestore) {
Log.d(TAG, "[reclaimUsernameIfNecessary] No need to restore username. Skipping.")
return UsernameReclaimResult.SUCCESS
}
val username = SignalStore.account().username
val link = SignalStore.account().usernameLink
val username = SignalStore.account.username
val link = SignalStore.account.usernameLink
if (username == null || link == null) {
Log.d(TAG, "[reclaimUsernameIfNecessary] No username or link to restore. Skipping.")
SignalStore.misc().needsUsernameRestore = false
SignalStore.misc.needsUsernameRestore = false
return UsernameReclaimResult.SUCCESS
}
@@ -149,13 +149,13 @@ object UsernameRepository {
when (result) {
UsernameReclaimResult.SUCCESS -> {
Log.i(TAG, "[reclaimUsernameIfNecessary] Successfully reclaimed username and link.")
SignalStore.misc().needsUsernameRestore = false
SignalStore.misc.needsUsernameRestore = false
}
UsernameReclaimResult.PERMANENT_ERROR -> {
Log.w(TAG, "[reclaimUsernameIfNecessary] Permanently failed to reclaim username and link. User will see an error.")
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED
SignalStore.misc().needsUsernameRestore = false
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED
SignalStore.misc.needsUsernameRestore = false
}
UsernameReclaimResult.NETWORK_ERROR -> {
@@ -185,7 +185,7 @@ object UsernameRepository {
return Single.just(UsernameLinkResetResult.NetworkUnavailable)
}
val usernameString = SignalStore.account().username
val usernameString = SignalStore.account.username
if (usernameString.isNullOrBlank()) {
Log.w(TAG, "[createOrResetUsernameLink] No username set! Cannot rotate the link!")
return Single.just(UsernameLinkResetResult.UnexpectedError)
@@ -201,15 +201,15 @@ object UsernameRepository {
return Single
.fromCallable {
try {
SignalStore.account().usernameLink = null
SignalStore.account.usernameLink = null
Log.d(TAG, "[createOrResetUsernameLink] Creating username link...")
val components = accountManager.createUsernameLink(username)
SignalStore.account().usernameLink = components
SignalStore.account.usernameLink = components
if (SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.LINK_CORRUPTED) {
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account().usernameSyncErrorCount = 0
if (SignalStore.account.usernameSyncState == AccountValues.UsernameSyncState.LINK_CORRUPTED) {
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account.usernameSyncErrorCount = 0
}
SignalDatabase.recipients.markNeedsSync(Recipient.self().id)
@@ -317,39 +317,39 @@ object UsernameRepository {
@JvmStatic
fun onUsernameConsistencyValidated() {
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
if (SignalStore.account().usernameSyncErrorCount > 0) {
Log.i(TAG, "Username consistency validated. There were previously ${SignalStore.account().usernameSyncErrorCount} error(s).")
SignalStore.account().usernameSyncErrorCount = 0
if (SignalStore.account.usernameSyncErrorCount > 0) {
Log.i(TAG, "Username consistency validated. There were previously ${SignalStore.account.usernameSyncErrorCount} error(s).")
SignalStore.account.usernameSyncErrorCount = 0
}
}
@JvmStatic
fun onUsernameMismatchDetected() {
SignalStore.account().usernameSyncErrorCount++
SignalStore.account.usernameSyncErrorCount++
if (SignalStore.account().usernameSyncErrorCount >= USERNAME_SYNC_ERROR_THRESHOLD) {
Log.w(TAG, "We've now seen ${SignalStore.account().usernameSyncErrorCount} mismatches in a row. Marking username and link as corrupted.")
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED
SignalStore.account().usernameSyncErrorCount = 0
if (SignalStore.account.usernameSyncErrorCount >= USERNAME_SYNC_ERROR_THRESHOLD) {
Log.w(TAG, "We've now seen ${SignalStore.account.usernameSyncErrorCount} mismatches in a row. Marking username and link as corrupted.")
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED
SignalStore.account.usernameSyncErrorCount = 0
} else {
Log.w(TAG, "Username mismatch reported. At ${SignalStore.account().usernameSyncErrorCount} / $USERNAME_SYNC_ERROR_THRESHOLD tries.")
Log.w(TAG, "Username mismatch reported. At ${SignalStore.account.usernameSyncErrorCount} / $USERNAME_SYNC_ERROR_THRESHOLD tries.")
}
}
@JvmStatic
fun onUsernameLinkMismatchDetected() {
SignalStore.account().usernameSyncErrorCount++
SignalStore.account.usernameSyncErrorCount++
if (SignalStore.account().usernameSyncErrorCount >= USERNAME_SYNC_ERROR_THRESHOLD) {
Log.w(TAG, "We've now seen ${SignalStore.account().usernameSyncErrorCount} mismatches in a row. Marking link as corrupted.")
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.LINK_CORRUPTED
SignalStore.account().usernameLink = null
SignalStore.account().usernameSyncErrorCount = 0
if (SignalStore.account.usernameSyncErrorCount >= USERNAME_SYNC_ERROR_THRESHOLD) {
Log.w(TAG, "We've now seen ${SignalStore.account.usernameSyncErrorCount} mismatches in a row. Marking link as corrupted.")
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.LINK_CORRUPTED
SignalStore.account.usernameLink = null
SignalStore.account.usernameSyncErrorCount = 0
StorageSyncHelper.scheduleSyncForDataChange()
} else {
Log.w(TAG, "Link mismatch reported. At ${SignalStore.account().usernameSyncErrorCount} / $USERNAME_SYNC_ERROR_THRESHOLD tries.")
Log.w(TAG, "Link mismatch reported. At ${SignalStore.account.usernameSyncErrorCount} / $USERNAME_SYNC_ERROR_THRESHOLD tries.")
}
}
@@ -403,15 +403,15 @@ object UsernameRepository {
}
return try {
val oldUsernameLink = SignalStore.account().usernameLink ?: return UsernameSetResult.USERNAME_INVALID
val oldUsernameLink = SignalStore.account.usernameLink ?: return UsernameSetResult.USERNAME_INVALID
val newUsernameLink = updatedUsername.generateLink(oldUsernameLink.entropy)
val usernameLinkComponents = accountManager.updateUsernameLink(newUsernameLink)
SignalStore.account().username = updatedUsername.username
SignalStore.account().usernameLink = usernameLinkComponents
SignalStore.account.username = updatedUsername.username
SignalStore.account.usernameLink = usernameLinkComponents
SignalDatabase.recipients.setUsername(Recipient.self().id, updatedUsername.username)
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account().usernameSyncErrorCount = 0
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account.usernameSyncErrorCount = 0
SignalDatabase.recipients.markNeedsSync(Recipient.self().id)
StorageSyncHelper.scheduleSyncForDataChange()
@@ -436,11 +436,11 @@ object UsernameRepository {
return try {
val linkComponents: UsernameLinkComponents = accountManager.confirmUsernameAndCreateNewLink(username)
SignalStore.account().username = username.username
SignalStore.account().usernameLink = linkComponents
SignalStore.account.username = username.username
SignalStore.account.usernameLink = linkComponents
SignalDatabase.recipients.setUsername(Recipient.self().id, username.username)
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account().usernameSyncErrorCount = 0
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account.usernameSyncErrorCount = 0
SignalDatabase.recipients.markNeedsSync(Recipient.self().id)
StorageSyncHelper.scheduleSyncForDataChange()
@@ -472,10 +472,10 @@ object UsernameRepository {
return try {
accountManager.deleteUsername()
SignalDatabase.recipients.setUsername(Recipient.self().id, null)
SignalStore.account().username = null
SignalStore.account().usernameLink = null
SignalStore.account().usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account().usernameSyncErrorCount = 0
SignalStore.account.username = null
SignalStore.account.usernameLink = null
SignalStore.account.usernameSyncState = AccountValues.UsernameSyncState.IN_SYNC
SignalStore.account.usernameSyncErrorCount = 0
SignalDatabase.recipients.markNeedsSync(Recipient.self().id)
StorageSyncHelper.scheduleSyncForDataChange()
Log.i(TAG, "[deleteUsername] Successfully deleted the username.")