[fenix] For https://github.com/mozilla-mobile/fenix/issues/9505: Adds possibility to sort saved logins
Currently we support sorting by name and by last used. Also, the selected option is saved in shared preferences so that the last option chosen by the user is properly displayed even after the app was restarted.pull/600/head
parent
061487dc25
commit
8210768fbe
@ -0,0 +1,22 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
package org.mozilla.fenix.settings.logins
|
||||
|
||||
import org.mozilla.fenix.utils.Settings
|
||||
|
||||
interface SavedLoginsController {
|
||||
fun handleSort(sortingStrategy: SortingStrategy)
|
||||
}
|
||||
|
||||
class DefaultSavedLoginsController(
|
||||
val store: SavedLoginsFragmentStore,
|
||||
val settings: Settings
|
||||
) : SavedLoginsController {
|
||||
|
||||
override fun handleSort(sortingStrategy: SortingStrategy) {
|
||||
store.dispatch(SavedLoginsFragmentAction.SortLogins(sortingStrategy))
|
||||
settings.savedLoginsSortingStrategy = sortingStrategy
|
||||
}
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
package org.mozilla.fenix.settings.logins
|
||||
|
||||
import android.content.Context
|
||||
import mozilla.components.browser.menu.BrowserMenuBuilder
|
||||
import mozilla.components.browser.menu.item.SimpleBrowserMenuHighlightableItem
|
||||
import mozilla.components.support.ktx.android.content.getColorFromAttr
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.theme.ThemeManager
|
||||
|
||||
class SavedLoginsSortingStrategyMenu(
|
||||
private val context: Context,
|
||||
private val itemToHighlight: Item,
|
||||
private val onItemTapped: (Item) -> Unit = {}
|
||||
) {
|
||||
sealed class Item {
|
||||
object AlphabeticallySort : Item()
|
||||
object LastUsedSort : Item()
|
||||
}
|
||||
|
||||
val menuBuilder by lazy { BrowserMenuBuilder(menuItems) }
|
||||
|
||||
private val menuItems by lazy {
|
||||
listOfNotNull(
|
||||
SimpleBrowserMenuHighlightableItem(
|
||||
label = context.getString(R.string.saved_logins_sort_strategy_alphabetically),
|
||||
textColorResource = ThemeManager.resolveAttribute(R.attr.primaryText, context),
|
||||
itemType = Item.AlphabeticallySort,
|
||||
backgroundTint = context.getColorFromAttr(R.attr.colorControlHighlight),
|
||||
isHighlighted = { itemToHighlight == Item.AlphabeticallySort }
|
||||
) {
|
||||
onItemTapped.invoke(Item.AlphabeticallySort)
|
||||
},
|
||||
|
||||
SimpleBrowserMenuHighlightableItem(
|
||||
label = context.getString(R.string.saved_logins_sort_strategy_last_used),
|
||||
textColorResource = ThemeManager.resolveAttribute(R.attr.primaryText, context),
|
||||
itemType = Item.LastUsedSort,
|
||||
backgroundTint = context.getColorFromAttr(R.attr.colorControlHighlight),
|
||||
isHighlighted = { itemToHighlight == Item.LastUsedSort }
|
||||
) {
|
||||
onItemTapped.invoke(Item.LastUsedSort)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
internal fun updateMenu(itemToHighlight: Item) {
|
||||
menuItems.forEach {
|
||||
it.isHighlighted = { itemToHighlight == it.itemType }
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
package org.mozilla.fenix.settings.logins
|
||||
|
||||
import android.content.Context
|
||||
import org.mozilla.fenix.ext.urlToTrimmedHost
|
||||
|
||||
sealed class SortingStrategy {
|
||||
abstract operator fun invoke(logins: List<SavedLoginsItem>): List<SavedLoginsItem>
|
||||
abstract val appContext: Context
|
||||
|
||||
data class Alphabetically(override val appContext: Context) : SortingStrategy() {
|
||||
override fun invoke(logins: List<SavedLoginsItem>): List<SavedLoginsItem> {
|
||||
return logins.sortedBy { it.url.urlToTrimmedHost(appContext) }
|
||||
}
|
||||
}
|
||||
|
||||
data class LastUsed(override val appContext: Context) : SortingStrategy() {
|
||||
override fun invoke(logins: List<SavedLoginsItem>): List<SavedLoginsItem> {
|
||||
return logins.sortedByDescending { it.timeLastUsed }
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- 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/. -->
|
||||
|
||||
<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/sort_logins_menu_root"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/toolbar_title"
|
||||
style="@style/ToolbarTitleTextStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/preferences_passwords_saved_logins"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/toolbar_chevron_icon"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<View
|
||||
android:id="@+id/drop_down_menu_anchor_view"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_below="@id/toolbar_title"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/toolbar_title" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/toolbar_chevron_icon"
|
||||
android:layout_width="@dimen/saved_logins_sort_menu_dropdown_chevron_icon_size"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginStart="@dimen/saved_logins_sort_menu_dropdown_chevron_icon_margin_start"
|
||||
android:layout_toEndOf="@+id/toolbar_title"
|
||||
android:adjustViewBounds="true"
|
||||
android:contentDescription="@string/saved_logins_menu_dropdown_chevron_icon_content_description"
|
||||
app:srcCompat="@drawable/ic_chevron"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/toolbar_title"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/toolbar_title"
|
||||
app:layout_constraintTop_toTopOf="@+id/toolbar_title" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
Loading…
Reference in New Issue