diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java index 07ca97be19..7d2b936f29 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java @@ -3,7 +3,6 @@ package com.mapswithme.maps.widget.placepage; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.view.LayoutInflater; import android.view.MenuItem; @@ -12,261 +11,394 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; import com.mapswithme.maps.routing.RoutingController; import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.ThemeUtils; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + final class PlacePageButtons { - private final int MAX_BUTTONS; + private static final Map PARTNERS_ITEMS = new HashMap() + {{ + put(PartnerItem.PARTNER1.getIndex(), PartnerItem.PARTNER1); + put(PartnerItem.PARTNER3.getIndex(), PartnerItem.PARTNER3); + }}; + + private final int mMaxButtons; private final PlacePageView mPlacePage; private final ViewGroup mFrame; private final ItemListener mItemListener; - private List mPrevItems; + private List mPrevItems; - enum Item + interface ButtonInterface + { + @StringRes + int getTitle(); + + @DrawableRes + int getIcon(); + + @NonNull + ButtonType getType(); + } + + enum ButtonType + { + PARTNER1, PARTNER3, BOOKING, BOOKING_SEARCH, OPENTABLE, BACK, BOOKMARK, + ROUTE_FROM, ROUTE_TO, ROUTE_ADD, ROUTE_REMOVE, SHARE, MORE, CALL + } + + private enum PartnerItem implements ButtonInterface + { + PARTNER1(1) + { + @Override + public int getTitle() + { + return R.string.sponsored_partner1_action; + } + + @Override + public int getIcon() + { + return R.drawable.ic_24px_logo_partner1; + } + + @NonNull + public ButtonType getType() + { + return ButtonType.PARTNER1; + } + }, + + PARTNER3(3) + { + @Override + public int getTitle() + { + return R.string.sponsored_partner3_action; + } + + @Override + public int getIcon() + { + return R.drawable.ic_24px_logo_partner3; + } + + @Override + @NonNull + public ButtonType getType() + { + return ButtonType.PARTNER3; + } + }; + + private final int mIndex; + + PartnerItem(int index) + { + mIndex = index; + } + + public int getIndex() + { + return mIndex; + } + } + + enum Item implements ButtonInterface { BOOKING { @Override - int getTitle() + public int getTitle() { return R.string.book_button; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_booking; } + + @Override + @NonNull + public ButtonType getType() + { + return ButtonType.BOOKING; + } }, BOOKING_SEARCH { @Override - int getTitle() + public int getTitle() { return R.string.booking_search; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_menu_search; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.BOOKING_SEARCH; + } }, OPENTABLE { @Override - int getTitle() + public int getTitle() { return R.string.book_button; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_opentable; } - }, - PARTNER1 - { + @NonNull @Override - int getTitle() + public ButtonType getType() { - return R.string.sponsored_partner1_action; - } - - @Override - int getIcon() - { - return R.drawable.ic_24px_logo_partner1; - } - }, - - PARTNER3 - { - @Override - int getTitle() - { - return R.string.sponsored_partner3_action; - } - - @Override - int getIcon() - { - return R.drawable.ic_24px_logo_partner3; + return ButtonType.OPENTABLE; } }, BACK { @Override - int getTitle() + public int getTitle() { return R.string.back; } @Override - int getIcon() + public int getIcon() { return ThemeUtils.getResource(MwmApplication.get(), android.R.attr.homeAsUpIndicator); } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.BACK; + } }, BOOKMARK { @Override - int getTitle() + public int getTitle() { return R.string.bookmark; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_bookmarks_off; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.BOOKMARK; + } }, ROUTE_FROM { @Override - int getTitle() + public int getTitle() { return R.string.p2p_from_here; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_route_from; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.ROUTE_FROM; + } }, ROUTE_TO { @Override - int getTitle() + public int getTitle() { return R.string.p2p_to_here; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_route_to; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.ROUTE_TO; + } }, ROUTE_ADD { @Override - int getTitle() + public int getTitle() { return R.string.placepage_add_stop; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_route_via; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.ROUTE_ADD; + } }, ROUTE_REMOVE { @Override - int getTitle() + public int getTitle() { return R.string.placepage_remove_stop; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_route_remove; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.ROUTE_REMOVE; + } }, SHARE { @Override - int getTitle() + public int getTitle() { return R.string.share; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_share; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.SHARE; + } }, // Must not be used outside MORE { @Override - int getTitle() + public int getTitle() { return R.string.placepage_more_button; } @Override - int getIcon() + public int getIcon() { return R.drawable.bs_ic_more; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.MORE; + } }, + CALL { @Override - int getTitle() + public int getTitle() { return R.string.placepage_call_button; } @Override - int getIcon() + public int getIcon() { return R.drawable.ic_place_page_phone; } + + @NonNull + @Override + public ButtonType getType() + { + return ButtonType.CALL; + } }; - @StringRes int getTitle() + @StringRes + public int getTitle() { throw new UnsupportedOperationException("Not supported!"); } - @DrawableRes int getIcon() + @DrawableRes + public int getIcon() { throw new UnsupportedOperationException("Not supported!"); } } - private static final Map PARTNERS_ITEMS = new HashMap() - {{ - put(1, Item.PARTNER1); - put(3, Item.PARTNER3); - }}; - interface ItemListener { - void onPrepareVisibleView(Item item, View frame, ImageView icon, TextView title); - void onItemClick(Item item); + void onPrepareVisibleView(ButtonInterface item, View frame, ImageView icon, TextView title); + void onItemClick(ButtonInterface item); } PlacePageButtons(PlacePageView placePage, ViewGroup frame, ItemListener itemListener) @@ -275,22 +407,23 @@ final class PlacePageButtons mFrame = frame; mItemListener = itemListener; - MAX_BUTTONS = mPlacePage.getContext().getResources().getInteger(R.integer.pp_buttons_max); + mMaxButtons = mPlacePage.getContext().getResources().getInteger(R.integer.pp_buttons_max); } @NonNull - static Item getPartnerItem(int partnerIndex) + static ButtonInterface getPartnerItem(int partnerIndex) { - if (!PARTNERS_ITEMS.containsKey(partnerIndex)) + ButtonInterface item = PARTNERS_ITEMS.get(partnerIndex); + if (item == null) throw new AssertionError("Wrong partner index: " + partnerIndex); - return PARTNERS_ITEMS.get(partnerIndex); + return item; } - private @NonNull List collectButtons(List items) + private @NonNull List collectButtons(List items) { - List res = new ArrayList<>(items); - if (res.size() > MAX_BUTTONS) - res.add(MAX_BUTTONS - 1, Item.MORE); + List res = new ArrayList<>(items); + if (res.size() > mMaxButtons) + res.add(mMaxButtons - 1, Item.MORE); // Swap ROUTE_FROM and ROUTE_TO if the latter one was pressed out to bottomsheet int from = res.indexOf(Item.ROUTE_FROM); @@ -298,10 +431,10 @@ final class PlacePageButtons { int addStop = res.indexOf(Item.ROUTE_ADD); int to = res.indexOf(Item.ROUTE_TO); - if ((to > from && to >= MAX_BUTTONS) || (to > from && addStop >= MAX_BUTTONS)) + if ((to > from && to >= mMaxButtons) || (to > from && addStop >= mMaxButtons)) Collections.swap(res, from, to); - if (addStop >= MAX_BUTTONS) + if (addStop >= mMaxButtons) { from = res.indexOf(Item.ROUTE_FROM); if (addStop > from) @@ -313,14 +446,14 @@ final class PlacePageButtons preserveRoutingButtons(res, Item.BOOKING_SEARCH); from = res.indexOf(Item.ROUTE_FROM); to = res.indexOf(Item.ROUTE_TO); - if (from < MAX_BUTTONS && from > to) + if (from < mMaxButtons && from > to) Collections.swap(res, to, from); } return res; } - private void preserveRoutingButtons(@NonNull List items, @NonNull Item itemToShift) + private void preserveRoutingButtons(@NonNull List items, @NonNull Item itemToShift) { if (!RoutingController.get().isNavigating() && !RoutingController.get().isPlanning()) return; @@ -329,14 +462,14 @@ final class PlacePageButtons if (pos > -1) { items.remove(pos); - items.add(MAX_BUTTONS, itemToShift); + items.add(mMaxButtons, itemToShift); int to = items.indexOf(Item.ROUTE_TO); if (items.indexOf(Item.ROUTE_ADD) > -1) { items.remove(Item.ROUTE_ADD); items.remove(Item.ROUTE_FROM); items.add(to + 1, Item.ROUTE_ADD); - items.add(MAX_BUTTONS, Item.ROUTE_FROM); + items.add(mMaxButtons, Item.ROUTE_FROM); } else { @@ -346,12 +479,12 @@ final class PlacePageButtons } } - private void showPopup(final List buttons) + private void showPopup(final List buttons) { BottomSheetHelper.Builder bs = new BottomSheetHelper.Builder(mPlacePage.getActivity()); - for (int i = MAX_BUTTONS; i < buttons.size(); i++) + for (int i = mMaxButtons; i < buttons.size(); i++) { - Item bsItem = buttons.get(i); + ButtonInterface bsItem = buttons.get(i); bs.sheet(i, bsItem.getIcon(), bsItem.getTitle()); } @@ -368,7 +501,7 @@ final class PlacePageButtons bs.tint().show(); } - private View createButton(final List items, final Item current) + private View createButton(final List items, final ButtonInterface current) { View res = LayoutInflater.from(mPlacePage.getContext()).inflate(R.layout.place_page_button, mFrame, false); @@ -395,14 +528,14 @@ final class PlacePageButtons return res; } - void setItems(List items) + void setItems(List items) { - final List buttons = collectButtons(items); + final List buttons = collectButtons(items); if (buttons.equals(mPrevItems)) return; mFrame.removeAllViews(); - int count = Math.min(buttons.size(), MAX_BUTTONS); + int count = Math.min(buttons.size(), mMaxButtons); for (int i = 0; i < count; i++) mFrame.addView(createButton(buttons, buttons.get(i))); diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index 8ff522f81c..ed24e5bb36 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -107,6 +107,7 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import static com.mapswithme.maps.widget.placepage.PlacePageButtons.Item.BOOKING; import static com.mapswithme.util.statistics.Destination.EXTERNAL; import static com.mapswithme.util.statistics.GalleryPlacement.PLACEPAGE; import static com.mapswithme.util.statistics.Statistics.EventName.PP_HOTEL_DESCRIPTION_LAND; @@ -448,11 +449,11 @@ public class PlacePageView extends RelativeLayout mButtons = new PlacePageButtons(this, ppButtons, new PlacePageButtons.ItemListener() { @Override - public void onPrepareVisibleView(PlacePageButtons.Item item, View frame, ImageView icon, TextView title) + public void onPrepareVisibleView(PlacePageButtons.ButtonInterface item, View frame, ImageView icon, TextView title) { int color; - switch (item) + switch (item.getType()) { case BOOKING: frame.setBackgroundResource(R.drawable.button_booking); @@ -495,9 +496,9 @@ public class PlacePageView extends RelativeLayout } @Override - public void onItemClick(PlacePageButtons.Item item) + public void onItemClick(PlacePageButtons.ButtonInterface item) { - switch (item) + switch (item.getType()) { case BOOKMARK: if (mMapObject == null) @@ -1591,7 +1592,7 @@ public class PlacePageView extends RelativeLayout private void setButtons(@NonNull MapObject mapObject, boolean showBackButton, boolean showRoutingButton) { - List buttons = new ArrayList<>(); + List buttons = new ArrayList<>(); if (RoutingController.get().isRoutePoint(mapObject)) { buttons.add(PlacePageButtons.Item.ROUTE_REMOVE); @@ -1607,7 +1608,7 @@ public class PlacePageView extends RelativeLayout switch (mSponsored.getType()) { case Sponsored.TYPE_BOOKING: - buttons.add(PlacePageButtons.Item.BOOKING); + buttons.add(BOOKING); break; case Sponsored.TYPE_OPENTABLE: buttons.add(PlacePageButtons.Item.OPENTABLE); diff --git a/partners_api/mopub_ads.cpp b/partners_api/mopub_ads.cpp index 41bbdf3e95..b629eedac7 100644 --- a/partners_api/mopub_ads.cpp +++ b/partners_api/mopub_ads.cpp @@ -71,9 +71,9 @@ Mopub::Mopub() AppendEntry({{"sponsored", "banner"}}, kSponsoredBannerPlacementId); - for (auto const & p : kPartners) + for (auto const & p : GetPartners()) { - auto const placementId = p.GetBannerPlacementId(); + auto const & placementId = p.GetBannerPlacementId(); if (!placementId.empty()) AppendEntry({{"sponsored", p.m_type.c_str()}}, placementId); } diff --git a/partners_api/partners.cpp b/partners_api/partners.cpp index 4a00ae08f7..ab87596e3c 100644 --- a/partners_api/partners.cpp +++ b/partners_api/partners.cpp @@ -46,7 +46,7 @@ PartnerInfo::PartnerInfo(int partnerIndex, std::string && name) : PartnerInfo(partnerIndex, std::move(name), false /* hasButton */) {} -std::string PartnerInfo::GetBannerPlacementId() const +std::string const & PartnerInfo::GetBannerPlacementId() const { #if defined(OMIM_OS_IPHONE) return m_iosBannerPlacementId; @@ -77,6 +77,11 @@ int PartnerChecker::GetPartnerIndex(FeatureType const & ft) const return kFakePartnerIndex; } +std::vector const & GetPartners() +{ + return kPartners; +} + PartnerInfo const & GetPartnerByIndex(int partnerIndex) { auto const it = std::find_if(kPartners.cbegin(), kPartners.cend(), diff --git a/partners_api/partners.hpp b/partners_api/partners.hpp index 20c14eadbc..a0c367e0b6 100644 --- a/partners_api/partners.hpp +++ b/partners_api/partners.hpp @@ -20,7 +20,7 @@ struct PartnerInfo PartnerInfo(int partnerIndex, std::string && name); - std::string GetBannerPlacementId() const; + std::string const & GetBannerPlacementId() const; }; class PartnerChecker : public ftypes::BaseChecker @@ -34,6 +34,6 @@ public: DECLARE_CHECKER_INSTANCE(PartnerChecker); }; -extern std::vector const kPartners; +extern std::vector const & GetPartners(); extern PartnerInfo const & GetPartnerByIndex(int partnerIndex);