Skip to content

Commit

Permalink
Rearranging tabs: Remove feature announcement (#4976)
Browse files Browse the repository at this point in the history
Task/Issue URL:
https://app.asana.com/0/1207418217763355/1207845554251064/f

### Description

This PR removes the drag & drop feature announcement.

### Steps to test this PR

- [x] Smoke test the app and make sure the tab switcher works as
expected.
  • Loading branch information
0nko authored Sep 9, 2024
1 parent 78c4c43 commit c3ca562
Show file tree
Hide file tree
Showing 33 changed files with 12 additions and 273 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import com.duckduckgo.di.scopes.AppScope
import dagger.SingleInstanceIn
import io.reactivex.Scheduler
import io.reactivex.schedulers.Schedulers
import java.util.*
import java.util.UUID
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
Expand Down Expand Up @@ -186,14 +186,6 @@ class TabDataRepository @Inject constructor(
}
}

override suspend fun setWasAnnouncementDismissed(wasDismissed: Boolean) {
tabSwitcherDataStore.setWasAnnouncementDismissed(wasDismissed)
}

override suspend fun setAnnouncementDisplayCount(displayCount: Int) {
tabSwitcherDataStore.setAnnouncementDisplayCount(displayCount)
}

override suspend fun setTabLayoutType(layoutType: LayoutType) {
tabSwitcherDataStore.setTabLayoutType(layoutType)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ package com.duckduckgo.app.tabs.store

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import com.duckduckgo.app.tabs.model.TabSwitcherData
import com.duckduckgo.app.tabs.model.TabSwitcherData.LayoutType
Expand All @@ -35,8 +33,6 @@ interface TabSwitcherDataStore {
val data: Flow<TabSwitcherData>

suspend fun setUserState(userState: UserState)
suspend fun setWasAnnouncementDismissed(wasDismissed: Boolean)
suspend fun setAnnouncementDisplayCount(displayCount: Int)
suspend fun setTabLayoutType(layoutType: LayoutType)
}

Expand All @@ -46,16 +42,12 @@ class TabSwitcherPrefsDataStore @Inject constructor(
) : TabSwitcherDataStore {
companion object {
const val KEY_USER_STATE = "KEY_USER_STATE"
const val KEY_WAS_ANNOUNCEMENT_DISMISSED = "KEY_WAS_ANNOUNCEMENT_DISMISSED"
const val KEY_ANNOUNCEMENT_DISPLAY_COUNT = "KEY_ANNOUNCEMENT_DISPLAY_COUNT"
const val KEY_LAYOUT_TYPE = "KEY_LAYOUT_TYPE"
}

override val data: Flow<TabSwitcherData> = store.data.map { preferences ->
TabSwitcherData(
userState = UserState.valueOf(preferences[stringPreferencesKey(KEY_USER_STATE)] ?: UserState.UNKNOWN.name),
wasAnnouncementDismissed = preferences[booleanPreferencesKey(KEY_WAS_ANNOUNCEMENT_DISMISSED)] ?: false,
announcementDisplayCount = preferences[intPreferencesKey(KEY_ANNOUNCEMENT_DISPLAY_COUNT)] ?: 0,
layoutType = LayoutType.valueOf(preferences[stringPreferencesKey(KEY_LAYOUT_TYPE)] ?: LayoutType.GRID.name),
)
}
Expand All @@ -66,18 +58,6 @@ class TabSwitcherPrefsDataStore @Inject constructor(
}
}

override suspend fun setWasAnnouncementDismissed(wasDismissed: Boolean) {
store.edit { preferences ->
preferences[booleanPreferencesKey(KEY_WAS_ANNOUNCEMENT_DISMISSED)] = wasDismissed
}
}

override suspend fun setAnnouncementDisplayCount(displayCount: Int) {
store.edit { preferences ->
preferences[intPreferencesKey(KEY_ANNOUNCEMENT_DISPLAY_COUNT)] = displayCount
}
}

override suspend fun setTabLayoutType(layoutType: LayoutType) {
store.edit { preferences ->
preferences[stringPreferencesKey(KEY_LAYOUT_TYPE)] = layoutType.name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.ImageButton
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR
Expand Down Expand Up @@ -126,8 +124,6 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
private lateinit var tabsRecycler: RecyclerView
private lateinit var tabItemDecorator: TabItemDecorator
private lateinit var toolbar: Toolbar
private lateinit var announcement: View
private lateinit var announcementCloseButton: ImageButton

private var layoutTypeMenuItem: MenuItem? = null
private var layoutType: LayoutType? = null
Expand All @@ -144,7 +140,6 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
configureRecycler()
configureObservers()
configureOnBackPressedListener()
configureAnnouncementBanner()
}

override fun onSaveInstanceState(outState: Bundle) {
Expand All @@ -153,21 +148,13 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
outState.putBoolean(KEY_FIRST_TIME_LOADING, firstTimeLoadingTabsList)
}

private fun configureAnnouncementBanner() {
announcementCloseButton.setOnClickListener {
viewModel.onFeatureAnnouncementCloseButtonTapped()
}
}

private fun extractIntentExtras() {
selectedTabId = intent.getStringExtra(EXTRA_KEY_SELECTED_TAB)
}

private fun configureViewReferences() {
tabsRecycler = findViewById(R.id.tabsRecycler)
toolbar = findViewById(R.id.toolbar)
announcement = findViewById(R.id.tabFeatureAnnouncement)
announcementCloseButton = findViewById(R.id.close)
}

private fun configureRecycler() {
Expand Down Expand Up @@ -218,26 +205,11 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
}
}

lifecycleScope.launch {
viewModel.isFeatureAnnouncementVisible.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).collect {
updateFeatureAnnouncement(it)
}
}

viewModel.command.observe(this) {
processCommand(it)
}
}

private fun updateFeatureAnnouncement(isVisible: Boolean) {
if (isVisible && !this@TabSwitcherActivity.isFinishing) {
viewModel.onTabFeatureAnnouncementDisplayed()
announcement.show()
} else {
announcement.gone()
}
}

private fun updateLayoutType(layoutType: LayoutType) {
tabsRecycler.hide()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,17 @@ import com.duckduckgo.app.browser.session.WebViewSessionStorage
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.statistics.pixels.Pixel
import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.DAILY
import com.duckduckgo.app.statistics.store.StatisticsDataStore
import com.duckduckgo.app.tabs.model.TabEntity
import com.duckduckgo.app.tabs.model.TabRepository
import com.duckduckgo.app.tabs.model.TabSwitcherData.LayoutType.GRID
import com.duckduckgo.app.tabs.model.TabSwitcherData.LayoutType.LIST
import com.duckduckgo.app.tabs.model.TabSwitcherData.UserState
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.common.utils.SingleLiveEvent
import com.duckduckgo.di.scopes.ActivityScope
import javax.inject.Inject
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch

Expand All @@ -51,33 +47,13 @@ class TabSwitcherViewModel @Inject constructor(
private val adClickManager: AdClickManager,
private val dispatcherProvider: DispatcherProvider,
private val pixel: Pixel,
private val statisticsDataStore: StatisticsDataStore,
) : ViewModel() {
companion object {
const val MAX_ANNOUNCEMENT_DISPLAY_COUNT = 3
const val REINSTALL_VARIANT = "ru"
}

val tabs: LiveData<List<TabEntity>> = tabRepository.liveTabs
val activeTab = tabRepository.liveSelectedTab
val deletableTabs: LiveData<List<TabEntity>> = tabRepository.flowDeletableTabs.asLiveData(
context = viewModelScope.coroutineContext,
)

private var announcementDisplayCount: Int = 0
private var isBannerAlreadyVisible: Boolean = false
val isFeatureAnnouncementVisible = combine(tabRepository.tabSwitcherData, tabRepository.flowTabs) { data, tabs ->
val isVisible =
announcementDisplayCount < MAX_ANNOUNCEMENT_DISPLAY_COUNT &&
!data.wasAnnouncementDismissed &&
(data.userState == UserState.EXISTING || statisticsDataStore.variant == REINSTALL_VARIANT) &&
(tabs.size > 1 || isBannerAlreadyVisible)
isBannerAlreadyVisible = isVisible
isVisible
}
.onStart { announcementDisplayCount = tabRepository.tabSwitcherData.first().announcementDisplayCount }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), false)

val layoutType = tabRepository.tabSwitcherData
.map { it.layoutType }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
Expand Down Expand Up @@ -173,22 +149,7 @@ class TabSwitcherViewModel @Inject constructor(
}
}

fun onTabFeatureAnnouncementDisplayed() {
viewModelScope.launch(dispatcherProvider.io()) {
val data = tabRepository.tabSwitcherData.first()
tabRepository.setAnnouncementDisplayCount(data.announcementDisplayCount + 1)
}
}

fun onFeatureAnnouncementCloseButtonTapped() {
dismissFeatureAnnouncementBanner()
}

fun onTabDraggingStarted() {
if (isBannerAlreadyVisible) {
dismissFeatureAnnouncementBanner()
}

viewModelScope.launch(dispatcherProvider.io()) {
val params = mapOf("userState" to tabRepository.tabSwitcherData.first().userState.name)
pixel.fire(AppPixelName.TAB_MANAGER_REARRANGE_TABS_DAILY, parameters = params, encodedParameters = emptyMap(), DAILY)
Expand All @@ -209,10 +170,4 @@ class TabSwitcherViewModel @Inject constructor(
tabRepository.setTabLayoutType(newLayoutType)
}
}

private fun dismissFeatureAnnouncementBanner() {
viewModelScope.launch(dispatcherProvider.io()) {
tabRepository.setWasAnnouncementDismissed(true)
}
}
}
45 changes: 3 additions & 42 deletions app/src/main/res/layout/content_tab_switcher.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,61 +13,22 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<LinearLayout
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/keyline_empty"
android:layout_height="@dimen/keyline_empty"
android:animateLayoutChanges="true"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/appBarLayout">

<androidx.cardview.widget.CardView
android:id="@+id/tabFeatureAnnouncement"
android:visibility="gone"
app:cardElevation="@dimen/keyline_1"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<com.duckduckgo.common.ui.view.text.DaxTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="@dimen/keyline_4"
android:drawableStart="@drawable/ic_announce"
android:drawablePadding="@dimen/keyline_2"
android:textAlignment="center"
app:typography="body1"
android:text="@string/tabSwitcherFeatureAnnouncement" />

<ImageButton
android:id="@+id/close"
android:layout_width="@dimen/legacyButtonSmallHeight"
android:layout_height="@dimen/legacyButtonSmallHeight"
android:background="@drawable/selectable_circular_ripple"
android:contentDescription="@string/closeContentDescription"
android:layout_margin="@dimen/keyline_1"
android:scaleType="center"
android:src="@drawable/ic_close_24_small" />

</LinearLayout>

</androidx.cardview.widget.CardView>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/tabsRecycler"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginStart="7dp"
android:layout_marginEnd="7dp"
android:clipToPadding="false"
Expand All @@ -78,4 +39,4 @@
tools:showIn="@layout/activity_tab_switcher"
tools:spanCount="2" />

</LinearLayout>
</FrameLayout>
1 change: 0 additions & 1 deletion app/src/main/res/values-bg/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Разделът е затворен</string>
<string name="tabClosedUndo">Отмяна</string>
<string name="downloadsMenuItemTitle">Изтеглени файлове</string>
<string name="tabSwitcherFeatureAnnouncement">Вече можете да плъзгате и пускате разделите, за да ги пренаредите!</string>
<string name="tabSwitcherListViewMenu">Изглед в списък</string>
<string name="tabSwitcherGridViewMenu">Изглед в решетка</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-cs/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Karta zavřená</string>
<string name="tabClosedUndo">Vrátit</string>
<string name="downloadsMenuItemTitle">Stahování</string>
<string name="tabSwitcherFeatureAnnouncement">Teď můžeš přetažením karet změnit jejich pořadí.</string>
<string name="tabSwitcherListViewMenu">Zobrazení seznamu</string>
<string name="tabSwitcherGridViewMenu">Zobrazení mřížky</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-da/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Fanen er lukket</string>
<string name="tabClosedUndo">Fortryd</string>
<string name="downloadsMenuItemTitle">Downloads</string>
<string name="tabSwitcherFeatureAnnouncement">Du kan nu trække og slippe dine faner for at omarrangere dem!</string>
<string name="tabSwitcherListViewMenu">Listevisning</string>
<string name="tabSwitcherGridViewMenu">Gittervisning</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Tab geschlossen</string>
<string name="tabClosedUndo">Rückgängig machen</string>
<string name="downloadsMenuItemTitle">Downloads</string>
<string name="tabSwitcherFeatureAnnouncement">Du kannst deine Tabs jetzt per Drag-and-Drop verschieben, um sie neu anzuordnen!</string>
<string name="tabSwitcherListViewMenu">Listenansicht</string>
<string name="tabSwitcherGridViewMenu">Gitteransicht</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-el/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Η καρτέλα έκλεισε</string>
<string name="tabClosedUndo">Αναίρεση</string>
<string name="downloadsMenuItemTitle">Λήψεις</string>
<string name="tabSwitcherFeatureAnnouncement">Μπορείτε τώρα να κάνετε μεταφορά και απόθεση στις καρτέλες σας για να τις αναδιατάξετε!</string>
<string name="tabSwitcherListViewMenu">Προβολή λίστας</string>
<string name="tabSwitcherGridViewMenu">Προβολή πλέγματος</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Pestaña cerrada</string>
<string name="tabClosedUndo">Deshacer</string>
<string name="downloadsMenuItemTitle">Descargas</string>
<string name="tabSwitcherFeatureAnnouncement">¡Ahora puedes arrastrar y soltar las pestañas para reordenarlas!</string>
<string name="tabSwitcherListViewMenu">Vista de lista</string>
<string name="tabSwitcherGridViewMenu">Vista de cuadrícula</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-et/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Vaheleht on suletud</string>
<string name="tabClosedUndo">Võta tagasi</string>
<string name="downloadsMenuItemTitle">Allalaadimised</string>
<string name="tabSwitcherFeatureAnnouncement">Nüüd saad oma vahekaarte lohistades ümber järjestada!</string>
<string name="tabSwitcherListViewMenu">Loendivaade</string>
<string name="tabSwitcherGridViewMenu">Võrgustikuvaade</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-fi/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Välilehti suljettu</string>
<string name="tabClosedUndo">Kumoa</string>
<string name="downloadsMenuItemTitle">Lataukset</string>
<string name="tabSwitcherFeatureAnnouncement">Voit nyt järjestää välilehdet uudelleen vetämällä ja pudottamalla!</string>
<string name="tabSwitcherListViewMenu">Luettelonäkymä</string>
<string name="tabSwitcherGridViewMenu">Ruudukkonäkymä</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Onglet fermé</string>
<string name="tabClosedUndo">Annuler</string>
<string name="downloadsMenuItemTitle">Téléchargements</string>
<string name="tabSwitcherFeatureAnnouncement">Vous pouvez désormais faire glisser et déposer vos onglets pour les réorganiser !</string>
<string name="tabSwitcherListViewMenu">Vue liste</string>
<string name="tabSwitcherGridViewMenu">Vue grille</string>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-hr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
<string name="tabClosed">Kartica je zatvorena</string>
<string name="tabClosedUndo">Poništi</string>
<string name="downloadsMenuItemTitle">Preuzimanja</string>
<string name="tabSwitcherFeatureAnnouncement">Sada možeš povući i ispustiti kartice i promijeniti njihov redoslijed!</string>
<string name="tabSwitcherListViewMenu">Prikaz popisa</string>
<string name="tabSwitcherGridViewMenu">Tablični prikaz</string>

Expand Down
Loading

0 comments on commit c3ca562

Please sign in to comment.