Skip to content

Commit 07b88bb

Browse files
authored
Merge pull request #9107 from woocommerce/issue/8949_handle_settings_cta
Privacy Banner: handle Settings CTA
2 parents daecdbd + b7efeee commit 07b88bb

File tree

11 files changed

+152
-10
lines changed

11 files changed

+152
-10
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import android.os.Build.VERSION
1212
import android.os.Build.VERSION_CODES
1313
import android.os.Bundle
1414
import android.os.Handler
15+
import android.os.Parcelable
1516
import android.text.method.LinkMovementMethod
1617
import android.view.Menu
1718
import android.view.MenuItem
@@ -98,6 +99,7 @@ import com.woocommerce.android.ui.plans.di.StartUpgradeFlowFactory
9899
import com.woocommerce.android.ui.plans.di.TrialStatusBarFormatterFactory
99100
import com.woocommerce.android.ui.plans.trial.DetermineTrialStatusBarState.TrialStatusBarState
100101
import com.woocommerce.android.ui.prefs.AppSettingsActivity
102+
import com.woocommerce.android.ui.prefs.RequestedAnalyticsValue
101103
import com.woocommerce.android.ui.products.ProductListFragmentDirections
102104
import com.woocommerce.android.ui.reviews.ReviewListFragmentDirections
103105
import com.woocommerce.android.ui.sitepicker.SitePickerFragmentDirections
@@ -599,6 +601,17 @@ class MainActivity :
599601
startActivityForResult(intent, RequestCodes.SETTINGS)
600602
}
601603

604+
private fun showPrivacySettingsScreen(requestedAnalyticsValue: Parcelable) {
605+
val intent = Intent(this, AppSettingsActivity::class.java).apply {
606+
putExtra(AppSettingsActivity.EXTRA_SHOW_PRIVACY_SETTINGS, true)
607+
putExtra(
608+
AppSettingsActivity.EXTRA_REQUESTED_ANALYTICS_VALUE_FROM_ERROR,
609+
requestedAnalyticsValue
610+
)
611+
}
612+
startActivityForResult(intent, RequestCodes.SETTINGS)
613+
}
614+
602615
override fun showAnalytics(targetPeriod: StatsTimeRangeSelection.SelectionType) {
603616
val action = MyStoreFragmentDirections.actionMyStoreToAnalytics(targetPeriod)
604617
navController.navigateSafely(action)
@@ -754,6 +767,12 @@ class MainActivity :
754767
viewModel.onRequestPrivacyUpdate(event.analyticsEnabled)
755768
}.show()
756769
}
770+
MainActivityViewModel.ShowPrivacySettings -> {
771+
showPrivacySettingsScreen(RequestedAnalyticsValue.NONE)
772+
}
773+
is MainActivityViewModel.ShowPrivacySettingsWithError -> {
774+
showPrivacySettingsScreen(event.requestedAnalyticsValue)
775+
}
757776
}
758777
}
759778

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivityViewModel.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.woocommerce.android.ui.moremenu.MoreMenuNewFeature
2828
import com.woocommerce.android.ui.moremenu.MoreMenuNewFeatureHandler
2929
import com.woocommerce.android.ui.plans.trial.DetermineTrialStatusBarState
3030
import com.woocommerce.android.ui.prefs.PrivacySettingsRepository
31+
import com.woocommerce.android.ui.prefs.RequestedAnalyticsValue
3132
import com.woocommerce.android.ui.whatsnew.FeatureAnnouncementRepository
3233
import com.woocommerce.android.util.BuildConfigWrapper
3334
import com.woocommerce.android.util.WooLog
@@ -275,6 +276,14 @@ class MainActivityViewModel @Inject constructor(
275276
}
276277
}
277278

279+
fun onPrivacySettingsTapped() {
280+
triggerEvent(ShowPrivacySettings)
281+
}
282+
283+
fun onSettingsPrivacyPreferenceUpdateFailed(requestedAnalyticsPreference: RequestedAnalyticsValue) {
284+
triggerEvent(ShowPrivacySettingsWithError(requestedAnalyticsPreference))
285+
}
286+
278287
object ViewOrderList : Event()
279288
object ViewReviewList : Event()
280289
object ViewMyStoreStats : Event()
@@ -292,6 +301,8 @@ class MainActivityViewModel @Inject constructor(
292301
data class ViewReviewDetail(val uniqueId: Long) : Event()
293302
data class ViewOrderDetail(val uniqueId: Long, val remoteNoteId: Long) : Event()
294303
data class ShowPrivacyPreferenceUpdatedFailed(val analyticsEnabled: Boolean) : Event()
304+
object ShowPrivacySettings : Event()
305+
data class ShowPrivacySettingsWithError(val requestedAnalyticsValue: RequestedAnalyticsValue) : Event()
295306

296307
sealed class MoreMenuBadgeState {
297308
data class UnseenReviews(val count: Int) : MoreMenuBadgeState()

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/AppSettingsActivity.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.woocommerce.android.ui.main.AppBarStatus
2727
import com.woocommerce.android.ui.main.MainActivity
2828
import com.woocommerce.android.ui.prefs.MainSettingsFragment.AppSettingsListener
2929
import com.woocommerce.android.util.AnalyticsUtils
30+
import com.woocommerce.android.util.parcelable
3031
import dagger.android.DispatchingAndroidInjector
3132
import dagger.hilt.android.AndroidEntryPoint
3233
import javax.inject.Inject
@@ -37,6 +38,8 @@ class AppSettingsActivity :
3738
AppSettingsListener,
3839
AppSettingsContract.View {
3940
companion object {
41+
const val EXTRA_SHOW_PRIVACY_SETTINGS = "extra_show_privacy_settings"
42+
const val EXTRA_REQUESTED_ANALYTICS_VALUE_FROM_ERROR = "extra_requested_analytics_value_from_error"
4043
const val RESULT_CODE_BETA_OPTIONS_CHANGED = 2
4144
const val KEY_BETA_OPTION_CHANGED = "key_beta_option_changed"
4245
}
@@ -75,6 +78,19 @@ class AppSettingsActivity :
7578
if (isBetaOptionChanged) {
7679
setResult(RESULT_CODE_BETA_OPTIONS_CHANGED)
7780
}
81+
82+
if (intent.getBooleanExtra(EXTRA_SHOW_PRIVACY_SETTINGS, false)) {
83+
84+
val requestedAnalyticsValue =
85+
intent.parcelable(EXTRA_REQUESTED_ANALYTICS_VALUE_FROM_ERROR)
86+
?: RequestedAnalyticsValue.NONE
87+
88+
navHostFragment.navController.navigate(
89+
MainSettingsFragmentDirections.actionMainSettingsFragmentToPrivacySettingsFragment(
90+
requestedAnalyticsValue
91+
)
92+
)
93+
}
7894
}
7995

8096
private val fragmentLifecycleObserver: FragmentLifecycleCallbacks = object : FragmentLifecycleCallbacks() {

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/MainSettingsFragment.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,11 @@ class MainSettingsFragment : Fragment(R.layout.fragment_settings_main), MainSett
184184

185185
binding.optionPrivacy.setOnClickListener {
186186
AnalyticsTracker.track(SETTINGS_PRIVACY_SETTINGS_BUTTON_TAPPED)
187-
findNavController().navigateSafely(R.id.action_mainSettingsFragment_to_privacySettingsFragment)
187+
findNavController().navigateSafely(
188+
MainSettingsFragmentDirections.actionMainSettingsFragmentToPrivacySettingsFragment(
189+
RequestedAnalyticsValue.NONE
190+
)
191+
)
188192
}
189193

190194
binding.optionSendFeedback.setOnClickListener {

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/PrivacySettingsViewModel.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.woocommerce.android.viewmodel.MultiLiveEvent
1111
import com.woocommerce.android.viewmodel.ResourceProvider
1212
import com.woocommerce.android.viewmodel.ScopedViewModel
1313
import com.woocommerce.android.viewmodel.combineWith
14+
import com.woocommerce.android.viewmodel.navArgs
1415
import dagger.hilt.android.lifecycle.HiltViewModel
1516
import kotlinx.coroutines.launch
1617
import javax.inject.Inject
@@ -24,6 +25,8 @@ class PrivacySettingsViewModel @Inject constructor(
2425
private val repository: PrivacySettingsRepository,
2526
) : ScopedViewModel(savedState) {
2627

28+
private val args: PrivacySettingsFragmentArgs by savedState.navArgs()
29+
2730
private val analyticsEnabled: LiveData<Boolean> = analyticsTrackerWrapper
2831
.observeSendUsageStats()
2932
.asLiveData()
@@ -60,6 +63,17 @@ class PrivacySettingsViewModel @Inject constructor(
6063
}
6164
)
6265
}
66+
67+
if (args.requestedAnalyticsValue != RequestedAnalyticsValue.NONE) {
68+
val checked =
69+
args.requestedAnalyticsValue == RequestedAnalyticsValue.ENABLED
70+
71+
triggerEvent(
72+
MultiLiveEvent.Event.ShowActionSnackbar(
73+
resourceProvider.getString(R.string.settings_tracking_analytics_error_update)
74+
) { onSendStatsSettingChanged(checked) }
75+
)
76+
}
6377
}
6478
}
6579
}
@@ -100,6 +114,7 @@ class PrivacySettingsViewModel @Inject constructor(
100114

101115
event.fold(
102116
onSuccess = {
117+
appPrefs.savedPrivacyBannerSettings = true
103118
analyticsTrackerWrapper.sendUsageStats = checked
104119
},
105120
onFailure = {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.woocommerce.android.ui.prefs
2+
3+
import android.os.Parcelable
4+
import kotlinx.parcelize.Parcelize
5+
6+
@Parcelize
7+
enum class RequestedAnalyticsValue : Parcelable {
8+
NONE, ENABLED, DISABLE
9+
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/privacy/banner/PrivacyBannerFragment.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,23 @@ class PrivacyBannerFragment : WCBottomSheetDialogFragment() {
3737
viewModel.event.observe(viewLifecycleOwner) { event ->
3838
when (event) {
3939
is PrivacyBannerViewModel.ShowError -> {
40-
mainViewModel.onPrivacyPreferenceUpdateFailed(event.requestedChange)
40+
mainViewModel.onPrivacyPreferenceUpdateFailed(event.requestedAnalyticsValue)
4141
dismiss()
4242
}
4343

4444
is PrivacyBannerViewModel.Dismiss -> {
4545
dismiss()
4646
}
47+
48+
is PrivacyBannerViewModel.ShowSettings -> {
49+
mainViewModel.onPrivacySettingsTapped()
50+
dismiss()
51+
}
52+
53+
is PrivacyBannerViewModel.ShowErrorOnSettings -> {
54+
mainViewModel.onSettingsPrivacyPreferenceUpdateFailed(event.requestedAnalyticsValue)
55+
dismiss()
56+
}
4757
}
4858
}
4959
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/privacy/banner/PrivacyBannerScreen.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ fun PrivacyBannerScreen(viewModel: PrivacyBannerViewModel) {
4444
PrivacyBannerScreen(
4545
state,
4646
viewModel::onSwitchChanged,
47-
viewModel::onSavePressed
47+
viewModel::onSavePressed,
48+
viewModel::onSettingsPressed,
4849
)
4950
}
5051

@@ -53,6 +54,7 @@ fun PrivacyBannerScreen(
5354
state: PrivacyBannerViewModel.State,
5455
onSwitchChanged: (Boolean) -> Unit,
5556
onSavePressed: () -> Unit,
57+
onSettingsPressed: () -> Unit,
5658
) {
5759
Box(Modifier.background(MaterialTheme.colors.surface)) {
5860
Column(
@@ -120,7 +122,7 @@ fun PrivacyBannerScreen(
120122
hoveredElevation = 0.dp,
121123
focusedElevation = 0.dp
122124
),
123-
onClick = { /*TODO*/ }
125+
onClick = onSettingsPressed
124126
) {
125127
Text(stringResource(R.string.privacy_banner_settings))
126128
}
@@ -178,7 +180,7 @@ private fun Default() {
178180
analyticsSwitchEnabled = false,
179181
loading = true
180182
),
181-
{}, {}
183+
{}, {}, {}
182184
)
183185
}
184186
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/privacy/banner/PrivacyBannerViewModel.kt

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.SavedStateHandle
66
import com.woocommerce.android.AppPrefsWrapper
77
import com.woocommerce.android.analytics.AnalyticsTrackerWrapper
88
import com.woocommerce.android.ui.prefs.PrivacySettingsRepository
9+
import com.woocommerce.android.ui.prefs.RequestedAnalyticsValue
910
import com.woocommerce.android.viewmodel.MultiLiveEvent
1011
import com.woocommerce.android.viewmodel.ScopedViewModel
1112
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -20,10 +21,11 @@ class PrivacyBannerViewModel @Inject constructor(
2021
private val repository: PrivacySettingsRepository,
2122
) : ScopedViewModel(savedStateHandle) {
2223

24+
private val initialUserPreference: Boolean = analyticsTrackerWrapper.sendUsageStats
25+
2326
private val _state: MutableLiveData<State> = MutableLiveData(
2427
State(
25-
analyticsSwitchEnabled = analyticsTrackerWrapper.sendUsageStats,
26-
loading = false
28+
analyticsSwitchEnabled = initialUserPreference, loading = false
2729
)
2830
)
2931

@@ -33,6 +35,45 @@ class PrivacyBannerViewModel @Inject constructor(
3335
_state.value = _state.value?.copy(analyticsSwitchEnabled = checked)
3436
}
3537

38+
fun onSettingsPressed() {
39+
val analyticsPreference = _state.value?.analyticsSwitchEnabled ?: false
40+
41+
if (analyticsPreference == initialUserPreference) {
42+
appPrefsWrapper.savedPrivacyBannerSettings = true
43+
triggerEvent(ShowSettings)
44+
return
45+
}
46+
47+
launch {
48+
if (repository.isUserWPCOM()) {
49+
_state.value = _state.value?.copy(loading = true)
50+
val event =
51+
repository.updateTracksSetting(_state.value?.analyticsSwitchEnabled ?: false)
52+
_state.value = _state.value?.copy(loading = false)
53+
54+
event.fold(
55+
onSuccess = {
56+
appPrefsWrapper.savedPrivacyBannerSettings = true
57+
analyticsTrackerWrapper.sendUsageStats = analyticsPreference
58+
triggerEvent(ShowSettings)
59+
},
60+
onFailure = {
61+
triggerEvent(
62+
ShowErrorOnSettings(
63+
requestedAnalyticsValue = if (analyticsPreference) RequestedAnalyticsValue.ENABLED
64+
else RequestedAnalyticsValue.DISABLE
65+
)
66+
)
67+
}
68+
)
69+
} else {
70+
appPrefsWrapper.savedPrivacyBannerSettings = true
71+
analyticsTrackerWrapper.sendUsageStats = analyticsPreference
72+
triggerEvent(ShowSettings)
73+
}
74+
}
75+
}
76+
3677
fun onSavePressed() {
3778
val analyticsPreference = _state.value?.analyticsSwitchEnabled ?: false
3879

@@ -50,7 +91,7 @@ class PrivacyBannerViewModel @Inject constructor(
5091
triggerEvent(Dismiss)
5192
},
5293
onFailure = {
53-
triggerEvent(ShowError(requestedChange = analyticsPreference))
94+
triggerEvent(ShowError(requestedAnalyticsValue = analyticsPreference))
5495
}
5596
)
5697
} else {
@@ -67,5 +108,9 @@ class PrivacyBannerViewModel @Inject constructor(
67108
)
68109

69110
object Dismiss : MultiLiveEvent.Event()
70-
data class ShowError(val requestedChange: Boolean) : MultiLiveEvent.Event()
111+
data class ShowError(val requestedAnalyticsValue: Boolean) : MultiLiveEvent.Event()
112+
object ShowSettings : MultiLiveEvent.Event()
113+
data class ShowErrorOnSettings(
114+
val requestedAnalyticsValue: RequestedAnalyticsValue
115+
) : MultiLiveEvent.Event()
71116
}

WooCommerce/src/main/kotlin/com/woocommerce/android/util/ActivityUtils.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import android.content.Context
66
import android.content.Intent
77
import android.content.pm.PackageManager
88
import android.net.Uri
9+
import android.os.Build.VERSION.SDK_INT
10+
import android.os.Parcelable
911
import androidx.core.content.FileProvider
1012
import com.woocommerce.android.R
1113
import com.woocommerce.android.extensions.intentActivities
@@ -140,3 +142,9 @@ object ActivityUtils {
140142
context.startActivity(Intent.createChooser(sendIntent, title))
141143
}
142144
}
145+
146+
@Suppress("MagicNumber")
147+
inline fun <reified T : Parcelable> Intent.parcelable(key: String): T? = when {
148+
SDK_INT >= 33 -> getParcelableExtra(key, T::class.java)
149+
else -> @Suppress("DEPRECATION") getParcelableExtra(key) as? T
150+
}

0 commit comments

Comments
 (0)