diff --git a/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt b/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt index 166dc482..5bbfb28b 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt @@ -31,6 +31,7 @@ import net.vonforst.evmap.R import net.vonforst.evmap.location.FusionEngine import net.vonforst.evmap.location.LocationEngine import net.vonforst.evmap.location.Priority +import net.vonforst.evmap.storage.PreferenceDataSource import net.vonforst.evmap.utils.checkFineLocationPermission @@ -111,27 +112,49 @@ class EVMapSession(val cas: CarAppService) : Session(), DefaultLifecycleObserver carContext.getCarService(CarContext.HARDWARE_SERVICE) as CarHardwareManager } + private val prefs: PreferenceDataSource by lazy { + PreferenceDataSource(carContext) + } + init { lifecycle.addObserver(this) } override fun onCreateScreen(intent: Intent): Screen { val mapScreen = MapScreen(carContext, this) + val screens = mutableListOf(mapScreen) + if (!prefs.dataSourceSet) { + screens.add( + ChooseDataSourceScreen( + carContext, + ChooseDataSourceScreen.Type.CHARGER_DATA_SOURCE, + initialChoice = true, + extraDesc = R.string.data_sources_description + ) + ) + } if (!locationPermissionGranted()) { - val screenManager = carContext.getCarService(ScreenManager::class.java) - screenManager.push(mapScreen) - return PermissionScreen( - carContext, - R.string.auto_location_permission_needed, - listOf( - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.ACCESS_COARSE_LOCATION + screens.add( + PermissionScreen( + carContext, + R.string.auto_location_permission_needed, + listOf( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + ) ) ) } - return mapScreen + if (screens.size > 1) { + val screenManager = carContext.getCarService(ScreenManager::class.java) + for (i in 0 until screens.size - 1) { + screenManager.push(screens[i]) + } + } + + return screens.last() } private fun locationPermissionGranted() = carContext.checkFineLocationPermission() diff --git a/app/src/google/java/net/vonforst/evmap/auto/SettingsScreens.kt b/app/src/google/java/net/vonforst/evmap/auto/SettingsScreens.kt index 99477d4c..5939cea5 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/SettingsScreens.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/SettingsScreens.kt @@ -92,12 +92,9 @@ class SettingsScreen(ctx: CarContext) : Screen(ctx) { class DataSettingsScreen(ctx: CarContext) : Screen(ctx) { val prefs = PreferenceDataSource(ctx) val db = AppDatabase.getInstance(ctx) + val dataSourceNames = carContext.resources.getStringArray(R.array.pref_data_source_names) val dataSourceValues = carContext.resources.getStringArray(R.array.pref_data_source_values) - val dataSourceDescriptions = listOf( - carContext.getString(R.string.data_source_goingelectric_desc), - carContext.getString(R.string.data_source_openchargemap_desc) - ) val searchProviderNames = carContext.resources.getStringArray(R.array.pref_search_provider_names) val searchProviderValues = @@ -118,14 +115,9 @@ class DataSettingsScreen(ctx: CarContext) : Screen(ctx) { screenManager.push( ChooseDataSourceScreen( carContext, - R.string.pref_data_source, - dataSourceNames, - dataSourceValues, - prefs.dataSource, - dataSourceDescriptions - ) { - prefs.dataSource = it - }) + ChooseDataSourceScreen.Type.CHARGER_DATA_SOURCE + ) + ) } }.build()) addItem(Row.Builder().apply { @@ -139,13 +131,9 @@ class DataSettingsScreen(ctx: CarContext) : Screen(ctx) { screenManager.push( ChooseDataSourceScreen( carContext, - R.string.pref_search_provider, - searchProviderNames, - searchProviderValues, - prefs.searchProvider - ) { - prefs.searchProvider = it - }) + ChooseDataSourceScreen.Type.SEARCH_PROVIDER + ) + ) } }.build()) addItem(Row.Builder().apply { @@ -168,34 +156,85 @@ class DataSettingsScreen(ctx: CarContext) : Screen(ctx) { class ChooseDataSourceScreen( ctx: CarContext, - @StringRes val title: Int, - val names: Array, - val values: Array, - val currentValue: String, - val descriptions: List? = null, - val callback: (String) -> Unit + val type: Type, + val initialChoice: Boolean = false, + @StringRes val extraDesc: Int? = null ) : Screen(ctx) { + enum class Type { + CHARGER_DATA_SOURCE, SEARCH_PROVIDER + } + val prefs = PreferenceDataSource(carContext) + val title = when (type) { + Type.CHARGER_DATA_SOURCE -> R.string.pref_data_source + Type.SEARCH_PROVIDER -> R.string.pref_search_provider + } + val names = when (type) { + Type.CHARGER_DATA_SOURCE -> carContext.resources.getStringArray(R.array.pref_data_source_names) + Type.SEARCH_PROVIDER -> carContext.resources.getStringArray(R.array.pref_search_provider_names) + } + val values = when (type) { + Type.CHARGER_DATA_SOURCE -> carContext.resources.getStringArray(R.array.pref_data_source_values) + Type.SEARCH_PROVIDER -> carContext.resources.getStringArray(R.array.pref_search_provider_values) + } + val currentValue: String = when (type) { + Type.CHARGER_DATA_SOURCE -> prefs.dataSource + Type.SEARCH_PROVIDER -> prefs.searchProvider + } + val descriptions = when (type) { + Type.CHARGER_DATA_SOURCE -> listOf( + carContext.getString(R.string.data_source_goingelectric_desc), + carContext.getString(R.string.data_source_openchargemap_desc) + ) + Type.SEARCH_PROVIDER -> null + } + val callback: (String) -> Unit = when (type) { + Type.CHARGER_DATA_SOURCE -> { it -> + prefs.dataSourceSet = true + prefs.dataSource = it + } + Type.SEARCH_PROVIDER -> { it -> + prefs.searchProvider = it + } + } override fun onGetTemplate(): Template { return ListTemplate.Builder().apply { setTitle(carContext.getString(title)) - setHeaderAction(Action.BACK) - setSingleList(ItemList.Builder().apply { + setHeaderAction(if (initialChoice) Action.APP_ICON else Action.BACK) + + val list = ItemList.Builder().apply { for (i in names.indices) { addItem(Row.Builder().apply { setTitle(names[i]) descriptions?.let { addText(it[i]) } + if (initialChoice) { + setBrowsable(true) + setOnClickListener { + itemSelected(i) + } + } }.build()) } - setOnSelectedListener { - callback(values[it]) - screenManager.pop() + if (!initialChoice) { + setOnSelectedListener { + itemSelected(it) + } + setSelectedIndex(values.indexOf(currentValue)) } - setSelectedIndex(values.indexOf(currentValue)) - }.build()) + }.build() + if (extraDesc != null) { + addSectionedList(SectionedItemList.create(list, carContext.getString(extraDesc))) + } else { + setSingleList(list) + } }.build() } + + private fun itemSelected(i: Int) { + callback(values[i]) + screenManager.pop() + } } class ChargepriceSettingsScreen(ctx: CarContext) : Screen(ctx) {