Skip to content

Commit c1bf064

Browse files
committed
Bookmark added dialog promo tidy-up, addressing feedback
1 parent 56b3bc7 commit c1bf064

File tree

8 files changed

+84
-19
lines changed

8 files changed

+84
-19
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"sync_setup_promo_bookmark_added_dialog_shown": {
3+
"description": "User added a bookmark and we showed the sync setup promo in the bookmark added dialog",
4+
"owners": ["CDRussell"],
5+
"triggers": ["other"],
6+
"suffixes": ["form_factor"],
7+
"parameters": ["appVersion"]
8+
},
9+
"sync_setup_promo_bookmark_added_dialog_dismissed": {
10+
"description": "User manually chose to hide the sync setup promo in the bookmark added dialog",
11+
"owners": ["CDRussell"],
12+
"triggers": ["other"],
13+
"suffixes": ["form_factor"],
14+
"parameters": ["appVersion"]
15+
},
16+
"sync_setup_promo_bookmark_added_dialog_confirmed": {
17+
"description": "User chose to set up sync from the promo in the bookmark added dialog",
18+
"owners": ["CDRussell"],
19+
"triggers": ["other"],
20+
"suffixes": ["form_factor"],
21+
"parameters": ["appVersion"]
22+
}
23+
}

app/src/main/java/com/duckduckgo/app/bookmarks/dialog/BookmarkAddedConfirmationDialog.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import android.widget.LinearLayout
3131
import androidx.core.view.children
3232
import androidx.core.view.isVisible
3333
import androidx.lifecycle.lifecycleScope
34-
import com.duckduckgo.app.bookmarks.BookmarkAddedPromotionPlugin
34+
import com.duckduckgo.app.bookmarks.BookmarkAddedDialogPlugin
3535
import com.duckduckgo.app.browser.R
3636
import com.duckduckgo.app.browser.databinding.BottomSheetAddBookmarkBinding
3737
import com.duckduckgo.common.ui.view.gone
@@ -54,7 +54,7 @@ import com.google.android.material.R as MaterialR
5454
class BookmarkAddedConfirmationDialog(
5555
context: Context,
5656
private val bookmarkFolder: BookmarkFolder?,
57-
private val promoPlugins: PluginPoint<BookmarkAddedPromotionPlugin>,
57+
private val promoPlugins: PluginPoint<BookmarkAddedDialogPlugin>,
5858
) : BottomSheetDialog(context) {
5959

6060
abstract class EventListener {

app/src/main/java/com/duckduckgo/app/bookmarks/dialog/BookmarkAddedConfirmationDialogFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package com.duckduckgo.app.bookmarks.dialog
1818

1919
import android.content.Context
20-
import com.duckduckgo.app.bookmarks.BookmarkAddedPromotionPlugin
20+
import com.duckduckgo.app.bookmarks.BookmarkAddedDialogPlugin
2121
import com.duckduckgo.common.utils.plugins.PluginPoint
2222
import com.duckduckgo.di.scopes.AppScope
2323
import com.duckduckgo.savedsites.api.models.BookmarkFolder
@@ -31,7 +31,7 @@ interface BookmarkAddedConfirmationDialogFactory {
3131

3232
@ContributesBinding(AppScope::class)
3333
class ReadyBookmarkAddedConfirmationDialogFactory @Inject constructor(
34-
private val plugins: PluginPoint<BookmarkAddedPromotionPlugin>,
34+
private val plugins: PluginPoint<BookmarkAddedDialogPlugin>,
3535
) : BookmarkAddedConfirmationDialogFactory {
3636
override fun create(context: Context, bookmarkFolder: BookmarkFolder?): BookmarkAddedConfirmationDialog {
3737
return BookmarkAddedConfirmationDialog(context, bookmarkFolder, plugins)

app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import androidx.datastore.preferences.preferencesDataStore
2525
import androidx.work.WorkManager
2626
import com.duckduckgo.adclick.api.AdClickManager
2727
import com.duckduckgo.anvil.annotations.ContributesPluginPoint
28-
import com.duckduckgo.app.bookmarks.BookmarkAddedPromotionPlugin
28+
import com.duckduckgo.app.bookmarks.BookmarkAddedDialogPlugin
2929
import com.duckduckgo.app.browser.*
3030
import com.duckduckgo.app.browser.addtohome.AddToHomeCapabilityDetector
3131
import com.duckduckgo.app.browser.addtohome.AddToHomeSystemCapabilityDetector
@@ -389,5 +389,5 @@ class BrowserModule {
389389
@Qualifier
390390
annotation class IndonesiaNewTabSection
391391

392-
@ContributesPluginPoint(scope = AppScope::class, boundType = BookmarkAddedPromotionPlugin::class)
393-
private interface BookmarkAddedPromotionPluginPoint
392+
@ContributesPluginPoint(scope = AppScope::class, boundType = BookmarkAddedDialogPlugin::class)
393+
private interface BookmarkAddedDialogPluginPoint

app/src/main/res/layout/bottom_sheet_add_bookmark.xml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
android:layout_height="match_parent"
2222
android:background="@drawable/rounded_top_corners_bottom_sheet_drawable"
2323
android:orientation="vertical"
24-
android:paddingTop="@dimen/actionBottomSheetVerticalPadding"
25-
android:paddingBottom="@dimen/actionBottomSheetVerticalPadding">
24+
android:paddingTop="@dimen/actionBottomSheetVerticalPadding">
2625

2726
<com.duckduckgo.common.ui.view.text.DaxTextView
2827
android:id="@+id/bookmarksBottomSheetDialogTitle"
@@ -68,9 +67,12 @@
6867
android:id="@+id/promotionContainer"
6968
android:layout_width="match_parent"
7069
android:layout_height="wrap_content"
71-
android:layout_marginStart="@dimen/keyline_4"
72-
android:layout_marginEnd="@dimen/keyline_4"
73-
android:layout_marginTop="@dimen/keyline_5"
74-
android:orientation="vertical" />
70+
android:layout_marginTop="@dimen/keyline_2"
71+
android:background="?attr/daxColorBackground"
72+
android:orientation="vertical"
73+
android:paddingStart="@dimen/keyline_4"
74+
android:paddingTop="@dimen/keyline_4"
75+
android:paddingEnd="@dimen/keyline_4"
76+
android:paddingBottom="@dimen/keyline_4" />
7577

7678
</com.duckduckgo.app.bookmarks.dialog.TouchObservingLinearLayout>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package com.duckduckgo.app.bookmarks
1818

1919
import android.view.View
2020

21-
interface BookmarkAddedPromotionPlugin {
21+
interface BookmarkAddedDialogPlugin {
2222

2323
/**
2424
* Returns a view to be displayed in the bookmark added confirmation dialog, or null if the promotion should not be shown.
@@ -27,6 +27,6 @@ interface BookmarkAddedPromotionPlugin {
2727
suspend fun getView(): View?
2828

2929
companion object {
30-
const val PRIORITY_KEY_BOOKMARK_ADDED_PROMOTION = 100
30+
const val PRIORITY_KEY_SETUP_SYNC = 100
3131
}
3232
}

sync/sync-impl/src/main/java/com/duckduckgo/sync/impl/pixels/SyncPixels.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ interface SyncPixels {
115115
fun fireSetupDeepLinkFlowAbandoned()
116116
fun fireUserConfirmedToTurnOffSync()
117117
fun fireUserConfirmedToTurnOffSyncAndDelete(connectedDevices: Int)
118+
fun fireSetupSyncPromoBookmarkAddedDialogDismissed()
119+
fun fireSetupSyncPromoBookmarkAddedDialogConfirmed()
120+
fun fireSetupSyncPromoBookmarkAddedDialogShown()
118121
}
119122

120123
@ContributesBinding(AppScope::class)
@@ -338,6 +341,18 @@ class RealSyncPixels @Inject constructor(
338341
pixel.fire(SyncPixelName.SYNC_USER_CONFIRMED_TO_TURN_OFF_SYNC_AND_DELETE, parameters = params)
339342
}
340343

344+
override fun fireSetupSyncPromoBookmarkAddedDialogDismissed() {
345+
pixel.fire(SyncPixelName.SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_DISMISSED)
346+
}
347+
348+
override fun fireSetupSyncPromoBookmarkAddedDialogConfirmed() {
349+
pixel.fire(SyncPixelName.SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_CONFIRMED)
350+
}
351+
352+
override fun fireSetupSyncPromoBookmarkAddedDialogShown() {
353+
pixel.fire(SyncPixelName.SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_SHOWN)
354+
}
355+
341356
override fun fireSyncBarcodeScreenShown(screenType: ScreenType) {
342357
val params = mapOf(SYNC_SETUP_SCREEN_TYPE to screenType.value)
343358
pixel.fire(SyncPixelName.SYNC_SETUP_BARCODE_SCREEN_SHOWN, parameters = params)
@@ -452,6 +467,9 @@ enum class SyncPixelName(override val pixelName: String) : Pixel.PixelName {
452467
SYNC_SETUP_ENDED_SUCCESS("sync_setup_ended_successful"),
453468
SYNC_USER_CONFIRMED_TO_TURN_OFF_SYNC("sync_disabled"),
454469
SYNC_USER_CONFIRMED_TO_TURN_OFF_SYNC_AND_DELETE("sync_disabledanddeleted"),
470+
SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_SHOWN("sync_setup_promo_bookmark_added_dialog_shown"),
471+
SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_DISMISSED("sync_setup_promo_bookmark_added_dialog_dismissed"),
472+
SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_CONFIRMED("sync_setup_promo_bookmark_added_dialog_confirmed"),
455473
}
456474

457475
object SyncPixelParameters {
@@ -485,6 +503,9 @@ object SyncPixelsRequiringDataCleaning : PixelParamRemovalPlugin {
485503
return listOf(
486504
SyncPixelName.SYNC_USER_CONFIRMED_TO_TURN_OFF_SYNC.pixelName to removeAtb(),
487505
SyncPixelName.SYNC_USER_CONFIRMED_TO_TURN_OFF_SYNC_AND_DELETE.pixelName to removeAtb(),
506+
SyncPixelName.SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_SHOWN.pixelName to removeAtb(),
507+
SyncPixelName.SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_DISMISSED.pixelName to removeAtb(),
508+
SyncPixelName.SYNC_SETUP_PROMO_BOOKMARK_ADDED_DIALOG_CONFIRMED.pixelName to removeAtb(),
488509
)
489510
}
490511
}

sync/sync-impl/src/main/java/com/duckduckgo/sync/impl/promotion/bookmarks/addeddialog/SetupSyncBookmarkAddedPromo.kt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import android.view.View
2222
import androidx.appcompat.app.AppCompatActivity
2323
import androidx.lifecycle.lifecycleScope
2424
import com.duckduckgo.anvil.annotations.PriorityKey
25-
import com.duckduckgo.app.bookmarks.BookmarkAddedPromotionPlugin
25+
import com.duckduckgo.app.bookmarks.BookmarkAddedDialogPlugin
2626
import com.duckduckgo.common.ui.menu.PopupMenu
2727
import com.duckduckgo.common.ui.view.gone
2828
import com.duckduckgo.common.ui.view.listitem.OneLineListItem
@@ -33,20 +33,22 @@ import com.duckduckgo.sync.api.SyncActivityWithEmptyParams
3333
import com.duckduckgo.sync.api.SyncState
3434
import com.duckduckgo.sync.api.SyncStateMonitor
3535
import com.duckduckgo.sync.impl.R
36+
import com.duckduckgo.sync.impl.pixels.SyncPixels
3637
import com.duckduckgo.sync.impl.promotion.SyncPromotions
3738
import com.squareup.anvil.annotations.ContributesMultibinding
3839
import kotlinx.coroutines.launch
3940
import javax.inject.Inject
4041

4142
@ContributesMultibinding(scope = ActivityScope::class)
42-
@PriorityKey(BookmarkAddedPromotionPlugin.PRIORITY_KEY_BOOKMARK_ADDED_PROMOTION)
43+
@PriorityKey(BookmarkAddedDialogPlugin.PRIORITY_KEY_SETUP_SYNC)
4344
class SetupSyncBookmarkAddedPromo @Inject constructor(
4445
private val globalActivityStarter: GlobalActivityStarter,
4546
private val dispatchers: DispatcherProvider,
4647
private val activity: AppCompatActivity,
4748
private val syncPromotions: SyncPromotions,
4849
private val syncStateMonitor: SyncStateMonitor,
49-
) : BookmarkAddedPromotionPlugin {
50+
private val syncPixels: SyncPixels,
51+
) : BookmarkAddedDialogPlugin {
5052

5153
@SuppressLint("InflateParams")
5254
override suspend fun getView(): View? {
@@ -55,8 +57,12 @@ class SetupSyncBookmarkAddedPromo @Inject constructor(
5557
}
5658

5759
val root = LayoutInflater.from(activity).inflate(R.layout.view_sync_setup_bookmark_added_promo, null) as OneLineListItem
58-
root.setOnClickListener { onLaunchSyncFlow(activity) }
60+
root.setOnClickListener {
61+
onLaunchSyncFlow(activity)
62+
syncPixels.fireSetupSyncPromoBookmarkAddedDialogConfirmed()
63+
}
5964
root.configureOverflowMenu()
65+
root.configureViewAttachedListener()
6066

6167
activity.lifecycleScope.launch {
6268
syncStateMonitor.syncState().collect { syncState -> onSyncStateAvailable(syncState, root) }
@@ -102,10 +108,23 @@ class SetupSyncBookmarkAddedPromo @Inject constructor(
102108
activity.lifecycleScope.launch(dispatchers.main()) {
103109
rootView.gone()
104110
syncPromotions.recordBookmarkAddedDialogPromotionDismissed()
111+
syncPixels.fireSetupSyncPromoBookmarkAddedDialogDismissed()
105112
}
106113
}
107114
}
108115

109116
return popupMenu
110117
}
118+
119+
private fun OneLineListItem.configureViewAttachedListener() {
120+
this.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
121+
override fun onViewAttachedToWindow(v: View) {
122+
syncPixels.fireSetupSyncPromoBookmarkAddedDialogShown()
123+
}
124+
125+
override fun onViewDetachedFromWindow(v: View) {
126+
// no-op
127+
}
128+
})
129+
}
111130
}

0 commit comments

Comments
 (0)