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();
}
}