From e90a2ed41061e67f0a893020930f431c32747d24 Mon Sep 17 00:00:00 2001 From: tekstrand Date: Fri, 28 Aug 2026 12:14:38 -0500 Subject: [PATCH] Added a navigation rail in landscape. A new layout-land variant of the main activity layout puts a NavigationRailView on the left edge, so landscape spends horizontal space on navigation and keeps the short screen for content instead of losing a strip to a full-width bottom bar. Portrait keeps the bottom bar, which now always shows its labels via labelVisibilityMode. The activity and fragments reference the nav view as NavigationBarView, the superclass both widgets share, so the same code drives either one. The five tabs switch from the android system icons to local Material Symbols drawables, tinted from the theme. Decodes gets a new ic_notes: the tab is merged into Monitor by upcoming work, so the final set never drew an icon for it. --- .../java/com/js8call/example/MainActivity.kt | 4 +-- .../com/js8call/example/ui/DecodeFragment.kt | 4 +-- .../js8call/example/ui/MessagesFragment.kt | 2 +- .../src/main/res/drawable/ic_chat_bubble.xml | 13 ++++++++ .../src/main/res/drawable/ic_graphic_eq.xml | 10 +++++++ .../app/src/main/res/drawable/ic_notes.xml | 13 ++++++++ android/app/src/main/res/drawable/ic_send.xml | 10 +++++++ .../app/src/main/res/drawable/ic_settings.xml | 10 +++++++ .../main/res/layout-land/activity_main.xml | 30 +++++++++++++++++++ .../app/src/main/res/layout/activity_main.xml | 1 + .../app/src/main/res/menu/bottom_nav_menu.xml | 10 +++---- 11 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 android/app/src/main/res/drawable/ic_chat_bubble.xml create mode 100644 android/app/src/main/res/drawable/ic_graphic_eq.xml create mode 100644 android/app/src/main/res/drawable/ic_notes.xml create mode 100644 android/app/src/main/res/drawable/ic_send.xml create mode 100644 android/app/src/main/res/drawable/ic_settings.xml create mode 100644 android/app/src/main/res/layout-land/activity_main.xml diff --git a/android/app/src/main/java/com/js8call/example/MainActivity.kt b/android/app/src/main/java/com/js8call/example/MainActivity.kt index 24dac83c0..06e63446a 100644 --- a/android/app/src/main/java/com/js8call/example/MainActivity.kt +++ b/android/app/src/main/java/com/js8call/example/MainActivity.kt @@ -17,7 +17,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import androidx.preference.PreferenceManager -import com.google.android.material.bottomnavigation.BottomNavigationView +import com.google.android.material.navigation.NavigationBarView import com.google.android.material.snackbar.Snackbar import com.js8call.example.model.EngineState import com.js8call.example.service.JS8EngineService @@ -28,7 +28,7 @@ import com.js8call.example.ui.TransmitViewModel class MainActivity : AppCompatActivity() { - private lateinit var bottomNav: BottomNavigationView + private lateinit var bottomNav: NavigationBarView private lateinit var decodeViewModel: DecodeViewModel private lateinit var monitorViewModel: MonitorViewModel private var spectrumBroadcastCount: Long = 0 diff --git a/android/app/src/main/java/com/js8call/example/ui/DecodeFragment.kt b/android/app/src/main/java/com/js8call/example/ui/DecodeFragment.kt index 88906949c..e46303707 100644 --- a/android/app/src/main/java/com/js8call/example/ui/DecodeFragment.kt +++ b/android/app/src/main/java/com/js8call/example/ui/DecodeFragment.kt @@ -14,7 +14,7 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.google.android.material.bottomnavigation.BottomNavigationView +import com.google.android.material.navigation.NavigationBarView import com.google.android.material.snackbar.Snackbar import com.js8call.example.R @@ -150,7 +150,7 @@ class DecodeFragment : Fragment() { return } transmitViewModel.setDirectedTo(callsign) - val bottomNav = activity?.findViewById(R.id.bottom_navigation) + val bottomNav = activity?.findViewById(R.id.bottom_navigation) if (bottomNav != null) { bottomNav.selectedItemId = R.id.navigation_transmit } else { diff --git a/android/app/src/main/java/com/js8call/example/ui/MessagesFragment.kt b/android/app/src/main/java/com/js8call/example/ui/MessagesFragment.kt index ae1594558..fc623f8fe 100644 --- a/android/app/src/main/java/com/js8call/example/ui/MessagesFragment.kt +++ b/android/app/src/main/java/com/js8call/example/ui/MessagesFragment.kt @@ -60,7 +60,7 @@ class MessagesFragment : Fragment() { // Set up FAB (navigate to Transmit tab to compose new message) newMessageFab.setOnClickListener { // Navigate to Transmit tab for new message - val bottomNav = activity?.findViewById(R.id.bottom_navigation) + val bottomNav = activity?.findViewById(R.id.bottom_navigation) bottomNav?.selectedItemId = R.id.navigation_transmit } diff --git a/android/app/src/main/res/drawable/ic_chat_bubble.xml b/android/app/src/main/res/drawable/ic_chat_bubble.xml new file mode 100644 index 000000000..016fd4142 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_chat_bubble.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/android/app/src/main/res/drawable/ic_graphic_eq.xml b/android/app/src/main/res/drawable/ic_graphic_eq.xml new file mode 100644 index 000000000..e143ae4fd --- /dev/null +++ b/android/app/src/main/res/drawable/ic_graphic_eq.xml @@ -0,0 +1,10 @@ + + + + diff --git a/android/app/src/main/res/drawable/ic_notes.xml b/android/app/src/main/res/drawable/ic_notes.xml new file mode 100644 index 000000000..eb0f830ce --- /dev/null +++ b/android/app/src/main/res/drawable/ic_notes.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/android/app/src/main/res/drawable/ic_send.xml b/android/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 000000000..d1cfac11e --- /dev/null +++ b/android/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,10 @@ + + + + diff --git a/android/app/src/main/res/drawable/ic_settings.xml b/android/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 000000000..dd427aa90 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,10 @@ + + + + diff --git a/android/app/src/main/res/layout-land/activity_main.xml b/android/app/src/main/res/layout-land/activity_main.xml new file mode 100644 index 000000000..ea00c528c --- /dev/null +++ b/android/app/src/main/res/layout-land/activity_main.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 1e2de4c1f..549adc740 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -23,6 +23,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" + app:labelVisibilityMode="labeled" app:menu="@menu/bottom_nav_menu" /> diff --git a/android/app/src/main/res/menu/bottom_nav_menu.xml b/android/app/src/main/res/menu/bottom_nav_menu.xml index 8700f6625..7e839152c 100644 --- a/android/app/src/main/res/menu/bottom_nav_menu.xml +++ b/android/app/src/main/res/menu/bottom_nav_menu.xml @@ -2,26 +2,26 @@