forked from shihaam/thijooree
customize circular nav
This commit is contained in:
@@ -78,13 +78,18 @@ class CircularNavFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
val wheelView = CircularWheelView(ctx).apply {
|
val wheelView = CircularWheelView(ctx).apply {
|
||||||
layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
|
layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
|
||||||
|
val prefs = ctx.getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||||
|
val savedSlots = NavCustomization.getCircularSlots(prefs).map { id ->
|
||||||
|
val def = NavCustomization.ALL_SWAPPABLE.find { it.id == id }!!
|
||||||
|
CircularWheelView.WheelItem(def.id, def.iconRes, ctx.getString(def.titleRes))
|
||||||
|
}
|
||||||
items = listOf(
|
items = listOf(
|
||||||
CircularWheelView.WheelItem(R.id.nav_dashboard, R.drawable.ic_nav_dashboard, "Dashboard"), // 12
|
CircularWheelView.WheelItem(R.id.nav_dashboard, R.drawable.ic_nav_dashboard, ctx.getString(R.string.nav_dashboard)),
|
||||||
CircularWheelView.WheelItem(R.id.nav_transfer, R.drawable.ic_send, "Transfer"), // 2
|
savedSlots[0], // 2 o'clock
|
||||||
CircularWheelView.WheelItem(R.id.nav_pay_with_card, R.drawable.ic_nav_card, "Cards"), // 4
|
savedSlots[1], // 4 o'clock
|
||||||
CircularWheelView.WheelItem(R.id.nav_more, R.drawable.ic_nav_more, "More"), // 6
|
CircularWheelView.WheelItem(R.id.nav_more, R.drawable.ic_nav_more, ctx.getString(R.string.nav_more)),
|
||||||
CircularWheelView.WheelItem(R.id.nav_contacts, R.drawable.ic_contacts, "Contacts"), // 8
|
savedSlots[2], // 8 o'clock
|
||||||
CircularWheelView.WheelItem(R.id.nav_accounts, R.drawable.ic_nav_accounts, "Accounts"), // 10
|
savedSlots[3], // 10 o'clock
|
||||||
)
|
)
|
||||||
accentColor = colorPrimary
|
accentColor = colorPrimary
|
||||||
surfaceColor = colorSurface
|
surfaceColor = colorSurface
|
||||||
|
|||||||
@@ -76,18 +76,31 @@ object NavCustomization {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Items that belong in the "More" screen — those not occupying a bottom nav slot. */
|
/** Items that belong in the "More" screen — those not occupying a bottom nav slot. */
|
||||||
|
fun getCircularSlots(prefs: SharedPreferences): List<Int> = listOf(
|
||||||
|
keyToId(prefs.getString("circular_slot_1_key", null), R.id.nav_transfer),
|
||||||
|
keyToId(prefs.getString("circular_slot_2_key", null), R.id.nav_pay_with_card),
|
||||||
|
keyToId(prefs.getString("circular_slot_3_key", null), R.id.nav_contacts),
|
||||||
|
keyToId(prefs.getString("circular_slot_4_key", null), R.id.nav_accounts),
|
||||||
|
)
|
||||||
|
|
||||||
|
fun saveCircularSlots(prefs: SharedPreferences, slots: List<Int>) {
|
||||||
|
prefs.edit()
|
||||||
|
.putString("circular_slot_1_key", idToKey(slots[0]) ?: "nav_transfer")
|
||||||
|
.putString("circular_slot_2_key", idToKey(slots[1]) ?: "nav_pay_with_card")
|
||||||
|
.putString("circular_slot_3_key", idToKey(slots[2]) ?: "nav_contacts")
|
||||||
|
.putString("circular_slot_4_key", idToKey(slots[3]) ?: "nav_accounts")
|
||||||
|
.apply()
|
||||||
|
}
|
||||||
|
|
||||||
fun getMoreItems(prefs: SharedPreferences): List<NavItemDef> {
|
fun getMoreItems(prefs: SharedPreferences): List<NavItemDef> {
|
||||||
if (getNavMode(prefs) == NAV_MODE_CIRCULAR) return getCircularMoreItems()
|
if (getNavMode(prefs) == NAV_MODE_CIRCULAR) return getCircularMoreItems(prefs)
|
||||||
val slots = getSlots(prefs).toSet()
|
val slots = getSlots(prefs).toSet()
|
||||||
return ALL_SWAPPABLE.filter { it.id !in slots }
|
return ALL_SWAPPABLE.filter { it.id !in slots }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Items shown in More when circular nav is active — everything not directly on the wheel. */
|
/** Items shown in More when circular nav is active — everything not in the saved wheel slots. */
|
||||||
private fun getCircularMoreItems(): List<NavItemDef> {
|
private fun getCircularMoreItems(prefs: SharedPreferences): List<NavItemDef> {
|
||||||
val wheelIds = setOf(
|
val slotIds = getCircularSlots(prefs).toSet()
|
||||||
R.id.nav_dashboard, R.id.nav_transfer, R.id.nav_pay_with_card,
|
return ALL_SWAPPABLE.filter { it.id !in slotIds }
|
||||||
R.id.nav_contacts, R.id.nav_accounts
|
|
||||||
)
|
|
||||||
return ALL_SWAPPABLE.filter { it.id !in wheelIds }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,8 +36,10 @@ class SettingsAppearanceFragment : Fragment() {
|
|||||||
private lateinit var prefs: SharedPreferences
|
private lateinit var prefs: SharedPreferences
|
||||||
private val slots = mutableListOf<Int>()
|
private val slots = mutableListOf<Int>()
|
||||||
private val quickActions = mutableListOf<Int>()
|
private val quickActions = mutableListOf<Int>()
|
||||||
|
private val circularSlots = mutableListOf<Int>()
|
||||||
private lateinit var slotAdapter: NavItemAdapter
|
private lateinit var slotAdapter: NavItemAdapter
|
||||||
private lateinit var quickActionAdapter: NavItemAdapter
|
private lateinit var quickActionAdapter: NavItemAdapter
|
||||||
|
private lateinit var circularSlotAdapter: NavItemAdapter
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||||
_binding = FragmentSettingsAppearanceBinding.inflate(inflater, container, false)
|
_binding = FragmentSettingsAppearanceBinding.inflate(inflater, container, false)
|
||||||
@@ -78,6 +80,18 @@ class SettingsAppearanceFragment : Fragment() {
|
|||||||
NavCustomization.getNavMode(prefs) != NavCustomization.NAV_MODE_BOTTOM
|
NavCustomization.getNavMode(prefs) != NavCustomization.NAV_MODE_BOTTOM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Circular nav shortcuts
|
||||||
|
circularSlots.clear()
|
||||||
|
circularSlots.addAll(NavCustomization.getCircularSlots(prefs))
|
||||||
|
circularSlotAdapter = NavItemAdapter(
|
||||||
|
items = circularSlots,
|
||||||
|
onSave = { NavCustomization.saveCircularSlots(prefs, circularSlots) },
|
||||||
|
isEnabled = { NavCustomization.getNavMode(prefs) == NavCustomization.NAV_MODE_CIRCULAR }
|
||||||
|
)
|
||||||
|
setupNavItemRecyclerView(binding.rvCircularSlots, circularSlotAdapter, circularSlots) {
|
||||||
|
NavCustomization.getNavMode(prefs) == NavCustomization.NAV_MODE_CIRCULAR
|
||||||
|
}
|
||||||
|
|
||||||
// Bottom bar shortcuts
|
// Bottom bar shortcuts
|
||||||
slots.clear()
|
slots.clear()
|
||||||
slots.addAll(NavCustomization.getSlots(prefs))
|
slots.addAll(NavCustomization.getSlots(prefs))
|
||||||
@@ -202,11 +216,13 @@ class SettingsAppearanceFragment : Fragment() {
|
|||||||
private fun updateShortcutsVisibility() {
|
private fun updateShortcutsVisibility() {
|
||||||
val mode = NavCustomization.getNavMode(prefs)
|
val mode = NavCustomization.getNavMode(prefs)
|
||||||
val isBottom = mode == NavCustomization.NAV_MODE_BOTTOM
|
val isBottom = mode == NavCustomization.NAV_MODE_BOTTOM
|
||||||
val isDrawer = mode == NavCustomization.NAV_MODE_DRAWER
|
val isCircular = mode == NavCustomization.NAV_MODE_CIRCULAR
|
||||||
binding.sectionQuickActions.alpha = if (!isBottom) 1f else 0.38f
|
binding.sectionQuickActions.alpha = if (!isBottom) 1f else 0.38f
|
||||||
|
binding.sectionCircularSlots.alpha = if (isCircular) 1f else 0.38f
|
||||||
binding.sectionBottomBarShortcuts.alpha = if (isBottom) 1f else 0.38f
|
binding.sectionBottomBarShortcuts.alpha = if (isBottom) 1f else 0.38f
|
||||||
binding.switchShowLabels.isClickable = isBottom
|
binding.switchShowLabels.isClickable = isBottom
|
||||||
quickActionAdapter.notifyDataSetChanged()
|
quickActionAdapter.notifyDataSetChanged()
|
||||||
|
circularSlotAdapter.notifyDataSetChanged()
|
||||||
slotAdapter.notifyDataSetChanged()
|
slotAdapter.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +292,7 @@ class SettingsAppearanceFragment : Fragment() {
|
|||||||
val mode = NavCustomization.getNavMode(prefs)
|
val mode = NavCustomization.getNavMode(prefs)
|
||||||
if (items === slots && mode != NavCustomization.NAV_MODE_BOTTOM) return
|
if (items === slots && mode != NavCustomization.NAV_MODE_BOTTOM) return
|
||||||
if (items === quickActions && mode == NavCustomization.NAV_MODE_BOTTOM) return
|
if (items === quickActions && mode == NavCustomization.NAV_MODE_BOTTOM) return
|
||||||
|
if (items === circularSlots && mode != NavCustomization.NAV_MODE_CIRCULAR) return
|
||||||
val ctx = requireContext()
|
val ctx = requireContext()
|
||||||
val otherIds = items.filterIndexed { i, _ -> i != slotIndex }.toSet()
|
val otherIds = items.filterIndexed { i, _ -> i != slotIndex }.toSet()
|
||||||
val available = NavCustomization.ALL_SWAPPABLE.filter { it.id !in otherIds }
|
val available = NavCustomization.ALL_SWAPPABLE.filter { it.id !in otherIds }
|
||||||
|
|||||||
@@ -78,6 +78,31 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Circular nav shortcuts — shown only when circular nav is active -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/sectionCircularSlots"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginBottom="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/settings_circular_shortcuts"
|
||||||
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="12dp" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/rvCircularSlots"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:nestedScrollingEnabled="false"
|
||||||
|
android:overScrollMode="never" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<!-- Bottom bar shortcuts — shown only when bottom nav is active -->
|
<!-- Bottom bar shortcuts — shown only when bottom nav is active -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/sectionBottomBarShortcuts"
|
android:id="@+id/sectionBottomBarShortcuts"
|
||||||
|
|||||||
@@ -177,6 +177,7 @@
|
|||||||
<string name="settings_nav_bottom">Bottom Bar</string>
|
<string name="settings_nav_bottom">Bottom Bar</string>
|
||||||
<string name="settings_nav_circular">Circular</string>
|
<string name="settings_nav_circular">Circular</string>
|
||||||
<string name="settings_appearance">Appearance</string>
|
<string name="settings_appearance">Appearance</string>
|
||||||
|
<string name="settings_circular_shortcuts">Circular Nav Shortcuts</string>
|
||||||
<string name="settings_bottom_bar_shortcuts">Bottom Bar Shortcuts</string>
|
<string name="settings_bottom_bar_shortcuts">Bottom Bar Shortcuts</string>
|
||||||
<string name="settings_bottom_bar_show_labels">Always show bottom bar labels</string>
|
<string name="settings_bottom_bar_show_labels">Always show bottom bar labels</string>
|
||||||
<string name="settings_bottom_bar_select">Choose button</string>
|
<string name="settings_bottom_bar_select">Choose button</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user