diff --git a/android/res/drawable-hdpi/ic_plus.webp b/android/res/drawable-hdpi/ic_plus.webp deleted file mode 100644 index a4b5ee4e09..0000000000 Binary files a/android/res/drawable-hdpi/ic_plus.webp and /dev/null differ diff --git a/android/res/drawable-mdpi/ic_plus.webp b/android/res/drawable-mdpi/ic_plus.webp deleted file mode 100644 index a57f2c9c69..0000000000 Binary files a/android/res/drawable-mdpi/ic_plus.webp and /dev/null differ diff --git a/android/res/drawable-xhdpi/ic_plus.webp b/android/res/drawable-xhdpi/ic_plus.webp deleted file mode 100644 index 40ff5ba65c..0000000000 Binary files a/android/res/drawable-xhdpi/ic_plus.webp and /dev/null differ diff --git a/android/res/drawable-xxhdpi/ic_plus.webp b/android/res/drawable-xxhdpi/ic_plus.webp deleted file mode 100644 index 954e8eea7f..0000000000 Binary files a/android/res/drawable-xxhdpi/ic_plus.webp and /dev/null differ diff --git a/android/res/drawable-xxxhdpi/ic_plus.webp b/android/res/drawable-xxxhdpi/ic_plus.webp deleted file mode 100644 index ea050652aa..0000000000 Binary files a/android/res/drawable-xxxhdpi/ic_plus.webp and /dev/null differ diff --git a/android/res/drawable/bg_toggle_map_layer_btn.xml b/android/res/drawable/bg_toggle_map_layer_btn.xml index 7d28ef4fae..4e5902d83e 100644 --- a/android/res/drawable/bg_toggle_map_layer_btn.xml +++ b/android/res/drawable/bg_toggle_map_layer_btn.xml @@ -1,5 +1,6 @@ + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_dark.xml b/android/res/drawable/bg_toggle_map_layer_btn_dark.xml index e3cedfb43b..28f87e62b8 100644 --- a/android/res/drawable/bg_toggle_map_layer_btn_dark.xml +++ b/android/res/drawable/bg_toggle_map_layer_btn_dark.xml @@ -1,5 +1,6 @@ + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_default.xml b/android/res/drawable/bg_toggle_map_layer_btn_default.xml index 954aa5b196..47077bcee5 100644 --- a/android/res/drawable/bg_toggle_map_layer_btn_default.xml +++ b/android/res/drawable/bg_toggle_map_layer_btn_default.xml @@ -1,8 +1,11 @@ - - - + + + + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_default_dark.xml b/android/res/drawable/bg_toggle_map_layer_btn_default_dark.xml index 3f46ad91d3..710471fb42 100644 --- a/android/res/drawable/bg_toggle_map_layer_btn_default_dark.xml +++ b/android/res/drawable/bg_toggle_map_layer_btn_default_dark.xml @@ -1,8 +1,11 @@ - - - + + + + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_pressed.xml b/android/res/drawable/bg_toggle_map_layer_btn_pressed.xml new file mode 100644 index 0000000000..0daccd2693 --- /dev/null +++ b/android/res/drawable/bg_toggle_map_layer_btn_pressed.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_pressed_dark.xml b/android/res/drawable/bg_toggle_map_layer_btn_pressed_dark.xml new file mode 100644 index 0000000000..4bb4fa9b1c --- /dev/null +++ b/android/res/drawable/bg_toggle_map_layer_btn_pressed_dark.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_selected.xml b/android/res/drawable/bg_toggle_map_layer_btn_selected.xml index 76a2654af6..c54873625d 100644 --- a/android/res/drawable/bg_toggle_map_layer_btn_selected.xml +++ b/android/res/drawable/bg_toggle_map_layer_btn_selected.xml @@ -1,8 +1,11 @@ - - - + + + + diff --git a/android/res/drawable/bg_toggle_map_layer_btn_selected_dark.xml b/android/res/drawable/bg_toggle_map_layer_btn_selected_dark.xml index dd60485f91..1a00348b7a 100644 --- a/android/res/drawable/bg_toggle_map_layer_btn_selected_dark.xml +++ b/android/res/drawable/bg_toggle_map_layer_btn_selected_dark.xml @@ -1,8 +1,12 @@ - - - + + + + diff --git a/android/res/drawable/ic_plus.xml b/android/res/drawable/ic_plus.xml new file mode 100644 index 0000000000..70046c48fe --- /dev/null +++ b/android/res/drawable/ic_plus.xml @@ -0,0 +1,5 @@ + + + diff --git a/android/res/layout-land/main_menu_bottom_sheet.xml b/android/res/layout-land/main_menu_bottom_sheet.xml deleted file mode 100644 index 9e5607f3ee..0000000000 --- a/android/res/layout-land/main_menu_bottom_sheet.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/android/res/layout-land/map_navigation_buttons.xml b/android/res/layout-land/map_navigation_buttons.xml index 772e5d5e1c..4f46effed7 100644 --- a/android/res/layout-land/map_navigation_buttons.xml +++ b/android/res/layout-land/map_navigation_buttons.xml @@ -9,14 +9,14 @@ - - - - diff --git a/android/res/layout/bottom_sheet.xml b/android/res/layout/bottom_sheet.xml index 80b132f481..c92a0f88f1 100644 --- a/android/res/layout/bottom_sheet.xml +++ b/android/res/layout/bottom_sheet.xml @@ -5,6 +5,11 @@ android:layout_height="match_parent" android:orientation="vertical"> + + - - + android:layout_height="wrap_content" + android:orientation="vertical"> + + android:textAppearance="?fontHeadline6" /> + - - - - + android:paddingEnd="@dimen/margin_base" /> + \ No newline at end of file diff --git a/android/res/layout/main_menu_bottom_sheet.xml b/android/res/layout/main_menu_bottom_sheet.xml deleted file mode 100644 index 8ac64e5199..0000000000 --- a/android/res/layout/main_menu_bottom_sheet.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/android/res/layout/map_navigation_buttons.xml b/android/res/layout/map_navigation_buttons.xml index f465de5ad6..3b57dbc3e4 100644 --- a/android/res/layout/map_navigation_buttons.xml +++ b/android/res/layout/map_navigation_buttons.xml @@ -8,31 +8,32 @@ android:layoutDirection="ltr" android:theme="?navButtonsTheme"> + + + tools:src="@drawable/anim_traffic_loading" /> - - - - - - - - - - - - - - - - - - - diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml index 1440de1480..2bbac14f4d 100644 --- a/android/res/values/styles.xml +++ b/android/res/values/styles.xml @@ -17,7 +17,7 @@ ?iconTint - diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 4a3ca222bc..5bf4ed8737 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -16,7 +16,6 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewTreeObserver; import android.view.WindowManager; -import android.widget.ImageButton; import androidx.annotation.CallSuper; import androidx.annotation.NonNull; @@ -45,7 +44,9 @@ import com.mapswithme.maps.dialog.AlertDialogCallback; import com.mapswithme.maps.dialog.DialogUtils; import com.mapswithme.maps.downloader.DownloaderActivity; import com.mapswithme.maps.downloader.DownloaderFragment; +import com.mapswithme.maps.downloader.MapManager; import com.mapswithme.maps.downloader.OnmapDownloader; +import com.mapswithme.maps.downloader.UpdateInfo; import com.mapswithme.maps.editor.Editor; import com.mapswithme.maps.editor.EditorActivity; import com.mapswithme.maps.editor.EditorHostFragment; @@ -58,14 +59,11 @@ import com.mapswithme.maps.location.CompassData; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.maplayer.MapLayerCompositeController; import com.mapswithme.maps.maplayer.Mode; -import com.mapswithme.maps.maplayer.OnIsolinesLayerToggleListener; +import com.mapswithme.maps.maplayer.ToggleMapLayerFragment; import com.mapswithme.maps.maplayer.isolines.IsolinesManager; import com.mapswithme.maps.maplayer.isolines.IsolinesState; -import com.mapswithme.maps.maplayer.subway.OnSubwayLayerToggleListener; import com.mapswithme.maps.maplayer.subway.SubwayManager; -import com.mapswithme.maps.maplayer.traffic.OnTrafficLayerToggleListener; import com.mapswithme.maps.maplayer.traffic.TrafficManager; -import com.mapswithme.maps.maplayer.traffic.widget.TrafficButton; import com.mapswithme.maps.routing.NavigationController; import com.mapswithme.maps.routing.RoutePointInfo; import com.mapswithme.maps.routing.RoutingBottomMenuListener; @@ -84,13 +82,8 @@ import com.mapswithme.maps.settings.SettingsActivity; import com.mapswithme.maps.settings.StoragePathManager; import com.mapswithme.maps.settings.UnitLocale; import com.mapswithme.maps.sound.TtsPlayer; -import com.mapswithme.maps.widget.FadeView; import com.mapswithme.maps.widget.menu.BaseMenu; import com.mapswithme.maps.widget.menu.MainMenu; -import com.mapswithme.maps.widget.menu.MainMenuOptionListener; -import com.mapswithme.maps.widget.menu.MenuController; -import com.mapswithme.maps.widget.menu.MenuControllerFactory; -import com.mapswithme.maps.widget.menu.MenuStateObserver; import com.mapswithme.maps.widget.menu.MyPositionButton; import com.mapswithme.maps.widget.placepage.PlacePageController; import com.mapswithme.maps.widget.placepage.PlacePageData; @@ -104,9 +97,12 @@ import com.mapswithme.util.ThemeSwitcher; import com.mapswithme.util.ThemeUtils; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; +import com.mapswithme.util.bottomsheet.MenuBottomSheetFragment; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; +import java.util.ArrayList; import java.util.Objects; import java.util.Stack; @@ -124,12 +120,9 @@ public class MwmActivity extends BaseMwmFragmentActivity RoutingBottomMenuListener, BookmarkManager.BookmarksLoadingListener, FloatingSearchToolbarController.SearchToolbarListener, - OnTrafficLayerToggleListener, - OnSubwayLayerToggleListener, PlacePageController.SlideListener, AlertDialogCallback, RoutingModeListener, AppBackgroundTracker.OnTransitionListener, - OnIsolinesLayerToggleListener, NoConnectionListener, MapWidgetOffsetsProvider { @@ -165,10 +158,6 @@ public class MwmActivity extends BaseMwmFragmentActivity @Nullable private MapFragment mMapFragment; - @SuppressWarnings("NullableProblems") - @NonNull - private FadeView mFadeView; - @SuppressWarnings("NullableProblems") @NonNull private View mPositionChooser; @@ -189,6 +178,12 @@ public class MwmActivity extends BaseMwmFragmentActivity @Nullable private MyPositionButton mNavMyPosition; + @NonNull + ToggleMapLayerFragment mToggleMapLayerFragment; + @NonNull + private MenuBottomSheetFragment mLayersBottomSheet; + @NonNull + private MenuBottomSheetFragment mMainMenuBottomSheet; @Nullable private NavigationButtonsAnimationController mNavAnimationController; @SuppressWarnings("NullableProblems") @@ -217,9 +212,6 @@ public class MwmActivity extends BaseMwmFragmentActivity @NonNull private PlacePageController mPlacePageController; @SuppressWarnings("NullableProblems") - @NonNull - private MenuController mMainMenuController; - public interface LeftAnimationTrackListener { @@ -414,17 +406,14 @@ public class MwmActivity extends BaseMwmFragmentActivity mPlacePageController.initialize(this); mPlacePageController.onActivityCreated(this, savedInstanceState); - mMainMenuController = MenuControllerFactory.createMainMenuController(new MainMenuStateObserver(), - new MainMenuOptionSelectedListener(), - this); - mMainMenuController.initialize(findViewById(R.id.coordinator)); - mSearchController = new FloatingSearchToolbarController(this, this); mSearchController.getToolbar() .getViewTreeObserver() .addOnGlobalLayoutListener(new ToolbarLayoutChangeListener()); mSearchController.setVisibilityListener(this); + initBottomSheets(); + boolean isLaunchByDeepLink = getIntent().getBooleanExtra(EXTRA_LAUNCH_BY_DEEP_LINK, false); initViews(isLaunchByDeepLink); @@ -443,6 +432,34 @@ public class MwmActivity extends BaseMwmFragmentActivity } } + private void initBottomSheets() + { + mToggleMapLayerFragment = new ToggleMapLayerFragment(this::onIsolinesLayerOptionSelected, this::onSubwayLayerOptionSelected); + mLayersBottomSheet = new MenuBottomSheetFragment(mToggleMapLayerFragment); + mMainMenuBottomSheet = new MenuBottomSheetFragment(mToggleMapLayerFragment, getMainMenuItems()); + } + + private int getDownloadMapsCounter() + { + UpdateInfo info = MapManager.nativeGetUpdateInfo(null); + return info == null ? 0 : info.filesCount; + } + + private ArrayList getMainMenuItems() + { + ArrayList items = new ArrayList<>(); + items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected)); + items.add(new MenuBottomSheetItem( + R.string.download_maps, + R.drawable.ic_download, + getDownloadMapsCounter(), + this::onDownloadMapsOptionSelected + )); + items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected)); + items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected)); + return items; + } + @Override public void onNoConnectionError() { @@ -535,9 +552,6 @@ public class MwmActivity extends BaseMwmFragmentActivity private void initMap(boolean isLaunchByDeepLink) { - mFadeView = findViewById(R.id.fade_view); - mFadeView.setListener(this::onFadeViewTouch); - mMapFragment = (MapFragment) getSupportFragmentManager().findFragmentByTag(MapFragment.class.getName()); if (mMapFragment == null) { @@ -557,12 +571,6 @@ public class MwmActivity extends BaseMwmFragmentActivity } } - private boolean onFadeViewTouch() - { - closeMenu(); - return getCurrentMenu().close(true); - } - public boolean isMapAttached() { return mMapFragment != null && mMapFragment.isAdded(); @@ -581,20 +589,44 @@ public class MwmActivity extends BaseMwmFragmentActivity View myPosition = frame.findViewById(R.id.my_position); mNavMyPosition = new MyPositionButton(myPosition, mOnMyPositionClickListener); - initToggleMapLayerController(frame); + View mLayersButton = frame.findViewById(R.id.layers_button); + + mToggleMapLayerController = new MapLayerCompositeController(mLayersButton, this::toggleMapLayerMenu,this); mNavAnimationController = new NavigationButtonsAnimationController( zoomIn, zoomOut, myPosition, getWindow().getDecorView().getRootView(), this); } - - private void initToggleMapLayerController(@NonNull View frame) + private void toggleMapLayerMenu() { - ImageButton trafficBtn = frame.findViewById(R.id.traffic); - TrafficButton traffic = new TrafficButton(trafficBtn); - View subway = frame.findViewById(R.id.subway); - View isoLines = frame.findViewById(R.id.isolines); - mToggleMapLayerController = new MapLayerCompositeController(traffic, subway, isoLines, this); - mToggleMapLayerController.attachCore(); + if (!closeMapLayerMenu()) + showMapLayerMenu(); + } + + private boolean closeMapLayerMenu() + { + if (!mLayersBottomSheet.isAdded()) + return false; + mLayersBottomSheet.dismiss(); + return true; + } + + private void showMapLayerMenu() + { + mLayersBottomSheet.show(getSupportFragmentManager(), "layersBottomSheet"); + } + + private boolean closeMainMenu() + { + if (!mMainMenuBottomSheet.isAdded()) + return false; + mMainMenuBottomSheet.dismiss(); + return true; + } + + private void showMainMenu() + { + mMainMenuBottomSheet = new MenuBottomSheetFragment(mToggleMapLayerFragment, getMainMenuItems()); + mMainMenuBottomSheet.show(getSupportFragmentManager(), "mainMenuBottomSheet"); } /** @@ -619,8 +651,6 @@ public class MwmActivity extends BaseMwmFragmentActivity if (removeCurrentFragment(true)) { - InputUtils.hideKeyboard(mFadeView); - mFadeView.fadeOut(); return true; } @@ -633,37 +663,7 @@ public class MwmActivity extends BaseMwmFragmentActivity return; closePlacePage(); - if (removeCurrentFragment(true)) - { - InputUtils.hideKeyboard(mFadeView); - mFadeView.fadeOut(); - } - } - - /** - * @return False if the menu was already closed, true otherwise - */ - public boolean closeMenu() - { - if (!getMainMenuController().isClosed()) - { - mFadeView.fadeOut(); - getMainMenuController().close(); - return true; - } - return false; - } - - /** - * Tries to close the main menu then runs the given runnable - * - * @param procAfterClose The runnable to run after closing the menu - */ - public void closeMenu(@Nullable Runnable procAfterClose) - { - closeMenu(); - if (procAfterClose != null) - procAfterClose.run(); + removeCurrentFragment(true); } /** @@ -712,9 +712,10 @@ public class MwmActivity extends BaseMwmFragmentActivity closeFloatingToolbars(clearSearchText, true); } - private void closeFloatingPanels() + public void closeFloatingPanels() { - closeMenu(); + closeMainMenu(); + closeMapLayerMenu(); closePlacePage(); } @@ -726,24 +727,15 @@ public class MwmActivity extends BaseMwmFragmentActivity public void startLocationToPoint(final @Nullable MapObject endPoint) { - closeMenu(() -> { - if (!PermissionsUtils.isFineLocationGranted(MwmActivity.this)) - PermissionsUtils.requestLocationPermission(MwmActivity.this, REQ_CODE_LOCATION_PERMISSION); + closeFloatingPanels(); + if (!PermissionsUtils.isFineLocationGranted(MwmActivity.this)) + PermissionsUtils.requestLocationPermission(MwmActivity.this, REQ_CODE_LOCATION_PERMISSION); - MapObject startPoint = LocationHelper.INSTANCE.getMyPosition(); - RoutingController.get().prepare(startPoint, endPoint); + MapObject startPoint = LocationHelper.INSTANCE.getMyPosition(); + RoutingController.get().prepare(startPoint, endPoint); - // TODO: check for tablet. - closePlacePage(); - }); - } - - public void refreshFade() - { - if (getCurrentMenu().isOpen() || !mMainMenuController.isClosed()) - mFadeView.fadeIn(); - else - mFadeView.fadeOut(); + // TODO: check for tablet. + closePlacePage(); } private void initMainMenu() @@ -883,24 +875,6 @@ public class MwmActivity extends BaseMwmFragmentActivity myPositionClick(); } - @Override - public void onSubwayLayerSelected() - { - toggleLayer(Mode.SUBWAY); - } - - @Override - public void onTrafficLayerSelected() - { - toggleLayer(Mode.TRAFFIC); - } - - @Override - public void onIsolinesLayerSelected() - { - toggleLayer(Mode.ISOLINES); - } - private void onIsolinesStateChanged(@NonNull IsolinesState type) { if (type != IsolinesState.EXPIREDDATA) @@ -997,7 +971,6 @@ public class MwmActivity extends BaseMwmFragmentActivity if (mNavAnimationController != null) mNavAnimationController.onResume(); mPlacePageController.onActivityResumed(this); - refreshFade(); } @Override @@ -1066,20 +1039,13 @@ public class MwmActivity extends BaseMwmFragmentActivity mToggleMapLayerController.detachCore(); TrafficManager.INSTANCE.detachAll(); mPlacePageController.destroy(); - getMainMenuController().destroy(); } @Override public void onBackPressed() { - if (getCurrentMenu().close(true)) - { - mFadeView.fadeOut(); - return; - } - RoutingController routingController = RoutingController.get(); - if (!closeMenu() && !closePlacePage() && !closeSearchToolbar(true, true) && + if (!closeMainMenu() && !closeMapLayerMenu() && !closePlacePage() && !closeSearchToolbar(true, true) && !closeSidePanel() && !closePositionChooser() && !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel()) { @@ -1173,9 +1139,6 @@ public class MwmActivity extends BaseMwmFragmentActivity setFullscreen(false); mPlacePageController.openFor(data); - - if (UiUtils.isVisible(mFadeView)) - mFadeView.fadeOut(); } // Called from JNI. @@ -1613,7 +1576,6 @@ public class MwmActivity extends BaseMwmFragmentActivity // TODO: // mPlacePage.refreshViews(); mNavigationController.show(show); - refreshFade(); if (mOnmapDownloader != null) mOnmapDownloader.updateState(false); } @@ -1883,7 +1845,8 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void onRoutingStart() { - closeMenu(() -> RoutingController.get().start()); + closeFloatingPanels(); + RoutingController.get().start(); } @Override @@ -1981,12 +1944,6 @@ public class MwmActivity extends BaseMwmFragmentActivity mToggleMapLayerController.toggleMode(mode); } - @NonNull - private MenuController getMainMenuController() - { - return mMainMenuController; - } - public void showTrackOnMap(long trackId) { Track track = BookmarkManager.INSTANCE.getTrack(trackId); @@ -2067,11 +2024,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { getActivity().closePlacePage(); getActivity().closeSidePanel(); - MenuController controller = getActivity().getMainMenuController(); - if (controller.isClosed()) - controller.open(); - else - controller.close(); + getActivity().showMainMenu(); } } @@ -2086,7 +2039,8 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onMenuItemClickInternal() { RoutingController.get().cancel(); - getActivity().closeMenu(() -> getActivity().showSearch(getActivity().mSearchController.getQuery())); + getActivity().closeFloatingPanels(); + getActivity().showSearch(getActivity().mSearchController.getQuery()); } } @@ -2100,7 +2054,8 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override void onMenuItemClickInternal() { - getActivity().closeMenu(getActivity()::showBookmarks); + getActivity().closeFloatingPanels(); + getActivity().showBookmarks(); } } @@ -2133,73 +2088,41 @@ public class MwmActivity extends BaseMwmFragmentActivity } } - private class MainMenuStateObserver implements MenuStateObserver + public void onAddPlaceOptionSelected() { - - @Override - public void onMenuOpen() - { - mFadeView.fadeIn(); - } - - @Override - public void onMenuClosed() - { - mFadeView.fadeOut(); - getCurrentMenu().updateMarker(); - } + closeFloatingPanels(); + showPositionChooser(false, false); } - private class MainMenuOptionSelectedListener implements MainMenuOptionListener + public void onDownloadMapsOptionSelected() { - @Override - public void onAddPlaceOptionSelected() - { - closeMenu(() -> showPositionChooser(false, false)); - } + RoutingController.get().cancel(); + closeFloatingPanels(); + showDownloader(false); + } - @Override - public void onDownloadMapsOptionSelected() - { - RoutingController.get().cancel(); - closeMenu(() -> showDownloader(false)); - } + public void onSettingsOptionSelected() + { + Intent intent = new Intent(getActivity(), SettingsActivity.class); + closeFloatingPanels(); + getActivity().startActivity(intent); + } - @Override - public void onSettingsOptionSelected() - { - Intent intent = new Intent(getActivity(), SettingsActivity.class); - closeMenu(() -> getActivity().startActivity(intent)); - } + public void onShareLocationOptionSelected() + { + closeFloatingPanels(); + shareMyLocation(); + } - @Override - public void onShareLocationOptionSelected() - { - closeMenu(MwmActivity.this::shareMyLocation); - } + public void onSubwayLayerOptionSelected() + { + closeFloatingPanels(); + toggleLayer(Mode.SUBWAY); + } - @Override - public void onReportOptionSelected() - { - closeMenu(() -> Utils.sendFeedback(getActivity())); - } - - @Override - public void onSubwayLayerOptionSelected() - { - toggleLayer(Mode.SUBWAY); - } - - @Override - public void onTrafficLayerOptionSelected() - { - toggleLayer(Mode.TRAFFIC); - } - - @Override - public void onIsolinesLayerOptionSelected() - { - toggleLayer(Mode.ISOLINES); - } + public void onIsolinesLayerOptionSelected() + { + closeFloatingPanels(); + toggleLayer(Mode.ISOLINES); } } diff --git a/android/src/com/mapswithme/maps/maplayer/MapLayerCompositeController.java b/android/src/com/mapswithme/maps/maplayer/MapLayerCompositeController.java index 6ad69150fb..b96020ce77 100644 --- a/android/src/com/mapswithme/maps/maplayer/MapLayerCompositeController.java +++ b/android/src/com/mapswithme/maps/maplayer/MapLayerCompositeController.java @@ -1,15 +1,13 @@ package com.mapswithme.maps.maplayer; -import android.app.Activity; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import com.mapswithme.maps.maplayer.subway.DefaultMapLayerController; -import com.mapswithme.maps.maplayer.traffic.widget.TrafficButton; -import com.mapswithme.maps.maplayer.traffic.widget.TrafficButtonController; import com.mapswithme.util.InputUtils; +import com.mapswithme.util.UiUtils; import java.util.ArrayList; import java.util.List; @@ -19,49 +17,25 @@ public class MapLayerCompositeController implements MapLayerController @NonNull private final AppCompatActivity mActivity; @NonNull - private final List mLayers; + private final List mLayers; @NonNull - private ControllerAndMode mCurrentLayer; + private Mode mCurrentLayer; @NonNull - private final OpenBottomDialogClickListener mOpenBottomDialogClickListener; + private final View mLayersButton; + @NonNull + OnShowMenuListener mOnshowMenuListener; - public MapLayerCompositeController(@NonNull TrafficButton traffic, @NonNull View subway, - @NonNull View isoLines, @NonNull AppCompatActivity activity) + public MapLayerCompositeController(@NonNull View layersButton, @NonNull OnShowMenuListener onshowMenuListener, @NonNull AppCompatActivity activity) { - mOpenBottomDialogClickListener = new OpenBottomDialogClickListener(activity); mActivity = activity; - mLayers = createLayers(traffic, subway, isoLines, activity, mOpenBottomDialogClickListener); + mLayersButton = layersButton; + mLayersButton.setOnClickListener(view -> onLayersButtonClick()); + mOnshowMenuListener = onshowMenuListener; + mLayers = new ArrayList<>(); + mLayers.add(Mode.SUBWAY); + mLayers.add(Mode.ISOLINES); mCurrentLayer = getCurrentLayer(); - toggleMode(mCurrentLayer.getMode()); - } - - @NonNull - private static List createLayers(@NonNull TrafficButton traffic, - @NonNull View subway, - @NonNull View isoLinesView, - @NonNull AppCompatActivity activity, - @NonNull View.OnClickListener dialogClickListener) - { - traffic.setOnclickListener(dialogClickListener); - TrafficButtonController trafficButtonController = new TrafficButtonController(traffic, - activity); - - subway.setOnClickListener(dialogClickListener); - DefaultMapLayerController subwayMapLayerController = new DefaultMapLayerController(subway); - - isoLinesView.setOnClickListener(dialogClickListener); - DefaultMapLayerController isoLinesController = new DefaultMapLayerController(isoLinesView); - - ControllerAndMode subwayEntry = new ControllerAndMode(Mode.SUBWAY, subwayMapLayerController); - ControllerAndMode trafficEntry = new ControllerAndMode(Mode.TRAFFIC, trafficButtonController); - ControllerAndMode isoLineEntry = new ControllerAndMode(Mode.ISOLINES, isoLinesController); - - List entries = new ArrayList<>(); - entries.add(subwayEntry); - entries.add(isoLineEntry); - entries.add(trafficEntry); - - return entries; + toggleMode(mCurrentLayer); } public void toggleMode(@NonNull Mode mode) @@ -88,209 +62,129 @@ public class MapLayerCompositeController implements MapLayerController private void turnInitialMode() { - mCurrentLayer.getController().hideImmediately(); + UiUtils.hide(mLayersButton); mCurrentLayer = mLayers.iterator().next(); - mCurrentLayer.getController().showImmediately(); + UiUtils.show(mLayersButton); } public void applyLastActiveMode() { - toggleMode(mCurrentLayer.getMode(), true); + toggleMode(mCurrentLayer, true); } @Override public void attachCore() { - for (ControllerAndMode each : mLayers) - { - each.getController().attachCore(); - } + // Do nothing } @Override public void detachCore() { - for (ControllerAndMode each : mLayers) - { - each.getController().detachCore(); - } + // Do nothing } private void setMasterController(@NonNull Mode mode) { - for (ControllerAndMode each : mLayers) + for (Mode each : mLayers) { - if (each.getMode() == mode) + if (each == mode) { mCurrentLayer = each; } else { - each.getController().hideImmediately(); - each.getMode().setEnabled(mActivity, false); + UiUtils.hide(mLayersButton); + each.setEnabled(mActivity, false); } } } private void showMasterController(boolean animate) { - if (animate) - mCurrentLayer.getController().show(); - else - mCurrentLayer.getController().showImmediately(); + UiUtils.show(mLayersButton); } @NonNull - private ControllerAndMode getCurrentLayer() + private Mode getCurrentLayer() { - for (ControllerAndMode each : mLayers) + for (Mode each : mLayers) { - if (each.getMode().isEnabled(mActivity)) + if (each.isEnabled(mActivity)) return each; } - return mLayers.iterator().next(); } @Override public void turnOn() { - mCurrentLayer.getController().turnOn(); - mCurrentLayer.getMode().setEnabled(mActivity, true); + mLayersButton.setSelected(true); + mCurrentLayer.setEnabled(mActivity, true); } @Override public void turnOff() { - mCurrentLayer.getController().turnOff(); - mCurrentLayer.getMode().setEnabled(mActivity, false); + mLayersButton.setSelected(false); + mCurrentLayer.setEnabled(mActivity, false); } @Override public void show() { - mCurrentLayer.getController().show(); + UiUtils.show(mLayersButton); } @Override public void showImmediately() { - mCurrentLayer.getController().showImmediately(); + UiUtils.show(mLayersButton); } @Override public void hide() { - mCurrentLayer.getController().hide(); + UiUtils.hide(mLayersButton); } @Override public void hideImmediately() { - mCurrentLayer.getController().hideImmediately(); + UiUtils.hide(mLayersButton); } @Override public void adjust(int offsetX, int offsetY) { - for(ControllerAndMode controllerAndMode: mLayers) - controllerAndMode.getController().adjust(offsetX, offsetY); - } - - private void showDialog() - { - ToggleMapLayerDialog.show(mActivity); - } - - @NonNull - private ControllerAndMode findModeMapLayerController(@NonNull Mode mode) - { - for (ControllerAndMode each : mLayers) - { - if (each.getMode() == mode) - return each; - } - - throw new IllegalArgumentException("Mode not found : " + mode); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mLayersButton.getLayoutParams(); + params.setMargins(offsetX, offsetY, 0, 0); + mLayersButton.setLayoutParams(params); } public void turnOnView(@NonNull Mode mode) { setMasterController(mode); - mCurrentLayer.getController().showImmediately(); - mCurrentLayer.getController().turnOn(); + UiUtils.show(mLayersButton); + mLayersButton.setSelected(true); } - public void turnOffCurrentView() + private void onLayersButtonClick() { - mCurrentLayer.getController().turnOff(); - } - - private static class ControllerAndMode - { - @NonNull - private final Mode mMode; - @NonNull - private final MapLayerController mController; - - ControllerAndMode(@NonNull Mode mode, @NonNull MapLayerController controller) + if (mCurrentLayer.isEnabled(mActivity)) { - mMode = mode; - mController = controller; - } - - @Override - public boolean equals(Object o) + Mode mode = getCurrentLayer(); + turnOff(); + toggleMode(mode); + } else { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ControllerAndMode that = (ControllerAndMode) o; - return mMode == that.getMode(); - } - - @Override - public int hashCode() - { - return mMode.hashCode(); - } - - @NonNull - MapLayerController getController() - { - return mController; - } - - @NonNull - Mode getMode() - { - return mMode; + InputUtils.hideKeyboard(mActivity.getWindow().getDecorView()); + mOnshowMenuListener.onShow(); } } - private class OpenBottomDialogClickListener implements View.OnClickListener + public interface OnShowMenuListener { - @NonNull - private final Activity mActivity; - - OpenBottomDialogClickListener(@NonNull Activity activity) - { - mActivity = activity; - } - - @Override - public final void onClick(View v) - { - if (mCurrentLayer.getMode().isEnabled(mActivity)) - { - Mode mode = getCurrentLayer().getMode(); - turnOff(); - toggleMode(mode); - } - else - { - InputUtils.hideKeyboard(mActivity.getWindow().getDecorView()); - showDialog(); - } - } + void onShow(); } } diff --git a/android/src/com/mapswithme/maps/maplayer/OnIsolinesLayerToggleListener.java b/android/src/com/mapswithme/maps/maplayer/OnIsolinesLayerToggleListener.java deleted file mode 100644 index 9fdbc86940..0000000000 --- a/android/src/com/mapswithme/maps/maplayer/OnIsolinesLayerToggleListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.mapswithme.maps.maplayer; - -public interface OnIsolinesLayerToggleListener -{ - void onIsolinesLayerSelected(); -} diff --git a/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerDialog.java b/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerDialog.java deleted file mode 100644 index 8c4a5c202b..0000000000 --- a/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerDialog.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.mapswithme.maps.maplayer; - -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.mapswithme.maps.R; -import com.mapswithme.maps.maplayer.subway.OnSubwayLayerToggleListener; -import com.mapswithme.maps.maplayer.traffic.OnTrafficLayerToggleListener; -import com.mapswithme.maps.widget.recycler.SpanningLinearLayoutManager; - -import java.util.Objects; - -public class ToggleMapLayerDialog extends DialogFragment -{ - @NonNull - @SuppressWarnings("NullableProblems") - private LayersAdapter mAdapter; - - @SuppressWarnings("NullableProblems") - @NonNull - private View mRoot; - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) - { - BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); - LayoutInflater inflater = requireActivity().getLayoutInflater(); - mRoot = inflater.inflate(R.layout.fragment_toggle_map_layer, null, false); - dialog.setOnShowListener(this::onShow); - dialog.setContentView(mRoot); - initChildren(mRoot); - return dialog; - } - - private void onShow(@NonNull DialogInterface dialogInterface) - { - BottomSheetDialog dialog = (BottomSheetDialog) dialogInterface; - View bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet); - BottomSheetBehavior behavior = BottomSheetBehavior.from(Objects.requireNonNull(bottomSheet)); - behavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } - - private void initChildren(@NonNull View root) - { - initCloseBtn(root); - initRecycler(root); - } - - private void initCloseBtn(@NonNull View root) - { - View closeBtn = root.findViewById(R.id.сlose_btn); - closeBtn.setOnClickListener(v -> dismiss()); - } - - private void initRecycler(@NonNull View root) - { - RecyclerView recycler = root.findViewById(R.id.recycler); - RecyclerView.LayoutManager layoutManager = new SpanningLinearLayoutManager(requireContext(), - LinearLayoutManager.HORIZONTAL, - false); - recycler.setLayoutManager(layoutManager); - mAdapter = new LayersAdapter(); - mAdapter.setLayerModes(LayersUtils.createItems(requireContext(), - new SubwayItemClickListener(), - new TrafficItemClickListener(), - new IsolinesItemClickListener())); - recycler.setAdapter(mAdapter); - } - - public static void show(@NonNull AppCompatActivity activity) - { - ToggleMapLayerDialog frag = new ToggleMapLayerDialog(); - String tag = frag.getClass().getCanonicalName(); - FragmentManager fm = activity.getSupportFragmentManager(); - - Fragment oldInstance = fm.findFragmentByTag(tag); - if (oldInstance != null) - return; - - fm.beginTransaction().add(frag, tag).commitAllowingStateLoss(); - fm.executePendingTransactions(); - } - - @NonNull - public View getRootView() - { - return mRoot; - } - - @Nullable - public static ToggleMapLayerDialog getInstance(@NonNull AppCompatActivity activity) { - String tag = ToggleMapLayerDialog.class.getCanonicalName(); - return (ToggleMapLayerDialog) activity.getSupportFragmentManager().findFragmentByTag(tag); - } - - private class SubwayItemClickListener extends DefaultClickListener - { - private SubwayItemClickListener() - { - super(mAdapter); - } - - @Override - public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) - { - OnSubwayLayerToggleListener listener = (OnSubwayLayerToggleListener) requireActivity(); - listener.onSubwayLayerSelected(); - } - } - - private class TrafficItemClickListener extends DefaultClickListener - { - private TrafficItemClickListener() - { - super(mAdapter); - } - - @Override - public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) - { - OnTrafficLayerToggleListener listener = (OnTrafficLayerToggleListener) requireActivity(); - listener.onTrafficLayerSelected(); - } - } - - private class IsolinesItemClickListener extends AbstractIsoLinesClickListener - { - private IsolinesItemClickListener() - { - super(mAdapter); - } - - @Override - public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) - { - super.onItemClickInternal(v,item); - OnIsolinesLayerToggleListener listener = (OnIsolinesLayerToggleListener) requireActivity(); - listener.onIsolinesLayerSelected(); - } - } -} diff --git a/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java b/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java new file mode 100644 index 0000000000..4819a3ba4a --- /dev/null +++ b/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java @@ -0,0 +1,102 @@ +package com.mapswithme.maps.maplayer; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.mapswithme.maps.R; +import com.mapswithme.maps.widget.recycler.SpanningLinearLayoutManager; + +public class ToggleMapLayerFragment extends Fragment +{ + @NonNull + private final LayerItemClickListener mIsolinesListener; + @NonNull + private final LayerItemClickListener mSubwayListener; + @NonNull + private LayersAdapter mAdapter; + + public ToggleMapLayerFragment(@NonNull LayerItemClickListener isolinesListener, @NonNull LayerItemClickListener subwayListener) + { + this.mIsolinesListener = isolinesListener; + this.mSubwayListener = subwayListener; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) + { + View mRoot = inflater.inflate(R.layout.fragment_toggle_map_layer, container, false); + initRecycler(mRoot); + return mRoot; + } + + private void initRecycler(@NonNull View root) + { + RecyclerView recycler = root.findViewById(R.id.recycler); + RecyclerView.LayoutManager layoutManager = new SpanningLinearLayoutManager(requireContext(), + LinearLayoutManager.HORIZONTAL, + false); + recycler.setLayoutManager(layoutManager); + mAdapter = new LayersAdapter(); + mAdapter.setLayerModes(LayersUtils.createItems(requireContext(), + new SubwayItemClickListener(), + new TrafficItemClickListener(), + new IsolinesItemClickListener())); + recycler.setAdapter(mAdapter); + recycler.setNestedScrollingEnabled(false); + } + + public interface LayerItemClickListener + { + void onClick(); + } + + private class SubwayItemClickListener extends DefaultClickListener + { + private SubwayItemClickListener() + { + super(mAdapter); + } + + @Override + public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) + { + mSubwayListener.onClick(); + } + } + + private class TrafficItemClickListener extends DefaultClickListener + { + private TrafficItemClickListener() + { + super(mAdapter); + } + + @Override + public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) + {} + } + + private class IsolinesItemClickListener extends AbstractIsoLinesClickListener + { + private IsolinesItemClickListener() + { + super(mAdapter); + } + + @Override + public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) + { + super.onItemClickInternal(v, item); + mIsolinesListener.onClick(); + } + } +} diff --git a/android/src/com/mapswithme/maps/maplayer/subway/DefaultMapLayerController.java b/android/src/com/mapswithme/maps/maplayer/subway/DefaultMapLayerController.java deleted file mode 100644 index 1d8d96c4c6..0000000000 --- a/android/src/com/mapswithme/maps/maplayer/subway/DefaultMapLayerController.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.mapswithme.maps.maplayer.subway; - -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; - -import com.mapswithme.maps.maplayer.MapLayerController; -import com.mapswithme.util.UiUtils; - -public class DefaultMapLayerController implements MapLayerController -{ - @NonNull - private final View mLayerView; - - public DefaultMapLayerController(@NonNull View subwayBtn) - { - mLayerView = subwayBtn; - UiUtils.addStatusBarOffset(mLayerView); - } - - @Override - public void turnOn() - { - mLayerView.setSelected(true); - } - - @Override - public void turnOff() - { - mLayerView.setSelected(false); - } - - @Override - public void show() - { - UiUtils.show(mLayerView); - } - - @Override - public void showImmediately() - { - UiUtils.show(mLayerView); - } - - @Override - public void hide() - { - UiUtils.hide(mLayerView); - } - - @Override - public void hideImmediately() - { - UiUtils.hide(mLayerView); - } - - @Override - public void adjust(int offsetX, int offsetY) - { - ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mLayerView.getLayoutParams(); - params.setMargins(offsetX, offsetY, 0, 0); - mLayerView.setLayoutParams(params); - } - - @Override - public void attachCore() - { - /* Do nothing by default */ - } - - @Override - public void detachCore() - { - /* Do nothing by default */ - } -} diff --git a/android/src/com/mapswithme/maps/maplayer/subway/OnSubwayLayerToggleListener.java b/android/src/com/mapswithme/maps/maplayer/subway/OnSubwayLayerToggleListener.java deleted file mode 100644 index 0046ace6a9..0000000000 --- a/android/src/com/mapswithme/maps/maplayer/subway/OnSubwayLayerToggleListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.mapswithme.maps.maplayer.subway; - -public interface OnSubwayLayerToggleListener -{ - void onSubwayLayerSelected(); -} diff --git a/android/src/com/mapswithme/maps/maplayer/traffic/OnTrafficLayerToggleListener.java b/android/src/com/mapswithme/maps/maplayer/traffic/OnTrafficLayerToggleListener.java deleted file mode 100644 index ab9f710719..0000000000 --- a/android/src/com/mapswithme/maps/maplayer/traffic/OnTrafficLayerToggleListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.mapswithme.maps.maplayer.traffic; - -public interface OnTrafficLayerToggleListener -{ - void onTrafficLayerSelected(); -} diff --git a/android/src/com/mapswithme/maps/routing/NavigationController.java b/android/src/com/mapswithme/maps/routing/NavigationController.java index 049f9f5fea..a4e1abc08e 100644 --- a/android/src/com/mapswithme/maps/routing/NavigationController.java +++ b/android/src/com/mapswithme/maps/routing/NavigationController.java @@ -179,7 +179,8 @@ public class NavigationController implements Application.ActivityLifecycleCallba stop(parent); break; case SETTINGS: - parent.closeMenu(() -> parent.startActivity(new Intent(parent, SettingsActivity.class))); + parent.closeFloatingPanels(); + parent.startActivity(new Intent(parent, SettingsActivity.class)); break; case TTS_VOLUME: TtsPlayer.setEnabled(!TtsPlayer.isEnabled()); @@ -192,13 +193,11 @@ public class NavigationController implements Application.ActivityLifecycleCallba // break; case TOGGLE: mNavMenu.toggle(true); - parent.refreshFade(); } } public void stop(MwmActivity parent) { - parent.refreshFade(); mSearchWheel.reset(); if (mBound) diff --git a/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuController.java b/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuController.java deleted file mode 100644 index 6eb2f4336f..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuController.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import android.annotation.SuppressLint; -import android.view.View; - -import androidx.annotation.IdRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.view.GestureDetectorCompat; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.mapswithme.util.log.Logger; -import com.mapswithme.util.log.LoggerFactory; - -import java.util.Objects; - -public class BottomSheetMenuController implements MenuController -{ - private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC); - private static final String TAG = BottomSheetMenuController.class.getSimpleName(); - @SuppressWarnings("NullableProblems") - @NonNull - private BottomSheetBehavior mSheetBehavior; - @IdRes - private final int mSheetResId; - @NonNull - private final MenuRenderer mMenuRenderer; - @Nullable - private final MenuStateObserver mStateObserver; - private final BottomSheetBehavior.BottomSheetCallback mSheetCallback - = new BottomSheetBehavior.BottomSheetCallback() - { - @Override - public void onStateChanged(@NonNull View view, int state) - { - LOGGER.d(TAG, "State change, new = " + BottomSheetMenuUtils.toString(state)); - if (BottomSheetMenuUtils.isSettlingState(state) || BottomSheetMenuUtils.isDraggingState(state)) - return; - - if (BottomSheetMenuUtils.isHiddenState(state)) - { - mMenuRenderer.onHide(); - if (mStateObserver != null) - mStateObserver.onMenuClosed(); - return; - } - - if (mStateObserver != null) - mStateObserver.onMenuOpen(); - } - - @Override - public void onSlide(@NonNull View view, float v) - { - // Do nothing by default. - } - }; - - BottomSheetMenuController(int sheetResId, @NonNull MenuRenderer menuRenderer, - @Nullable MenuStateObserver stateObserver) - { - mSheetResId = sheetResId; - mMenuRenderer = menuRenderer; - mStateObserver = stateObserver; - } - - @Override - public void open() - { - mMenuRenderer.render(); - mSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } - - @Override - public void close() - { - mSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - } - - @Override - public boolean isClosed() - { - int state = mSheetBehavior.getState(); - return BottomSheetMenuUtils.isHiddenState(state) - || (mSheetBehavior.getSkipCollapsed() && BottomSheetMenuUtils.isCollapsedState(state)); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initialize(@Nullable View view) - { - Objects.requireNonNull(view); - View sheet = view.findViewById(mSheetResId); - Objects.requireNonNull(sheet); - mSheetBehavior = BottomSheetBehavior.from(sheet); - mSheetBehavior.addBottomSheetCallback(mSheetCallback); - mSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - GestureDetectorCompat gestureDetector = new GestureDetectorCompat( - view.getContext(), new BottomSheetMenuGestureListener(mSheetBehavior)); - sheet.setOnTouchListener((v, event) -> gestureDetector.onTouchEvent(event)); - mMenuRenderer.initialize(sheet); - } - - @Override - public void destroy() - { - mSheetBehavior.removeBottomSheetCallback(mSheetCallback); - mMenuRenderer.destroy(); - } -} diff --git a/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuGestureListener.java b/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuGestureListener.java deleted file mode 100644 index 14700cea82..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuGestureListener.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; - -import androidx.annotation.NonNull; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; - -public class BottomSheetMenuGestureListener extends GestureDetector.SimpleOnGestureListener -{ - @NonNull - private final BottomSheetBehavior mBottomSheetBehavior; - - public BottomSheetMenuGestureListener(@NonNull BottomSheetBehavior bottomSheetBehavior) - { - mBottomSheetBehavior = bottomSheetBehavior; - } - - @Override - public boolean onSingleTapConfirmed(MotionEvent e) - { - @AnchorBottomSheetBehavior.State - int state = mBottomSheetBehavior.getState(); - if (!BottomSheetMenuUtils.isHiddenState(state) && !BottomSheetMenuUtils.isDraggingState(state) - && !BottomSheetMenuUtils.isSettlingState(state)) - { - mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - return true; - } - - return false; - } -} diff --git a/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuUtils.java b/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuUtils.java deleted file mode 100644 index fa916bef87..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/BottomSheetMenuUtils.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import androidx.annotation.NonNull; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; - -class BottomSheetMenuUtils -{ - static boolean isSettlingState(int state) - { - return state == BottomSheetBehavior.STATE_SETTLING; - } - - static boolean isDraggingState(int state) - { - return state == BottomSheetBehavior.STATE_DRAGGING; - } - - static boolean isCollapsedState(int state) - { - return state == BottomSheetBehavior.STATE_COLLAPSED; - } - - static boolean isExpandedState(int state) - { - return state == BottomSheetBehavior.STATE_EXPANDED; - } - - static boolean isHiddenState(int state) - { - return state == BottomSheetBehavior.STATE_HIDDEN; - } - - @NonNull - static String toString(int state) - { - switch (state) - { - case BottomSheetBehavior.STATE_EXPANDED: - return "EXPANDED"; - case BottomSheetBehavior.STATE_COLLAPSED: - return "COLLAPSED"; - case BottomSheetBehavior.STATE_DRAGGING: - return "DRAGGING"; - case BottomSheetBehavior.STATE_SETTLING: - return "SETTLING"; - case BottomSheetBehavior.STATE_HIDDEN: - return "HIDDEN"; - default: - throw new AssertionError("Unsupported state detected: " + state); - } - } -} diff --git a/android/src/com/mapswithme/maps/widget/menu/MainMenuOptionListener.java b/android/src/com/mapswithme/maps/widget/menu/MainMenuOptionListener.java deleted file mode 100644 index 1b10c06a84..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/MainMenuOptionListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -public interface MainMenuOptionListener -{ - void onAddPlaceOptionSelected(); - void onDownloadMapsOptionSelected(); - void onSettingsOptionSelected(); - void onShareLocationOptionSelected(); - void onReportOptionSelected(); - void onSubwayLayerOptionSelected(); - void onTrafficLayerOptionSelected(); - void onIsolinesLayerOptionSelected(); -} diff --git a/android/src/com/mapswithme/maps/widget/menu/MainMenuRenderer.java b/android/src/com/mapswithme/maps/widget/menu/MainMenuRenderer.java deleted file mode 100644 index 5e3ae70495..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/MainMenuRenderer.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.widget.NestedScrollView; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.mapswithme.maps.R; -import com.mapswithme.maps.base.NoConnectionListener; -import com.mapswithme.maps.downloader.MapManager; -import com.mapswithme.maps.downloader.UpdateInfo; -import com.mapswithme.maps.maplayer.AbstractIsoLinesClickListener; -import com.mapswithme.maps.maplayer.BottomSheetItem; -import com.mapswithme.maps.maplayer.DefaultClickListener; -import com.mapswithme.maps.maplayer.LayersAdapter; -import com.mapswithme.maps.maplayer.LayersUtils; -import com.mapswithme.maps.widget.recycler.SpanningLinearLayoutManager; -import com.mapswithme.util.Graphics; -import com.mapswithme.util.UiUtils; - -import java.util.Objects; - -public class MainMenuRenderer implements MenuRenderer -{ - @NonNull - private final MainMenuOptionListener mListener; - @NonNull - @SuppressWarnings("NullableProblems") - private LayersAdapter mLayersAdapter; - @SuppressWarnings("NullableProblems") - @NonNull - private TextView mDownloadMapsCounter; - @SuppressWarnings("NullableProblems") - @NonNull - private NestedScrollView mScrollView; - @NonNull - private final NoConnectionListener mNoConnectionListener; - - MainMenuRenderer(@NonNull MainMenuOptionListener listener, - @NonNull NoConnectionListener noConnectionListener) - { - mListener = listener; - mNoConnectionListener = noConnectionListener; - } - - @Override - public void render() - { - mLayersAdapter.notifyDataSetChanged(); - renderDownloadMapsCounter(); - } - - private void renderDownloadMapsCounter() - { - UpdateInfo info = MapManager.nativeGetUpdateInfo(null); - int count = info == null ? 0 : info.filesCount; - UiUtils.showIf(count > 0, mDownloadMapsCounter); - if (count > 0) - mDownloadMapsCounter.setText(String.valueOf(count)); - } - - @Override - public void initialize(@Nullable View view) - { - Objects.requireNonNull(view); - mScrollView = (NestedScrollView) view; - initLayersRecycler(view); - TextView addPlace = view.findViewById(R.id.add_place); - addPlace.setOnClickListener(v -> mListener.onAddPlaceOptionSelected()); - Graphics.tint(addPlace); - View downloadMapsContainer = view.findViewById(R.id.download_maps_container); - downloadMapsContainer.setOnClickListener(v -> mListener.onDownloadMapsOptionSelected()); - TextView downloadMaps = downloadMapsContainer.findViewById(R.id.download_maps); - Graphics.tint(downloadMaps); - mDownloadMapsCounter = downloadMapsContainer.findViewById(R.id.counter); - TextView settings = view.findViewById(R.id.settings); - settings.setOnClickListener(v -> mListener.onSettingsOptionSelected()); - Graphics.tint(settings); - TextView share = view.findViewById(R.id.share); - share.setOnClickListener(v -> mListener.onShareLocationOptionSelected()); - Graphics.tint(share); - } - - private void initLayersRecycler(@NonNull View view) - { - RecyclerView layersRecycler = view.findViewById(R.id.layers_recycler); - RecyclerView.LayoutManager layoutManager = new SpanningLinearLayoutManager(layersRecycler.getContext(), - LinearLayoutManager.HORIZONTAL, - false); - layersRecycler.setLayoutManager(layoutManager); - mLayersAdapter = new LayersAdapter(); - mLayersAdapter.setLayerModes(LayersUtils.createItems(layersRecycler.getContext(), - new SubwayItemClickListener(), - new TrafficItemClickListener(), - new IsolinesItemClickListener())); - layersRecycler.setAdapter(mLayersAdapter); - } - - @Override - public void destroy() - { - // Do nothing by default. - } - - @Override - public void onHide() - { - mScrollView.scrollTo(0, 0); - } - - private class SubwayItemClickListener extends DefaultClickListener - { - SubwayItemClickListener() - { - super(mLayersAdapter); - } - - @Override - public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) - { - mListener.onSubwayLayerOptionSelected(); - } - } - - private class TrafficItemClickListener extends DefaultClickListener - { - TrafficItemClickListener() - { - super(mLayersAdapter); - } - - @Override - public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) - { - mListener.onTrafficLayerOptionSelected(); - } - } - - private class IsolinesItemClickListener extends AbstractIsoLinesClickListener - { - IsolinesItemClickListener() - { - super(mLayersAdapter); - } - - @Override - public void onItemClickInternal(@NonNull View v, @NonNull BottomSheetItem item) - { - super.onItemClickInternal(v, item); - mListener.onIsolinesLayerOptionSelected(); - } - } -} diff --git a/android/src/com/mapswithme/maps/widget/menu/MenuController.java b/android/src/com/mapswithme/maps/widget/menu/MenuController.java deleted file mode 100644 index 7d4bd26768..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/MenuController.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import android.view.View; - -import com.mapswithme.maps.base.Initializable; - -public interface MenuController extends Initializable -{ - void open(); - void close(); - boolean isClosed(); -} diff --git a/android/src/com/mapswithme/maps/widget/menu/MenuControllerFactory.java b/android/src/com/mapswithme/maps/widget/menu/MenuControllerFactory.java deleted file mode 100644 index 5ce925572b..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/MenuControllerFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.mapswithme.maps.R; -import com.mapswithme.maps.base.NoConnectionListener; - -public class MenuControllerFactory -{ - @NonNull - public static MenuController createMainMenuController(@Nullable MenuStateObserver stateObserver, - @NonNull MainMenuOptionListener listener, - @NonNull NoConnectionListener noConnectionListener) - { - return new BottomSheetMenuController(R.id.main_menu_sheet, new MainMenuRenderer(listener, - noConnectionListener), - stateObserver); - } -} diff --git a/android/src/com/mapswithme/maps/widget/menu/MenuRenderer.java b/android/src/com/mapswithme/maps/widget/menu/MenuRenderer.java deleted file mode 100644 index 16f27f6488..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/MenuRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -import android.view.View; - -import com.mapswithme.maps.base.Hideable; -import com.mapswithme.maps.base.Initializable; - -public interface MenuRenderer extends Initializable, Hideable -{ - void render(); -} diff --git a/android/src/com/mapswithme/maps/widget/menu/MenuStateObserver.java b/android/src/com/mapswithme/maps/widget/menu/MenuStateObserver.java deleted file mode 100644 index 31a09c343c..0000000000 --- a/android/src/com/mapswithme/maps/widget/menu/MenuStateObserver.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.mapswithme.maps.widget.menu; - -public interface MenuStateObserver -{ - void onMenuOpen(); - void onMenuClosed(); -} diff --git a/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java b/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java index 63a36998c2..3c97dc83a0 100644 --- a/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java +++ b/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java @@ -8,6 +8,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -22,20 +23,38 @@ public class MenuBottomSheetFragment extends BottomSheetDialogFragment { @Nullable private final String title; + @Nullable + private final Fragment headerFragment; private final ArrayList menuBottomSheetItems; + public MenuBottomSheetFragment(@NonNull Fragment headerFragment, ArrayList menuBottomSheetItems) + { + this.title = null; + this.headerFragment = headerFragment; + this.menuBottomSheetItems = menuBottomSheetItems; + } + public MenuBottomSheetFragment(@NonNull String title, ArrayList menuBottomSheetItems) { this.title = title; + this.headerFragment = null; this.menuBottomSheetItems = menuBottomSheetItems; } public MenuBottomSheetFragment(ArrayList menuBottomSheetItems) { this.title = null; + this.headerFragment = null; this.menuBottomSheetItems = menuBottomSheetItems; } + public MenuBottomSheetFragment(@NonNull Fragment headerFragment) + { + this.title = null; + this.headerFragment = headerFragment; + this.menuBottomSheetItems = new ArrayList<>(); + } + @Override public int getTheme() { @@ -84,5 +103,7 @@ public class MenuBottomSheetFragment extends BottomSheetDialogFragment MenuAdapter menuAdapter = new MenuAdapter(menuBottomSheetItems, this::dismiss); recyclerView.setAdapter(menuAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity())); + if (headerFragment != null) + getChildFragmentManager().beginTransaction().add(R.id.bottom_sheet_menu_header, headerFragment).commit(); } }