For #2419 - Adds a deletion state to the history component

nightly-build-test
Jeff Boek 5 years ago
parent 9617a06232
commit 3920cda693

@ -38,6 +38,7 @@ data class HistoryState(val items: List<HistoryItem>, val mode: Mode) : ViewStat
sealed class Mode {
object Normal : Mode()
data class Editing(val selectedItems: List<HistoryItem>) : 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)
}
}
}

@ -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<HistoryChange>().onNext(producer())
}
}
private const val HISTORY_TIME_DAYS = 3L
companion object {
private const val HISTORY_TIME_DAYS = 3L
}
}

@ -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<HistoryItem> = 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<HistoryState> {
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())

@ -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 {

@ -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)

@ -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/. -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/history_wrapper"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:indeterminate="true"
android:layout_width="match_parent"
android:layout_height="8dp"
android:translationY="-3dp"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/history_empty_view"
@ -17,9 +27,13 @@
android:text="@string/history_empty_message"
android:textColor="?secondaryText"
android:textSize="16sp"
android:visibility="gone" />
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/history_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Loading…
Cancel
Save