diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index df661e9ceb..f4a90f23a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -512,6 +512,14 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Clear choose initial my story privacy state"), + isEnabled = true, + onClick = { + SignalStore.storyValues().userHasBeenNotifiedAboutStories = false + } + ) + clickPref( title = DSLSettingsText.from("Clear first time navigation state"), isEnabled = true, diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt index a1765452f8..31e5c15aff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsFragment.kt @@ -51,7 +51,7 @@ class MyStorySettingsFragment : DSLSettingsFragment( customPref( AllSignalConnectionsRowItem.Model( - isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL, + isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL && state.hasUserPerformedManualSelection, count = state.allSignalConnectionsCount, onRowClicked = { lifecycleDisposable += viewModel.setMyStoryPrivacyMode(DistributionListPrivacyMode.ALL) @@ -72,7 +72,7 @@ class MyStorySettingsFragment : DSLSettingsFragment( radioPref( title = DSLSettingsText.from(R.string.MyStorySettingsFragment__all_except), summary = exceptText, - isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL_EXCEPT, + isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ALL_EXCEPT && state.hasUserPerformedManualSelection, onClick = { lifecycleDisposable += viewModel.setMyStoryPrivacyMode(DistributionListPrivacyMode.ALL_EXCEPT) .subscribe { findNavController().safeNavigate(R.id.action_myStorySettings_to_allExceptFragment) } @@ -88,7 +88,7 @@ class MyStorySettingsFragment : DSLSettingsFragment( radioPref( title = DSLSettingsText.from(R.string.MyStorySettingsFragment__only_share_with), summary = onlyWithText, - isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ONLY_WITH, + isChecked = state.myStoryPrivacyState.privacyMode == DistributionListPrivacyMode.ONLY_WITH && state.hasUserPerformedManualSelection, onClick = { lifecycleDisposable += viewModel.setMyStoryPrivacyMode(DistributionListPrivacyMode.ONLY_WITH) .subscribe { findNavController().safeNavigate(R.id.action_myStorySettings_to_onlyShareWithFragment) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt index ef63a19cc7..e7522da2f5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsState.kt @@ -3,5 +3,6 @@ package org.thoughtcrime.securesms.stories.settings.my data class MyStorySettingsState( val myStoryPrivacyState: MyStoryPrivacyState = MyStoryPrivacyState(), val areRepliesAndReactionsEnabled: Boolean = false, - val allSignalConnectionsCount: Int = 0 + val allSignalConnectionsCount: Int = 0, + val hasUserPerformedManualSelection: Boolean ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt index 0cbf79d4ae..1d9ff98788 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/my/MyStorySettingsViewModel.kt @@ -6,11 +6,15 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.schedulers.Schedulers import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.livedata.Store class MyStorySettingsViewModel @JvmOverloads constructor(private val repository: MyStorySettingsRepository = MyStorySettingsRepository()) : ViewModel() { - private val store = Store(MyStorySettingsState()) + private val store = Store(MyStorySettingsState(hasUserPerformedManualSelection = SignalStore.storyValues().userHasBeenNotifiedAboutStories)) private val disposables = CompositeDisposable() val state: LiveData = store.stateLiveData @@ -36,8 +40,16 @@ class MyStorySettingsViewModel @JvmOverloads constructor(private val repository: } fun setMyStoryPrivacyMode(privacyMode: DistributionListPrivacyMode): Completable { + store.update { state -> + state.copy(hasUserPerformedManualSelection = true) + } + + SignalStore.storyValues().userHasBeenNotifiedAboutStories = true + return if (privacyMode == state.value!!.myStoryPrivacyState.privacyMode) { - Completable.complete() + Completable.fromAction { + Stories.onStorySettingsChanged(Recipient.self().id) + }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) } else { repository.setPrivacyMode(privacyMode) .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt index a0163fdd97..793719e32e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipBottomSheetDialogFragment.kt @@ -79,9 +79,9 @@ class ChooseInitialMyStoryMembershipBottomSheetDialogFragment : lifecycleDisposable += viewModel.state .subscribe { state -> - allRadio.isChecked = state.privacyState.privacyMode == DistributionListPrivacyMode.ALL - allExceptRadio.isChecked = state.privacyState.privacyMode == DistributionListPrivacyMode.ALL_EXCEPT - onlyWitRadio.isChecked = state.privacyState.privacyMode == DistributionListPrivacyMode.ONLY_WITH + allRadio.isChecked = state.privacyState.privacyMode == DistributionListPrivacyMode.ALL && state.hasUserPerformedManualSelection + allExceptRadio.isChecked = state.privacyState.privacyMode == DistributionListPrivacyMode.ALL_EXCEPT && state.hasUserPerformedManualSelection + onlyWitRadio.isChecked = state.privacyState.privacyMode == DistributionListPrivacyMode.ONLY_WITH && state.hasUserPerformedManualSelection allExceptCount.visible = allExceptRadio.isChecked onlyWithCount.visible = onlyWitRadio.isChecked @@ -95,7 +95,7 @@ class ChooseInitialMyStoryMembershipBottomSheetDialogFragment : else -> Unit } - save.isEnabled = state.recipientId != null + save.isEnabled = state.recipientId != null && state.hasUserPerformedManualSelection } val clickListener = { v: View -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt index 14ae833224..6d3d006281 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipState.kt @@ -6,5 +6,6 @@ import org.thoughtcrime.securesms.stories.settings.my.MyStoryPrivacyState data class ChooseInitialMyStoryMembershipState( val recipientId: RecipientId? = null, val privacyState: MyStoryPrivacyState = MyStoryPrivacyState(), - val allSignalConnectionsCount: Int = 0 + val allSignalConnectionsCount: Int = 0, + val hasUserPerformedManualSelection: Boolean = false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt index bb0d88f637..aa5921f3f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/privacy/ChooseInitialMyStoryMembershipViewModel.kt @@ -6,6 +6,7 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.kotlin.subscribeBy import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient @@ -26,7 +27,9 @@ class ChooseInitialMyStoryMembershipViewModel @JvmOverloads constructor( init { disposables += repository.observeChooseInitialPrivacy() .distinctUntilChanged() - .subscribe { state -> store.update { state } } + .subscribeBy(onNext = { state -> + store.update { state.copy(hasUserPerformedManualSelection = it.hasUserPerformedManualSelection) } + }) } override fun onCleared() { @@ -37,6 +40,9 @@ class ChooseInitialMyStoryMembershipViewModel @JvmOverloads constructor( fun select(selection: DistributionListPrivacyMode): Single { return repository.setPrivacyMode(selection) .toSingleDefault(selection) + .doAfterSuccess { _ -> + store.update { it.copy(hasUserPerformedManualSelection = true) } + } .observeOn(AndroidSchedulers.mainThread()) }