diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index c5a933e4ad..b435c5ca27 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -260,7 +260,7 @@ jobject g_javaListener; jmethodID g_updateResultsId; jmethodID g_endResultsId; // Implements 'NativeBookingFilterListener' java interface. -jmethodID g_onFilterAvailableHotelsId; +jmethodID g_onFilterHotels; // Cached classes and methods to return results. jclass g_resultClass; jmethodID g_resultConstructor; @@ -442,7 +442,8 @@ void OnBookingFilterAvailabilityResults(std::shared_ptr con JNIEnv * env = jni::GetEnv(); jni::TScopedLocalObjectArrayRef jResults(env, usermark_helper::ToFeatureIdArray(env, featuresSorted)); - env->CallVoidMethod(g_javaListener, g_onFilterAvailableHotelsId, jResults.get()); + env->CallVoidMethod(g_javaListener, g_onFilterHotels, + static_cast(booking::filter::Type::Availability), jResults.get()); } void OnBookingFilterDealsResults(std::shared_ptr const & apiParams, @@ -459,7 +460,11 @@ void OnBookingFilterDealsResults(std::shared_ptr const & ap ASSERT(std::is_sorted(featuresSorted.cbegin(), featuresSorted.cend()), ()); - // Dummy. Should be implemented soon. + JNIEnv * env = jni::GetEnv(); + jni::TScopedLocalObjectArrayRef jResults(env, + usermark_helper::ToFeatureIdArray(env, featuresSorted)); + env->CallVoidMethod(g_javaListener, g_onFilterHotels, + static_cast(booking::filter::Type::Deals), jResults.get()); } class BookingBuilder @@ -628,8 +633,8 @@ extern "C" g_endBookmarksResultsId = jni::GetMethodID(env, g_javaListener, "onBookmarksResultsEnd", "([JJ)V"); - g_onFilterAvailableHotelsId = jni::GetMethodID(env, g_javaListener, "onFilterAvailableHotels", - "([Lcom/mapswithme/maps/bookmarks/data/FeatureId;)V"); + g_onFilterHotels = jni::GetMethodID(env, g_javaListener, "onFilterHotels", + "(I[Lcom/mapswithme/maps/bookmarks/data/FeatureId;)V"); g_hotelsFilterBuilder.Init(env); g_bookingBuilder.Init(env); diff --git a/android/res/drawable-hdpi/ic_deal_dark.png b/android/res/drawable-hdpi/ic_deal_dark.png new file mode 100644 index 0000000000..a413e6a863 Binary files /dev/null and b/android/res/drawable-hdpi/ic_deal_dark.png differ diff --git a/android/res/drawable-hdpi/ic_deal_light.png b/android/res/drawable-hdpi/ic_deal_light.png new file mode 100644 index 0000000000..3e1691019b Binary files /dev/null and b/android/res/drawable-hdpi/ic_deal_light.png differ diff --git a/android/res/drawable-mdpi/ic_deal_dark.png b/android/res/drawable-mdpi/ic_deal_dark.png new file mode 100644 index 0000000000..3b41c9d9fd Binary files /dev/null and b/android/res/drawable-mdpi/ic_deal_dark.png differ diff --git a/android/res/drawable-mdpi/ic_deal_light.png b/android/res/drawable-mdpi/ic_deal_light.png new file mode 100644 index 0000000000..6bcd42d80e Binary files /dev/null and b/android/res/drawable-mdpi/ic_deal_light.png differ diff --git a/android/res/drawable-xhdpi/ic_deal_dark.png b/android/res/drawable-xhdpi/ic_deal_dark.png new file mode 100644 index 0000000000..aa65bbd84e Binary files /dev/null and b/android/res/drawable-xhdpi/ic_deal_dark.png differ diff --git a/android/res/drawable-xhdpi/ic_deal_light.png b/android/res/drawable-xhdpi/ic_deal_light.png new file mode 100644 index 0000000000..a639f33cc3 Binary files /dev/null and b/android/res/drawable-xhdpi/ic_deal_light.png differ diff --git a/android/res/drawable-xxhdpi/ic_deal_dark.png b/android/res/drawable-xxhdpi/ic_deal_dark.png new file mode 100644 index 0000000000..92a9d64b98 Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_deal_dark.png differ diff --git a/android/res/drawable-xxhdpi/ic_deal_light.png b/android/res/drawable-xxhdpi/ic_deal_light.png new file mode 100644 index 0000000000..21914c73b7 Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_deal_light.png differ diff --git a/android/res/drawable-xxxhdpi/ic_deal_dark.png b/android/res/drawable-xxxhdpi/ic_deal_dark.png new file mode 100644 index 0000000000..e32ad19aaf Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_deal_dark.png differ diff --git a/android/res/drawable-xxxhdpi/ic_deal_light.png b/android/res/drawable-xxxhdpi/ic_deal_light.png new file mode 100644 index 0000000000..47cacfe014 Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_deal_light.png differ diff --git a/android/res/layout/item_search_result.xml b/android/res/layout/item_search_result.xml index 562b41543f..1af057fd3f 100644 --- a/android/res/layout/item_search_result.xml +++ b/android/res/layout/item_search_result.xml @@ -42,26 +42,42 @@ android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@id/title" - android:layout_toLeftOf="@+id/price_category" - android:layout_toStartOf="@id/price_category" + android:layout_toLeftOf="@+id/cost" + android:layout_toStartOf="@id/cost" android:layout_marginRight="@dimen/margin_half" + android:layout_marginEnd="@dimen/margin_half" android:layout_marginTop="@dimen/margin_quarter" android:textAppearance="@style/MwmTextAppearance.Body3" android:maxLines="2" android:ellipsize="end" tools:text="Hotel \u2022 \u2605\u2605\u2605\u2605\u2605"/> - + + + + + + diff --git a/android/res/values/themes-base.xml b/android/res/values/themes-base.xml index 0b6c537cf0..380f9d7edd 100644 --- a/android/res/values/themes-base.xml +++ b/android/res/values/themes-base.xml @@ -124,6 +124,7 @@ @drawable/dot_divider @drawable/button_with_border @drawable/ic_ad_light + @drawable/ic_deal_light @@ -250,5 +251,6 @@ @drawable/dot_divider_night @drawable/button_with_border_night @drawable/ic_ad_dark + @drawable/ic_deal_dark diff --git a/android/src/com/mapswithme/maps/search/BookingFilter.java b/android/src/com/mapswithme/maps/search/BookingFilter.java new file mode 100644 index 0000000000..334b392ecf --- /dev/null +++ b/android/src/com/mapswithme/maps/search/BookingFilter.java @@ -0,0 +1,17 @@ +package com.mapswithme.maps.search; + +import android.support.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +final class BookingFilter +{ + // This list should correspond to the booking::filter::Type enum on c++ side. + public static final int TYPE_DEALS = 0; + public static final int TYPE_AVAILABILITY = 1; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ TYPE_DEALS, TYPE_AVAILABILITY }) + public @interface Type {} +} diff --git a/android/src/com/mapswithme/maps/search/NativeBookingFilterListener.java b/android/src/com/mapswithme/maps/search/NativeBookingFilterListener.java index 3cea92c8f8..2fe1f47881 100644 --- a/android/src/com/mapswithme/maps/search/NativeBookingFilterListener.java +++ b/android/src/com/mapswithme/maps/search/NativeBookingFilterListener.java @@ -11,7 +11,8 @@ import com.mapswithme.maps.bookmarks.data.FeatureId; public interface NativeBookingFilterListener { /** - * @param availableHotels Array of available hotels feature ids. + * @param type Filter type which was applied. + * @param hotels Array of hotels that meet the requirements for the filter. */ - void onFilterAvailableHotels(@Nullable FeatureId[] availableHotels); + void onFilterHotels(@BookingFilter.Type int type, @Nullable FeatureId[] hotels); } diff --git a/android/src/com/mapswithme/maps/search/SearchAdapter.java b/android/src/com/mapswithme/maps/search/SearchAdapter.java index 00ad85485e..5be7280e85 100644 --- a/android/src/com/mapswithme/maps/search/SearchAdapter.java +++ b/android/src/com/mapswithme/maps/search/SearchAdapter.java @@ -14,6 +14,7 @@ import android.text.Spanned; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; +import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -40,7 +41,7 @@ class SearchAdapter extends RecyclerView.Adapter mAvailableHotelIds = new HashSet<>(); + private FilteredHotelIds mFilteredHotelIds = new FilteredHotelIds(); private final Drawable mClosedMarkerBackground; static abstract class SearchDataViewHolder extends RecyclerView.ViewHolder @@ -113,9 +114,28 @@ class SearchAdapter extends RecyclerView.Adapter> mFilteredHotelIds = + new SparseArray<>(); + + void set(@BookingFilter.Type int type, @NonNull FeatureId[] hotelsId) + { + mFilteredHotelIds.put(type, new HashSet<>(Arrays.asList(hotelsId))); + } + + boolean contains(@BookingFilter.Type int type, @NonNull FeatureId id) + { + Set ids = mFilteredHotelIds.get(type); + + return ids != null && ids.contains(id); + } + } + private class SuggestViewHolder extends BaseResultViewHolder { - SuggestViewHolder(View view) + SuggestViewHolder(@NonNull View view) { super(view); } @@ -156,12 +176,20 @@ class SearchAdapter extends RecyclerView.Adapter { for (NativeBookingFilterListener listener : mHotelListeners) - listener.onFilterAvailableHotels(availableHotels); + listener.onFilterHotels(type, hotels); mHotelListeners.finishIterate(); }); } diff --git a/android/src/com/mapswithme/maps/search/SearchFragment.java b/android/src/com/mapswithme/maps/search/SearchFragment.java index d8ce890d48..6b0eb9620c 100644 --- a/android/src/com/mapswithme/maps/search/SearchFragment.java +++ b/android/src/com/mapswithme/maps/search/SearchFragment.java @@ -688,12 +688,12 @@ public class SearchFragment extends BaseMwmFragment } @Override - public void onFilterAvailableHotels(@Nullable FeatureId[] availableHotels) + public void onFilterHotels(@BookingFilter.Type int type, @Nullable FeatureId[] hotels) { - if (availableHotels == null) + if (hotels == null) return; - mSearchAdapter.setAvailableHotels(availableHotels); + mSearchAdapter.setFilteredHotels(type, hotels); } @Override