add support for bottom nav bar
All checks were successful
Auto Tag on Version Change / check-version (push) Successful in 2s

This commit is contained in:
2026-05-17 19:29:44 +05:00
parent 9bbb024d69
commit 2b710f00c6
10 changed files with 192 additions and 4 deletions

View File

@@ -54,6 +54,7 @@ class HomeActivity : AppCompatActivity() {
private lateinit var binding: ActivityHomeBinding
private val viewModel: HomeViewModel by viewModels()
private lateinit var toggle: ActionBarDrawerToggle
private val autolockHandler = Handler(Looper.getMainLooper())
private var warningDialog: AlertDialog? = null
@@ -82,13 +83,25 @@ class HomeActivity : AppCompatActivity() {
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
val toggle = ActionBarDrawerToggle(
toggle = ActionBarDrawerToggle(
this, binding.drawerLayout, binding.toolbar,
R.string.nav_open_drawer, R.string.nav_close_drawer
)
binding.drawerLayout.addDrawerListener(toggle)
toggle.syncState()
binding.bottomNavigation.setOnItemSelectedListener { item ->
when (item.itemId) {
R.id.nav_dashboard -> { show(DashboardFragment()); true }
R.id.nav_accounts -> { show(AccountsFragment()); true }
R.id.nav_transfer -> { show(TransferFragment()); true }
R.id.nav_more -> { showMoreSheet(); false }
else -> false
}
}
applyNavMode()
binding.navigationView.setNavigationItemSelectedListener { item ->
binding.drawerLayout.closeDrawers()
when (item.itemId) {
@@ -177,6 +190,36 @@ class HomeActivity : AppCompatActivity() {
.commit()
}
fun applyNavMode() {
val isBottom = getSharedPreferences("prefs", MODE_PRIVATE).getBoolean("bottom_nav", false)
if (isBottom) {
binding.drawerLayout.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
toggle.isDrawerIndicatorEnabled = false
supportActionBar?.setDisplayHomeAsUpEnabled(false)
binding.bottomNavigation.visibility = View.VISIBLE
} else {
binding.drawerLayout.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED)
toggle.isDrawerIndicatorEnabled = true
toggle.syncState()
binding.bottomNavigation.visibility = View.GONE
}
}
private fun showMoreSheet() {
val sheet = NavMoreSheetFragment()
sheet.onNavigate = { itemId ->
when (itemId) {
R.id.nav_contacts -> show(ContactsFragment())
R.id.nav_transfer_history -> show(TransferHistoryFragment())
R.id.nav_finances -> show(FinancingFragment())
R.id.nav_otp -> show(OtpFragment())
R.id.nav_settings -> show(SettingsFragment())
else -> Toast.makeText(this, R.string.work_in_progress, Toast.LENGTH_SHORT).show()
}
}
sheet.show(supportFragmentManager, "nav_more")
}
fun setRefreshing(visible: Boolean) {
binding.refreshIndicator.visibility = if (visible) View.VISIBLE else View.GONE
}

View File

@@ -0,0 +1,25 @@
package sh.sar.basedbank.ui.home
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.navigation.NavigationView
import sh.sar.basedbank.R
class NavMoreSheetFragment : BottomSheetDialogFragment() {
var onNavigate: ((Int) -> Unit)? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(R.layout.sheet_nav_more, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<NavigationView>(R.id.navMoreView).setNavigationItemSelectedListener { item ->
dismiss()
onNavigate?.invoke(item.itemId)
true
}
}
}

View File

@@ -44,6 +44,15 @@ class SettingsFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val prefs = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE)
// Navigation mode
val isBottom = prefs.getBoolean("bottom_nav", false)
binding.navModeToggle.check(if (isBottom) R.id.btnNavBottom else R.id.btnNavDrawer)
binding.navModeToggle.addOnButtonCheckedListener { _, checkedId, isChecked ->
if (!isChecked) return@addOnButtonCheckedListener
prefs.edit().putBoolean("bottom_nav", checkedId == R.id.btnNavBottom).apply()
(activity as? HomeActivity)?.applyNavMode()
}
// Theme
val saved = prefs.getString("theme", "system")
val initialId = when (saved) {

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?attr/colorOnSurfaceVariant"
android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
</vector>

View File

@@ -32,11 +32,26 @@
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/contentFrame"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<FrameLayout
android:id="@+id/contentFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:menu="@menu/bottom_nav_menu" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -36,6 +36,41 @@
android:layout_marginBottom="24dp"
android:text="@string/nav_add_account" />
<!-- Navigation -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_navigation"
android:textAppearance="?attr/textAppearanceTitleMedium"
android:layout_marginBottom="12dp" />
<com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/navModeToggle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
app:singleSelection="true"
app:selectionRequired="true">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnNavDrawer"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/settings_nav_drawer" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnNavBottom"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/settings_nav_bottom" />
</com.google.android.material.button.MaterialButtonToggleGroup>
<!-- Theme -->
<TextView

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.navigation.NavigationView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navMoreView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/more_nav_menu" />

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/nav_dashboard"
android:icon="@drawable/ic_nav_dashboard"
android:title="@string/nav_dashboard" />
<item android:id="@+id/nav_accounts"
android:icon="@drawable/ic_nav_accounts"
android:title="@string/nav_accounts" />
<item android:id="@+id/nav_transfer"
android:icon="@drawable/ic_send"
android:title="@string/transfer" />
<item android:id="@+id/nav_more"
android:icon="@drawable/ic_nav_more"
android:title="@string/nav_more" />
</menu>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/nav_contacts"
android:icon="@drawable/ic_contacts"
android:title="@string/nav_contacts" />
<item android:id="@+id/nav_activities"
android:icon="@drawable/ic_nav_activities"
android:title="@string/nav_activities" />
<item android:id="@+id/nav_transfer_history"
android:icon="@drawable/ic_nav_transfer_history"
android:title="@string/nav_transfer_history" />
<item android:id="@+id/nav_finances"
android:icon="@drawable/ic_nav_finances"
android:title="@string/nav_finances" />
<item android:id="@+id/nav_card_settings"
android:icon="@drawable/ic_nav_card"
android:title="@string/nav_card_settings" />
<item android:id="@+id/nav_otp"
android:icon="@drawable/ic_nav_otp"
android:title="@string/nav_otp" />
<item android:id="@+id/nav_settings"
android:icon="@drawable/ic_nav_settings"
android:title="@string/nav_settings" />
</menu>

View File

@@ -80,6 +80,7 @@
<string name="nav_card_settings">Card Settings</string>
<string name="nav_otp">OTP Codes</string>
<string name="nav_settings">Settings</string>
<string name="nav_more">More</string>
<string name="nav_open_drawer">Open navigation</string>
<string name="nav_close_drawer">Close navigation</string>
<string name="work_in_progress">Work in progress</string>
@@ -122,6 +123,9 @@
<string name="settings_cache">Cache</string>
<string name="settings_clear_cache">Clear Cache</string>
<string name="settings_cache_cleared">Cache cleared</string>
<string name="settings_navigation">Navigation</string>
<string name="settings_nav_drawer">Drawer</string>
<string name="settings_nav_bottom">Bottom Bar</string>
<string name="settings_logins">Logins</string>
<string name="settings_logout">Log out</string>
<string name="settings_logout_confirm_title">Log out of %s?</string>