[android] Moved/refactored main menu option click listeners to separate interface and bound it to main menu bottom sheet controller

This commit is contained in:
Александр Зацепин 2020-04-19 17:19:45 +03:00 committed by yoksnod
parent e90471c167
commit f7118b1696
8 changed files with 126 additions and 156 deletions

View file

@ -4,88 +4,59 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_half"
android:layout_marginTop="@dimen/margin_half"
android:layout_marginBottom="@dimen/margin_half"
android:orientation="vertical">
<TextView
android:id="@+id/add_place"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_plus"
android:drawableStart="@drawable/ic_plus"
android:text="@string/placepage_add_place_button"
tools:background="#40FF00FF"/>
tools:background="#40FF00FF" />
<TextView
android:id="@+id/download_guides"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_download_guides"
android:drawableStart="@drawable/ic_menu_download_guides"
android:drawableTint="?attr/colorAccent"
android:textColor="?attr/colorAccent"
android:text="@string/download_guides"
android:textColor="?attr/colorAccent"
tools:background="#403033FF"
tools:targetApi="m"/>
tools:targetApi="m" />
<TextView
android:id="@+id/hotel_search"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_hotel_search"
android:drawableStart="@drawable/ic_menu_hotel_search"
android:text="@string/booking_button_toolbar"
tools:background="#200000FF"/>
<TextView
android:id="@+id/search"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_search"
android:drawableStart="@drawable/ic_menu_search"
android:text="@string/search"
tools:background="#200000FF"/>
<TextView
android:id="@+id/bookmarks"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_bookmarks"
android:drawableStart="@drawable/ic_menu_bookmarks"
android:text="@string/bookmarks"
tools:background="#40FF00FF"/>
tools:background="#200000FF" />
<FrameLayout
android:id="@+id/download_maps_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/download_maps"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_download"
android:drawableStart="@drawable/ic_menu_download"
android:text="@string/download_maps"
tools:background="#2000FF00"/>
tools:background="#2000FF00" />
<TextView
android:id="@+id/counter"
style="@style/MwmWidget.Counter"
android:layout_gravity="end|center_vertical"
android:layout_marginRight="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_base"
android:visibility="gone"
tools:text="9999"
tools:visibility="visible"/>
tools:visibility="visible" />
</FrameLayout>
<TextView
android:id="@+id/settings"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_settings"
android:drawableStart="@drawable/ic_menu_settings"
android:text="@string/settings"
tools:background="#20FF0000"/>
tools:background="#20FF0000" />
<TextView
android:id="@+id/share"
style="@style/MwmTheme.Menu.Content.ListItem"
android:drawableLeft="@drawable/ic_menu_share"
android:drawableStart="@drawable/ic_menu_share"
android:text="@string/share_my_location"
tools:background="#400FF000"/>
tools:background="#400FF000" />
</LinearLayout>

View file

@ -124,7 +124,9 @@ import com.mapswithme.maps.tips.TutorialAction;
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;
@ -533,8 +535,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
mPlacePageController.initialize(this);
mPlacePageController.onActivityCreated(this, savedInstanceState);
// TODO: set state observer.
mMainMenuController = com.mapswithme.maps.widget.menu.Factory.createMainMenuController(new MainMenuStateObserver());
mMainMenuController = MenuControllerFactory.createMainMenuController(new MainMenuStateObserver(),
new MainMenuOptionSelectedListener());
mMainMenuController.initialize(findViewById(R.id.coordinator));
boolean isLaunchByDeepLink = getIntent().getBooleanExtra(EXTRA_LAUNCH_BY_DEEP_LINK, false);
@ -1479,6 +1481,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
if (!mMainMenuController.isClosed())
{
mMainMenuController.close();
return;
}
if (mSearchController != null && mSearchController.hide())
{
SearchEngine.INSTANCE.cancelInteractiveSearch();
@ -2667,23 +2675,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
}
public static class AddPlaceDelegate extends StatisticClickMenuDelegate
{
public AddPlaceDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
{
super(activity, item);
}
@Override
void onPostStatisticMenuItemClick()
{
getActivity().closePlacePage();
if (getActivity().mIsTabletLayout)
getActivity().closeSidePanel();
getActivity().closeMenu(() -> getActivity().showPositionChooser(false, false));
}
}
public static class SearchClickDelegate extends AbstractClickMenuDelegate
{
public SearchClickDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
@ -2700,55 +2691,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
}
public static class SettingsDelegate extends StatisticClickMenuDelegate
{
public SettingsDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
{
super(activity, item);
}
@Override
void onPostStatisticMenuItemClick()
{
Intent intent = new Intent(getActivity(), SettingsActivity.class);
getActivity().closeMenu(() -> getActivity().startActivity(intent));
}
}
public static class DownloadGuidesDelegate extends StatisticClickMenuDelegate
{
public DownloadGuidesDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
{
super(activity, item);
}
@Override
void onPostStatisticMenuItemClick()
{
int requestCode = BookmarkCategoriesActivity.REQ_CODE_DOWNLOAD_BOOKMARK_CATEGORY;
String catalogUrl = BookmarkManager.INSTANCE.getCatalogFrontendUrl(UTM.UTM_TOOLBAR_BUTTON);
getActivity().closeMenu(() -> BookmarksCatalogActivity.startForResult(getActivity(),
requestCode,
catalogUrl));
}
}
public static class HotelSearchDelegate extends StatisticClickMenuDelegate
{
public HotelSearchDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
{
super(activity, item);
}
@Override
void onPostStatisticMenuItemClick()
{
getActivity().closeMenu(() -> {
getActivity().runHotelCategorySearchOnMap();
});
}
}
public abstract static class StatisticClickMenuDelegate extends AbstractClickMenuDelegate
{
StatisticClickMenuDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
@ -2766,21 +2708,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
abstract void onPostStatisticMenuItemClick();
}
public static class DownloadMapsDelegate extends StatisticClickMenuDelegate
{
public DownloadMapsDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
{
super(activity, item);
}
@Override
void onPostStatisticMenuItemClick()
{
RoutingController.get().cancel();
getActivity().closeMenu(() -> getActivity().showDownloader(false));
}
}
public static class BookmarksDelegate extends StatisticClickMenuDelegate
{
public BookmarksDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
@ -2795,20 +2722,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
}
public static class ShareMyLocationDelegate extends StatisticClickMenuDelegate
{
public ShareMyLocationDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
{
super(activity, item);
}
@Override
void onPostStatisticMenuItemClick()
{
getActivity().closeMenu(getActivity()::shareMyLocation);
}
}
public static class DiscoveryDelegate extends StatisticClickMenuDelegate
{
public DiscoveryDelegate(@NonNull MwmActivity activity, @NonNull MainMenu.Item item)
@ -2842,13 +2755,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public void onGlobalLayout()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
mSearchController.getToolbar().getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
else
mSearchController.getToolbar().getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
mSearchController.getToolbar().getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
adjustCompassAndTraffic(UiUtils.isVisible(mSearchController.getToolbar())
? calcFloatingViewsOffset()
@ -2871,4 +2779,55 @@ public class MwmActivity extends BaseMwmFragmentActivity
mFadeView.fadeOut();
}
}
private class MainMenuOptionSelectedListener implements MainMenuOptionListener
{
@Override
public void onAddPlaceOptionSelected()
{
Statistics.INSTANCE.trackToolbarMenu(MainMenu.Item.ADD_PLACE);
closePlacePage();
closeMenu(() -> showPositionChooser(false, false));
}
@Override
public void onSearchGuidesOptionSelected()
{
Statistics.INSTANCE.trackToolbarMenu(MainMenu.Item.DOWNLOAD_GUIDES);
int requestCode = BookmarkCategoriesActivity.REQ_CODE_DOWNLOAD_BOOKMARK_CATEGORY;
String catalogUrl = BookmarkManager.INSTANCE.getCatalogFrontendUrl(UTM.UTM_TOOLBAR_BUTTON);
closeMenu(() -> BookmarksCatalogActivity.startForResult(getActivity(), requestCode,
catalogUrl));
}
@Override
public void onHotelSearchOptionSelected()
{
Statistics.INSTANCE.trackToolbarMenu(MainMenu.Item.HOTEL_SEARCH);
closeMenu(MwmActivity.this::runHotelCategorySearchOnMap);
}
@Override
public void onDownloadMapsOptionSelected()
{
Statistics.INSTANCE.trackToolbarMenu(MainMenu.Item.DOWNLOAD_MAPS);
RoutingController.get().cancel();
closeMenu(() -> showDownloader(false));
}
@Override
public void onSettingsOptionSelected()
{
Statistics.INSTANCE.trackToolbarMenu(MainMenu.Item.SETTINGS);
Intent intent = new Intent(getActivity(), SettingsActivity.class);
closeMenu(() -> getActivity().startActivity(intent));
}
@Override
public void onShareLocationOptionSelected()
{
Statistics.INSTANCE.trackToolbarMenu(MainMenu.Item.SHARE_MY_LOCATION);
closeMenu(MwmActivity.this::shareMyLocation);
}
}
}

View file

@ -76,6 +76,12 @@ public class BottomSheetMenuController implements MenuController
mSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}
@Override
public boolean isClosed()
{
return BottomSheetMenuUtils.isHiddenState(mSheetBehavior.getState());
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void initialize(@Nullable View view)

View file

@ -69,7 +69,7 @@ public class MainMenu extends BaseMenu
public ClickMenuDelegate createClickDelegate(@NonNull MwmActivity activity,
@NonNull Item item)
{
return new MwmActivity.AddPlaceDelegate(activity, item);
throw new UnsupportedOperationException("Main menu option doesn't support it!");
}
},
DOWNLOAD_GUIDES(R.id.download_guides)
@ -79,7 +79,7 @@ public class MainMenu extends BaseMenu
public ClickMenuDelegate createClickDelegate(@NonNull MwmActivity activity,
@NonNull Item item)
{
return new MwmActivity.DownloadGuidesDelegate(activity, item);
throw new UnsupportedOperationException("Main menu option doesn't support it!");
}
},
HOTEL_SEARCH(R.id.hotel_search)
@ -89,7 +89,7 @@ public class MainMenu extends BaseMenu
public ClickMenuDelegate createClickDelegate(@NonNull MwmActivity activity,
@NonNull Item item)
{
return new MwmActivity.HotelSearchDelegate(activity, item);
throw new UnsupportedOperationException("Main menu option doesn't support it!");
}
@NonNull
@ -146,7 +146,7 @@ public class MainMenu extends BaseMenu
public ClickMenuDelegate createClickDelegate(@NonNull MwmActivity activity,
@NonNull Item item)
{
return new MwmActivity.ShareMyLocationDelegate(activity, item);
throw new UnsupportedOperationException("Main menu option doesn't support it!");
}
},
DOWNLOAD_MAPS(R.id.download_maps)
@ -156,7 +156,7 @@ public class MainMenu extends BaseMenu
public ClickMenuDelegate createClickDelegate(@NonNull MwmActivity activity,
@NonNull Item item)
{
return new MwmActivity.DownloadMapsDelegate(activity, item);
throw new UnsupportedOperationException("Main menu option doesn't support it!");
}
},
SETTINGS(R.id.settings)
@ -166,7 +166,7 @@ public class MainMenu extends BaseMenu
public ClickMenuDelegate createClickDelegate(@NonNull MwmActivity activity,
@NonNull Item item)
{
return new MwmActivity.SettingsDelegate(activity, item);
throw new UnsupportedOperationException("Main menu option doesn't support it!");
}
};

View file

@ -0,0 +1,11 @@
package com.mapswithme.maps.widget.menu;
public interface MainMenuOptionListener
{
void onAddPlaceOptionSelected();
void onSearchGuidesOptionSelected();
void onHotelSearchOptionSelected();
void onDownloadMapsOptionSelected();
void onSettingsOptionSelected();
void onShareLocationOptionSelected();
}

View file

@ -2,10 +2,22 @@ package com.mapswithme.maps.widget.menu;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapswithme.maps.R;
import java.util.Objects;
public class MainMenuRenderer implements MenuRenderer
{
@NonNull
private final MainMenuOptionListener mListener;
MainMenuRenderer(@NonNull MainMenuOptionListener listener)
{
mListener = listener;
}
@Override
public void render()
{
@ -15,7 +27,19 @@ public class MainMenuRenderer implements MenuRenderer
@Override
public void initialize(@Nullable View view)
{
// TODO: Implement.
Objects.requireNonNull(view);
View addPlace = view.findViewById(R.id.add_place);
addPlace.setOnClickListener(v -> mListener.onAddPlaceOptionSelected());
View downloadGuides = view.findViewById(R.id.download_guides);
downloadGuides.setOnClickListener(v -> mListener.onSearchGuidesOptionSelected());
View hotelSearch = view.findViewById(R.id.hotel_search);
hotelSearch.setOnClickListener(v -> mListener.onHotelSearchOptionSelected());
View downloadMaps = view.findViewById(R.id.download_maps_container);
downloadMaps.setOnClickListener(v -> mListener.onDownloadMapsOptionSelected());
View settings = view.findViewById(R.id.settings);
settings.setOnClickListener(v -> mListener.onSettingsOptionSelected());
View share = view.findViewById(R.id.share);
share.setOnClickListener(v -> mListener.onShareLocationOptionSelected());
}
@Override

View file

@ -8,4 +8,5 @@ public interface MenuController extends Initializable<View>
{
void open();
void close();
boolean isClosed();
}

View file

@ -1,18 +1,16 @@
package com.mapswithme.maps.widget.menu;
import android.app.Activity;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapswithme.maps.R;
public class Factory
public class MenuControllerFactory
{
@NonNull
public static MenuController createMainMenuController(@Nullable MenuStateObserver stateObserver)
public static MenuController createMainMenuController(@Nullable MenuStateObserver stateObserver,
@NonNull MainMenuOptionListener listener)
{
return new BottomSheetMenuController(R.id.main_menu_sheet, new MainMenuRenderer(),
return new BottomSheetMenuController(R.id.main_menu_sheet, new MainMenuRenderer(listener),
stateObserver);
}
}