forked from organicmaps/organicmaps
[android] Refactored sponsored adapter for discovery and added UI callback invocation
This commit is contained in:
parent
8e3a6b00b3
commit
581e2e9578
8 changed files with 157 additions and 47 deletions
|
@ -44,27 +44,23 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
private final List<Item> mItems;
|
||||
@Nullable
|
||||
private final ItemSelectedListener mListener;
|
||||
@Sponsored.SponsoredType
|
||||
private final int mSponsoredType;
|
||||
|
||||
public BaseSponsoredAdapter(@Sponsored.SponsoredType int sponsoredType, @NonNull String url,
|
||||
boolean hasError, @Nullable ItemSelectedListener listener)
|
||||
|
||||
public BaseSponsoredAdapter(@NonNull String url, boolean hasError,
|
||||
@Nullable ItemSelectedListener listener)
|
||||
{
|
||||
mSponsoredType = sponsoredType;
|
||||
mItems = new ArrayList<>();
|
||||
mListener = listener;
|
||||
mItems.add(new Item(TYPE_LOADING, sponsoredType, getLoadingTitle(), url, getLoadingSubtitle(),
|
||||
mItems.add(new Item(TYPE_LOADING, getLoadingTitle(), url, getLoadingSubtitle(),
|
||||
hasError, false));
|
||||
}
|
||||
|
||||
public BaseSponsoredAdapter(@Sponsored.SponsoredType int sponsoredType,
|
||||
@NonNull List<? extends Item> items, @NonNull String url,
|
||||
@Nullable ItemSelectedListener listener)
|
||||
public BaseSponsoredAdapter(@NonNull List<? extends Item> items, @NonNull String url,
|
||||
@Nullable ItemSelectedListener listener, boolean shouldShowMoreItem)
|
||||
{
|
||||
mSponsoredType = sponsoredType;
|
||||
mItems = new ArrayList<>();
|
||||
mListener = listener;
|
||||
boolean showMoreItem = items.size() >= MAX_ITEMS;
|
||||
boolean showMoreItem = shouldShowMoreItem && items.size() >= MAX_ITEMS;
|
||||
int size = showMoreItem ? MAX_ITEMS : items.size();
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
|
@ -72,7 +68,7 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
mItems.add(product);
|
||||
}
|
||||
if (showMoreItem)
|
||||
mItems.add(new Item(TYPE_MORE, sponsoredType, MORE, url, null, false, false));
|
||||
mItems.add(new Item(TYPE_MORE, MORE, url, null, false, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -118,7 +114,7 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
public void setLoadingError(@Sponsored.SponsoredType int sponsoredType, @NonNull String url)
|
||||
{
|
||||
mItems.clear();
|
||||
mItems.add(new Item(TYPE_LOADING, sponsoredType, getLoadingTitle(), url, getLoadingSubtitle(),
|
||||
mItems.add(new Item(TYPE_LOADING, getLoadingTitle(), url, getLoadingSubtitle(),
|
||||
true, false));
|
||||
notifyItemChanged(0/* position */);
|
||||
}
|
||||
|
@ -126,7 +122,7 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
public void setLoadingCompleted(@Sponsored.SponsoredType int sponsoredType, @NonNull String url)
|
||||
{
|
||||
mItems.clear();
|
||||
mItems.add(new Item(TYPE_LOADING, sponsoredType, getLoadingTitle(), url, getLoadingSubtitle(),
|
||||
mItems.add(new Item(TYPE_LOADING, getLoadingTitle(), url, getLoadingSubtitle(),
|
||||
false, true));
|
||||
notifyItemChanged(0/* position */);
|
||||
}
|
||||
|
@ -198,9 +194,9 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
if (mAdapter.mListener != null)
|
||||
{
|
||||
if (item.mType == TYPE_PRODUCT)
|
||||
mAdapter.mListener.onItemSelected(item.mUrl, item.mSponsoredType);
|
||||
mAdapter.mListener.onItemSelected(item.mUrl);
|
||||
else if (item.mType == TYPE_MORE || item.mType == TYPE_LOADING)
|
||||
mAdapter.mListener.onMoreItemSelected(item.mUrl, item.mSponsoredType);
|
||||
mAdapter.mListener.onMoreItemSelected(item.mUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -257,11 +253,11 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
if (mAdapter.mListener != null)
|
||||
{
|
||||
if (item.mType == TYPE_PRODUCT)
|
||||
mAdapter.mListener.onItemSelected(item.mUrl, item.mSponsoredType);
|
||||
mAdapter.mListener.onItemSelected(item.mUrl);
|
||||
else if (item.mType == TYPE_MORE)
|
||||
mAdapter.mListener.onMoreItemSelected(item.mUrl, item.mSponsoredType);
|
||||
mAdapter.mListener.onMoreItemSelected(item.mUrl);
|
||||
else if (item.mType == TYPE_LOADING && item.mLoadingError)
|
||||
mAdapter.mListener.onItemSelected(item.mUrl, item.mSponsoredType);
|
||||
mAdapter.mListener.onItemSelected(item.mUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -270,8 +266,6 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
{
|
||||
@ViewType
|
||||
private final int mType;
|
||||
@Sponsored.SponsoredType
|
||||
private final int mSponsoredType;
|
||||
@NonNull
|
||||
private final String mTitle;
|
||||
@NonNull
|
||||
|
@ -281,12 +275,10 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
private final boolean mLoadingError;
|
||||
private final boolean mFinished;
|
||||
|
||||
protected Item(@ViewType int type, @Sponsored.SponsoredType int sponsoredType,
|
||||
@NonNull String title, @NonNull String url, @Nullable String subtitle,
|
||||
boolean loadingError, boolean finished)
|
||||
protected Item(@ViewType int type, @NonNull String title, @NonNull String url,
|
||||
@Nullable String subtitle, boolean loadingError, boolean finished)
|
||||
{
|
||||
mType = type;
|
||||
mSponsoredType = sponsoredType;
|
||||
mTitle = title;
|
||||
mUrl = url;
|
||||
mSubtitle = subtitle;
|
||||
|
@ -297,7 +289,7 @@ public abstract class BaseSponsoredAdapter extends RecyclerView.Adapter<BaseSpon
|
|||
|
||||
public interface ItemSelectedListener
|
||||
{
|
||||
void onItemSelected(@NonNull String url, @Sponsored.SponsoredType int type);
|
||||
void onMoreItemSelected(@NonNull String url, @Sponsored.SponsoredType int type);
|
||||
void onItemSelected(@NonNull String url);
|
||||
void onMoreItemSelected(@NonNull String url);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,13 +27,13 @@ public final class CianAdapter extends BaseSponsoredAdapter
|
|||
|
||||
public CianAdapter(@NonNull String url, boolean hasError, @Nullable ItemSelectedListener listener)
|
||||
{
|
||||
super(Sponsored.TYPE_CIAN, url, hasError, listener);
|
||||
super(url, hasError, listener);
|
||||
}
|
||||
|
||||
public CianAdapter(@NonNull RentPlace[] items, @NonNull String url,
|
||||
@Nullable ItemSelectedListener listener)
|
||||
{
|
||||
super(Sponsored.TYPE_CIAN, convertItems(items), url, listener);
|
||||
super(convertItems(items), url, listener, true);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
@ -134,7 +134,7 @@ public final class CianAdapter extends BaseSponsoredAdapter
|
|||
private Item(@NonNull String title, @NonNull String url, @NonNull String price,
|
||||
@NonNull String address)
|
||||
{
|
||||
super(TYPE_PRODUCT, Sponsored.TYPE_CIAN, title, url, null, false, false);
|
||||
super(TYPE_PRODUCT, title, url, null, false, false);
|
||||
mPrice = price;
|
||||
mAddress = address;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.mapswithme.maps.discovery;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.MainThread;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -9,9 +10,18 @@ import android.view.ViewGroup;
|
|||
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.maps.base.BaseMwmToolbarFragment;
|
||||
import com.mapswithme.maps.search.SearchResult;
|
||||
import com.mapswithme.maps.viator.ViatorProduct;
|
||||
import com.mapswithme.util.Language;
|
||||
import com.mapswithme.util.Utils;
|
||||
|
||||
public class DiscoveryFragment extends BaseMwmToolbarFragment
|
||||
public class DiscoveryFragment extends BaseMwmToolbarFragment implements UICallback
|
||||
{
|
||||
private static final int ITEMS_COUNT = 5;
|
||||
private static final int[] ITEM_TYPES = { DiscoveryParams.ITEM_TYPE_VIATOR,
|
||||
DiscoveryParams.ITEM_TYPE_ATTRACTIONS,
|
||||
DiscoveryParams.ITEM_TYPE_CAFES,
|
||||
DiscoveryParams.ITEM_TYPE_LOCAL_EXPERTS };
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||
|
@ -19,10 +29,55 @@ public class DiscoveryFragment extends BaseMwmToolbarFragment
|
|||
return inflater.inflate(R.layout.fragment_discovery, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
super.onStart();
|
||||
DiscoveryManager.INSTANCE.attach(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
DiscoveryManager.INSTANCE.detach();
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
mToolbarController.setTitle(R.string.discover_button_title);
|
||||
DiscoveryParams params = new DiscoveryParams(Utils.getCurrencyCode(), Language.getDefaultLocale(),
|
||||
ITEMS_COUNT, ITEM_TYPES);
|
||||
DiscoveryManager.INSTANCE.discover(params);
|
||||
}
|
||||
|
||||
@MainThread
|
||||
@Override
|
||||
public void onAttractionsReceived(@Nullable SearchResult[] results)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@MainThread
|
||||
@Override
|
||||
public void onCafesReceived(@Nullable SearchResult[] results)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@MainThread
|
||||
@Override
|
||||
public void onViatorProductsReceived(@Nullable ViatorProduct[] products)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@MainThread
|
||||
@Override
|
||||
public void onLocalExpertsReceived(@Nullable LocalExpert[] experts)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,9 @@ enum DiscoveryManager
|
|||
{
|
||||
INSTANCE;
|
||||
|
||||
@Nullable
|
||||
private UICallback mCallback;
|
||||
|
||||
public void discover(@NonNull DiscoveryParams params)
|
||||
{
|
||||
Framework.nativeDiscover(params);
|
||||
|
@ -21,20 +24,49 @@ enum DiscoveryManager
|
|||
@MainThread
|
||||
private void onResultReceived(@Nullable SearchResult[] results, @DiscoveryParams.ItemType int type)
|
||||
{
|
||||
// TODO: not implemented yet.
|
||||
if (mCallback == null)
|
||||
return;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DiscoveryParams.ITEM_TYPE_ATTRACTIONS:
|
||||
mCallback.onAttractionsReceived(results);
|
||||
break;
|
||||
case DiscoveryParams.ITEM_TYPE_CAFES:
|
||||
mCallback.onCafesReceived(results);
|
||||
break;
|
||||
case DiscoveryParams.ITEM_TYPE_HOTELS:
|
||||
case DiscoveryParams.ITEM_TYPE_LOCAL_EXPERTS:
|
||||
case DiscoveryParams.ITEM_TYPE_VIATOR:
|
||||
break;
|
||||
default:
|
||||
throw new AssertionError("Unsupported discovery item type: " + type);
|
||||
}
|
||||
}
|
||||
|
||||
// Called from JNI.
|
||||
@MainThread
|
||||
private void onViatorProductsReceived(@Nullable ViatorProduct[] products)
|
||||
{
|
||||
// TODO: not implemented yet.
|
||||
if (mCallback != null)
|
||||
mCallback.onViatorProductsReceived(products);
|
||||
}
|
||||
|
||||
// Called from JNI.
|
||||
@MainThread
|
||||
private void onLocalExpertsReceived(@Nullable LocalExpert[] experts)
|
||||
{
|
||||
// TODO: not implemented yet.
|
||||
if (mCallback != null)
|
||||
mCallback.onLocalExpertsReceived(experts);
|
||||
}
|
||||
|
||||
void attach(@NonNull UICallback callback)
|
||||
{
|
||||
mCallback = callback;
|
||||
}
|
||||
|
||||
void detach()
|
||||
{
|
||||
mCallback = null;
|
||||
}
|
||||
}
|
||||
|
|
10
android/src/com/mapswithme/maps/discovery/ItemType.java
Normal file
10
android/src/com/mapswithme/maps/discovery/ItemType.java
Normal file
|
@ -0,0 +1,10 @@
|
|||
package com.mapswithme.maps.discovery;
|
||||
|
||||
public enum ItemType
|
||||
{
|
||||
VIATOR,
|
||||
ATTRACTIONS,
|
||||
CAFES,
|
||||
HOTELS,
|
||||
LOCAL_EXPERTS;
|
||||
}
|
20
android/src/com/mapswithme/maps/discovery/UICallback.java
Normal file
20
android/src/com/mapswithme/maps/discovery/UICallback.java
Normal file
|
@ -0,0 +1,20 @@
|
|||
package com.mapswithme.maps.discovery;
|
||||
|
||||
import android.support.annotation.MainThread;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.mapswithme.maps.search.SearchResult;
|
||||
import com.mapswithme.maps.viator.ViatorProduct;
|
||||
|
||||
public interface UICallback
|
||||
{
|
||||
@MainThread
|
||||
void onAttractionsReceived(@Nullable SearchResult[] results);
|
||||
@MainThread
|
||||
void onCafesReceived(@Nullable SearchResult[] results);
|
||||
@MainThread
|
||||
void onViatorProductsReceived(@Nullable ViatorProduct[] products);
|
||||
@MainThread
|
||||
void onLocalExpertsReceived(@Nullable LocalExpert[] experts);
|
||||
}
|
|
@ -15,7 +15,6 @@ import com.bumptech.glide.Glide;
|
|||
import com.mapswithme.maps.MwmApplication;
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.maps.base.BaseSponsoredAdapter;
|
||||
import com.mapswithme.maps.widget.placepage.Sponsored;
|
||||
import com.mapswithme.util.UiUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -30,13 +29,13 @@ public final class ViatorAdapter extends BaseSponsoredAdapter
|
|||
public ViatorAdapter(@NonNull String url, boolean hasError,
|
||||
@Nullable ItemSelectedListener listener)
|
||||
{
|
||||
super(Sponsored.TYPE_VIATOR, url, hasError, listener);
|
||||
super(url, hasError, listener);
|
||||
}
|
||||
|
||||
public ViatorAdapter(@NonNull ViatorProduct[] items, @NonNull String cityUrl,
|
||||
@Nullable ItemSelectedListener listener)
|
||||
@Nullable ItemSelectedListener listener, boolean shouldShowMoreItem)
|
||||
{
|
||||
super(Sponsored.TYPE_VIATOR, convertItems(items), cityUrl, listener);
|
||||
super(convertItems(items), cityUrl, listener, shouldShowMoreItem);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
@ -154,7 +153,7 @@ public final class ViatorAdapter extends BaseSponsoredAdapter
|
|||
@Nullable String duration, double rating, @Nullable String price,
|
||||
@NonNull String url)
|
||||
{
|
||||
super(TYPE_PRODUCT, Sponsored.TYPE_VIATOR, title, url, null, false, false);
|
||||
super(TYPE_PRODUCT, title, url, null, false, false);
|
||||
mPhotoUrl = photoUrl;
|
||||
mDuration = duration;
|
||||
mRating = rating;
|
||||
|
|
|
@ -888,7 +888,7 @@ public class PlacePageView extends RelativeLayout
|
|||
{
|
||||
if (mSponsoredAdapter == null || !mSponsoredAdapter.containsLoading())
|
||||
{
|
||||
mSponsoredAdapter = new ViatorAdapter(products, cityUrl, this);
|
||||
mSponsoredAdapter = new ViatorAdapter(products, cityUrl, this, true);
|
||||
mRvSponsoredProducts.setAdapter(mSponsoredAdapter);
|
||||
}
|
||||
else
|
||||
|
@ -898,7 +898,7 @@ public class PlacePageView extends RelativeLayout
|
|||
public void onAnimationFinished()
|
||||
{
|
||||
mRvSponsoredProducts.setItemAnimator(new DefaultItemAnimator());
|
||||
mSponsoredAdapter = new ViatorAdapter(products, cityUrl, PlacePageView.this);
|
||||
mSponsoredAdapter = new ViatorAdapter(products, cityUrl, PlacePageView.this, true);
|
||||
mRvSponsoredProducts.setAdapter(mSponsoredAdapter);
|
||||
}
|
||||
});
|
||||
|
@ -995,19 +995,21 @@ public class PlacePageView extends RelativeLayout
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onItemSelected(@NonNull String url, @Sponsored.SponsoredType int type)
|
||||
public void onItemSelected(@NonNull String url)
|
||||
{
|
||||
Utils.openUrl(getContext(), url);
|
||||
Statistics.INSTANCE.trackSponsoredEvent(Statistics.EventName.PP_SPONSOR_ITEM_SELECTED,
|
||||
type);
|
||||
if (mSponsored != null)
|
||||
Statistics.INSTANCE.trackSponsoredEvent(Statistics.EventName.PP_SPONSOR_ITEM_SELECTED,
|
||||
mSponsored.getType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMoreItemSelected(@NonNull String url, @Sponsored.SponsoredType int type)
|
||||
public void onMoreItemSelected(@NonNull String url)
|
||||
{
|
||||
Utils.openUrl(getContext(), url);
|
||||
Statistics.INSTANCE.trackSponsoredEvent(Statistics.EventName.PP_SPONSOR_MORE_SELECTED,
|
||||
type);
|
||||
if (mSponsored != null)
|
||||
Statistics.INSTANCE.trackSponsoredEvent(Statistics.EventName.PP_SPONSOR_MORE_SELECTED,
|
||||
mSponsored.getType());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Add table
Reference in a new issue