diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 5b5014cf50..4b2c67c893 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -92,7 +92,7 @@ LOCAL_SRC_FILES := \ com/mapswithme/maps/SearchRecents.cpp \ com/mapswithme/maps/settings/UnitLocale.cpp \ com/mapswithme/maps/sound/tts.cpp \ - com/mapswithme/maps/SponsoredHotel.cpp \ + com/mapswithme/maps/Sponsored.cpp \ com/mapswithme/maps/uber/Uber.cpp \ com/mapswithme/maps/TrackRecorder.cpp \ com/mapswithme/maps/UserMarkHelper.cpp \ diff --git a/android/jni/com/mapswithme/maps/SponsoredHotel.cpp b/android/jni/com/mapswithme/maps/Sponsored.cpp similarity index 80% rename from android/jni/com/mapswithme/maps/SponsoredHotel.cpp rename to android/jni/com/mapswithme/maps/Sponsored.cpp index 986709c2ec..ac8bb04fc5 100644 --- a/android/jni/com/mapswithme/maps/SponsoredHotel.cpp +++ b/android/jni/com/mapswithme/maps/Sponsored.cpp @@ -10,7 +10,7 @@ namespace { -jclass g_hotelClass; +jclass g_sponsoredClass; jclass g_facilityTypeClass; jclass g_nearbyObjectClass; jclass g_imageClass; @@ -21,22 +21,22 @@ jmethodID g_nearbyConstructor; jmethodID g_imageConstructor; jmethodID g_reviewConstructor; jmethodID g_hotelInfoConstructor; -jmethodID g_hotelClassConstructor; +jmethodID g_sponsoredClassConstructor; jmethodID g_priceCallback; jmethodID g_infoCallback; -void PrepareClassRefs(JNIEnv * env, jclass hotelClass) +void PrepareClassRefs(JNIEnv * env, jclass sponsoredClass) { - if (g_hotelClass) + if (g_sponsoredClass) return; - g_hotelClass = static_cast(env->NewGlobalRef(hotelClass)); + g_sponsoredClass = static_cast(env->NewGlobalRef(sponsoredClass)); g_hotelInfoClass = - jni::GetGlobalClassRef(env, "com/mapswithme/maps/widget/placepage/SponsoredHotel$HotelInfo"); + jni::GetGlobalClassRef(env, "com/mapswithme/maps/widget/placepage/Sponsored$HotelInfo"); g_facilityTypeClass = jni::GetGlobalClassRef( - env, "com/mapswithme/maps/widget/placepage/SponsoredHotel$FacilityType"); + env, "com/mapswithme/maps/widget/placepage/Sponsored$FacilityType"); g_nearbyObjectClass = jni::GetGlobalClassRef( - env, "com/mapswithme/maps/widget/placepage/SponsoredHotel$NearbyObject"); + env, "com/mapswithme/maps/widget/placepage/Sponsored$NearbyObject"); g_reviewClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/review/Review"); g_imageClass = jni::GetGlobalClassRef(env, "com/mapswithme/maps/gallery/Image"); @@ -52,46 +52,47 @@ void PrepareClassRefs(JNIEnv * env, jclass hotelClass) g_hotelInfoConstructor = jni::GetConstructorID( env, g_hotelInfoClass, "(Ljava/lang/String;[Lcom/mapswithme/maps/gallery/Image;[Lcom/mapswithme/maps/widget/" - "placepage/SponsoredHotel$FacilityType;[Lcom/mapswithme/maps/review/Review;[Lcom/mapswithme/" - "maps/widget/placepage/SponsoredHotel$NearbyObject;)V"); + "placepage/Sponsored$FacilityType;[Lcom/mapswithme/maps/review/Review;[Lcom/mapswithme/" + "maps/widget/placepage/Sponsored$NearbyObject;)V"); - // SponsoredHotel(String rating, String price, String urlBook, String urlDescription) - g_hotelClassConstructor = jni::GetConstructorID( - env, g_hotelClass, - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); + // Sponsored(String rating, String price, String urlBook, String urlDescription) + g_sponsoredClassConstructor = jni::GetConstructorID( + env, g_sponsoredClass, + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V"); // static void onPriceReceived(final String id, final String price, final String currency) g_priceCallback = - jni::GetStaticMethodID(env, g_hotelClass, "onPriceReceived", + jni::GetStaticMethodID(env, g_sponsoredClass, "onPriceReceived", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); // static void onDescriptionReceived(final String id, final String description) g_infoCallback = jni::GetStaticMethodID( - env, g_hotelClass, "onInfoReceived", - "(Ljava/lang/String;Lcom/mapswithme/maps/widget/placepage/SponsoredHotel$HotelInfo;)V"); + env, g_sponsoredClass, "onHotelInfoReceived", + "(Ljava/lang/String;Lcom/mapswithme/maps/widget/placepage/Sponsored$HotelInfo;)V"); } } // namespace extern "C" { -// static SponsoredHotel nativeGetCurrent(); -JNIEXPORT jobject JNICALL Java_com_mapswithme_maps_widget_placepage_SponsoredHotel_nativeGetCurrent( +// static Sponsored nativeGetCurrent(); +JNIEXPORT jobject JNICALL Java_com_mapswithme_maps_widget_placepage_Sponsored_nativeGetCurrent( JNIEnv * env, jclass clazz) { PrepareClassRefs(env, clazz); place_page::Info const & ppInfo = g_framework->GetPlacePageInfo(); - if (!ppInfo.m_isSponsoredHotel) + if (!ppInfo.IsSponsored()) return nullptr; - return env->NewObject(g_hotelClass, g_hotelClassConstructor, + return env->NewObject(g_sponsoredClass, g_sponsoredClassConstructor, jni::ToJavaString(env, ppInfo.GetRatingFormatted()), jni::ToJavaString(env, ppInfo.GetApproximatePricing()), - jni::ToJavaString(env, ppInfo.GetSponsoredBookingUrl()), - jni::ToJavaString(env, ppInfo.GetSponsoredDescriptionUrl())); + jni::ToJavaString(env, ppInfo.GetSponsoredUrl()), + jni::ToJavaString(env, ppInfo.GetSponsoredDescriptionUrl()), + (jint)ppInfo.m_sponsoredType); } // static void nativeRequestPrice(String id, String currencyCode); -JNIEXPORT void JNICALL Java_com_mapswithme_maps_widget_placepage_SponsoredHotel_nativeRequestPrice( +JNIEXPORT void JNICALL Java_com_mapswithme_maps_widget_placepage_Sponsored_nativeRequestPrice( JNIEnv * env, jclass clazz, jstring id, jstring currencyCode) { PrepareClassRefs(env, clazz); @@ -103,14 +104,14 @@ JNIEXPORT void JNICALL Java_com_mapswithme_maps_widget_placepage_SponsoredHotel_ string const & currency) { GetPlatform().RunOnGuiThread([=]() { JNIEnv * env = jni::GetEnv(); - env->CallStaticVoidMethod(g_hotelClass, g_priceCallback, jni::ToJavaString(env, hotelId), + env->CallStaticVoidMethod(g_sponsoredClass, g_priceCallback, jni::ToJavaString(env, hotelId), jni::ToJavaString(env, price), jni::ToJavaString(env, currency)); }); }); } // static void nativeRequestInfo(String id, String locale); -JNIEXPORT void JNICALL Java_com_mapswithme_maps_widget_placepage_SponsoredHotel_nativeRequestInfo( +JNIEXPORT void JNICALL Java_com_mapswithme_maps_widget_placepage_Sponsored_nativeRequestHotelInfo( JNIEnv * env, jclass clazz, jstring id, jstring locale) { PrepareClassRefs(env, clazz); @@ -151,7 +152,7 @@ JNIEXPORT void JNICALL Java_com_mapswithme_maps_widget_placepage_SponsoredHotel_ }); auto nearby = env->NewObjectArray(0, g_nearbyObjectClass, 0); - env->CallStaticVoidMethod(g_hotelClass, g_infoCallback, jni::ToJavaString(env, hotelId), + env->CallStaticVoidMethod(g_sponsoredClass, g_infoCallback, jni::ToJavaString(env, hotelId), env->NewObject(g_hotelInfoClass, g_hotelInfoConstructor, description, photos, facilities, reviews, nearby)); }); diff --git a/android/res/drawable-hdpi/ic_opentable.png b/android/res/drawable-hdpi/ic_opentable.png new file mode 100644 index 0000000000..fff32a337c Binary files /dev/null and b/android/res/drawable-hdpi/ic_opentable.png differ diff --git a/android/res/drawable-mdpi/ic_opentable.png b/android/res/drawable-mdpi/ic_opentable.png new file mode 100644 index 0000000000..ae53c7be0c Binary files /dev/null and b/android/res/drawable-mdpi/ic_opentable.png differ diff --git a/android/res/drawable-v21/button_opentable.xml b/android/res/drawable-v21/button_opentable.xml new file mode 100644 index 0000000000..e1b31e63e2 --- /dev/null +++ b/android/res/drawable-v21/button_opentable.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/android/res/drawable-xhdpi/ic_opentable.png b/android/res/drawable-xhdpi/ic_opentable.png new file mode 100644 index 0000000000..1d7641a1ef Binary files /dev/null and b/android/res/drawable-xhdpi/ic_opentable.png differ diff --git a/android/res/drawable-xxhdpi/ic_opentable.png b/android/res/drawable-xxhdpi/ic_opentable.png new file mode 100644 index 0000000000..2d8fbad633 Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_opentable.png differ diff --git a/android/res/drawable-xxxhdpi/ic_opentable.png b/android/res/drawable-xxxhdpi/ic_opentable.png new file mode 100644 index 0000000000..1b1de05206 Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_opentable.png differ diff --git a/android/res/drawable/button_opentable.xml b/android/res/drawable/button_opentable.xml new file mode 100644 index 0000000000..fcbddd3705 --- /dev/null +++ b/android/res/drawable/button_opentable.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/android/res/values-ar/strings.xml b/android/res/values-ar/strings.xml index e4b4480cc3..a85932d1d3 100644 --- a/android/res/values-ar/strings.xml +++ b/android/res/values-ar/strings.xml @@ -868,7 +868,7 @@ د الوصف المزيد - حجز + حجز اتصال تحرير العلامة المرجعية اسم العلامة المرجعية diff --git a/android/res/values-cs/strings.xml b/android/res/values-cs/strings.xml index 2879db6784..1419524638 100644 --- a/android/res/values-cs/strings.xml +++ b/android/res/values-cs/strings.xml @@ -869,7 +869,7 @@ min Popis Více - Rezervace + Rezervace Volat Upravit záložku Název záložky diff --git a/android/res/values-da/strings.xml b/android/res/values-da/strings.xml index 397e81f0e7..b02309a96a 100644 --- a/android/res/values-da/strings.xml +++ b/android/res/values-da/strings.xml @@ -866,7 +866,7 @@ min Beskrivelse Mere - Bog + Bog Ring Rediger bogmærke Bogmærke diff --git a/android/res/values-de/strings.xml b/android/res/values-de/strings.xml index f01ad0ebd0..e73ab6395a 100644 --- a/android/res/values-de/strings.xml +++ b/android/res/values-de/strings.xml @@ -880,7 +880,7 @@ min Beschreibung Mehr - Buchen + Buchen Anruf Lesezeichen bearbeiten Name des Lesezeichens diff --git a/android/res/values-es/strings.xml b/android/res/values-es/strings.xml index 6faa1fee13..7cf5668e64 100644 --- a/android/res/values-es/strings.xml +++ b/android/res/values-es/strings.xml @@ -855,7 +855,7 @@ min Descripción Más - Reservar + Reservar Llamar Editar marcador Nombre del marcador diff --git a/android/res/values-fi/strings.xml b/android/res/values-fi/strings.xml index 3bee475c60..095e1f20bd 100644 --- a/android/res/values-fi/strings.xml +++ b/android/res/values-fi/strings.xml @@ -862,7 +862,7 @@ min Kuvaus Lisää - Varaa + Varaa Soita Muokkaa kirjanmerkkiä Kirjanmerkin nimi diff --git a/android/res/values-fr/strings.xml b/android/res/values-fr/strings.xml index 6f04a8e04a..183099f785 100644 --- a/android/res/values-fr/strings.xml +++ b/android/res/values-fr/strings.xml @@ -879,7 +879,7 @@ min Description Plus - Réserver + Réserver Appeler Éditer les signets Nom du signet diff --git a/android/res/values-hu/strings.xml b/android/res/values-hu/strings.xml index 794139dd87..cd7c7738b7 100644 --- a/android/res/values-hu/strings.xml +++ b/android/res/values-hu/strings.xml @@ -862,7 +862,7 @@ p Leírás Még - Foglalás + Foglalás Hívás Könyvjelző szerkesztése Könyvjelző neve diff --git a/android/res/values-in/strings.xml b/android/res/values-in/strings.xml index a40eb6ca59..7829c604a7 100644 --- a/android/res/values-in/strings.xml +++ b/android/res/values-in/strings.xml @@ -861,7 +861,7 @@ mnt Deskripsi Lainnya - Pesan + Pesan Hubungi Edit Bookmark Nama Bookmark diff --git a/android/res/values-it/strings.xml b/android/res/values-it/strings.xml index 85092082bb..549b48fb53 100644 --- a/android/res/values-it/strings.xml +++ b/android/res/values-it/strings.xml @@ -861,7 +861,7 @@ min Descrizione Altro - Prenota + Prenota Chiama Modifica segnalibro Nome segnalibro diff --git a/android/res/values-ja/strings.xml b/android/res/values-ja/strings.xml index 51688a48bd..bc8a43eed0 100644 --- a/android/res/values-ja/strings.xml +++ b/android/res/values-ja/strings.xml @@ -861,7 +861,7 @@ 説明 さらに詳しく - 予約 + 予約 コール ブックマークを編集 ブックマーク名 diff --git a/android/res/values-ko/strings.xml b/android/res/values-ko/strings.xml index 01009a0fab..3d85a9fd94 100644 --- a/android/res/values-ko/strings.xml +++ b/android/res/values-ko/strings.xml @@ -858,7 +858,7 @@ min 설명 자세히 - 예약 + 예약 전화 즐겨찾기 편집 즐겨찾기 이름 diff --git a/android/res/values-nb/strings.xml b/android/res/values-nb/strings.xml index 79a11af2fb..b5431626da 100644 --- a/android/res/values-nb/strings.xml +++ b/android/res/values-nb/strings.xml @@ -860,7 +860,7 @@ min Beskrivelse Mer - Bestill + Bestill Ring Rediger bokmerke Bokmerkenavn diff --git a/android/res/values-nl/strings.xml b/android/res/values-nl/strings.xml index 864332fd34..b7ef6b6d5f 100644 --- a/android/res/values-nl/strings.xml +++ b/android/res/values-nl/strings.xml @@ -862,7 +862,7 @@ min Beschrijving Meer - Boeken + Boeken Bellen Bladwijzer bewerken Bladwijzernaam diff --git a/android/res/values-pl/strings.xml b/android/res/values-pl/strings.xml index 292a06ffe6..549c09f27b 100644 --- a/android/res/values-pl/strings.xml +++ b/android/res/values-pl/strings.xml @@ -869,7 +869,7 @@ min Opis Więcej - Zarezerwuj + Zarezerwuj Zadzwoń Edytuj zakładkę Nazwa zakładki diff --git a/android/res/values-pt/strings.xml b/android/res/values-pt/strings.xml index bbc2e6287b..8ff49efe2f 100644 --- a/android/res/values-pt/strings.xml +++ b/android/res/values-pt/strings.xml @@ -861,7 +861,7 @@ min Descrição Mais - Livro + Livro Chamada Editar marcador Nome do marcador diff --git a/android/res/values-ro/strings.xml b/android/res/values-ro/strings.xml index 4613f70567..04479f0063 100644 --- a/android/res/values-ro/strings.xml +++ b/android/res/values-ro/strings.xml @@ -858,7 +858,7 @@ min Descriere Mai multe - Rezervare + Rezervare Apel Editare marcaj Nume marcaj diff --git a/android/res/values-ru/strings.xml b/android/res/values-ru/strings.xml index 89f73ee115..1f305964b3 100644 --- a/android/res/values-ru/strings.xml +++ b/android/res/values-ru/strings.xml @@ -881,7 +881,7 @@ Описание Ещё Ещё отзывы - Забронировать + Забронировать Позвонить Редактировать метку Название метки diff --git a/android/res/values-sk/strings.xml b/android/res/values-sk/strings.xml index b3b3b9f89e..95585d1add 100644 --- a/android/res/values-sk/strings.xml +++ b/android/res/values-sk/strings.xml @@ -865,7 +865,7 @@ min Popis Viac - Rezervovať + Rezervovať Zavolať Upraviť záložku Názov záložky diff --git a/android/res/values-sv/strings.xml b/android/res/values-sv/strings.xml index f1008bddc8..6870ac6d10 100644 --- a/android/res/values-sv/strings.xml +++ b/android/res/values-sv/strings.xml @@ -866,7 +866,7 @@ min Beskrivning Mer - Boka + Boka Ring Redigera bokmärke Namn bokmärke diff --git a/android/res/values-th/strings.xml b/android/res/values-th/strings.xml index 66bda98cbe..f13081e555 100644 --- a/android/res/values-th/strings.xml +++ b/android/res/values-th/strings.xml @@ -868,7 +868,7 @@ น. คำอธิบาย เพิ่มเติม - จอง + จอง โทร แก้ไข Bookmark ชื่อของ Bookmark diff --git a/android/res/values-tr/strings.xml b/android/res/values-tr/strings.xml index e53d8a0013..532a52903c 100644 --- a/android/res/values-tr/strings.xml +++ b/android/res/values-tr/strings.xml @@ -868,7 +868,7 @@ dk Açıklama Diğer - Rezervasyon + Rezervasyon Çağrı Yer İmini Düzenle Yer İmi Adı diff --git a/android/res/values-uk/strings.xml b/android/res/values-uk/strings.xml index 11f03e2996..fc8290357a 100644 --- a/android/res/values-uk/strings.xml +++ b/android/res/values-uk/strings.xml @@ -866,7 +866,7 @@ хв Опис Ще - Забронювати + Забронювати Подзвонити Редагувати мiтку Назва мiтки diff --git a/android/res/values-vi/strings.xml b/android/res/values-vi/strings.xml index f7a949615a..64ba555112 100644 --- a/android/res/values-vi/strings.xml +++ b/android/res/values-vi/strings.xml @@ -862,7 +862,7 @@ phút Mô tả Bổ sung - Đặt trước + Đặt trước Gọi Sửa Dấu Trang Tên Dấu Trang diff --git a/android/res/values-zh-rTW/strings.xml b/android/res/values-zh-rTW/strings.xml index 79b1938e8a..73e1ac9494 100644 --- a/android/res/values-zh-rTW/strings.xml +++ b/android/res/values-zh-rTW/strings.xml @@ -874,7 +874,7 @@ 分鐘 說明 更多 - 預約 + 預約 呼叫 編輯書籤 書籤名稱 diff --git a/android/res/values-zh/strings.xml b/android/res/values-zh/strings.xml index db7e231f50..0938b6292c 100644 --- a/android/res/values-zh/strings.xml +++ b/android/res/values-zh/strings.xml @@ -868,7 +868,7 @@ 分鐘 说明 更多 - 预約 + 预約 呼叫 编辑书签 书签名称 diff --git a/android/res/values/colors.xml b/android/res/values/colors.xml index 0e9f2bfe07..b383e9f656 100644 --- a/android/res/values/colors.xml +++ b/android/res/values/colors.xml @@ -141,5 +141,7 @@ #FF19457D #FF1B549E + #FFDA3743 + #FFFC5965 diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index b5b3538358..88981bb6da 100644 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -885,7 +885,7 @@ Description More More Reviews - Book + Book Call Edit Bookmark Bookmark Name diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java index 3b0500e7f9..9bfcac22b7 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java @@ -22,7 +22,7 @@ import com.mapswithme.maps.bookmarks.data.BookmarkCategory; import com.mapswithme.maps.bookmarks.data.BookmarkManager; import com.mapswithme.maps.bookmarks.data.Track; import com.mapswithme.maps.widget.placepage.EditBookmarkFragment; -import com.mapswithme.maps.widget.placepage.SponsoredHotel; +import com.mapswithme.maps.widget.placepage.Sponsored; import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.sharing.ShareOption; import com.mapswithme.util.sharing.SharingHelper; @@ -162,15 +162,15 @@ public class BookmarksListFragment extends BaseMwmListFragment switch (menuItem.getItemId()) { case R.id.share_message: - ShareOption.SMS.shareMapObject(getActivity(), item, SponsoredHotel.nativeGetCurrent()); + ShareOption.SMS.shareMapObject(getActivity(), item, Sponsored.nativeGetCurrent()); break; case R.id.share_email: - ShareOption.EMAIL.shareMapObject(getActivity(), item, SponsoredHotel.nativeGetCurrent()); + ShareOption.EMAIL.shareMapObject(getActivity(), item, Sponsored.nativeGetCurrent()); break; case R.id.share: - ShareOption.ANY.shareMapObject(getActivity(), item, SponsoredHotel.nativeGetCurrent()); + ShareOption.ANY.shareMapObject(getActivity(), item, Sponsored.nativeGetCurrent()); break; case R.id.edit: diff --git a/android/src/com/mapswithme/maps/widget/placepage/FacilitiesAdapter.java b/android/src/com/mapswithme/maps/widget/placepage/FacilitiesAdapter.java index 3a5aa72e7e..220cde2007 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/FacilitiesAdapter.java +++ b/android/src/com/mapswithme/maps/widget/placepage/FacilitiesAdapter.java @@ -18,7 +18,7 @@ class FacilitiesAdapter extends BaseAdapter static final int MAX_COUNT = 6; @NonNull - private List mItems = new ArrayList<>(); + private List mItems = new ArrayList<>(); private boolean isShowAll = false; @Override @@ -64,7 +64,7 @@ class FacilitiesAdapter extends BaseAdapter return convertView; } - public void setItems(@NonNull List items) + public void setItems(@NonNull List items) { this.mItems = items; notifyDataSetChanged(); @@ -87,7 +87,7 @@ class FacilitiesAdapter extends BaseAdapter mName = (TextView) view.findViewById(R.id.tv__facility); } - public void bind(SponsoredHotel.FacilityType facility) + public void bind(Sponsored.FacilityType facility) { // TODO map facility key to image resource id mIcon.setImageResource(R.drawable.ic_entrance); diff --git a/android/src/com/mapswithme/maps/widget/placepage/NearbyAdapter.java b/android/src/com/mapswithme/maps/widget/placepage/NearbyAdapter.java index 97bdca8995..7772cd9d32 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/NearbyAdapter.java +++ b/android/src/com/mapswithme/maps/widget/placepage/NearbyAdapter.java @@ -19,7 +19,7 @@ import java.util.List; class NearbyAdapter extends BaseAdapter { @NonNull - private List mItems = new ArrayList<>(); + private List mItems = new ArrayList<>(); @Nullable private final OnItemClickListener mListener; @@ -30,7 +30,7 @@ class NearbyAdapter extends BaseAdapter interface OnItemClickListener { - void onItemClick(@NonNull SponsoredHotel.NearbyObject item); + void onItemClick(@NonNull Sponsored.NearbyObject item); } @Override @@ -71,7 +71,7 @@ class NearbyAdapter extends BaseAdapter return convertView; } - public void setItems(@NonNull List items) + public void setItems(@NonNull List items) { this.mItems = items; notifyDataSetChanged(); @@ -90,7 +90,7 @@ class NearbyAdapter extends BaseAdapter @NonNull TextView mDistance; @Nullable - SponsoredHotel.NearbyObject mItem; + Sponsored.NearbyObject mItem; public ViewHolder(View view, @Nullable OnItemClickListener listener) { @@ -109,7 +109,7 @@ class NearbyAdapter extends BaseAdapter mListener.onItemClick(mItem); } - public void bind(@NonNull SponsoredHotel.NearbyObject item) + public void bind(@NonNull Sponsored.NearbyObject item) { mItem = item; String packageName = mType.getContext().getPackageName(); diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java index bb4160330e..2ad4d585fb 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageButtons.java @@ -37,7 +37,7 @@ final class PlacePageButtons @Override int getTitle() { - return R.string.bookingcom_book_button; + return R.string.book_button; } @Override @@ -47,6 +47,21 @@ final class PlacePageButtons } }, + OPENTABLE + { + @Override + int getTitle() + { + return R.string.book_button; + } + + @Override + int getIcon() + { + return R.drawable.ic_opentable; + } + }, + BACK { @Override diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index 9e00e9897d..6c7b313c7e 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -88,8 +88,8 @@ import java.util.Map; public class PlacePageView extends RelativeLayout implements View.OnClickListener, View.OnLongClickListener, - SponsoredHotel.OnPriceReceivedListener, - SponsoredHotel.OnInfoReceivedListener, + Sponsored.OnPriceReceivedListener, + Sponsored.OnHotelInfoReceivedListener, LineCountTextView.OnLineCountCalculatedListener, RecyclerClickListener, NearbyAdapter.OnItemClickListener @@ -110,9 +110,9 @@ public class PlacePageView extends RelativeLayout private ArrowView mAvDirection; private TextView mTvDistance; private TextView mTvAddress; - private View mHotelInfo; - private TextView mTvHotelRating; - private TextView mTvHotelPrice; + private View mSponsoredInfo; + private TextView mTvSponsoredRating; + private TextView mTvSponsoredPrice; // Details. private ScrollView mDetails; private View mPhone; @@ -164,8 +164,8 @@ public class PlacePageView extends RelativeLayout private MwmActivity.LeftAnimationTrackListener mLeftAnimationTrackListener; // Data private MapObject mMapObject; - private SponsoredHotel mSponsoredHotel; - private String mSponsoredHotelPrice; + private Sponsored mSponsored; + private String mSponsoredPrice; private boolean mIsLatLonDms; @NonNull private final FacilitiesAdapter mFacilitiesAdapter = new FacilitiesAdapter(); @@ -265,9 +265,9 @@ public class PlacePageView extends RelativeLayout mTvAddress = (TextView) mPreview.findViewById(R.id.tv__address); - mHotelInfo = mPreview.findViewById(R.id.hotel_info_frame); - mTvHotelRating = (TextView) mHotelInfo.findViewById(R.id.tv__hotel_rating); - mTvHotelPrice = (TextView) mHotelInfo.findViewById(R.id.tv__hotel_price); + mSponsoredInfo = mPreview.findViewById(R.id.hotel_info_frame); + mTvSponsoredRating = (TextView) mSponsoredInfo.findViewById(R.id.tv__hotel_rating); + mTvSponsoredPrice = (TextView) mSponsoredInfo.findViewById(R.id.tv__hotel_price); mDetails = (ScrollView) findViewById(R.id.pp__details); RelativeLayout address = (RelativeLayout) mDetails.findViewById(R.id.ll__place_name); @@ -341,6 +341,11 @@ public class PlacePageView extends RelativeLayout color = Color.WHITE; break; + case OPENTABLE: + frame.setBackgroundResource(R.drawable.button_opentable); + color = Color.WHITE; + break; + case BOOKMARK: mBookmarkButtonIcon = icon; updateButtons(); @@ -370,7 +375,7 @@ public class PlacePageView extends RelativeLayout case SHARE: Statistics.INSTANCE.trackEvent(Statistics.EventName.PP_SHARE); AlohaHelper.logClick(AlohaHelper.PP_SHARE); - ShareOption.ANY.shareMapObject(getActivity(), mMapObject, mSponsoredHotel); + ShareOption.ANY.shareMapObject(getActivity(), mMapObject, mSponsored); break; case BACK: @@ -404,7 +409,8 @@ public class PlacePageView extends RelativeLayout break; case BOOKING: - onBookingClick(true /* book */); + case OPENTABLE: + onSponsoredClick(true /* book */); break; } } @@ -455,8 +461,8 @@ public class PlacePageView extends RelativeLayout if (UiUtils.isLandscape(getContext())) mDetails.setBackgroundResource(0); - SponsoredHotel.setPriceListener(this); - SponsoredHotel.setInfoListener(this); + Sponsored.setPriceListener(this); + Sponsored.setInfoListener(this); } private void initHotelRatingView() @@ -512,7 +518,7 @@ public class PlacePageView extends RelativeLayout public void onPriceReceived(@NonNull String id, @NonNull String price, @NonNull String currencyCode) { - if (mSponsoredHotel == null || !TextUtils.equals(id, mSponsoredHotel.getId())) + if (mSponsored == null || !TextUtils.equals(id, mSponsored.getId())) return; String text; @@ -525,14 +531,14 @@ public class PlacePageView extends RelativeLayout text = (price + " " + currencyCode); } - mSponsoredHotelPrice = getContext().getString(R.string.place_page_starting_from, text); + mSponsoredPrice = getContext().getString(R.string.place_page_starting_from, text); refreshPreview(); } @Override - public void onInfoReceived(@NonNull String id, @NonNull SponsoredHotel.HotelInfo info) + public void onHotelInfoReceived(@NonNull String id, @NonNull Sponsored.HotelInfo info) { - if (mSponsoredHotel == null || !TextUtils.equals(id, mSponsoredHotel.getId())) + if (mSponsored == null || !TextUtils.equals(id, mSponsored.getId())) return; updateHotelDetails(info); @@ -542,7 +548,7 @@ public class PlacePageView extends RelativeLayout updateHotelRating(info); } - private void updateHotelRating(@NonNull SponsoredHotel.HotelInfo info) + private void updateHotelRating(@NonNull Sponsored.HotelInfo info) { if (info.mReviews == null || info.mReviews.length == 0) { @@ -552,13 +558,13 @@ public class PlacePageView extends RelativeLayout { UiUtils.show(mHotelReview); mReviewAdapter.setItems(new ArrayList<>(Arrays.asList(info.mReviews))); - mHotelRating.setText(mSponsoredHotel.mRating); + mHotelRating.setText(mSponsored.mRating); mHotelRatingBase.setText(getResources().getQuantityString(R.plurals.place_page_booking_rating_base, info.mReviews.length, info.mReviews.length)); } } - private void updateHotelNearby(@NonNull SponsoredHotel.HotelInfo info) + private void updateHotelNearby(@NonNull Sponsored.HotelInfo info) { if (info.mNearby == null || info.mNearby.length == 0) { @@ -571,7 +577,7 @@ public class PlacePageView extends RelativeLayout } } - private void updateHotelGallery(@NonNull SponsoredHotel.HotelInfo info) + private void updateHotelGallery(@NonNull Sponsored.HotelInfo info) { if (info.mPhotos == null || info.mPhotos.length == 0) { @@ -585,7 +591,7 @@ public class PlacePageView extends RelativeLayout } } - private void updateHotelFacilities(@NonNull SponsoredHotel.HotelInfo info) + private void updateHotelFacilities(@NonNull Sponsored.HotelInfo info) { if (info.mFacilities == null || info.mFacilities.length == 0) { @@ -601,7 +607,7 @@ public class PlacePageView extends RelativeLayout } } - private void updateHotelDetails(@NonNull SponsoredHotel.HotelInfo info) + private void updateHotelDetails(@NonNull Sponsored.HotelInfo info) { mTvHotelDescription.setMaxLines(getResources().getInteger(R.integer.pp_hotel_description_lines)); refreshMetadataOrHide(info.mDescription, mHotelDescription, mTvHotelDescription); @@ -628,47 +634,71 @@ public class PlacePageView extends RelativeLayout } @Override - public void onItemClick(@NonNull SponsoredHotel.NearbyObject item) + public void onItemClick(@NonNull Sponsored.NearbyObject item) { // TODO go to selected object on map } - private void onBookingClick(final boolean book) + private void onSponsoredClick(final boolean book) { // TODO (trashkalmar): Set correct text - Utils.checkConnection(getActivity(), R.string.common_check_internet_connection_dialog, new Utils.Proc() - { - @Override - public void invoke(Boolean result) - { - if (!result) - return; + Utils.checkConnection( + getActivity(), R.string.common_check_internet_connection_dialog, new Utils.Proc() { + @Override + public void invoke(Boolean result) + { + if (!result) + return; - SponsoredHotel info = mSponsoredHotel; - if (info == null) - return; + Sponsored info = mSponsored; + if (info == null) + return; - Map params = new HashMap<>(); - params.put("provider", "Booking.Com"); - params.put("hotel_lat", (mMapObject == null ? "N/A" : String.valueOf(mMapObject.getLat()))); - params.put("hotel_lon", (mMapObject == null ? "N/A" : String.valueOf(mMapObject.getLon()))); - params.put("hotel", info.getId()); + String event = null; + Map params = new HashMap<>(); + switch (info.getType()) + { + case Sponsored.TYPE_BOOKING: + params.put("provider", "Booking.Com"); + params.put("hotel_lat", + (mMapObject == null ? "N/A" : String.valueOf(mMapObject.getLat()))); + params.put("hotel_lon", + (mMapObject == null ? "N/A" : String.valueOf(mMapObject.getLon()))); + params.put("hotel", info.getId()); + event = (book ? Statistics.EventName.PP_SPONSORED_BOOK + : Statistics.EventName.PP_SPONSORED_DETAILS); + break; + case Sponsored.TYPE_GEOCHAT: + break; + case Sponsored.TYPE_OPENTABLE: + params.put("provider", "OpenTable"); + params.put("restaurant_lat", + (mMapObject == null ? "N/A" : String.valueOf(mMapObject.getLat()))); + params.put("restaurant_lon", + (mMapObject == null ? "N/A" : String.valueOf(mMapObject.getLon()))); + params.put("restaurant", info.getId()); + event = Statistics.EventName.PP_SPONSORED_OPENTABLE; + break; + case Sponsored.TYPE_NONE: + break; + } - String event = (book ? Statistics.EventName.PP_SPONSORED_BOOK - : Statistics.EventName.PP_SPONSORED_DETAILS); + if (!TextUtils.isEmpty(event)) + { + Location location = LocationHelper.INSTANCE.getLastKnownLocation(); + Statistics.INSTANCE.trackEvent(event, location, params); + } - final Location location = LocationHelper.INSTANCE.getLastKnownLocation(); - Statistics.INSTANCE.trackEvent(event, location, params); - - try - { - followUrl(book ? info.mUrlBook : info.mUrlDescription); - } catch (ActivityNotFoundException e) - { - AlohaHelper.logException(e); - } - } - }); + try + { + followUrl(book ? info.mUrl : info.mUrlDescription); + } + catch (ActivityNotFoundException e) + { + AlohaHelper.logException(e); + } + } + }); } private void init(AttributeSet attrs, int defStyleAttr) @@ -756,22 +786,23 @@ public class PlacePageView extends RelativeLayout return; mMapObject = mapObject; - mSponsoredHotel = (mMapObject == null ? null : SponsoredHotel.nativeGetCurrent()); + mSponsored = (mMapObject == null ? null : Sponsored.nativeGetCurrent()); detachCountry(); if (mMapObject != null) { - if (mSponsoredHotel != null) + if (mSponsored != null) { - mSponsoredHotel.updateId(mMapObject); - mSponsoredHotelPrice = mSponsoredHotel.mPrice; + mSponsored.updateId(mMapObject); + mSponsoredPrice = mSponsored.mPrice; Locale locale = Locale.getDefault(); Currency currency = Currency.getInstance(locale); - SponsoredHotel.requestPrice(mSponsoredHotel.getId(), currency.getCurrencyCode()); + if (mSponsored.getType() == Sponsored.TYPE_BOOKING) + Sponsored.requestPrice(mSponsored.getId(), currency.getCurrencyCode()); // TODO: remove this after booking_api.cpp will be done if (!USE_OLD_BOOKING) - SponsoredHotel.requestInfo(mSponsoredHotel.getId(), locale.toString()); + Sponsored.requestInfo(mSponsored, locale.toString()); } String country = MapManager.nativeGetSelectedCountry(); @@ -854,12 +885,12 @@ public class PlacePageView extends RelativeLayout UiUtils.hide(mAvDirection); UiUtils.setTextAndHideIfEmpty(mTvAddress, mMapObject.getAddress()); - boolean sponsored = (mSponsoredHotel != null); - UiUtils.showIf(sponsored, mHotelInfo); + boolean sponsored = (mSponsored != null && mSponsored.getType() != Sponsored.TYPE_NONE); + UiUtils.showIf(sponsored, mSponsoredInfo); if (sponsored) { - mTvHotelRating.setText(mSponsoredHotel.mRating); - UiUtils.setTextAndHideIfEmpty(mTvHotelPrice, mSponsoredHotelPrice); + UiUtils.setTextAndHideIfEmpty(mTvSponsoredRating, mSponsored.mRating); + UiUtils.setTextAndHideIfEmpty(mTvSponsoredPrice, mSponsoredPrice); } } @@ -867,7 +898,7 @@ public class PlacePageView extends RelativeLayout { refreshLatLon(); - if (mSponsoredHotel == null) + if (mSponsored == null) { final String website = mMapObject.getMetadata(Metadata.MetadataType.FMD_WEBSITE); refreshMetadataOrHide(TextUtils.isEmpty(website) ? mMapObject.getMetadata(Metadata.MetadataType.FMD_URL) : website, mWebsite, mTvWebsite); @@ -885,6 +916,9 @@ public class PlacePageView extends RelativeLayout // TODO: remove this after booking_api.cpp will be done if (!USE_OLD_BOOKING) UiUtils.hide(mHotelMore); + + if (mSponsored.getType() != Sponsored.TYPE_BOOKING) + UiUtils.hide(mHotelMore); } refreshMetadataOrHide(mMapObject.getMetadata(Metadata.MetadataType.FMD_PHONE_NUMBER), mPhone, mTvPhone); @@ -989,8 +1023,22 @@ public class PlacePageView extends RelativeLayout if (showBackButton || ParsedMwmRequest.isPickPointMode()) buttons.add(PlacePageButtons.Item.BACK); - if (mSponsoredHotel != null) - buttons.add(PlacePageButtons.Item.BOOKING); + if (mSponsored != null) + { + switch (mSponsored.getType()) + { + case Sponsored.TYPE_BOOKING: + buttons.add(PlacePageButtons.Item.BOOKING); + break; + case Sponsored.TYPE_GEOCHAT: + break; + case Sponsored.TYPE_OPENTABLE: + buttons.add(PlacePageButtons.Item.OPENTABLE); + break; + case Sponsored.TYPE_NONE: + break; + } + } buttons.add(PlacePageButtons.Item.BOOKMARK); @@ -1135,7 +1183,7 @@ public class PlacePageView extends RelativeLayout addPlace(); break; case R.id.ll__more: - onBookingClick(false /* book */); + onSponsoredClick(false /* book */); break; case R.id.ll__place_latlon: mIsLatLonDms = !mIsLatLonDms; @@ -1185,8 +1233,8 @@ public class PlacePageView extends RelativeLayout break; case R.id.tv__place_hotel_reviews_more: ReviewActivity.start(getContext(), mReviewAdapter.getItems(), mMapObject.getTitle(), - mSponsoredHotel.mRating, mReviewAdapter.getItems() - .size(), mSponsoredHotel.mUrlBook); + mSponsored.mRating, mReviewAdapter.getItems() + .size(), mSponsored.mUrl); break; } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/SponsoredHotel.java b/android/src/com/mapswithme/maps/widget/placepage/Sponsored.java similarity index 72% rename from android/src/com/mapswithme/maps/widget/placepage/SponsoredHotel.java rename to android/src/com/mapswithme/maps/widget/placepage/Sponsored.java index 1ef4c46d28..61296a9dce 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/SponsoredHotel.java +++ b/android/src/com/mapswithme/maps/widget/placepage/Sponsored.java @@ -1,5 +1,6 @@ package com.mapswithme.maps.widget.placepage; +import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.UiThread; @@ -10,13 +11,24 @@ import com.mapswithme.maps.bookmarks.data.Metadata; import com.mapswithme.maps.gallery.Image; import com.mapswithme.maps.review.Review; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; @UiThread -public final class SponsoredHotel +public final class Sponsored { + static final int TYPE_NONE = 0; + static final int TYPE_BOOKING = 1; + static final int TYPE_OPENTABLE = 2; + static final int TYPE_GEOCHAT = 3; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({TYPE_NONE, TYPE_BOOKING, TYPE_OPENTABLE, TYPE_GEOCHAT}) + @interface SponsoredType {} + private static class Price { @NonNull @@ -146,7 +158,7 @@ public final class SponsoredHotel void onPriceReceived(@NonNull String id, @NonNull String price, @NonNull String currency); } - interface OnInfoReceivedListener + interface OnHotelInfoReceivedListener { /** * This method is called from the native core on the UI thread @@ -156,7 +168,7 @@ public final class SponsoredHotel * @param info A hotel info */ @UiThread - void onInfoReceived(@NonNull String id, @NonNull HotelInfo info); + void onHotelInfoReceived(@NonNull String id, @NonNull HotelInfo info); } // Hotel ID -> Price @@ -168,7 +180,7 @@ public final class SponsoredHotel @NonNull private static WeakReference sPriceListener = new WeakReference<>(null); @NonNull - private static WeakReference sInfoListener = new WeakReference<>(null); + private static WeakReference sInfoListener = new WeakReference<>(null); @Nullable private String mId; @@ -178,17 +190,20 @@ public final class SponsoredHotel @NonNull final String mPrice; @NonNull - final String mUrlBook; + final String mUrl; @NonNull final String mUrlDescription; + @SponsoredType + private final int mType; - public SponsoredHotel(@NonNull String rating, @NonNull String price, @NonNull String urlBook, - @NonNull String urlDescription) + public Sponsored(@NonNull String rating, @NonNull String price, @NonNull String url, + @NonNull String urlDescription, @SponsoredType int type) { mRating = rating; mPrice = price; - mUrlBook = urlBook; + mUrl = url; mUrlDescription = urlDescription; + mType = type; } void updateId(MapObject point) @@ -215,9 +230,9 @@ public final class SponsoredHotel } @NonNull - public String getUrlBook() + public String getUrl() { - return mUrlBook; + return mUrl; } @NonNull @@ -226,12 +241,18 @@ public final class SponsoredHotel return mUrlDescription; } + @SponsoredType + public int getType() + { + return mType; + } + static void setPriceListener(@NonNull OnPriceReceivedListener listener) { sPriceListener = new WeakReference<>(listener); } - static void setInfoListener(@NonNull OnInfoReceivedListener listener) + static void setInfoListener(@NonNull OnHotelInfoReceivedListener listener) { sInfoListener = new WeakReference<>(listener); } @@ -253,21 +274,44 @@ public final class SponsoredHotel nativeRequestPrice(id, currencyCode); } + + static void requestInfo(Sponsored sponsored, String locale) + { + String id = sponsored.getId(); + if (id == null) + return; + + switch (sponsored.getType()) + { + case TYPE_BOOKING: + requestHotelInfo(id, locale); + break; + case TYPE_GEOCHAT: +// TODO: request geochat info + break; + case TYPE_OPENTABLE: +// TODO: request opentable info + break; + case TYPE_NONE: + break; + } + } + /** * Make request to obtain hotel information. * This method also checks cache for requested hotel id - * and if cache exists - call {@link #onInfoReceived(String, HotelInfo) onInfoReceived} immediately + * and if cache exists - call {@link #onHotelInfoReceived(String, HotelInfo) onHotelInfoReceived} immediately * * @param id A Hotel id * @param locale A user locale */ - static void requestInfo(String id, String locale) + private static void requestHotelInfo(String id, String locale) { HotelInfo info = sInfoCache.get(id); if (info != null) - onInfoReceived(id, info); + onHotelInfoReceived(id, info); - nativeRequestInfo(id, locale); + nativeRequestHotelInfo(id, locale); } private static void onPriceReceived(@NonNull String id, @NonNull String price, @@ -284,19 +328,19 @@ public final class SponsoredHotel listener.onPriceReceived(id, price, currency); } - private static void onInfoReceived(@NonNull String id, @NonNull HotelInfo info) + private static void onHotelInfoReceived(@NonNull String id, @NonNull HotelInfo info) { sInfoCache.put(id, info); - OnInfoReceivedListener listener = sInfoListener.get(); + OnHotelInfoReceivedListener listener = sInfoListener.get(); if (listener != null) - listener.onInfoReceived(id, info); + listener.onHotelInfoReceived(id, info); } @Nullable - public static native SponsoredHotel nativeGetCurrent(); + public static native Sponsored nativeGetCurrent(); private static native void nativeRequestPrice(@NonNull String id, @NonNull String currencyCode); - private static native void nativeRequestInfo(@NonNull String id, @NonNull String locale); + private static native void nativeRequestHotelInfo(@NonNull String id, @NonNull String locale); } diff --git a/android/src/com/mapswithme/util/sharing/MapObjectShareable.java b/android/src/com/mapswithme/util/sharing/MapObjectShareable.java index de59c16923..b427e1e2f9 100644 --- a/android/src/com/mapswithme/util/sharing/MapObjectShareable.java +++ b/android/src/com/mapswithme/util/sharing/MapObjectShareable.java @@ -8,12 +8,12 @@ import android.text.TextUtils; import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; import com.mapswithme.maps.bookmarks.data.MapObject; -import com.mapswithme.maps.widget.placepage.SponsoredHotel; +import com.mapswithme.maps.widget.placepage.Sponsored; import com.mapswithme.util.statistics.Statistics; class MapObjectShareable extends BaseShareable { - MapObjectShareable(Activity context, @NonNull MapObject mapObject, @Nullable SponsoredHotel sponsoredHotel) + MapObjectShareable(Activity context, @NonNull MapObject mapObject, @Nullable Sponsored sponsored) { super(context); @@ -40,10 +40,10 @@ class MapObjectShareable extends BaseShareable lineWithBreak(mapObject.getAddress()) + lineWithBreak(ge0Url); - if (sponsoredHotel != null) + if (sponsored != null) { text += lineWithBreak(activity.getString(R.string.sharing_booking)) + - sponsoredHotel.getUrlBook(); + sponsored.getUrl(); } } diff --git a/android/src/com/mapswithme/util/sharing/ShareOption.java b/android/src/com/mapswithme/util/sharing/ShareOption.java index 7b7ce2497b..ae34b022a2 100644 --- a/android/src/com/mapswithme/util/sharing/ShareOption.java +++ b/android/src/com/mapswithme/util/sharing/ShareOption.java @@ -10,7 +10,7 @@ import android.support.annotation.StringRes; import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; import com.mapswithme.maps.bookmarks.data.MapObject; -import com.mapswithme.maps.widget.placepage.SponsoredHotel; +import com.mapswithme.maps.widget.placepage.Sponsored; import com.mapswithme.util.Utils; import com.mapswithme.util.statistics.Statistics; @@ -35,9 +35,9 @@ public abstract class ShareOption return Utils.isIntentSupported(context, mBaseIntent); } - public void shareMapObject(Activity activity, @NonNull MapObject mapObject, @Nullable SponsoredHotel sponsoredHotel) + public void shareMapObject(Activity activity, @NonNull MapObject mapObject, @Nullable Sponsored sponsored) { - SharingHelper.shareOutside(new MapObjectShareable(activity, mapObject, sponsoredHotel) + SharingHelper.shareOutside(new MapObjectShareable(activity, mapObject, sponsored) .setBaseIntent(new Intent(mBaseIntent)), mNameResId); } @@ -57,7 +57,7 @@ public abstract class ShareOption } @Override - public void shareMapObject(Activity activity, MapObject mapObject, SponsoredHotel sponsoredHotel) + public void shareMapObject(Activity activity, MapObject mapObject, Sponsored sponsored) { final String ge0Url = Framework.nativeGetGe0Url(mapObject.getLat(), mapObject.getLon(), mapObject.getScale(), ""); final String httpUrl = Framework.getHttpGe0Url(mapObject.getLat(), mapObject.getLon(), mapObject.getScale(), ""); diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index 0b77c7be9d..7cd53af5ae 100644 --- a/android/src/com/mapswithme/util/statistics/Statistics.java +++ b/android/src/com/mapswithme/util/statistics/Statistics.java @@ -70,6 +70,8 @@ public enum Statistics public static final String PP_ROUTE = "PP. Route"; public static final String PP_SPONSORED_DETAILS = "Placepage_Hotel_details"; public static final String PP_SPONSORED_BOOK = "Placepage_Hotel_book"; + public static final String PP_SPONSORED_OPENTABLE = "Placepage_Restaurant_book"; + public static final String PP_SPONSORED_NONE = "Placepage_Sponsored_none"; public static final String PP_DIRECTION_ARROW = "PP. DirectionArrow"; public static final String PP_DIRECTION_ARROW_CLOSE = "PP. DirectionArrowClose"; public static final String PP_METADATA_COPY = "PP. CopyMetadata"; diff --git a/configure.sh b/configure.sh index c764b0e5eb..973f91a1dd 100755 --- a/configure.sh +++ b/configure.sh @@ -52,6 +52,7 @@ else #define BOOKING_SECRET "" #define UBER_SERVER_TOKEN "" #define UBER_CLIENT_ID "" +#define OPENTABLE_AFFILATE_ID "" #define TRACKING_REALTIME_HOST "" #define TRACKING_REALTIME_PORT 0 #define TRACKING_HISTORICAL_HOST "" diff --git a/generator/opentable_dataset.cpp b/generator/opentable_dataset.cpp index 7892444bb0..499a2ef833 100644 --- a/generator/opentable_dataset.cpp +++ b/generator/opentable_dataset.cpp @@ -55,7 +55,6 @@ void OpentableDataset::PreprocessMatchedOsmObject(ObjectId const matchedObjId, F auto restaurant = GetObjectById(matchedObjId); auto & metadata = params.GetMetadata(); metadata.Set(feature::Metadata::FMD_SPONSORED_ID, strings::to_string(restaurant.m_id.Get())); - metadata.Set(feature::Metadata::FMD_WEBSITE, restaurant.m_descUrl); // params.AddAddress(restaurant.address); // TODO(mgsergio): addr:full ??? diff --git a/indexer/ftypes_matcher.cpp b/indexer/ftypes_matcher.cpp index dfe0a32004..59bac21c1c 100644 --- a/indexer/ftypes_matcher.cpp +++ b/indexer/ftypes_matcher.cpp @@ -476,6 +476,18 @@ IsFoodChecker const & IsFoodChecker::Instance() return instance; } +IsOpentableChecker::IsOpentableChecker() +{ + Classificator const & c = classif(); + m_types.push_back(c.GetTypeByPath({"sponsored", "opentable"})); +} + +IsOpentableChecker const & IsOpentableChecker::Instance() +{ + static IsOpentableChecker const inst; + return inst; +} + uint32_t GetPopulation(FeatureType const & ft) { uint32_t population = ft.GetPopulation(); diff --git a/indexer/ftypes_matcher.hpp b/indexer/ftypes_matcher.hpp index 17d1e77665..48d1dcfd97 100644 --- a/indexer/ftypes_matcher.hpp +++ b/indexer/ftypes_matcher.hpp @@ -184,6 +184,14 @@ public: static IsFoodChecker const & Instance(); }; +class IsOpentableChecker : public BaseChecker +{ + IsOpentableChecker(); + +public: + static IsOpentableChecker const & Instance(); +}; + /// Type of locality (do not change values and order - they have detalization order) /// COUNTRY < STATE < CITY < ... enum Type { NONE = -1, COUNTRY = 0, STATE, CITY, TOWN, VILLAGE, LOCALITY_COUNT }; diff --git a/iphone/Maps/Classes/MWMActionBarButton.h b/iphone/Maps/Classes/MWMActionBarButton.h index b03175c775..5b5b56befd 100644 --- a/iphone/Maps/Classes/MWMActionBarButton.h +++ b/iphone/Maps/Classes/MWMActionBarButton.h @@ -2,6 +2,7 @@ enum class EButton // Required button's order { Api, Booking, + Opentable, Call, Bookmark, RouteFrom, diff --git a/iphone/Maps/Classes/MWMActionBarButton.mm b/iphone/Maps/Classes/MWMActionBarButton.mm index 1362d6b1ec..a34b9e242a 100644 --- a/iphone/Maps/Classes/MWMActionBarButton.mm +++ b/iphone/Maps/Classes/MWMActionBarButton.mm @@ -10,6 +10,7 @@ NSString * titleForButton(EButton type, BOOL isSelected) case EButton::Api: return L(@"back"); case EButton::Booking: + case EButton::Opentable: return L(@"bookingcom_book_button"); case EButton::Call: return L(@"placepage_call_button"); @@ -60,6 +61,11 @@ NSString * titleForButton(EButton type, BOOL isSelected) self.label.textColor = [UIColor whiteColor]; self.backgroundColor = [UIColor bookingBackground]; break; + case EButton::Opentable: + [self.button setImage:[UIImage imageNamed:@"ic_opentable"] forState:UIControlStateNormal]; + self.label.textColor = [UIColor whiteColor]; + self.backgroundColor = [UIColor opentableBackground]; + break; case EButton::Call: [self.button setImage:[UIImage imageNamed:@"ic_placepage_phone_number"] forState:UIControlStateNormal]; break; diff --git a/iphone/Maps/Classes/MWMPlacePageActionBar.h b/iphone/Maps/Classes/MWMPlacePageActionBar.h index 20c9cf9c11..599099a1d2 100644 --- a/iphone/Maps/Classes/MWMPlacePageActionBar.h +++ b/iphone/Maps/Classes/MWMPlacePageActionBar.h @@ -4,6 +4,7 @@ @protocol MWMActionBarSharedData - (BOOL)isBookmark; +- (BOOL)isOpentable; - (BOOL)isBooking; - (BOOL)isApi; - (BOOL)isMyPosition; diff --git a/iphone/Maps/Classes/MWMPlacePageActionBar.mm b/iphone/Maps/Classes/MWMPlacePageActionBar.mm index f18a1c5a18..992f3c5af6 100644 --- a/iphone/Maps/Classes/MWMPlacePageActionBar.mm +++ b/iphone/Maps/Classes/MWMPlacePageActionBar.mm @@ -77,11 +77,15 @@ extern NSString * const kAlohalyticsTapEventKey; BOOL const isIphone = [[UIDevice currentDevice].model isEqualToString:@"iPhone"]; BOOL const isPhoneNotEmpty = phone.length > 0; BOOL const isBooking = data.isBooking; + BOOL const isOpentable = data.isOpentable; + BOOL const isSponsored = isBooking || isOpentable; BOOL const itHasPhoneNumber = isIphone && isPhoneNotEmpty; BOOL const isApi = data.isApi; BOOL const isP2P = self.isPrepareRouteMode; BOOL const isMyPosition = data.isMyPosition; + EButton const sponsoredButton = isBooking ? EButton::Booking : EButton::Opentable; + if (isMyPosition) { m_visibleButtons.push_back(EButton::Spacer); @@ -89,10 +93,10 @@ extern NSString * const kAlohalyticsTapEventKey; m_visibleButtons.push_back(EButton::Share); m_visibleButtons.push_back(EButton::Spacer); } - else if (isApi && isBooking) + else if (isApi && isSponsored) { m_visibleButtons.push_back(EButton::Api); - m_visibleButtons.push_back(EButton::Booking); + m_visibleButtons.push_back(sponsoredButton); m_additionalButtons.push_back(EButton::Bookmark); m_additionalButtons.push_back(EButton::RouteFrom); m_additionalButtons.push_back(EButton::Share); @@ -119,11 +123,11 @@ extern NSString * const kAlohalyticsTapEventKey; m_additionalButtons.push_back(EButton::RouteFrom); m_additionalButtons.push_back(EButton::Share); } - else if (isBooking && isP2P) + else if (isSponsored && isP2P) { m_visibleButtons.push_back(EButton::Bookmark); m_visibleButtons.push_back(EButton::RouteFrom); - m_additionalButtons.push_back(EButton::Booking); + m_additionalButtons.push_back(sponsoredButton); m_additionalButtons.push_back(EButton::Share); } else if (itHasPhoneNumber && isP2P) @@ -133,9 +137,9 @@ extern NSString * const kAlohalyticsTapEventKey; m_additionalButtons.push_back(EButton::Call); m_additionalButtons.push_back(EButton::Share); } - else if (isBooking) + else if (isSponsored) { - m_visibleButtons.push_back(EButton::Booking); + m_visibleButtons.push_back(sponsoredButton); m_visibleButtons.push_back(EButton::Bookmark); m_additionalButtons.push_back(EButton::RouteFrom); m_additionalButtons.push_back(EButton::Share); @@ -191,6 +195,7 @@ extern NSString * const kAlohalyticsTapEventKey; switch (type) { case EButton::Api: [delegate apiBack]; break; + case EButton::Opentable: case EButton::Booking: [delegate book:NO]; break; case EButton::Call: [delegate call]; break; case EButton::Bookmark: diff --git a/iphone/Maps/Classes/MWMPlacePageData.h b/iphone/Maps/Classes/MWMPlacePageData.h index e1a7ee0c9b..de0d5a0837 100644 --- a/iphone/Maps/Classes/MWMPlacePageData.h +++ b/iphone/Maps/Classes/MWMPlacePageData.h @@ -64,9 +64,9 @@ enum class OpeningHours // Booking - (NSString *)bookingRating; - (NSString *)bookingApproximatePricing; -- (NSURL *)bookingURL; -- (NSURL *)bookingDescriptionURL; -- (NSString *)hotelId; +- (NSURL *)sponsoredURL; +- (NSURL *)sponsoredDescriptionURL; +- (NSString *)sponsoredId; - (void)assignOnlinePriceToLabel:(UILabel *)label; // API @@ -92,6 +92,7 @@ enum class OpeningHours - (BOOL)isBookmark; - (BOOL)isApi; - (BOOL)isBooking; +- (BOOL)isOpentable; - (BOOL)isHTMLDescription; - (BOOL)isMyPosition; diff --git a/iphone/Maps/Classes/MWMPlacePageData.mm b/iphone/Maps/Classes/MWMPlacePageData.mm index 223ee7693d..b323d98c88 100644 --- a/iphone/Maps/Classes/MWMPlacePageData.mm +++ b/iphone/Maps/Classes/MWMPlacePageData.mm @@ -53,7 +53,7 @@ using namespace place_page; // There is at least one of these buttons. if (m_info.ShouldShowAddPlace() || m_info.ShouldShowEditPlace() || - m_info.ShouldShowAddBusiness() || m_info.IsSponsoredHotel()) + m_info.ShouldShowAddBusiness() || m_info.IsSponsored()) { m_sections.push_back(Sections::Buttons); [self fillButtonsSection]; @@ -97,7 +97,7 @@ using namespace place_page; - (void)fillButtonsSection { // We don't have to show edit, add place or business if it's booking object. - if (m_info.IsSponsoredHotel()) + if (self.isBooking) { m_buttonsRows.push_back(ButtonsRows::HotelDescription); return; @@ -177,30 +177,30 @@ using namespace place_page; - (NSString *)bookingRating { - return m_info.IsSponsoredHotel() ? @(m_info.GetRatingFormatted().c_str()) : nil; + return self.isBooking ? @(m_info.GetRatingFormatted().c_str()) : nil; } - (NSString *)bookingApproximatePricing { - return m_info.IsSponsoredHotel() ? @(m_info.GetApproximatePricing().c_str()) : nil; + return self.isBooking ? @(m_info.GetApproximatePricing().c_str()) : nil; } -- (NSURL *)bookingURL +- (NSURL *)sponsoredURL { - return m_info.IsSponsoredHotel() ? [NSURL URLWithString:@(m_info.m_sponsoredBookingUrl.c_str())] + return m_info.IsSponsored() ? [NSURL URLWithString:@(m_info.GetSponsoredUrl().c_str())] : nil; } -- (NSURL *)bookingDescriptionURL +- (NSURL *)sponsoredDescriptionURL { - return m_info.IsSponsoredHotel() - ? [NSURL URLWithString:@(m_info.m_sponsoredDescriptionUrl.c_str())] + return m_info.IsSponsored() + ? [NSURL URLWithString:@(m_info.GetSponsoredDescriptionUrl().c_str())] : nil; } -- (NSString *)hotelId +- (NSString *)sponsoredId { - return m_info.IsSponsoredHotel() + return m_info.IsSponsored() ? @(m_info.GetMetadata().Get(feature::Metadata::FMD_SPONSORED_ID).c_str()) : nil; } @@ -208,7 +208,7 @@ using namespace place_page; - (void)assignOnlinePriceToLabel:(UILabel *)label { // TODO(Vlad): Remove similar code from MWMPlacePageEntity.mm when new iPAD place page will be finished. - NSAssert(m_info.IsSponsoredHotel(), @"Online price must be assigned to booking object!"); + NSAssert(self.isBooking, @"Online price must be assigned to booking object!"); if (Platform::ConnectionStatus() == Platform::EConnectionType::CONNECTION_NONE) return; @@ -247,7 +247,7 @@ using namespace place_page; }); }; - api.GetMinPrice(self.hotelId.UTF8String, currency, func); + api.GetMinPrice(self.sponsoredId.UTF8String, currency, func); } - (NSString *)address { return @(m_info.GetAddress().c_str()); } @@ -310,7 +310,8 @@ using namespace place_page; - (NSString *)phoneNumber { return @(m_info.GetPhone().c_str()); } - (BOOL)isBookmark { return m_info.IsBookmark(); } - (BOOL)isApi { return m_info.HasApiUrl(); } -- (BOOL)isBooking { return m_info.IsSponsoredHotel(); } +- (BOOL)isBooking { return m_info.m_sponsoredType == SponsoredType::Booking; } +- (BOOL)isOpentable { return m_info.m_sponsoredType == SponsoredType::Opentable; } - (BOOL)isMyPosition { return m_info.IsMyPosition(); } - (BOOL)isHTMLDescription { return strings::IsHTML(m_info.m_bookmarkDescription); } diff --git a/iphone/Maps/Classes/MWMPlacePageEntity.h b/iphone/Maps/Classes/MWMPlacePageEntity.h index 3f538c04b2..ade028658d 100644 --- a/iphone/Maps/Classes/MWMPlacePageEntity.h +++ b/iphone/Maps/Classes/MWMPlacePageEntity.h @@ -61,12 +61,13 @@ using MWMPlacePageCellTypeValueMap = map; - (BOOL)isBookmark; - (BOOL)isApi; - (BOOL)isBooking; +- (BOOL)isOpentable; - (ms::LatLon)latLon; - (m2::PointD const &)mercator; - (NSString *)apiURL; -- (NSURL *)bookingURL; -- (NSURL *)bookingDescriptionURL; -- (NSString * )hotelId; +- (NSURL *)sponsoredURL; +- (NSURL *)sponsoredDescriptionURL; +- (NSString *)sponsoredId; - (NSString *)phoneNumber; - (string)titleForNewBookmark; diff --git a/iphone/Maps/Classes/MWMPlacePageEntity.mm b/iphone/Maps/Classes/MWMPlacePageEntity.mm index 16bc21df9c..aadc989775 100644 --- a/iphone/Maps/Classes/MWMPlacePageEntity.mm +++ b/iphone/Maps/Classes/MWMPlacePageEntity.mm @@ -200,9 +200,9 @@ void initFieldsMap() case MWMPlacePageCellTypeAddBusinessButton: return navigationIsHidden && m_info.ShouldShowAddBusiness() ? @"" : nil; case MWMPlacePageCellTypeWebsite: - return m_info.IsSponsoredHotel() ? nil : [self getDefaultField:cellType]; + return self.isBooking ? nil : [self getDefaultField:cellType]; case MWMPlacePageCellTypeBookingMore: - return m_info.IsSponsoredHotel() ? @(m_info.GetSponsoredDescriptionUrl().c_str()) : nil; + return self.isBooking ? @(m_info.GetSponsoredDescriptionUrl().c_str()) : nil; default: return [self getDefaultField:cellType]; } } @@ -214,12 +214,12 @@ void initFieldsMap() return haveField ? @(it->second.c_str()) : nil; } -- (NSURL *)bookingURL { return [self sponsoredUrl:NO]; } -- (NSURL *)bookingDescriptionURL { return [self sponsoredUrl:YES]; } +- (NSURL *)sponsoredURL { return [self sponsoredUrl:NO]; } +- (NSURL *)sponsoredDescriptionURL { return [self sponsoredUrl:YES]; } - (NSURL *)sponsoredUrl:(BOOL)isDescription { auto const & url = - isDescription ? m_info.GetSponsoredDescriptionUrl() : m_info.GetSponsoredBookingUrl(); + isDescription ? m_info.GetSponsoredDescriptionUrl() : m_info.GetSponsoredUrl(); return url.empty() ? nil : [NSURL URLWithString:@(url.c_str())]; } @@ -229,10 +229,12 @@ void initFieldsMap() - (BOOL)isMyPosition { return m_info.IsMyPosition(); } - (BOOL)isBookmark { return m_info.IsBookmark(); } - (BOOL)isApi { return m_info.HasApiUrl(); } -- (BOOL)isBooking { return m_info.IsSponsoredHotel(); } -- (NSString *)hotelId +- (BOOL)isBooking { return m_info.m_sponsoredType == SponsoredType::Booking; } +- (BOOL)isOpentable { return m_info.m_sponsoredType == SponsoredType::Opentable; } +- (BOOL)isSponsored { return m_info.IsSponsored(); } +- (NSString *)sponsoredId { - return self.isBooking ? @(m_info.GetMetadata().Get(Metadata::FMD_SPONSORED_ID).c_str()) : nil; + return self.isSponsored ? @(m_info.GetMetadata().Get(Metadata::FMD_SPONSORED_ID).c_str()) : nil; } - (NSString *)phoneNumber { return [self getCellValue:MWMPlacePageCellTypePhoneNumber]; } diff --git a/iphone/Maps/Classes/MWMPlacePageManager.mm b/iphone/Maps/Classes/MWMPlacePageManager.mm index e57719c9e9..d3f508ce13 100644 --- a/iphone/Maps/Classes/MWMPlacePageManager.mm +++ b/iphone/Maps/Classes/MWMPlacePageManager.mm @@ -247,19 +247,34 @@ - (void)editBookmark { [[MapViewController controller] openBookmarkEditorWithData:self.data]; } - (void)book:(BOOL)isDescription { - NSMutableDictionary * stat = [@{ kStatProvider : kStatBooking } mutableCopy]; + // TODO(Vlad): remove the same code from MWMPlacePageViewManager.mm MWMPlacePageData * data = self.data; + BOOL const isBooking = data.isBooking; auto const & latLon = data.latLon; - stat[kStatHotel] = data.hotelId; - stat[kStatHotelLat] = @(latLon.lat); - stat[kStatHotelLon] = @(latLon.lon); - [Statistics logEvent:isDescription ? kPlacePageHotelDetails : kPlacePageHotelBook + NSMutableDictionary * stat = [@{} mutableCopy]; + if (isBooking) + { + stat[kStatProvider] = kStatBooking; + stat[kStatHotel] = data.sponsoredId; + stat[kStatHotelLat] = @(latLon.lat); + stat[kStatHotelLon] = @(latLon.lon); + } + else + { + stat[kStatProvider] = kStatOpentable; + stat[kStatRestaurant] = data.sponsoredId; + stat[kStatRestaurantLat] = @(latLon.lat); + stat[kStatRestaurantLon] = @(latLon.lon); + } + + NSString * eventName = isBooking ? kPlacePageHotelBook : kPlacePageRestaurantBook; + [Statistics logEvent:isDescription ? kPlacePageHotelDetails : eventName withParameters:stat atLocation:[MWMLocationManager lastLocation]]; UIViewController * vc = static_cast([MapViewController controller]); - NSURL * url = isDescription ? self.data.bookingDescriptionURL : self.data.bookingURL; - NSAssert(url, @"Booking url can't be nil!"); + NSURL * url = isDescription ? self.data.sponsoredDescriptionURL : self.data.sponsoredURL; + NSAssert(url, @"Sponsored url can't be nil!"); [vc openUrl:url]; } diff --git a/iphone/Maps/Classes/MWMPlacePageViewManager.mm b/iphone/Maps/Classes/MWMPlacePageViewManager.mm index 556b8c6f09..30777c62eb 100644 --- a/iphone/Maps/Classes/MWMPlacePageViewManager.mm +++ b/iphone/Maps/Classes/MWMPlacePageViewManager.mm @@ -210,19 +210,33 @@ extern NSString * const kBookmarksChangedNotification; - (void)book:(BOOL)isDescription { - NSMutableDictionary * stat = [@{ kStatProvider : kStatBooking } mutableCopy]; - MWMPlacePageEntity * en = self.entity; - auto const & latLon = en.latLon; - stat[kStatHotel] = en.hotelId; - stat[kStatHotelLat] = @(latLon.lat); - stat[kStatHotelLon] = @(latLon.lon); - [Statistics logEvent:isDescription ? kPlacePageHotelDetails : kPlacePageHotelBook + MWMPlacePageEntity * data = self.entity; + BOOL const isBooking = data.isBooking; + auto const & latLon = data.latLon; + NSMutableDictionary * stat = [@{} mutableCopy]; + if (isBooking) + { + stat[kStatProvider] = kStatBooking; + stat[kStatHotel] = data.sponsoredId; + stat[kStatHotelLat] = @(latLon.lat); + stat[kStatHotelLon] = @(latLon.lon); + } + else + { + stat[kStatProvider] = kStatOpentable; + stat[kStatRestaurant] = data.sponsoredId; + stat[kStatRestaurantLat] = @(latLon.lat); + stat[kStatRestaurantLon] = @(latLon.lon); + } + + NSString * eventName = isBooking ? kPlacePageHotelBook : kPlacePageRestaurantBook; + [Statistics logEvent:isDescription ? kPlacePageHotelDetails : eventName withParameters:stat atLocation:[MWMLocationManager lastLocation]]; UIViewController * vc = static_cast([MapViewController controller]); - NSURL * url = isDescription ? self.entity.bookingDescriptionURL : self.entity.bookingURL; - NSAssert(url, @"Booking url can't be nil!"); + NSURL * url = isDescription ? self.entity.sponsoredDescriptionURL : self.entity.sponsoredURL; + NSAssert(url, @"Sponsored url can't be nil!"); [vc openUrl:url]; } diff --git a/iphone/Maps/Classes/Share/MWMShareActivityItem.h b/iphone/Maps/Classes/Share/MWMShareActivityItem.h index 765b2ccfcb..fd66a31d41 100644 --- a/iphone/Maps/Classes/Share/MWMShareActivityItem.h +++ b/iphone/Maps/Classes/Share/MWMShareActivityItem.h @@ -10,7 +10,7 @@ class LatLon; - (NSString *)title; - (NSString *)subtitle; - (NSString *)address; -- (NSURL *)bookingDescriptionURL; +- (NSURL *)sponsoredDescriptionURL; - (NSString *)phoneNumber; - (ms::LatLon)latLon; diff --git a/iphone/Maps/Classes/Share/MWMShareActivityItem.mm b/iphone/Maps/Classes/Share/MWMShareActivityItem.mm index 9eada7509e..a1342349e7 100644 --- a/iphone/Maps/Classes/Share/MWMShareActivityItem.mm +++ b/iphone/Maps/Classes/Share/MWMShareActivityItem.mm @@ -130,7 +130,7 @@ NSString * httpGe0Url(NSString * shortUrl) if (self.object.isBooking) { strings.push_back(L(@"sharing_booking")); - strings.push_back(self.object.bookingDescriptionURL.absoluteString); + strings.push_back(self.object.sponsoredDescriptionURL.absoluteString); } for (auto const str : strings) diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/Contents.json b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/Contents.json new file mode 100644 index 0000000000..13b56b543c --- /dev/null +++ b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_opentable.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_opentable@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_opentable@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable.png b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable.png new file mode 100644 index 0000000000..dff6aa0a92 Binary files /dev/null and b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable.png differ diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable@2x.png b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable@2x.png new file mode 100644 index 0000000000..41dbe4d427 Binary files /dev/null and b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable@2x.png differ diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable@3x.png b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable@3x.png new file mode 100644 index 0000000000..b233778da5 Binary files /dev/null and b/iphone/Maps/Images.xcassets/Place Page/ic_opentable.imageset/ic_opentable@3x.png differ diff --git a/iphone/Maps/Statistics/StatisticsStrings.h b/iphone/Maps/Statistics/StatisticsStrings.h index f73cc36415..88ad207521 100644 --- a/iphone/Maps/Statistics/StatisticsStrings.h +++ b/iphone/Maps/Statistics/StatisticsStrings.h @@ -143,6 +143,7 @@ static NSString * const kStatOff = @"Off"; static NSString * const kStatOn = @"On"; static NSString * const kStatOpen = @"Open"; static NSString * const kStatOpenActionSheet = @"Open action sheet"; +static NSString * const kStatOpentable = @"Opentable.com"; static NSString * const kStatOpenSite = @"Open site"; static NSString * const kStatOrientation = @"Orientation"; static NSString * const kStatOther = @"Other"; @@ -152,6 +153,7 @@ static NSString * const kStatPlacePage = @"Place page"; static NSString * const kPlacePageHotelBook = @"Placepage_Hotel_book"; static NSString * const kPlacePageHotelDetails = @"Placepage_Hotel_details"; static NSString * const kStatPlacePageNonBuilding = @"placepage_nonbuilding"; +static NSString * const kPlacePageRestaurantBook = @"Placepage_Restaurant_book"; static NSString * const kStatPointToPoint = @"Point to point"; static NSString * const kStatPortrait = @"Portrait"; static NSString * const kStatProblem = @"Problem"; @@ -165,6 +167,9 @@ static NSString * const kStatRegular = @"Regular"; static NSString * const kStatRemove = @"Remove"; static NSString * const kStatRename = @"Rename"; static NSString * const kStatReport = @"Report"; +static NSString * const kStatRestaurant = @"restaurant"; +static NSString * const kStatRestaurantLat = @"restaurant_lat"; +static NSString * const kStatRestaurantLon = @"restaurant_lon"; static NSString * const kStatRetry = @"retry"; static NSString * const kStatRouting = @"routing"; static NSString * const kStatSave = @"Save"; diff --git a/iphone/Maps/UIColor+MapsMeColor.h b/iphone/Maps/UIColor+MapsMeColor.h index 4a097c165d..5c0c4810b7 100644 --- a/iphone/Maps/UIColor+MapsMeColor.h +++ b/iphone/Maps/UIColor+MapsMeColor.h @@ -33,6 +33,7 @@ + (UIColor *)alertBackground; + (UIColor *)blackOpaque; + (UIColor *)bookingBackground; ++ (UIColor *)opentableBackground; + (UIColor *)colorWithName:(NSString *)colorName; diff --git a/iphone/Maps/UIColor+MapsMeColor.mm b/iphone/Maps/UIColor+MapsMeColor.mm index 4b7670d31f..71945169c5 100644 --- a/iphone/Maps/UIColor+MapsMeColor.mm +++ b/iphone/Maps/UIColor+MapsMeColor.mm @@ -297,6 +297,11 @@ UIColor * color(SEL cmd) return [UIColor colorWithRed:scaled(25.) green:scaled(69.) blue:scaled(125.) alpha:alpha100]; } ++ (UIColor *)opentableBackground +{ + return [UIColor colorWithRed:scaled(218.) green:scaled(55) blue:scaled(67) alpha:alpha100]; +} + + (UIColor *)colorWithName:(NSString *)colorName { #pragma clang diagnostic push diff --git a/map/framework.cpp b/map/framework.cpp index 110352c18a..42f82a8551 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -74,6 +74,8 @@ #include "geometry/rect2d.hpp" #include "geometry/triangle2d.hpp" +#include "partners_api/opentable_api.hpp" + #include "base/logging.hpp" #include "base/math.hpp" #include "base/scope_guard.hpp" @@ -789,17 +791,25 @@ void Framework::FillInfoFromFeatureType(FeatureType const & ft, place_page::Info if (ftypes::IsAddressObjectChecker::Instance()(ft)) info.m_address = GetAddressInfoAtPoint(feature::GetCenter(ft)).FormatHouseAndStreet(); - info.m_isHotel = ftypes::IsHotelChecker::Instance()(ft); if (ftypes::IsBookingChecker::Instance()(ft)) { - info.m_isSponsoredHotel = true; - string const & baseUrl = info.GetMetadata().Get(feature::Metadata::FMD_WEBSITE); - info.m_sponsoredBookingUrl = GetBookingApi().GetBookingUrl(baseUrl); + info.m_sponsoredType = SponsoredType::Booking; + auto const & baseUrl = info.GetMetadata().Get(feature::Metadata::FMD_WEBSITE); + info.m_sponsoredUrl = GetBookingApi().GetBookHotelUrl(baseUrl); info.m_sponsoredDescriptionUrl = GetBookingApi().GetDescriptionUrl(baseUrl); } + else if (ftypes::IsOpentableChecker::Instance()(ft)) + { + info.m_sponsoredType = SponsoredType::Opentable; + auto const & sponsoredId = info.GetMetadata().Get(feature::Metadata::FMD_SPONSORED_ID); + auto const & url = opentable::Api::GetBookTableUrl(sponsoredId); + info.m_sponsoredUrl = url; + info.m_sponsoredDescriptionUrl = url; + } + info.m_canEditOrAdd = featureStatus != osm::Editor::FeatureStatus::Obsolete && CanEditMap() && - !info.IsSponsoredHotel(); + !info.IsSponsored(); info.m_localizedWifiString = m_stringsBundle.GetString("wifi"); info.m_localizedRatingString = m_stringsBundle.GetString("place_page_booking_rating"); @@ -1979,7 +1989,7 @@ void Framework::ActivateMapSelection(bool needAnimation, df::SelectionShape::ESe CallDrapeFunction(bind(&df::DrapeEngine::SelectObject, _1, selectionType, info.GetMercator(), info.GetID(), needAnimation)); - SetDisplacementMode(DisplacementModeManager::SLOT_MAP_SELECTION, info.IsHotel() /* show */); + SetDisplacementMode(DisplacementModeManager::SLOT_MAP_SELECTION, ftypes::IsHotelChecker::Instance()(info.GetTypes()) /* show */); if (m_activateMapSelectionFn) m_activateMapSelectionFn(info); @@ -2055,7 +2065,7 @@ void Framework::OnTapEvent(TapEvent const & tapEvent) // Older version of statistics used "$GetUserMark" event. alohalytics::Stats::Instance().LogEvent("$SelectMapObject", kv, alohalytics::Location::FromLatLon(ll.lat, ll.lon)); - if (info.IsHotel()) + if (info.m_sponsoredType == SponsoredType::Booking) GetPlatform().SendMarketingEvent("Placepage_Hotel_book", {{"provider", "booking.com"}}); } diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index 8e63bc5803..2d5e30b1bf 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -16,8 +16,7 @@ char const * const Info::kPricingSymbol = "$"; bool Info::IsFeature() const { return m_featureID.IsValid(); } bool Info::IsBookmark() const { return m_bac.IsValid(); } bool Info::IsMyPosition() const { return m_isMyPosition; } -bool Info::IsSponsoredHotel() const { return m_isSponsoredHotel; } -bool Info::IsHotel() const { return m_isHotel; } +bool Info::IsSponsored() const { return m_sponsoredType != SponsoredType::None; } bool Info::ShouldShowAddPlace() const { auto const isPointOrBuilding = IsPointType() || IsBuilding(); @@ -116,12 +115,12 @@ BookmarkAndCategory Info::GetBookmarkAndCategory() const { return m_bac; } string Info::GetBookmarkCategoryName() const { return m_bookmarkCategoryName; } string const & Info::GetApiUrl() const { return m_apiUrl; } -string const & Info::GetSponsoredBookingUrl() const { return m_sponsoredBookingUrl; } +string const & Info::GetSponsoredUrl() const { return m_sponsoredUrl; } string const & Info::GetSponsoredDescriptionUrl() const {return m_sponsoredDescriptionUrl; } string Info::GetRatingFormatted() const { - if (!IsSponsoredHotel()) + if (!IsSponsored()) return string(); auto const r = GetMetadata().Get(feature::Metadata::FMD_RATING); @@ -140,7 +139,7 @@ string Info::GetRatingFormatted() const string Info::GetApproximatePricing() const { - if (!IsSponsoredHotel()) + if (!IsSponsored()) return string(); int pricing; diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 2a150f4b43..29f9bc42be 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -14,6 +14,14 @@ #include "std/string.hpp" +enum class SponsoredType +{ + None, + Booking, + Opentable, + Geochat +}; + namespace place_page { class Info : public osm::MapObject @@ -28,8 +36,7 @@ public: bool IsFeature() const; bool IsBookmark() const; bool IsMyPosition() const; - bool IsSponsoredHotel() const; - bool IsHotel() const; + bool IsSponsored() const; bool ShouldShowAddPlace() const; bool ShouldShowAddBusiness() const; @@ -62,7 +69,7 @@ public: string GetBookmarkCategoryName() const; string const & GetApiUrl() const; - string const & GetSponsoredBookingUrl() const; + string const & GetSponsoredUrl() const; string const & GetSponsoredDescriptionUrl() const; /// @returns formatted rating string for booking object, or empty if it isn't booking object @@ -90,12 +97,11 @@ public: string m_apiUrl; /// Formatted feature address. string m_address; - /// Feature is a hotel. - bool m_isHotel = false; - /// Feature is a sponsored hotel. - bool m_isSponsoredHotel = false; + /// Sponsored type or None. + SponsoredType m_sponsoredType = SponsoredType::None; + /// Sponsored feature urls. - string m_sponsoredBookingUrl; + string m_sponsoredUrl; string m_sponsoredDescriptionUrl; /// Which country this MapObject is in. diff --git a/partners_api/booking_api.cpp b/partners_api/booking_api.cpp index 6bb2dc1a75..201f2cafbd 100644 --- a/partners_api/booking_api.cpp +++ b/partners_api/booking_api.cpp @@ -20,7 +20,7 @@ BookingApi::BookingApi() : m_affiliateId(BOOKING_AFFILIATE_ID), m_testingMode(fa m_apiUrl = "https://" + ss.str() + "@distribution-xml.booking.com/json/bookings."; } -string BookingApi::GetBookingUrl(string const & baseUrl, string const & /* lang */) const +string BookingApi::GetBookHotelUrl(string const & baseUrl, string const & /* lang */) const { return GetDescriptionUrl(baseUrl) + "#availability"; } diff --git a/partners_api/booking_api.hpp b/partners_api/booking_api.hpp index 4e92a8ca83..4804fefa7d 100644 --- a/partners_api/booking_api.hpp +++ b/partners_api/booking_api.hpp @@ -117,7 +117,7 @@ public: static constexpr const char kDefaultCurrency[1] = {0}; BookingApi(); - string GetBookingUrl(string const & baseUrl, string const & lang = string()) const; + string GetBookHotelUrl(string const & baseUrl, string const & lang = string()) const; string GetDescriptionUrl(string const & baseUrl, string const & lang = string()) const; inline void SetTestingMode(bool testing) { m_testingMode = testing; } diff --git a/partners_api/opentable_api.cpp b/partners_api/opentable_api.cpp new file mode 100644 index 0000000000..9454cef63b --- /dev/null +++ b/partners_api/opentable_api.cpp @@ -0,0 +1,21 @@ +#include "partners_api/opentable_api.hpp" + +#include "std/sstream.hpp" + +#include "private.h" + +namespace +{ + auto const kOpentableBaseUrl = "http://www.opentable.com/restaurant/profile/"; +} // namespace + +namespace opentable +{ +// static +string Api::GetBookTableUrl(string const & restaurantId) +{ + stringstream ss; + ss << kOpentableBaseUrl << restaurantId << "?ref=" << OPENTABLE_AFFILATE_ID; + return ss.str(); +} +} // namespace opentable diff --git a/partners_api/opentable_api.hpp b/partners_api/opentable_api.hpp new file mode 100644 index 0000000000..b298fafdd7 --- /dev/null +++ b/partners_api/opentable_api.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "std/string.hpp" + +namespace opentable +{ +class Api +{ +public: + static string GetBookTableUrl(string const & restaurantId); +}; +} // namespace opentable diff --git a/partners_api/partners_api.pro b/partners_api/partners_api.pro index e49f090dae..47cf571ac3 100644 --- a/partners_api/partners_api.pro +++ b/partners_api/partners_api.pro @@ -10,8 +10,10 @@ include($$ROOT_DIR/common.pri) SOURCES += \ booking_api.cpp \ + opentable_api.cpp \ uber_api.cpp \ HEADERS += \ booking_api.hpp \ + opentable_api.hpp \ uber_api.hpp \ diff --git a/partners_api/partners_api_tests/booking_tests.cpp b/partners_api/partners_api_tests/booking_tests.cpp index 05b28b25ae..86f3fcf54c 100644 --- a/partners_api/partners_api_tests/booking_tests.cpp +++ b/partners_api/partners_api_tests/booking_tests.cpp @@ -6,7 +6,7 @@ UNIT_TEST(Booking_SmokeTest) { BookingApi api; - string url = api.GetBookingUrl("http://someurl.com"); + string url = api.GetBookHotelUrl("http://someurl.com"); TEST(!url.empty(), ()); } diff --git a/strings.txt b/strings.txt index a61a752738..bde5f10f34 100644 --- a/strings.txt +++ b/strings.txt @@ -17875,7 +17875,7 @@ en = More Reviews ru = Ещё отзывы - [bookingcom_book_button] + [book_button] en = Book ru = Забронировать ar = حجز diff --git a/xcode/partners_api/partners_api.xcodeproj/project.pbxproj b/xcode/partners_api/partners_api.xcodeproj/project.pbxproj index f251d085e7..db43d9a290 100644 --- a/xcode/partners_api/partners_api.xcodeproj/project.pbxproj +++ b/xcode/partners_api/partners_api.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + F67E75251DB8F06F00D6741F /* opentable_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F67E75231DB8F06F00D6741F /* opentable_api.cpp */; }; + F67E75261DB8F06F00D6741F /* opentable_api.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F67E75241DB8F06F00D6741F /* opentable_api.hpp */; }; F6B536401DA520E40067EEA5 /* booking_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6B5363C1DA520E40067EEA5 /* booking_api.cpp */; }; F6B536411DA520E40067EEA5 /* booking_api.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6B5363D1DA520E40067EEA5 /* booking_api.hpp */; }; F6B536421DA520E40067EEA5 /* uber_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6B5363E1DA520E40067EEA5 /* uber_api.cpp */; }; @@ -30,6 +32,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + F67E75231DB8F06F00D6741F /* opentable_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opentable_api.cpp; sourceTree = ""; }; + F67E75241DB8F06F00D6741F /* opentable_api.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = opentable_api.hpp; sourceTree = ""; }; F6B536341DA5209F0067EEA5 /* libpartners_api.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libpartners_api.a; sourceTree = BUILT_PRODUCTS_DIR; }; F6B5363C1DA520E40067EEA5 /* booking_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = booking_api.cpp; sourceTree = ""; }; F6B5363D1DA520E40067EEA5 /* booking_api.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_api.hpp; sourceTree = ""; }; @@ -102,6 +106,8 @@ F6B5363B1DA520B20067EEA5 /* partners_api */ = { isa = PBXGroup; children = ( + F67E75231DB8F06F00D6741F /* opentable_api.cpp */, + F67E75241DB8F06F00D6741F /* opentable_api.hpp */, F6B5363C1DA520E40067EEA5 /* booking_api.cpp */, F6B5363D1DA520E40067EEA5 /* booking_api.hpp */, F6B5363E1DA520E40067EEA5 /* uber_api.cpp */, @@ -153,6 +159,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + F67E75261DB8F06F00D6741F /* opentable_api.hpp in Headers */, F6B536411DA520E40067EEA5 /* booking_api.hpp in Headers */, F6B536431DA520E40067EEA5 /* uber_api.hpp in Headers */, ); @@ -252,6 +259,7 @@ F6B536421DA520E40067EEA5 /* uber_api.cpp in Sources */, F6B536471DA5213D0067EEA5 /* booking_tests.cpp in Sources */, F6B5366A1DA523060067EEA5 /* testingmain.cpp in Sources */, + F67E75251DB8F06F00D6741F /* opentable_api.cpp in Sources */, F6B536401DA520E40067EEA5 /* booking_api.cpp in Sources */, F6B536481DA5213D0067EEA5 /* uber_tests.cpp in Sources */, );