From a43d430166434cd8d1abe9f382d09df004b86d43 Mon Sep 17 00:00:00 2001 From: Harry Bond Date: Sat, 3 Aug 2024 22:34:14 +0100 Subject: [PATCH] [Android] Highlight layers button when it is activated Signed-off-by: Harry Bond Co-authored-by: Alexander Borsuk --- .../organicmaps/maplayer/LayersButton.java | 43 +++++++++++++++++++ .../maplayer/MapButtonsController.java | 18 +++++++- .../java/app/organicmaps/maplayer/Mode.java | 11 +++-- .../maplayer/ToggleMapLayerFragment.java | 6 +-- .../maplayer/isolines/IsolinesManager.java | 4 +- .../maplayer/subway/SubwayManager.java | 4 +- .../main/res/color/accent_color_selector.xml | 9 +++- .../res/color/accent_color_selector_night.xml | 9 +++- .../main/res/layout/map_buttons_layers.xml | 3 +- android/app/src/main/res/values/attrs.xml | 4 ++ 10 files changed, 92 insertions(+), 19 deletions(-) create mode 100644 android/app/src/main/java/app/organicmaps/maplayer/LayersButton.java diff --git a/android/app/src/main/java/app/organicmaps/maplayer/LayersButton.java b/android/app/src/main/java/app/organicmaps/maplayer/LayersButton.java new file mode 100644 index 0000000000..571846807e --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/maplayer/LayersButton.java @@ -0,0 +1,43 @@ +package app.organicmaps.maplayer; + +import android.content.Context; +import android.util.AttributeSet; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import app.organicmaps.R; + +public class LayersButton extends FloatingActionButton +{ + private boolean mAreLayersActive = false; + + public LayersButton(Context context) + { + super(context); + } + + public LayersButton(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public LayersButton(Context context, AttributeSet attrs, int defStyleAttr) + { + super(context, attrs, defStyleAttr); + } + + @Override + public int[] onCreateDrawableState(int extraSpace) + { + final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); + if (mAreLayersActive) + mergeDrawableStates(drawableState, new int[]{R.attr.layers_enabled}); + return drawableState; + } + + public void setHasActiveLayers(boolean areLayersActive) + { + mAreLayersActive = areLayersActive; + refreshDrawableState(); + } +} \ No newline at end of file diff --git a/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java b/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java index 94cbbc6f9c..9dcbe40ab2 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java @@ -17,10 +17,14 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import app.organicmaps.Framework; import app.organicmaps.MwmActivity; import app.organicmaps.R; import app.organicmaps.downloader.MapManager; import app.organicmaps.downloader.UpdateInfo; +import app.organicmaps.maplayer.isolines.IsolinesManager; +import app.organicmaps.maplayer.subway.SubwayManager; +import app.organicmaps.maplayer.traffic.TrafficManager; import app.organicmaps.routing.RoutingController; import app.organicmaps.util.Config; import app.organicmaps.util.ThemeUtils; @@ -43,7 +47,7 @@ public class MapButtonsController extends Fragment @Nullable private View mBottomButtonsFrame; @Nullable - private FloatingActionButton mToggleMapLayerButton; + private LayersButton mToggleMapLayerButton; @Nullable private MyPositionButton mNavMyPosition; @@ -210,6 +214,17 @@ public class MapButtonsController extends Fragment BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton); } + public void updateLayerButton() + { + if (mToggleMapLayerButton == null) + return; + final boolean buttonSelected = TrafficManager.INSTANCE.isEnabled() + || IsolinesManager.isEnabled() + || SubwayManager.isEnabled() + || Framework.nativeIsOutdoorsLayerEnabled(); + mToggleMapLayerButton.setHasActiveLayers(buttonSelected); + } + private boolean isBehindPlacePage(View v) { if (mPlacePageViewModel == null) @@ -315,6 +330,7 @@ public class MapButtonsController extends Fragment super.onResume(); mSearchWheel.onResume(); updateMenuBadge(); + updateLayerButton(); } @Override diff --git a/android/app/src/main/java/app/organicmaps/maplayer/Mode.java b/android/app/src/main/java/app/organicmaps/maplayer/Mode.java index 2c5204f73f..7b69e5ed52 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/Mode.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/Mode.java @@ -17,8 +17,7 @@ public enum Mode @Override public boolean isEnabled(@NonNull Context context) { - return !SubwayManager.from(context).isEnabled() - && TrafficManager.INSTANCE.isEnabled(); + return !SubwayManager.isEnabled() && TrafficManager.INSTANCE.isEnabled(); } @Override @@ -32,13 +31,13 @@ public enum Mode @Override public boolean isEnabled(@NonNull Context context) { - return SubwayManager.from(context).isEnabled(); + return SubwayManager.isEnabled(); } @Override public void setEnabled(@NonNull Context context, boolean isEnabled) { - SubwayManager.from(context).setEnabled(isEnabled); + SubwayManager.setEnabled(isEnabled); } }, @@ -47,13 +46,13 @@ public enum Mode @Override public boolean isEnabled(@NonNull Context context) { - return IsolinesManager.from(context).isEnabled(); + return IsolinesManager.isEnabled(); } @Override public void setEnabled(@NonNull Context context, boolean isEnabled) { - IsolinesManager.from(context).setEnabled(isEnabled); + IsolinesManager.setEnabled(isEnabled); } }, OUTDOORS diff --git a/android/app/src/main/java/app/organicmaps/maplayer/ToggleMapLayerFragment.java b/android/app/src/main/java/app/organicmaps/maplayer/ToggleMapLayerFragment.java index 177023c8ab..84ded9f3bc 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/ToggleMapLayerFragment.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/ToggleMapLayerFragment.java @@ -9,7 +9,6 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import app.organicmaps.R; @@ -28,7 +27,7 @@ public class ToggleMapLayerFragment extends Fragment private static final String LAYERS_MENU_ID = "LAYERS_MENU_BOTTOM_SHEET"; @Nullable private LayersAdapter mAdapter; - private MapButtonsViewModel mMapButtonsViewModel; + private MapButtonsController mMapButtonsController; @Nullable @Override @@ -36,7 +35,7 @@ public class ToggleMapLayerFragment extends Fragment { View mRoot = inflater.inflate(R.layout.fragment_toggle_map_layer, container, false); - mMapButtonsViewModel = new ViewModelProvider(requireActivity()).get(MapButtonsViewModel.class); + mMapButtonsController = (MapButtonsController) requireActivity().getSupportFragmentManager().findFragmentById(R.id.map_buttons); MaterialButton mCloseButton = mRoot.findViewById(R.id.close_button); mCloseButton.setOnClickListener(view -> closeLayerBottomSheet()); @@ -74,6 +73,7 @@ public class ToggleMapLayerFragment extends Fragment SharedPropertiesUtils.setLayerMarkerShownForLayerMode(context, mode); mode.setEnabled(context, !mode.isEnabled(context)); mAdapter.notifyDataSetChanged(); + mMapButtonsController.updateLayerButton(); if (IsolinesManager.from(context).shouldShowNotification()) Utils.showSnackbar(context, v.getRootView(), R.string.isolines_toast_zooms_1_10); } diff --git a/android/app/src/main/java/app/organicmaps/maplayer/isolines/IsolinesManager.java b/android/app/src/main/java/app/organicmaps/maplayer/isolines/IsolinesManager.java index 250b95d347..1957bbae02 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/isolines/IsolinesManager.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/isolines/IsolinesManager.java @@ -18,7 +18,7 @@ public class IsolinesManager mListener = new OnIsolinesChangedListener(application); } - public boolean isEnabled() + static public boolean isEnabled() { return Framework.nativeIsIsolinesLayerEnabled(); } @@ -28,7 +28,7 @@ public class IsolinesManager nativeAddListener(mListener); } - public void setEnabled(boolean isEnabled) + static public void setEnabled(boolean isEnabled) { if (isEnabled == isEnabled()) return; diff --git a/android/app/src/main/java/app/organicmaps/maplayer/subway/SubwayManager.java b/android/app/src/main/java/app/organicmaps/maplayer/subway/SubwayManager.java index 5ac28cd885..e2f5062612 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/subway/SubwayManager.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/subway/SubwayManager.java @@ -17,7 +17,7 @@ public class SubwayManager mSchemeChangedListener = new OnTransitSchemeChangedListener.Default(application); } - public void setEnabled(boolean isEnabled) + static public void setEnabled(boolean isEnabled) { if (isEnabled == isEnabled()) return; @@ -26,7 +26,7 @@ public class SubwayManager Framework.nativeSaveSettingSchemeEnabled(isEnabled); } - public boolean isEnabled() + static public boolean isEnabled() { return Framework.nativeIsTransitSchemeEnabled(); } diff --git a/android/app/src/main/res/color/accent_color_selector.xml b/android/app/src/main/res/color/accent_color_selector.xml index a49cc73642..9ae6d9e149 100644 --- a/android/app/src/main/res/color/accent_color_selector.xml +++ b/android/app/src/main/res/color/accent_color_selector.xml @@ -1,10 +1,15 @@ - + + - + + + diff --git a/android/app/src/main/res/color/accent_color_selector_night.xml b/android/app/src/main/res/color/accent_color_selector_night.xml index 2aa8b2cb2c..5ac5acec9d 100644 --- a/android/app/src/main/res/color/accent_color_selector_night.xml +++ b/android/app/src/main/res/color/accent_color_selector_night.xml @@ -1,10 +1,15 @@ - + + - + + + diff --git a/android/app/src/main/res/layout/map_buttons_layers.xml b/android/app/src/main/res/layout/map_buttons_layers.xml index 9a1e251cb8..24fed92ea0 100644 --- a/android/app/src/main/res/layout/map_buttons_layers.xml +++ b/android/app/src/main/res/layout/map_buttons_layers.xml @@ -1,8 +1,9 @@ - \ No newline at end of file diff --git a/android/app/src/main/res/values/attrs.xml b/android/app/src/main/res/values/attrs.xml index 50d5a2dfac..9981b13f8c 100644 --- a/android/app/src/main/res/values/attrs.xml +++ b/android/app/src/main/res/values/attrs.xml @@ -7,6 +7,10 @@ + + + +