diff --git a/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java index e564c6b985..2ed2589229 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java @@ -4,18 +4,18 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.car.app.CarContext; import androidx.car.app.model.Action; -import androidx.car.app.model.CarIcon; import androidx.car.app.model.Header; import androidx.car.app.model.ItemList; +import androidx.car.app.model.OnClickListener; import androidx.car.app.model.Row; import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapTemplate; -import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.R; import app.organicmaps.car.SurfaceRenderer; import app.organicmaps.car.screens.base.BaseMapScreen; +import app.organicmaps.car.util.Toggle; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.routing.RoutingOptions; import app.organicmaps.settings.RoadType; @@ -48,19 +48,12 @@ public class DrivingOptionsScreen extends BaseMapScreen new DrivingOption(RoadType.Motorway, R.string.avoid_motorways) }; - @NonNull - private final CarIcon mCheckboxIcon; - @NonNull - private final CarIcon mCheckboxSelectedIcon; - @NonNull private final Map mInitialDrivingOptionsState = new HashMap<>(); public DrivingOptionsScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) { super(carContext, surfaceRenderer); - mCheckboxIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box)).build(); - mCheckboxSelectedIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box_checked)).build(); initDrivingOptionsState(); } @@ -103,24 +96,21 @@ public class DrivingOptionsScreen extends BaseMapScreen { final ItemList.Builder builder = new ItemList.Builder(); for (final DrivingOption drivingOption : mDrivingOptions) - builder.addItem(createDrivingOptionCheckbox(drivingOption.roadType, drivingOption.text)); + builder.addItem(createDrivingOptionsToggle(drivingOption.roadType, drivingOption.text)); return builder.build(); } @NonNull - private Row createDrivingOptionCheckbox(RoadType roadType, @StringRes int titleRes) + private Row createDrivingOptionsToggle(RoadType roadType, @StringRes int title) { - final Row.Builder builder = new Row.Builder(); - builder.setTitle(getCarContext().getString(titleRes)); - builder.setOnClickListener(() -> { + final OnClickListener listener = () -> { if (RoutingOptions.hasOption(roadType)) RoutingOptions.removeOption(roadType); else RoutingOptions.addOption(roadType); invalidate(); - }); - builder.setImage(RoutingOptions.hasOption(roadType) ? mCheckboxSelectedIcon : mCheckboxIcon); - return builder.build(); + }; + return Toggle.create(getCarContext(), title, listener, RoutingOptions.hasOption(roadType)); } private void initDrivingOptionsState() diff --git a/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java index c539f555bd..d9937e87fc 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java @@ -4,19 +4,19 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.car.app.CarContext; import androidx.car.app.model.Action; -import androidx.car.app.model.CarIcon; import androidx.car.app.model.Header; import androidx.car.app.model.Item; import androidx.car.app.model.ItemList; +import androidx.car.app.model.OnClickListener; import androidx.car.app.model.Row; import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapTemplate; -import androidx.core.graphics.drawable.IconCompat; import app.organicmaps.R; import app.organicmaps.car.SurfaceRenderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.ThemeUtils; +import app.organicmaps.car.util.Toggle; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.util.Config; @@ -32,16 +32,9 @@ public class SettingsScreen extends BaseMapScreen void set(boolean newValue); } - @NonNull - private final CarIcon mCheckboxIcon; - @NonNull - private final CarIcon mCheckboxSelectedIcon; - public SettingsScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) { super(carContext, surfaceRenderer); - mCheckboxIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box)).build(); - mCheckboxSelectedIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box_checked)).build(); } @NonNull @@ -70,8 +63,8 @@ public class SettingsScreen extends BaseMapScreen final ItemList.Builder builder = new ItemList.Builder(); builder.addItem(createThemeItem()); builder.addItem(createRoutingOptionsItem()); - builder.addItem(createSharedPrefsCheckbox(R.string.big_font, Config::isLargeFontsSize, Config::setLargeFontsSize)); - builder.addItem(createSharedPrefsCheckbox(R.string.transliteration_title, Config::isTransliteration, Config::setTransliteration)); + builder.addItem(createSharedPrefsToggle(R.string.big_font, Config::isLargeFontsSize, Config::setLargeFontsSize)); + builder.addItem(createSharedPrefsToggle(R.string.transliteration_title, Config::isTransliteration, Config::setTransliteration)); builder.addItem(createHelpItem()); return builder.build(); } @@ -108,17 +101,13 @@ public class SettingsScreen extends BaseMapScreen } @NonNull - private Row createSharedPrefsCheckbox(@StringRes int titleRes, @NonNull PrefsGetter getter, @NonNull PrefsSetter setter) + private Row createSharedPrefsToggle(@StringRes int titleRes, @NonNull PrefsGetter getter, @NonNull PrefsSetter setter) { - final boolean getterValue = getter.get(); - - final Row.Builder builder = new Row.Builder(); - builder.setTitle(getCarContext().getString(titleRes)); - builder.setOnClickListener(() -> { - setter.set(!getterValue); + final boolean enabled = getter.get(); + final OnClickListener listener = () -> { + setter.set(!enabled); invalidate(); - }); - builder.setImage(getterValue ? mCheckboxSelectedIcon : mCheckboxIcon); - return builder.build(); + }; + return Toggle.create(getCarContext(), titleRes, listener, enabled); } } diff --git a/android/app/src/main/java/app/organicmaps/car/util/Toggle.java b/android/app/src/main/java/app/organicmaps/car/util/Toggle.java new file mode 100644 index 0000000000..b7365ae311 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/util/Toggle.java @@ -0,0 +1,50 @@ +package app.organicmaps.car.util; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.car.app.CarContext; +import androidx.car.app.annotations.RequiresCarApi; +import androidx.car.app.model.CarIcon; +import androidx.car.app.model.OnClickListener; +import androidx.car.app.model.Row; +import androidx.core.graphics.drawable.IconCompat; + +import app.organicmaps.R; + +public final class Toggle +{ + @DrawableRes + private static final int CHECKBOX_ICON = R.drawable.ic_checkbox; + @DrawableRes + private static final int CHECKBOX_CHECKED_ICON = R.drawable.ic_checkbox_checked; + + @NonNull + public static Row create(@NonNull final CarContext context, @StringRes int title, @NonNull final OnClickListener onClickListener, boolean checked) + { + final Row.Builder row = new Row.Builder(); + row.setTitle(context.getString(title)); + if (context.getCarAppApiLevel() >= 6) + row.setToggle(createToggle(onClickListener, checked)); + else + createCheckbox(row, context, onClickListener, checked); + + return row.build(); + } + + @RequiresCarApi(6) + @NonNull + private static androidx.car.app.model.Toggle createToggle(@NonNull final OnClickListener onClickListener, boolean checked) + { + return new androidx.car.app.model.Toggle.Builder((unused) -> onClickListener.onClick()).setChecked(checked).build(); + } + + private static void createCheckbox( + @NonNull final Row.Builder row, @NonNull final CarContext context, @NonNull final OnClickListener onClickListener, boolean checked) + { + row.setOnClickListener(onClickListener); + row.setImage(new CarIcon.Builder(IconCompat.createWithResource(context, checked ? CHECKBOX_CHECKED_ICON : CHECKBOX_ICON)).build()); + } + + private Toggle() {} +} diff --git a/android/app/src/main/res/drawable/ic_check_box.xml b/android/app/src/main/res/drawable/ic_checkbox.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_check_box.xml rename to android/app/src/main/res/drawable/ic_checkbox.xml diff --git a/android/app/src/main/res/drawable/ic_check_box_checked.xml b/android/app/src/main/res/drawable/ic_checkbox_checked.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_check_box_checked.xml rename to android/app/src/main/res/drawable/ic_checkbox_checked.xml