diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index b08269d364..ac32f39a87 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -103,6 +103,8 @@ import java.util.ArrayList; import java.util.Objects; import java.util.Stack; +import static com.mapswithme.maps.widget.placepage.PlacePageButtons.PLACEPAGE_MORE_MENU_ID; + public class MwmActivity extends BaseMwmFragmentActivity implements PlacePageActivationListener, View.OnTouchListener, @@ -117,7 +119,9 @@ public class MwmActivity extends BaseMwmFragmentActivity PlacePageController.SlideListener, AlertDialogCallback, RoutingModeListener, AppBackgroundTracker.OnTransitionListener, - NoConnectionListener + NoConnectionListener, + MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader, + ToggleMapLayerFragment.LayerItemClickListener { public static final String EXTRA_TASK = "map_task"; public static final String EXTRA_LAUNCH_BY_DEEP_LINK = "launch_by_deep_link"; @@ -141,6 +145,9 @@ public class MwmActivity extends BaseMwmFragmentActivity public static final String ERROR_DRIVING_OPTIONS_DIALOG_TAG = "error_driving_options_dialog_tag"; private static final String ISOLINES_ERROR_DIALOG_TAG = "isolines_dialog_tag"; + private static final String MAIN_MENU_ID = "MAIN_MENU_BOTTOM_SHEET"; + private static final String LAYERS_MENU_ID = "LAYERS_MENU_BOTTOM_SHEET"; + // Map tasks that we run AFTER rendering initialized private final Stack mTasks = new Stack<>(); @@ -167,11 +174,6 @@ public class MwmActivity extends BaseMwmFragmentActivity @Nullable private OnmapDownloader mOnmapDownloader; - @NonNull - private MenuBottomSheetFragment mLayersBottomSheet; - @NonNull - private MenuBottomSheetFragment mMainMenuBottomSheet; - @Nullable private MapButtonsController mMapButtonsController; @@ -407,8 +409,6 @@ public class MwmActivity extends BaseMwmFragmentActivity .getViewTreeObserver() .addOnGlobalLayoutListener(new ToolbarLayoutChangeListener()); - initBottomSheets(); - boolean isLaunchByDeepLink = getIntent().getBooleanExtra(EXTRA_LAUNCH_BY_DEEP_LINK, false); initViews(isLaunchByDeepLink); @@ -457,37 +457,12 @@ public class MwmActivity extends BaseMwmFragmentActivity return windowInsets; } - private void initBottomSheets() - { - ToggleMapLayerFragment toggleMapLayerFragment = new ToggleMapLayerFragment(this::onLayerItemClicked); - mLayersBottomSheet = new MenuBottomSheetFragment(toggleMapLayerFragment); - mMainMenuBottomSheet = new MenuBottomSheetFragment(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 - )); - mDonatesUrl = Config.getDonateUrl(); - if (!TextUtils.isEmpty(mDonatesUrl)) - items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected)); - 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() { @@ -702,7 +677,7 @@ public class MwmActivity extends BaseMwmFragmentActivity break; case menu: closeFloatingPanels(); - showMainMenuBottomSheet(); + showBottomSheet(MAIN_MENU_ID); break; case help: showHelp(); @@ -711,37 +686,25 @@ public class MwmActivity extends BaseMwmFragmentActivity } + private boolean closeBottomSheet(String id) + { + MenuBottomSheetFragment bottomSheet = + (MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id); + if (bottomSheet == null || !bottomSheet.isAdded()) + return false; + bottomSheet.dismiss(); + return true; + } + + private void showBottomSheet(String id) + { + MenuBottomSheetFragment.newInstance(id).show(getSupportFragmentManager(), id); + } + private void toggleMapLayerBottomSheet() { - if (!closeMapLayerBottomSheet()) - showMapLayerBottomSheet(); - } - - private boolean closeMapLayerBottomSheet() - { - if (!mLayersBottomSheet.isAdded()) - return false; - mLayersBottomSheet.dismiss(); - return true; - } - - private void showMapLayerBottomSheet() - { - mLayersBottomSheet.show(getSupportFragmentManager(), "layersBottomSheet"); - } - - private boolean closeMainMenuBottomSheet() - { - if (!mMainMenuBottomSheet.isAdded()) - return false; - mMainMenuBottomSheet.dismiss(); - return true; - } - - private void showMainMenuBottomSheet() - { - mMainMenuBottomSheet = new MenuBottomSheetFragment(getMainMenuItems()); - mMainMenuBottomSheet.show(getSupportFragmentManager(), "mainMenuBottomSheet"); + if (!closeBottomSheet(LAYERS_MENU_ID)) + showBottomSheet(LAYERS_MENU_ID); } /** @@ -835,8 +798,8 @@ public class MwmActivity extends BaseMwmFragmentActivity public void closeFloatingPanels() { - closeMainMenuBottomSheet(); - closeMapLayerBottomSheet(); + closeBottomSheet(LAYERS_MENU_ID); + closeBottomSheet(MAIN_MENU_ID); closePlacePage(); } @@ -1155,7 +1118,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onBackPressed() { RoutingController routingController = RoutingController.get(); - if (!closeMainMenuBottomSheet() && !closeMapLayerBottomSheet() && !collapseNavMenu() && + if (!closeBottomSheet(MAIN_MENU_ID) && !closeBottomSheet(LAYERS_MENU_ID) && !collapseNavMenu() && !closePlacePage() &&!closeSearchToolbar(true, true) && !closeSidePanel() && !closePositionChooser() && !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel()) @@ -1970,9 +1933,46 @@ public class MwmActivity extends BaseMwmFragmentActivity shareMyLocation(); } - public void onLayerItemClicked(@NonNull Mode mode) + @Override + public void onLayerItemClick(@NonNull Mode mode) { closeFloatingPanels(); - mMapButtonsController.toggleMapLayer(mode); + if (mMapButtonsController != null) + mMapButtonsController.toggleMapLayer(mode); + } + + @Override + @Nullable + public ArrayList getMenuBottomSheetItems(String id) + { + if (id.equals(MAIN_MENU_ID)) + { + 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 + )); + mDonatesUrl = Config.getDonateUrl(); + if (!TextUtils.isEmpty(mDonatesUrl)) + items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected)); + 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; + } + else if (id.equals(PLACEPAGE_MORE_MENU_ID)) + return mPlacePageController.getMenuBottomSheetItems(); + return null; + } + + @Override + @Nullable + public Fragment getMenuBottomSheetFragment(String id) + { + if (id.equals(LAYERS_MENU_ID)) + return new ToggleMapLayerFragment(); + return null; } } diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java index bd94f11665..007061388f 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java @@ -45,7 +45,9 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment, OnItemMoreClickListener, - OnItemLongClickListener, BookmarkManager.BookmarksSharingListener + OnItemLongClickListener, + BookmarkManager.BookmarksSharingListener, + MenuBottomSheetFragment.MenuBottomSheetInterface { private static final String TAG = BookmarkCategoriesFragment.class.getSimpleName(); @@ -55,6 +57,8 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment getMenuItems(@NonNull BookmarkCategory item) + @Override + @Nullable + public ArrayList getMenuBottomSheetItems(String id) { ArrayList items = new ArrayList<>(); - items.add(new MenuBottomSheetItem(R.string.list_settings, R.drawable.ic_settings, () -> onSettingsActionSelected(item))); - items.add(new MenuBottomSheetItem( - item.isVisible() ? R.string.hide : R.string.show, - item.isVisible() ? R.drawable.ic_hide : R.drawable.ic_show, - () -> onShowActionSelected(item))); - items.add(new MenuBottomSheetItem(R.string.export_file, R.drawable.ic_share, () -> onShareActionSelected(item))); - // Disallow deleting the last category - if (getAdapter().getBookmarkCategories().size() > 1) - items.add(new MenuBottomSheetItem(R.string.delete, R.drawable.ic_delete, () -> onDeleteActionSelected(item))); - + if (mSelectedCategory != null) + { + items.add(new MenuBottomSheetItem( + R.string.list_settings, + R.drawable.ic_settings, + () -> onSettingsActionSelected(mSelectedCategory))); + items.add(new MenuBottomSheetItem( + mSelectedCategory.isVisible() ? R.string.hide : R.string.show, + mSelectedCategory.isVisible() ? R.drawable.ic_hide : R.drawable.ic_show, + () -> onShowActionSelected(mSelectedCategory))); + items.add(new MenuBottomSheetItem( + R.string.export_file, + R.drawable.ic_share, + () -> onShareActionSelected(mSelectedCategory))); + // Disallow deleting the last category + if (getAdapter().getBookmarkCategories().size() > 1) + items.add(new MenuBottomSheetItem( + R.string.delete, + R.drawable.ic_delete, + () -> onDeleteActionSelected(mSelectedCategory))); + } return items; } diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java index 710214d4fe..9b1e026bc2 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java @@ -53,13 +53,17 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment getMenuBottomSheetItems(String id) + { + if (id.equals(BOOKMARKS_MENU_ID)) + return getBookmarkMenuItems(); + if (id.equals(TRACK_MENU_ID)) + { + final Track track = (Track) getBookmarkListAdapter().getItem(mSelectedPosition); + return getTrackMenuItems(track); + } + if (id.equals(OPTIONS_MENU_ID)) + return getOptionsMenuItems(); + return null; + } } diff --git a/android/src/com/mapswithme/maps/downloader/DownloaderAdapter.java b/android/src/com/mapswithme/maps/downloader/DownloaderAdapter.java index 9db1a5d593..89f6f66efe 100644 --- a/android/src/com/mapswithme/maps/downloader/DownloaderAdapter.java +++ b/android/src/com/mapswithme/maps/downloader/DownloaderAdapter.java @@ -49,6 +49,8 @@ class DownloaderAdapter extends RecyclerView.Adapter getMenuItems() + { + ArrayList items = new ArrayList<>(); + switch (mSelectedItem.status) + { + case CountryItem.STATUS_DOWNLOADABLE: + items.add(getDownloadMenuItem()); + break; + + case CountryItem.STATUS_UPDATABLE: + items.add(getUpdateMenuItem()); + // Fallthrough + + case CountryItem.STATUS_DONE: + if (!mSelectedItem.isExpandable()) + items.add(getExploreMenuItem()); + appendDeleteMenuItem(items); + break; + + case CountryItem.STATUS_FAILED: + items.add(getCancelMenuItem()); + + if (mSelectedItem.present) + { + appendDeleteMenuItem(items); + items.add(getExploreMenuItem()); + } + break; + + case CountryItem.STATUS_PROGRESS: + case CountryItem.STATUS_APPLYING: + case CountryItem.STATUS_ENQUEUED: + items.add(getCancelMenuItem()); + + if (mSelectedItem.present) + items.add(getExploreMenuItem()); + break; + + case CountryItem.STATUS_PARTLY: + items.add(getDownloadMenuItem()); + appendDeleteMenuItem(items); + break; + } + return items; + } + + + private MenuBottomSheetItem getDownloadMenuItem() + { + return new MenuBottomSheetItem(R.string.downloader_download_map, R.drawable.ic_download, + () -> onDownloadActionSelected(mSelectedItem, DownloaderAdapter.this)); + } + + private MenuBottomSheetItem getUpdateMenuItem() + { + return new MenuBottomSheetItem(R.string.downloader_update_map, R.drawable.ic_update, + () -> onUpdateActionSelected(mSelectedItem, DownloaderAdapter.this)); + } + + private MenuBottomSheetItem getExploreMenuItem() + { + return new MenuBottomSheetItem(R.string.zoom_to_country, R.drawable.ic_explore, + () -> onExploreActionSelected(mSelectedItem, DownloaderAdapter.this)); + } + + private void appendDeleteMenuItem(ArrayList items) + { + // Do not show "Delete" option for World files. + // Checking the name is not beautiful, but the simplest way for now .. + if (!mSelectedItem.id.startsWith("World")) { + items.add(new MenuBottomSheetItem(R.string.delete, R.drawable.ic_delete, + () -> onDeleteActionSelected(mSelectedItem, DownloaderAdapter.this))); + } + } + + private MenuBottomSheetItem getCancelMenuItem() + { + return new MenuBottomSheetItem(R.string.cancel, R.drawable.ic_cancel, + () -> onCancelActionSelected(mSelectedItem, DownloaderAdapter.this)); + } + private class ItemViewHolder extends BaseInnerViewHolder { private final DownloaderStatusIcon mStatusIcon; @@ -311,89 +402,7 @@ class DownloaderAdapter extends RecyclerView.Adapter items = getMenuItems(); - new MenuBottomSheetFragment(mItem.name, items) - .show(mFragment.getParentFragmentManager(), "downloaderBottomSheet"); - } - - private MenuBottomSheetItem getDownloadMenuItem() - { - return new MenuBottomSheetItem(R.string.downloader_download_map, R.drawable.ic_download, - () -> onDownloadActionSelected(mItem, DownloaderAdapter.this)); - } - - private MenuBottomSheetItem getUpdateMenuItem() - { - return new MenuBottomSheetItem(R.string.downloader_update_map, R.drawable.ic_update, - () -> onUpdateActionSelected(mItem, DownloaderAdapter.this)); - } - - private MenuBottomSheetItem getExploreMenuItem() - { - return new MenuBottomSheetItem(R.string.zoom_to_country, R.drawable.ic_explore, - () -> onExploreActionSelected(mItem, DownloaderAdapter.this)); - } - - private void appendDeleteMenuItem(ArrayList items) - { - // Do not show "Delete" option for World files. - // Checking name is not beautiful, but the simplest way for now .. - if (!mItem.id.startsWith("World")) { - items.add(new MenuBottomSheetItem(R.string.delete, R.drawable.ic_delete, - () -> onDeleteActionSelected(mItem, DownloaderAdapter.this))); - } - } - - private MenuBottomSheetItem getCancelMenuItem() - { - return new MenuBottomSheetItem(R.string.cancel, R.drawable.ic_cancel, - () -> onCancelActionSelected(mItem, DownloaderAdapter.this)); - } - - private ArrayList getMenuItems() - { - ArrayList items = new ArrayList<>(); - switch (mItem.status) - { - case CountryItem.STATUS_DOWNLOADABLE: - items.add(getDownloadMenuItem()); - break; - - case CountryItem.STATUS_UPDATABLE: - items.add(getUpdateMenuItem()); - // Fallthrough - - case CountryItem.STATUS_DONE: - if (!mItem.isExpandable()) - items.add(getExploreMenuItem()); - appendDeleteMenuItem(items); - break; - - case CountryItem.STATUS_FAILED: - items.add(getCancelMenuItem()); - - if (mItem.present) - { - appendDeleteMenuItem(items); - items.add(getExploreMenuItem()); - } - break; - - case CountryItem.STATUS_PROGRESS: - case CountryItem.STATUS_APPLYING: - case CountryItem.STATUS_ENQUEUED: - items.add(getCancelMenuItem()); - - if (mItem.present) - items.add(getExploreMenuItem()); - break; - - case CountryItem.STATUS_PARTLY: - items.add(getDownloadMenuItem()); - appendDeleteMenuItem(items); - break; - } - return items; + showBottomSheet(mItem); } ItemViewHolder(View frame) diff --git a/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java b/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java index c37634d448..56e29c6e1a 100644 --- a/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java +++ b/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java @@ -16,12 +16,15 @@ import com.mapswithme.maps.base.OnBackPressListener; import com.mapswithme.maps.search.NativeMapSearchListener; import com.mapswithme.maps.search.SearchEngine; import com.mapswithme.maps.widget.PlaceholderView; +import com.mapswithme.util.bottomsheet.MenuBottomSheetFragment; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; import java.util.ArrayList; import java.util.List; public class DownloaderFragment extends BaseMwmRecyclerFragment - implements OnBackPressListener + implements OnBackPressListener, + MenuBottomSheetFragment.MenuBottomSheetInterface { private DownloaderToolbarController mToolbarController; @@ -230,4 +233,11 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment getMenuBottomSheetItems(String id) + { + return mAdapter != null ? mAdapter.getMenuItems() : null; + } } diff --git a/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java b/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java index a02c1a3631..655274651d 100644 --- a/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java +++ b/android/src/com/mapswithme/maps/maplayer/ToggleMapLayerFragment.java @@ -23,21 +23,20 @@ import java.util.List; public class ToggleMapLayerFragment extends Fragment { - @NonNull - private final LayerItemClickListener mLayerItemClickListener; + @Nullable + private LayerItemClickListener mLayerItemClickListener; @Nullable private LayersAdapter mAdapter; - public ToggleMapLayerFragment(@NonNull LayerItemClickListener layerItemClickListener) - { - mLayerItemClickListener = layerItemClickListener; - } - @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); + + if (getActivity() instanceof LayerItemClickListener) + mLayerItemClickListener = ((LayerItemClickListener) getActivity()); + initRecycler(mRoot); return mRoot; } @@ -73,11 +72,12 @@ public class ToggleMapLayerFragment extends Fragment mAdapter.notifyDataSetChanged(); if (IsolinesManager.from(context).shouldShowNotification()) Utils.showSnackbar(context, v.getRootView(), R.string.isolines_toast_zooms_1_10); - mLayerItemClickListener.onClick(mode); + if (mLayerItemClickListener != null) + mLayerItemClickListener.onLayerItemClick(mode); } public interface LayerItemClickListener { - void onClick(@NonNull Mode mode); + void onLayerItemClick(@NonNull Mode mode); } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java index b350e72155..36566603da 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.mapswithme.maps.MwmApplication; @@ -25,6 +26,7 @@ import java.util.List; public final class PlacePageButtons { + public static final String PLACEPAGE_MORE_MENU_ID = "PLACEPAGE_MORE_MENU_BOTTOM_SHEET"; private final int mMaxButtons; private final PlacePageView mPlacePage; @@ -32,6 +34,7 @@ public final class PlacePageButtons private final ItemListener mItemListener; private List mPrevItems; + private List mMoreItems; interface PlacePageButton { @@ -308,22 +311,25 @@ public final class PlacePageButtons } } - private ArrayList getMenuItems(final List buttons) + @Nullable + public ArrayList getMenuBottomSheetItems() { + if (mMoreItems == null) + return null; ArrayList items = new ArrayList<>(); - for (int i = mMaxButtons; i < buttons.size(); i++) + for (int i = mMaxButtons; i < mMoreItems.size(); i++) { - PlacePageButton bsItem = buttons.get(i); + final PlacePageButton bsItem = mMoreItems.get(i); int iconRes = bsItem.getIcon().getEnabledStateResId(mPlacePage.getContext()); items.add(new MenuBottomSheetItem(bsItem.getTitle(), iconRes, () -> mItemListener.onItemClick(bsItem))); } return items; } - private void showPopup(final List buttons) + private void showPopup() { - new MenuBottomSheetFragment(getMenuItems(buttons)) - .show(mPlacePage.getActivity().getSupportFragmentManager(), "moreBottomSheet"); + MenuBottomSheetFragment.newInstance(PLACEPAGE_MORE_MENU_ID) + .show(mPlacePage.getActivity().getSupportFragmentManager(), PLACEPAGE_MORE_MENU_ID); } private View createButton(@NonNull final List items, @@ -339,7 +345,9 @@ public final class PlacePageButtons title.setText(current.getTitle()); icon.setImageResource(current.getIcon().getEnabledStateResId(context)); mItemListener.onPrepareVisibleView(current, parent, icon, title); - parent.setOnClickListener(new ShowPopupClickListener(current, items)); + if (current == Item.MORE) + mMoreItems = items; + parent.setOnClickListener(new ShowPopupClickListener(current)); return parent; } @@ -361,21 +369,17 @@ public final class PlacePageButtons { @NonNull private final PlacePageButton mCurrent; - @NonNull - private final List mItems; - public ShowPopupClickListener(@NonNull PlacePageButton current, - @NonNull List items) + public ShowPopupClickListener(@NonNull PlacePageButton current) { mCurrent = current; - mItems = items; } @Override public void onClick(View v) { if (mCurrent == Item.MORE) - showPopup(mItems); + showPopup(); else mItemListener.onItemClick(mCurrent); } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java index 3d488076f5..c3d2da0698 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java @@ -6,9 +6,13 @@ import android.os.Bundle; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.base.Savable; import com.mapswithme.maps.base.Supportable; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; + +import java.util.ArrayList; public interface PlacePageController extends Initializable, Savable, @@ -19,6 +23,8 @@ public interface PlacePageController extends Initializable, void close(boolean deactivateMapSelection); boolean isClosed(); int getPlacePageWidth(); + @Nullable + ArrayList getMenuBottomSheetItems(); interface SlideListener { diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java index b588c1ea4e..58cacb4909 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java @@ -5,6 +5,7 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; import java.util.ArrayList; import java.util.List; @@ -34,6 +35,13 @@ class PlacePageControllerComposite implements PlacePageController return mActiveController.getPlacePageWidth(); } + @Override + @Nullable + public ArrayList getMenuBottomSheetItems() + { + return mActiveController.getMenuBottomSheetItems(); + } + @Override public void openFor(@NonNull PlacePageData data) { diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index 189a36cd67..2217c970e4 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -65,6 +65,7 @@ import com.mapswithme.util.StringUtils; import com.mapswithme.util.ThemeUtils; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; import com.mapswithme.util.concurrency.UiThread; import com.mapswithme.util.log.Logger; @@ -1635,6 +1636,12 @@ public class PlacePageView extends NestedScrollViewClickFixed return mPreview.getHeight(); } + @Nullable + public ArrayList getMenuBottomSheetItems() + { + return mButtons.getMenuBottomSheetItems(); + } + private class EditBookmarkClickListener implements OnClickListener { @Override diff --git a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java index 01939ce3d2..15c57ff19c 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java @@ -20,8 +20,10 @@ import com.mapswithme.maps.bookmarks.data.MapObject; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.location.LocationListener; import com.mapswithme.util.UiUtils; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; import com.mapswithme.util.log.Logger; +import java.util.ArrayList; import java.util.Objects; public class RichPlacePageController implements PlacePageController, LocationListener, @@ -144,6 +146,13 @@ public class RichPlacePageController implements PlacePageController, LocationLis return mPlacePage.getWidth(); } + @Override + @Nullable + public ArrayList getMenuBottomSheetItems() + { + return mPlacePage.getMenuBottomSheetItems(); + } + @Override public void destroy() { diff --git a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java index ea8d3827f5..163c19e024 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java @@ -16,7 +16,9 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; import com.mapswithme.util.UiUtils; +import com.mapswithme.util.bottomsheet.MenuBottomSheetItem; +import java.util.ArrayList; import java.util.Objects; public class SimplePlacePageController implements PlacePageController @@ -115,6 +117,13 @@ public class SimplePlacePageController implements PlacePageController return mSheet.getWidth(); } + @Override + @Nullable + public ArrayList getMenuBottomSheetItems() + { + return null; + } + @Override public void openFor(@NonNull PlacePageData data) { diff --git a/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java b/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java index b6e290fe22..37c99b54c5 100644 --- a/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java +++ b/android/src/com/mapswithme/util/bottomsheet/MenuBottomSheetFragment.java @@ -1,5 +1,6 @@ package com.mapswithme.util.bottomsheet; +import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -11,64 +12,38 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; - import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.mapswithme.maps.R; -import com.mapswithme.util.ThemeUtils; +import com.mapswithme.util.UiUtils; import java.util.ArrayList; public class MenuBottomSheetFragment extends BottomSheetDialogFragment { + @Nullable - private final String title; + private ArrayList mMenuBottomSheetItems; @Nullable - private final Fragment headerFragment; - private final ArrayList menuBottomSheetItems; + private Fragment mHeaderFragment; - public MenuBottomSheetFragment(@NonNull Fragment headerFragment, ArrayList menuBottomSheetItems) + public static MenuBottomSheetFragment newInstance(String id) { - this.title = null; - this.headerFragment = headerFragment; - this.menuBottomSheetItems = menuBottomSheetItems; + Bundle args = new Bundle(); + args.putString("id", id); + MenuBottomSheetFragment f = new MenuBottomSheetFragment(); + f.setArguments(args); + return f; } - public MenuBottomSheetFragment(@NonNull String title, ArrayList menuBottomSheetItems) + public static MenuBottomSheetFragment newInstance(String id, String title) { - 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<>(); - } - - // https://stackoverflow.com/questions/51831053/could-not-find-fragment-constructor - public MenuBottomSheetFragment() - { - this.title = null; - this.headerFragment = null; - /// @todo Make an empty list as in ctor above. Can we leave it null and don't create MenuAdapter? - /// What is the reason of MenuAdapter with empty items list? - this.menuBottomSheetItems = new ArrayList<>(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); + Bundle args = new Bundle(); + args.putString("id", id); + args.putString("title", title); + MenuBottomSheetFragment f = new MenuBottomSheetFragment(); + f.setArguments(args); + return f; } @Nullable @@ -93,19 +68,93 @@ public class MenuBottomSheetFragment extends BottomSheetDialogFragment public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + attachToNearestContext(); TextView titleView = view.findViewById(R.id.bottomSheetTitle); RecyclerView recyclerView = view.findViewById(R.id.bottomSheetMenuContainer); - if (title != null) + if (getArguments() != null) { - titleView.setVisibility(View.VISIBLE); - titleView.setText(title); - } else + String title = getArguments().getString("title"); + if (title != null && title.length() > 0) + { + titleView.setVisibility(View.VISIBLE); + titleView.setText(title); + } + else + titleView.setVisibility(View.GONE); + } + else titleView.setVisibility(View.GONE); - 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(); + if (mMenuBottomSheetItems != null) + { + MenuAdapter menuAdapter = new MenuAdapter(mMenuBottomSheetItems, this::dismiss); + recyclerView.setAdapter(menuAdapter); + recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity())); + } + if (mHeaderFragment != null) + getChildFragmentManager().beginTransaction().add(R.id.bottom_sheet_menu_header, mHeaderFragment).commit(); + + // If there is nothing to show, hide the sheet + if (!UiUtils.isVisible(titleView) && mMenuBottomSheetItems == null && mHeaderFragment == null) + dismiss(); } + + private void attachToNearestContext() + { + // Try to attach to the parent fragment if any + // In other cases, attach to the activity + MenuBottomSheetInterface bottomSheetInterface = null; + MenuBottomSheetInterfaceWithHeader bottomSheetInterfaceWithHeader = null; + + Fragment parentFragment = getParentFragment(); + if (parentFragment instanceof MenuBottomSheetInterfaceWithHeader) + bottomSheetInterfaceWithHeader = (MenuBottomSheetInterfaceWithHeader) parentFragment; + else if (parentFragment instanceof MenuBottomSheetInterface) + bottomSheetInterface = (MenuBottomSheetInterface) parentFragment; + else + { + Activity parentActivity = getActivity(); + if (parentActivity instanceof MenuBottomSheetInterfaceWithHeader) + bottomSheetInterfaceWithHeader = (MenuBottomSheetInterfaceWithHeader) parentActivity; + else if (parentActivity instanceof MenuBottomSheetInterface) + bottomSheetInterface = (MenuBottomSheetInterface) parentActivity; + } + + if (bottomSheetInterface != null) + { + if (getArguments() != null) + { + String id = getArguments().getString("id"); + if (id != null && id.length() > 0) + mMenuBottomSheetItems = bottomSheetInterface.getMenuBottomSheetItems(id); + } + } + else if (bottomSheetInterfaceWithHeader != null) + { + if (getArguments() != null) + { + String id = getArguments().getString("id"); + if (id != null && id.length() > 0) + { + mMenuBottomSheetItems = bottomSheetInterfaceWithHeader.getMenuBottomSheetItems(id); + mHeaderFragment = bottomSheetInterfaceWithHeader.getMenuBottomSheetFragment(id); + } + } + } + } + + public interface MenuBottomSheetInterfaceWithHeader + { + @Nullable + Fragment getMenuBottomSheetFragment(String id); + @Nullable + ArrayList getMenuBottomSheetItems(String id); + } + + public interface MenuBottomSheetInterface + { + @Nullable + ArrayList getMenuBottomSheetItems(String id); + } + }