1
0
Fork 0

Rename HistoryStore/State/Action to HistoryFragmentStore/State/Action.

master
Sebastian Kaspari 2019-08-30 15:33:00 +02:00 committed by Jeff Boek
parent f3d8a89c63
commit 2723a55b03
8 changed files with 71 additions and 71 deletions

View File

@ -31,7 +31,7 @@ class HistoryAdapter(
private val historyInteractor: HistoryInteractor private val historyInteractor: HistoryInteractor
) : PagedListAdapter<HistoryItem, HistoryListItemViewHolder>(historyDiffCallback), SelectionHolder<HistoryItem> { ) : PagedListAdapter<HistoryItem, HistoryListItemViewHolder>(historyDiffCallback), SelectionHolder<HistoryItem> {
private var mode: HistoryState.Mode = HistoryState.Mode.Normal private var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal
override val selectedItems get() = mode.selectedItems override val selectedItems get() = mode.selectedItems
override fun getItemViewType(position: Int): Int = HistoryListItemViewHolder.LAYOUT_ID override fun getItemViewType(position: Int): Int = HistoryListItemViewHolder.LAYOUT_ID
@ -41,7 +41,7 @@ class HistoryAdapter(
return HistoryListItemViewHolder(view, historyInteractor, this) return HistoryListItemViewHolder(view, historyInteractor, this)
} }
fun updateMode(mode: HistoryState.Mode) { fun updateMode(mode: HistoryFragmentState.Mode) {
this.mode = mode this.mode = mode
// Update the delete button alpha that the first item holds // Update the delete button alpha that the first item holds
if (itemCount > 0) notifyItemChanged(0) if (itemCount > 0) notifyItemChanged(0)

View File

@ -17,7 +17,7 @@ interface HistoryController {
} }
class DefaultHistoryController( class DefaultHistoryController(
private val store: HistoryStore, private val store: HistoryFragmentStore,
private val openToBrowser: (item: HistoryItem) -> Unit, private val openToBrowser: (item: HistoryItem) -> Unit,
private val displayDeleteAll: () -> Unit, private val displayDeleteAll: () -> Unit,
private val invalidateOptionsMenu: () -> Unit, private val invalidateOptionsMenu: () -> Unit,
@ -28,16 +28,16 @@ class DefaultHistoryController(
} }
override fun handleSelect(item: HistoryItem) { override fun handleSelect(item: HistoryItem) {
store.dispatch(HistoryAction.AddItemForRemoval(item)) store.dispatch(HistoryFragmentAction.AddItemForRemoval(item))
} }
override fun handleDeselect(item: HistoryItem) { override fun handleDeselect(item: HistoryItem) {
store.dispatch(HistoryAction.RemoveItemForRemoval(item)) store.dispatch(HistoryFragmentAction.RemoveItemForRemoval(item))
} }
override fun handleBackPressed(): Boolean { override fun handleBackPressed(): Boolean {
return if (store.state.mode is HistoryState.Mode.Editing) { return if (store.state.mode is HistoryFragmentState.Mode.Editing) {
store.dispatch(HistoryAction.ExitEditMode) store.dispatch(HistoryFragmentAction.ExitEditMode)
true true
} else { } else {
false false

View File

@ -42,7 +42,7 @@ import org.mozilla.fenix.share.ShareTab
@SuppressWarnings("TooManyFunctions", "LargeClass") @SuppressWarnings("TooManyFunctions", "LargeClass")
class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler { class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler {
private lateinit var historyStore: HistoryStore private lateinit var historyStore: HistoryFragmentStore
private lateinit var historyView: HistoryView private lateinit var historyView: HistoryView
private lateinit var historyInteractor: HistoryInteractor private lateinit var historyInteractor: HistoryInteractor
private lateinit var viewModel: HistoryViewModel private lateinit var viewModel: HistoryViewModel
@ -54,9 +54,9 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler {
): View? { ): View? {
val view = inflater.inflate(R.layout.fragment_history, container, false) val view = inflater.inflate(R.layout.fragment_history, container, false)
historyStore = StoreProvider.get(this) { historyStore = StoreProvider.get(this) {
HistoryStore( HistoryFragmentStore(
HistoryState( HistoryFragmentState(
items = listOf(), mode = HistoryState.Mode.Normal items = listOf(), mode = HistoryFragmentState.Mode.Normal
) )
) )
} }
@ -106,7 +106,7 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler {
} }
} }
viewModel.invalidate() viewModel.invalidate()
historyStore.dispatch(HistoryAction.ExitDeletionMode) historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode)
} }
} }
@ -135,12 +135,12 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val mode = historyStore.state.mode val mode = historyStore.state.mode
when (mode) { when (mode) {
HistoryState.Mode.Normal -> R.menu.library_menu HistoryFragmentState.Mode.Normal -> R.menu.library_menu
is HistoryState.Mode.Editing -> R.menu.history_select_multi is HistoryFragmentState.Mode.Editing -> R.menu.history_select_multi
else -> null else -> null
}?.let { inflater.inflate(it, menu) } }?.let { inflater.inflate(it, menu) }
if (mode is HistoryState.Mode.Editing) { if (mode is HistoryFragmentState.Mode.Editing) {
menu.findItem(R.id.share_history_multi_select)?.run { menu.findItem(R.id.share_history_multi_select)?.run {
isVisible = true isVisible = true
icon.colorFilter = PorterDuffColorFilter( icon.colorFilter = PorterDuffColorFilter(
@ -174,7 +174,7 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler {
lifecycleScope.launch(Main) { lifecycleScope.launch(Main) {
deleteSelectedHistory(historyStore.state.mode.selectedItems, components) deleteSelectedHistory(historyStore.state.mode.selectedItems, components)
viewModel.invalidate() viewModel.invalidate()
historyStore.dispatch(HistoryAction.ExitDeletionMode) historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode)
} }
true true
} }
@ -228,13 +228,13 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), BackHandler {
dialog.cancel() dialog.cancel()
} }
setPositiveButton(R.string.delete_browsing_data_prompt_allow) { dialog: DialogInterface, _ -> setPositiveButton(R.string.delete_browsing_data_prompt_allow) { dialog: DialogInterface, _ ->
historyStore.dispatch(HistoryAction.EnterDeletionMode) historyStore.dispatch(HistoryFragmentAction.EnterDeletionMode)
lifecycleScope.launch { lifecycleScope.launch {
requireComponents.analytics.metrics.track(Event.HistoryAllItemsRemoved) requireComponents.analytics.metrics.track(Event.HistoryAllItemsRemoved)
requireComponents.core.historyStorage.deleteEverything() requireComponents.core.historyStorage.deleteEverything()
launch(Main) { launch(Main) {
viewModel.invalidate() viewModel.invalidate()
historyStore.dispatch(HistoryAction.ExitDeletionMode) historyStore.dispatch(HistoryFragmentAction.ExitDeletionMode)
} }
} }

View File

@ -18,20 +18,20 @@ import mozilla.components.lib.state.Store
data class HistoryItem(val id: Int, val title: String, val url: String, val visitedAt: Long) data class HistoryItem(val id: Int, val title: String, val url: String, val visitedAt: Long)
/** /**
* The [Store] for holding the [HistoryState] and applying [HistoryAction]s. * The [Store] for holding the [HistoryFragmentState] and applying [HistoryFragmentAction]s.
*/ */
class HistoryStore(initialState: HistoryState) : class HistoryFragmentStore(initialState: HistoryFragmentState) :
Store<HistoryState, HistoryAction>(initialState, ::historyStateReducer) Store<HistoryFragmentState, HistoryFragmentAction>(initialState, ::historyStateReducer)
/** /**
* Actions to dispatch through the `HistoryStore` to modify `HistoryState` through the reducer. * Actions to dispatch through the `HistoryStore` to modify `HistoryState` through the reducer.
*/ */
sealed class HistoryAction : Action { sealed class HistoryFragmentAction : Action {
object ExitEditMode : HistoryAction() object ExitEditMode : HistoryFragmentAction()
data class AddItemForRemoval(val item: HistoryItem) : HistoryAction() data class AddItemForRemoval(val item: HistoryItem) : HistoryFragmentAction()
data class RemoveItemForRemoval(val item: HistoryItem) : HistoryAction() data class RemoveItemForRemoval(val item: HistoryItem) : HistoryFragmentAction()
object EnterDeletionMode : HistoryAction() object EnterDeletionMode : HistoryFragmentAction()
object ExitDeletionMode : HistoryAction() object ExitDeletionMode : HistoryFragmentAction()
} }
/** /**
@ -39,7 +39,7 @@ sealed class HistoryAction : Action {
* @property items List of HistoryItem to display * @property items List of HistoryItem to display
* @property mode Current Mode of History * @property mode Current Mode of History
*/ */
data class HistoryState(val items: List<HistoryItem>, val mode: Mode) : State { data class HistoryFragmentState(val items: List<HistoryItem>, val mode: Mode) : State {
sealed class Mode { sealed class Mode {
open val selectedItems = emptySet<HistoryItem>() open val selectedItems = emptySet<HistoryItem>()
@ -52,18 +52,18 @@ data class HistoryState(val items: List<HistoryItem>, val mode: Mode) : State {
/** /**
* The HistoryState Reducer. * The HistoryState Reducer.
*/ */
fun historyStateReducer(state: HistoryState, action: HistoryAction): HistoryState { private fun historyStateReducer(state: HistoryFragmentState, action: HistoryFragmentAction): HistoryFragmentState {
return when (action) { return when (action) {
is HistoryAction.AddItemForRemoval -> is HistoryFragmentAction.AddItemForRemoval ->
state.copy(mode = HistoryState.Mode.Editing(state.mode.selectedItems + action.item)) state.copy(mode = HistoryFragmentState.Mode.Editing(state.mode.selectedItems + action.item))
is HistoryAction.RemoveItemForRemoval -> { is HistoryFragmentAction.RemoveItemForRemoval -> {
val selected = state.mode.selectedItems - action.item val selected = state.mode.selectedItems - action.item
state.copy( state.copy(
mode = if (selected.isEmpty()) HistoryState.Mode.Normal else HistoryState.Mode.Editing(selected) mode = if (selected.isEmpty()) HistoryFragmentState.Mode.Normal else HistoryFragmentState.Mode.Editing(selected)
) )
} }
is HistoryAction.ExitEditMode -> state.copy(mode = HistoryState.Mode.Normal) is HistoryFragmentAction.ExitEditMode -> state.copy(mode = HistoryFragmentState.Mode.Normal)
is HistoryAction.EnterDeletionMode -> state.copy(mode = HistoryState.Mode.Deleting) is HistoryFragmentAction.EnterDeletionMode -> state.copy(mode = HistoryFragmentState.Mode.Deleting)
is HistoryAction.ExitDeletionMode -> state.copy(mode = HistoryState.Mode.Normal) is HistoryFragmentAction.ExitDeletionMode -> state.copy(mode = HistoryFragmentState.Mode.Normal)
} }
} }

View File

@ -57,7 +57,7 @@ class HistoryView(
.inflate(R.layout.component_history, container, true) .inflate(R.layout.component_history, container, true)
private var items: List<HistoryItem> = listOf() private var items: List<HistoryItem> = listOf()
var mode: HistoryState.Mode = HistoryState.Mode.Normal var mode: HistoryFragmentState.Mode = HistoryFragmentState.Mode.Normal
private set private set
val historyAdapter = HistoryAdapter(interactor) val historyAdapter = HistoryAdapter(interactor)
@ -71,10 +71,10 @@ class HistoryView(
} }
} }
fun update(state: HistoryState) { fun update(state: HistoryFragmentState) {
val oldMode = mode val oldMode = mode
view.progress_bar.isVisible = state.mode === HistoryState.Mode.Deleting view.progress_bar.isVisible = state.mode === HistoryFragmentState.Mode.Deleting
items = state.items items = state.items
mode = state.mode mode = state.mode
@ -88,7 +88,7 @@ class HistoryView(
} }
} }
if (state.mode is HistoryState.Mode.Editing) { if (state.mode is HistoryFragmentState.Mode.Editing) {
val unselectedItems = oldMode.selectedItems - state.mode.selectedItems val unselectedItems = oldMode.selectedItems - state.mode.selectedItems
state.mode.selectedItems.union(unselectedItems).forEach { item -> state.mode.selectedItems.union(unselectedItems).forEach { item ->
@ -97,9 +97,9 @@ class HistoryView(
} }
when (val mode = state.mode) { when (val mode = state.mode) {
is HistoryState.Mode.Normal -> is HistoryFragmentState.Mode.Normal ->
setUiForNormalMode(context.getString(R.string.library_history)) setUiForNormalMode(context.getString(R.string.library_history))
is HistoryState.Mode.Editing -> is HistoryFragmentState.Mode.Editing ->
setUiForSelectingMode(context.getString(R.string.history_multi_select_title, mode.selectedItems.size)) setUiForSelectingMode(context.getString(R.string.history_multi_select_title, mode.selectedItems.size))
} }
} }

View File

@ -13,7 +13,7 @@ import org.mozilla.fenix.library.history.HistoryInteractor
import org.mozilla.fenix.library.history.HistoryItem import org.mozilla.fenix.library.history.HistoryItem
import org.mozilla.fenix.library.history.HistoryItemMenu import org.mozilla.fenix.library.history.HistoryItemMenu
import org.mozilla.fenix.library.history.HistoryItemTimeGroup import org.mozilla.fenix.library.history.HistoryItemTimeGroup
import org.mozilla.fenix.library.history.HistoryState import org.mozilla.fenix.library.history.HistoryFragmentState
class HistoryListItemViewHolder( class HistoryListItemViewHolder(
view: View, view: View,
@ -40,14 +40,14 @@ class HistoryListItemViewHolder(
item: HistoryItem, item: HistoryItem,
timeGroup: HistoryItemTimeGroup?, timeGroup: HistoryItemTimeGroup?,
showDeleteButton: Boolean, showDeleteButton: Boolean,
mode: HistoryState.Mode mode: HistoryFragmentState.Mode
) { ) {
this.item = item this.item = item
itemView.history_layout.titleView.text = item.title itemView.history_layout.titleView.text = item.title
itemView.history_layout.urlView.text = item.url itemView.history_layout.urlView.text = item.url
toggleDeleteButton(showDeleteButton, mode === HistoryState.Mode.Normal) toggleDeleteButton(showDeleteButton, mode === HistoryFragmentState.Mode.Normal)
val headerText = timeGroup?.humanReadable(itemView.context) val headerText = timeGroup?.humanReadable(itemView.context)
toggleHeader(headerText) toggleHeader(headerText)

View File

@ -16,8 +16,8 @@ import org.junit.Test
class HistoryControllerTest { class HistoryControllerTest {
private val historyItem = HistoryItem(0, "title", "url", 0.toLong()) private val historyItem = HistoryItem(0, "title", "url", 0.toLong())
private val store: HistoryStore = mockk(relaxed = true) private val store: HistoryFragmentStore = mockk(relaxed = true)
private val state: HistoryState = mockk(relaxed = true) private val state: HistoryFragmentState = mockk(relaxed = true)
@Before @Before
fun setUp() { fun setUp() {
@ -28,7 +28,7 @@ class HistoryControllerTest {
fun onPressHistoryItemInNormalMode() { fun onPressHistoryItemInNormalMode() {
var historyItemReceived: HistoryItem? = null var historyItemReceived: HistoryItem? = null
every { state.mode } returns HistoryState.Mode.Normal every { state.mode } returns HistoryFragmentState.Mode.Normal
val controller = DefaultHistoryController( val controller = DefaultHistoryController(
store, store,
@ -44,7 +44,7 @@ class HistoryControllerTest {
@Test @Test
fun onPressHistoryItemInEditMode() { fun onPressHistoryItemInEditMode() {
every { state.mode } returns HistoryState.Mode.Editing(setOf()) every { state.mode } returns HistoryFragmentState.Mode.Editing(setOf())
val controller = DefaultHistoryController( val controller = DefaultHistoryController(
store, store,
@ -57,13 +57,13 @@ class HistoryControllerTest {
controller.handleSelect(historyItem) controller.handleSelect(historyItem)
verify { verify {
store.dispatch(HistoryAction.AddItemForRemoval(historyItem)) store.dispatch(HistoryFragmentAction.AddItemForRemoval(historyItem))
} }
} }
@Test @Test
fun onPressSelectedHistoryItemInEditMode() { fun onPressSelectedHistoryItemInEditMode() {
every { state.mode } returns HistoryState.Mode.Editing(setOf(historyItem)) every { state.mode } returns HistoryFragmentState.Mode.Editing(setOf(historyItem))
val controller = DefaultHistoryController( val controller = DefaultHistoryController(
store, store,
@ -76,13 +76,13 @@ class HistoryControllerTest {
controller.handleDeselect(historyItem) controller.handleDeselect(historyItem)
verify { verify {
store.dispatch(HistoryAction.RemoveItemForRemoval(historyItem)) store.dispatch(HistoryFragmentAction.RemoveItemForRemoval(historyItem))
} }
} }
@Test @Test
fun onBackPressedInNormalMode() { fun onBackPressedInNormalMode() {
every { state.mode } returns HistoryState.Mode.Normal every { state.mode } returns HistoryFragmentState.Mode.Normal
val controller = DefaultHistoryController(store, mockk(), mockk(), mockk(), mockk()) val controller = DefaultHistoryController(store, mockk(), mockk(), mockk(), mockk())
assertFalse(controller.handleBackPressed()) assertFalse(controller.handleBackPressed())
@ -90,13 +90,13 @@ class HistoryControllerTest {
@Test @Test
fun onBackPressedInEditMode() { fun onBackPressedInEditMode() {
every { state.mode } returns HistoryState.Mode.Editing(setOf()) every { state.mode } returns HistoryFragmentState.Mode.Editing(setOf())
val controller = DefaultHistoryController(store, mockk(), mockk(), mockk(), mockk()) val controller = DefaultHistoryController(store, mockk(), mockk(), mockk(), mockk())
assertTrue(controller.handleBackPressed()) assertTrue(controller.handleBackPressed())
verify { verify {
store.dispatch(HistoryAction.ExitEditMode) store.dispatch(HistoryFragmentAction.ExitEditMode)
} }
} }

View File

@ -9,55 +9,55 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotSame import org.junit.Assert.assertNotSame
import org.junit.Test import org.junit.Test
class HistoryStoreTest { class HistoryFragmentStoreTest {
private val historyItem = HistoryItem(0, "title", "url", 0.toLong()) private val historyItem = HistoryItem(0, "title", "url", 0.toLong())
private val newHistoryItem = HistoryItem(1, "title", "url", 0.toLong()) private val newHistoryItem = HistoryItem(1, "title", "url", 0.toLong())
@Test @Test
fun exitEditMode() = runBlocking { fun exitEditMode() = runBlocking {
val initialState = oneItemEditState() val initialState = oneItemEditState()
val store = HistoryStore(initialState) val store = HistoryFragmentStore(initialState)
store.dispatch(HistoryAction.ExitEditMode).join() store.dispatch(HistoryFragmentAction.ExitEditMode).join()
assertNotSame(initialState, store.state) assertNotSame(initialState, store.state)
assertEquals(store.state.mode, HistoryState.Mode.Normal) assertEquals(store.state.mode, HistoryFragmentState.Mode.Normal)
} }
@Test @Test
fun itemAddedForRemoval() = runBlocking { fun itemAddedForRemoval() = runBlocking {
val initialState = emptyDefaultState() val initialState = emptyDefaultState()
val store = HistoryStore(initialState) val store = HistoryFragmentStore(initialState)
store.dispatch(HistoryAction.AddItemForRemoval(newHistoryItem)).join() store.dispatch(HistoryFragmentAction.AddItemForRemoval(newHistoryItem)).join()
assertNotSame(initialState, store.state) assertNotSame(initialState, store.state)
assertEquals( assertEquals(
store.state.mode, store.state.mode,
HistoryState.Mode.Editing(setOf(newHistoryItem)) HistoryFragmentState.Mode.Editing(setOf(newHistoryItem))
) )
} }
@Test @Test
fun removeItemForRemoval() = runBlocking { fun removeItemForRemoval() = runBlocking {
val initialState = twoItemEditState() val initialState = twoItemEditState()
val store = HistoryStore(initialState) val store = HistoryFragmentStore(initialState)
store.dispatch(HistoryAction.RemoveItemForRemoval(newHistoryItem)).join() store.dispatch(HistoryFragmentAction.RemoveItemForRemoval(newHistoryItem)).join()
assertNotSame(initialState, store.state) assertNotSame(initialState, store.state)
assertEquals(store.state.mode, HistoryState.Mode.Editing(setOf(historyItem))) assertEquals(store.state.mode, HistoryFragmentState.Mode.Editing(setOf(historyItem)))
} }
private fun emptyDefaultState(): HistoryState = HistoryState( private fun emptyDefaultState(): HistoryFragmentState = HistoryFragmentState(
items = listOf(), items = listOf(),
mode = HistoryState.Mode.Normal mode = HistoryFragmentState.Mode.Normal
) )
private fun oneItemEditState(): HistoryState = HistoryState( private fun oneItemEditState(): HistoryFragmentState = HistoryFragmentState(
items = listOf(), items = listOf(),
mode = HistoryState.Mode.Editing(setOf(historyItem)) mode = HistoryFragmentState.Mode.Editing(setOf(historyItem))
) )
private fun twoItemEditState(): HistoryState = HistoryState( private fun twoItemEditState(): HistoryFragmentState = HistoryFragmentState(
items = listOf(), items = listOf(),
mode = HistoryState.Mode.Editing(setOf(historyItem, newHistoryItem)) mode = HistoryFragmentState.Mode.Editing(setOf(historyItem, newHistoryItem))
) )
} }