[android] Refactored sponsored adapter for discovery and added UI callback invocation

This commit is contained in:
Александр Зацепин 2017-11-24 15:08:08 +03:00 committed by Arsentiy Milchakov
parent 8e3a6b00b3
commit 581e2e9578
8 changed files with 157 additions and 47 deletions

View file

@ -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);
}
}

View file

@ -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;
}

View file

@ -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)
{
}
}

View file

@ -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;
}
}

View file

@ -0,0 +1,10 @@
package com.mapswithme.maps.discovery;
public enum ItemType
{
VIATOR,
ATTRACTIONS,
CAFES,
HOTELS,
LOCAL_EXPERTS;
}

View 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);
}

View file

@ -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;

View file

@ -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