From 3920cda6935eadfb09f2da896f061a8ab99ad34f Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Wed, 29 May 2019 10:59:05 -0700 Subject: [PATCH] For #2419 - Adds a deletion state to the history component --- .../fenix/library/history/HistoryComponent.kt | 5 +++++ .../fenix/library/history/HistoryFragment.kt | 15 ++++++++++--- .../fenix/library/history/HistoryUIView.kt | 11 ++++++---- .../HistoryDeleteButtonViewHolder.kt | 6 +++-- .../viewholders/HistoryListItemViewHolder.kt | 2 +- app/src/main/res/layout/component_history.xml | 22 +++++++++++++++---- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt index f6de63d3d..c6d0f7084 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt @@ -38,6 +38,7 @@ data class HistoryState(val items: List, val mode: Mode) : ViewStat sealed class Mode { object Normal : Mode() data class Editing(val selectedItems: List) : Mode() + object Deleting : Mode() } } @@ -62,6 +63,8 @@ sealed class HistoryChange : Change { object ExitEditMode : HistoryChange() data class AddItemForRemoval(val item: HistoryItem) : HistoryChange() data class RemoveItemForRemoval(val item: HistoryItem) : HistoryChange() + object EnterDeletionMode : HistoryChange() + object ExitDeletionMode : HistoryChange() } class HistoryViewModel( @@ -95,6 +98,8 @@ class HistoryViewModel( } } is HistoryChange.ExitEditMode -> state.copy(mode = HistoryState.Mode.Normal) + is HistoryChange.EnterDeletionMode -> state.copy(mode = HistoryState.Mode.Deleting) + is HistoryChange.ExitDeletionMode -> state.copy(mode = HistoryState.Mode.Normal) } } } diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index 37c2dd58c..745d0d236 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -22,6 +22,7 @@ import androidx.fragment.app.Fragment import androidx.navigation.Navigation import kotlinx.android.synthetic.main.fragment_history.view.* import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.MainScope @@ -106,7 +107,8 @@ class HistoryFragment : Fragment(), CoroutineScope by MainScope(), BackHandler { R.menu.library_menu is HistoryState.Mode.Editing -> R.menu.history_select_multi - }.let { inflater.inflate(it, menu) } + else -> null + }?.let { inflater.inflate(it, menu) } if (mode is HistoryState.Mode.Editing) { menu.findItem(R.id.share_history_multi_select)?.run { @@ -237,10 +239,15 @@ class HistoryFragment : Fragment(), CoroutineScope by MainScope(), BackHandler { dialog.cancel() } setPositiveButton(R.string.history_clear_dialog) { dialog: DialogInterface, _ -> + emitChange { HistoryChange.EnterDeletionMode } launch { requireComponents.core.historyStorage.deleteEverything() reloadData() + launch(Dispatchers.Main) { + emitChange { HistoryChange.ExitDeletionMode } + } } + dialog.dismiss() } create() @@ -302,6 +309,8 @@ class HistoryFragment : Fragment(), CoroutineScope by MainScope(), BackHandler { private inline fun emitChange(producer: () -> HistoryChange) { getManagedEmitter().onNext(producer()) } -} -private const val HISTORY_TIME_DAYS = 3L + companion object { + private const val HISTORY_TIME_DAYS = 3L + } +} diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt index 6afdfa272..08d2767d0 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt @@ -9,10 +9,10 @@ import android.graphics.PorterDuffColorFilter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.FrameLayout import androidx.appcompat.widget.Toolbar import android.widget.ImageButton import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import io.reactivex.Observable @@ -45,7 +45,7 @@ class HistoryUIView( fun getSelected(): List = historyAdapter.selected - override val view: FrameLayout = LayoutInflater.from(container.context) + override val view: ConstraintLayout = LayoutInflater.from(container.context) .inflate(R.layout.component_history, container, true) .findViewById(R.id.history_wrapper) @@ -58,10 +58,13 @@ class HistoryUIView( } override fun updateView() = Consumer { + view.progress_bar.visibility = if (it.mode is HistoryState.Mode.Deleting) View.VISIBLE else View.GONE + if (it.mode != mode) { mode = it.mode actionEmitter.onNext(HistoryAction.SwitchMode) } + (view.history_list.adapter as HistoryAdapter).updateData(it.items, it.mode) items = it.items @@ -128,8 +131,8 @@ class HistoryUIView( } override fun onBackPressed(): Boolean { - return when { - mode is HistoryState.Mode.Editing -> { + return when (mode) { + is HistoryState.Mode.Editing -> { mode = HistoryState.Mode.Normal historyAdapter.updateData(items, mode) setUIForNormalMode(items.isEmpty()) diff --git a/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryDeleteButtonViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryDeleteButtonViewHolder.kt index 773431435..1c1cff9db 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryDeleteButtonViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryDeleteButtonViewHolder.kt @@ -25,7 +25,8 @@ class HistoryDeleteButtonViewHolder( val action = when (it) { is HistoryState.Mode.Normal -> HistoryAction.Delete.All is HistoryState.Mode.Editing -> HistoryAction.Delete.Some(it.selectedItems) - } + is HistoryState.Mode.Deleting -> null + } ?: return@also actionEmitter.onNext(action) } @@ -35,7 +36,8 @@ class HistoryDeleteButtonViewHolder( this.mode = mode buttonView.run { - if (mode is HistoryState.Mode.Editing && mode.selectedItems.isNotEmpty()) { + val isDeleting = mode is HistoryState.Mode.Deleting + if (isDeleting || mode is HistoryState.Mode.Editing && mode.selectedItems.isNotEmpty()) { isEnabled = false alpha = DISABLED_ALPHA } else { diff --git a/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryListItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryListItemViewHolder.kt index 495c7ed6d..868990ead 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryListItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/viewholders/HistoryListItemViewHolder.kt @@ -85,7 +85,7 @@ class HistoryListItemViewHolder( val selected = when (mode) { is HistoryState.Mode.Editing -> mode.selectedItems.contains(item) - HistoryState.Mode.Normal -> false + else -> false } setClickListeners(item, selected) diff --git a/app/src/main/res/layout/component_history.xml b/app/src/main/res/layout/component_history.xml index 9afb2912e..00add25a2 100644 --- a/app/src/main/res/layout/component_history.xml +++ b/app/src/main/res/layout/component_history.xml @@ -3,11 +3,21 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - + + android:visibility="gone" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> - +