feat(cw): wire CW decoder page into navigation (between Roaming and Map)
Compose integration of the ported CW decoder engine:
- CwDecodeScreen: AndroidView embedding the ported activity_main.xml,
lifecycle delegated to the ported MainActivity controller (onCreate ->
onResume, onDispose -> onPause/onDestroy), RECORD_AUDIO runtime
permission flow (with permanent-denial -> app settings), original
options_menu actions as a top button row (pause/clear/save/record/
settings), double-back-to-exit preserved
- CwSettingsDialog: message_type (general_text/ham_radio_qso),
text_font_size (7-99), and the 9 color keys (bg_color/text_color/...)
reading/writing the same prefs keys as the original app
(getPackageName()+"_preferences"), colors sourced from I2.b tables
- Navigation: Screen.CwDecode ("CwDecode") placed between Roaming and
Map in the default order; defaultScreenOrder updated; ic_cw morse icon;
nav_cw strings (en/zh/tr); app depends on :feature:cw
Verified: :feature:cw:compileDebugKotlin + :app:compileDebugKotlin
BUILD SUCCESSFUL (first pass, no errors).
This commit is contained in:
1 parent
5dc7ce6a22
commit
8bc1f16e2c
10 files changed
+463
-4
No files matched your search
+5
-2
@@ -41,12 +41,15 @@ sealed class Screen(val iconResId: Int, val titleResId: Int, val screenId: Strin
|
||||
@Serializable
|
||||
data object Roaming : Screen(R.drawable.ic_roaming, R.string.nav_roaming, "Roaming")
|
||||
|
||||
@Serializable
|
||||
data object CwDecode : Screen(R.drawable.ic_cw, R.string.nav_cw, "CwDecode")
|
||||
|
||||
@Serializable
|
||||
data object Settings : Screen(R.drawable.ic_settings, R.string.nav_prefs, "Settings")
|
||||
}
|
||||
|
||||
// UI 设置: 默认页面顺序(与 MainScreen navItems 一致)
|
||||
val defaultScreenOrder = listOf("Satellites", "Passes", "Radar", "Mutual", "Roaming", "Map", "Settings")
|
||||
val defaultScreenOrder = listOf("Satellites", "Passes", "Radar", "Mutual", "Roaming", "CwDecode", "Map", "Settings")
|
||||
|
||||
@Serializable
|
||||
data object RadarDestination : NavKey
|
||||
@@ -76,4 +79,4 @@ class DeeplinkResolver(private val fallbackDestination: NavKey = Screen.Passes)
|
||||
matchers.forEach { it.match(deeplink)?.let { match -> return match } }
|
||||
return fallbackDestination
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
|
||||
<!-- Morse style icon: a dot above a dash -->
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M 8 4 L 16 4 L 16 8 L 8 8 Z" />
|
||||
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M 3 16 L 21 16 L 21 20 L 3 20 Z" />
|
||||
</vector>
|
||||
@@ -10,6 +10,7 @@
|
||||
<string name="nav_sat">Uydular</string>
|
||||
<string name="nav_pass">Geçişler</string>
|
||||
<string name="nav_radar">Radar</string>
|
||||
<string name="nav_cw">CW Dekoder</string>
|
||||
<string name="nav_map">Harita</string>
|
||||
<string name="nav_prefs">Ayarlar</string>
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<string name="nav_radar">雷达</string>
|
||||
<string name="nav_mutual">匹配</string>
|
||||
<string name="nav_roaming">漫游</string>
|
||||
<string name="nav_cw">CW解码</string>
|
||||
<string name="nav_map">地图</string>
|
||||
<string name="nav_prefs">设置</string>
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
<string name="nav_radar">Radar</string>
|
||||
<string name="nav_mutual">Match</string>
|
||||
<string name="nav_roaming">Roaming</string>
|
||||
<string name="nav_cw">CW Decoder</string>
|
||||
<string name="nav_map">Map</string>
|
||||
<string name="nav_prefs">Settings</string>
|
||||
|
||||
|
||||
Reference in new issue
Block a user