From 14412d62d0b41a19ec08eb43ee2e2702e00deb62 Mon Sep 17 00:00:00 2001 From: Andrew Shkrob Date: Sat, 27 Apr 2024 23:49:25 +0200 Subject: [PATCH] [android-auto] New UI Signed-off-by: Andrew Shkrob --- .../src/main/java/app/organicmaps/Map.java | 2 +- .../car/screens/CategoriesScreen.java | 10 ++-- .../organicmaps/car/screens/MapScreen.java | 48 ++++++++++++++----- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/android/app/src/main/java/app/organicmaps/Map.java b/android/app/src/main/java/app/organicmaps/Map.java index 656b94442d849..ce6ead2f53a6c 100644 --- a/android/app/src/main/java/app/organicmaps/Map.java +++ b/android/app/src/main/java/app/organicmaps/Map.java @@ -334,7 +334,7 @@ private void setupWidgets(final Context context, int width, int height) } else { - nativeSetupWidget(WIDGET_SCALE_FPS_LABEL, UiUtils.dimen(context, R.dimen.margin_base), mHeight - UiUtils.dimen(context, R.dimen.margin_base) * 5, ANCHOR_LEFT_TOP); + nativeSetupWidget(WIDGET_SCALE_FPS_LABEL, (float) mWidth / 2 + UiUtils.dimen(context, R.dimen.margin_base) * 2, UiUtils.dimen(context, R.dimen.margin_base), ANCHOR_LEFT_TOP); updateCompassOffset(context, mWidth, mCurrentCompassOffsetY, true); } } diff --git a/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java index 3119560bb39e7..7598bfbf0cd98 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java @@ -7,10 +7,10 @@ import androidx.car.app.constraints.ConstraintManager; import androidx.car.app.model.Action; import androidx.car.app.model.CarIcon; +import androidx.car.app.model.GridItem; +import androidx.car.app.model.GridTemplate; import androidx.car.app.model.Header; import androidx.car.app.model.ItemList; -import androidx.car.app.model.ListTemplate; -import androidx.car.app.model.Row; import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.core.graphics.drawable.IconCompat; @@ -70,14 +70,14 @@ private Header createHeader() } @NonNull - private ListTemplate createCategoriesListTemplate() + private GridTemplate createCategoriesListTemplate() { final boolean isNightMode = ThemeUtils.isNightMode(getCarContext()); final ItemList.Builder builder = new ItemList.Builder(); final int categoriesSize = Math.min(CATEGORIES.size(), MAX_CATEGORIES_SIZE); for (int i = 0; i < categoriesSize; ++i) { - final Row.Builder itemBuilder = new Row.Builder(); + final GridItem.Builder itemBuilder = new GridItem.Builder(); final String title = getCarContext().getString(CATEGORIES.get(i).nameResId); @DrawableRes final int iconResId = isNightMode ? CATEGORIES.get(i).iconNightResId : CATEGORIES.get(i).iconResId; @@ -86,6 +86,6 @@ private ListTemplate createCategoriesListTemplate() itemBuilder.setOnClickListener(() -> getScreenManager().push(new SearchOnMapScreen.Builder(getCarContext(), getSurfaceRenderer()).setCategory(title).build())); builder.addItem(itemBuilder.build()); } - return new ListTemplate.Builder().setHeader(createHeader()).setSingleList(builder.build()).build(); + return new GridTemplate.Builder().setHeader(createHeader()).setSingleList(builder.build()).build(); } } diff --git a/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java index b65269ab1daf8..fb5687fa95d62 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java @@ -5,11 +5,11 @@ import androidx.car.app.model.Action; import androidx.car.app.model.ActionStrip; import androidx.car.app.model.CarIcon; +import androidx.car.app.model.GridItem; +import androidx.car.app.model.GridTemplate; import androidx.car.app.model.Header; import androidx.car.app.model.Item; import androidx.car.app.model.ItemList; -import androidx.car.app.model.ListTemplate; -import androidx.car.app.model.Row; import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.core.graphics.drawable.IconCompat; @@ -19,6 +19,7 @@ import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.bookmarks.BookmarkCategoriesScreen; import app.organicmaps.car.screens.search.SearchScreen; +import app.organicmaps.car.screens.settings.SettingsScreen; import app.organicmaps.car.util.SuggestionsHelpers; import app.organicmaps.car.util.UiHelpers; @@ -38,7 +39,7 @@ public Template onGetTemplate() final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); builder.setActionStrip(createActionStrip()); - builder.setContentTemplate(createListTemplate()); + builder.setContentTemplate(createGridTemplate()); return builder.build(); } @@ -60,19 +61,19 @@ private ActionStrip createActionStrip() final ActionStrip.Builder builder = new ActionStrip.Builder(); builder.addAction(freeDriveScreenBuilder.build()); - builder.addAction(UiHelpers.createSettingsAction(this, getSurfaceRenderer())); return builder.build(); } @NonNull - private ListTemplate createListTemplate() + private GridTemplate createGridTemplate() { - final ListTemplate.Builder builder = new ListTemplate.Builder(); + final GridTemplate.Builder builder = new GridTemplate.Builder(); final ItemList.Builder itemsBuilder = new ItemList.Builder(); itemsBuilder.addItem(createSearchItem()); itemsBuilder.addItem(createCategoriesItem()); itemsBuilder.addItem(createBookmarksItem()); + itemsBuilder.addItem(createSettingsItem()); builder.setHeader(createHeader()); builder.setSingleList(itemsBuilder.build()); @@ -84,10 +85,9 @@ private Item createSearchItem() { final CarIcon iconSearch = new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_search)).build(); - final Row.Builder builder = new Row.Builder(); + final GridItem.Builder builder = new GridItem.Builder(); builder.setTitle(getCarContext().getString(R.string.search)); builder.setImage(iconSearch); - builder.setBrowsable(true); builder.setOnClickListener(this::openSearch); return builder.build(); } @@ -95,9 +95,11 @@ private Item createSearchItem() @NonNull private Item createCategoriesItem() { - final Row.Builder builder = new Row.Builder(); + final CarIcon iconCategories = new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_address)).build(); + + final GridItem.Builder builder = new GridItem.Builder(); + builder.setImage(iconCategories); builder.setTitle(getCarContext().getString(R.string.categories)); - builder.setBrowsable(true); builder.setOnClickListener(this::openCategories); return builder.build(); } @@ -105,13 +107,27 @@ private Item createCategoriesItem() @NonNull private Item createBookmarksItem() { - final Row.Builder builder = new Row.Builder(); + final CarIcon iconBookmarks = new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_bookmarks)).build(); + + final GridItem.Builder builder = new GridItem.Builder(); + builder.setImage(iconBookmarks); builder.setTitle(getCarContext().getString(R.string.bookmarks)); - builder.setBrowsable(true); builder.setOnClickListener(this::openBookmarks); return builder.build(); } + @NonNull + private Item createSettingsItem() + { + final CarIcon iconSettings = new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_settings)).build(); + + final GridItem.Builder builder = new GridItem.Builder(); + builder.setImage(iconSettings); + builder.setTitle(getCarContext().getString(R.string.settings)); + builder.setOnClickListener(this::openSettings); + return builder.build(); + } + private void openSearch() { // Details in UiHelpers.createSettingsAction() @@ -135,4 +151,12 @@ private void openBookmarks() return; getScreenManager().push(new BookmarkCategoriesScreen(getCarContext(), getSurfaceRenderer())); } + + private void openSettings() + { + // Details in UiHelpers.createSettingsAction() + if (getScreenManager().getTop() != this) + return; + getScreenManager().push(new SettingsScreen(getCarContext(), getSurfaceRenderer())); + } }