forked from organicmaps/organicmaps
[android] add: Ads in downloader.
This commit is contained in:
parent
a289083067
commit
a6c109b3e2
7 changed files with 465 additions and 71 deletions
|
@ -49,7 +49,7 @@ dependencies {
|
|||
compile 'com.facebook.android:facebook-android-sdk:4.8.0'
|
||||
compile 'com.google.code.gson:gson:2.6.1'
|
||||
compile 'com.pushwoosh:pushwoosh:4.6.3'
|
||||
compile 'com.my.tracker:mytracker-sdk:1.3.2'
|
||||
compile 'com.my.tracker:mytracker-sdk:1.3.5'
|
||||
compile fileTree(dir: '3rd_party', include: '*.jar')
|
||||
// BottomSheet
|
||||
compile project(":3rd_party:BottomSheet")
|
||||
|
|
57
android/res/layout/downloader_item_ad.xml
Normal file
57
android/res/layout/downloader_item_ad.xml
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="@dimen/height_item_multiline"
|
||||
android:paddingLeft="@dimen/margin_base"
|
||||
android:paddingRight="@dimen/margin_base"
|
||||
android:background="?clickableBackground"
|
||||
android:clipToPadding="false"
|
||||
tools:background="#200000FF">
|
||||
<Button
|
||||
android:id="@+id/downloader_ad_action"
|
||||
style="@style/MwmWidget.Button.Accent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_centerVertical="true"
|
||||
tools:text="Install"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/downloader_ad_icon"
|
||||
android:layout_width="@dimen/downloader_ad_icon_size"
|
||||
android:layout_height="@dimen/downloader_ad_icon_size"
|
||||
android:layout_centerVertical="true"
|
||||
tools:background="#8000FF00"/>
|
||||
|
||||
<LinearLayout android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginLeft="@dimen/margin_base"
|
||||
android:layout_marginRight="@dimen/margin_half"
|
||||
android:layout_toRightOf="@id/downloader_ad_icon"
|
||||
android:layout_toLeftOf="@id/downloader_ad_action"
|
||||
android:layout_centerVertical="true"
|
||||
tools:background="#20FF0000">
|
||||
<TextView
|
||||
android:id="@+id/downloader_ad_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body1"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
tools:text="This is the coolest advertisment ever!!!"
|
||||
tools:background="#40FF0000"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/downloader_ad_subtitle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body4"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
tools:text="Buy me now\nCan you hear me?"
|
||||
tools:background="#60FFFF00"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
|
@ -39,6 +39,7 @@
|
|||
<dimen name="place_page_buttons_height">56dp</dimen>
|
||||
|
||||
<dimen name="downloader_status_size">40dp</dimen>
|
||||
<dimen name="downloader_ad_icon_size">@dimen/downloader_status_size</dimen>
|
||||
<dimen name="search_progress_size">32dp</dimen>
|
||||
|
||||
<dimen name="panel_width">360dp</dimen>
|
||||
|
|
|
@ -16,7 +16,6 @@ import android.support.v4.app.FragmentActivity;
|
|||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
|
@ -87,6 +86,7 @@ import ru.mail.android.mytarget.nativeads.NativeAppwallAd;
|
|||
import ru.mail.android.mytarget.nativeads.banners.NativeAppwallBanner;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
@ -956,7 +956,41 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
@Override
|
||||
public void onDismissDialog(NativeAppwallAd nativeAppwallAd) {}
|
||||
};
|
||||
mMytargetHelper = new MytargetHelper(listener, this);
|
||||
|
||||
|
||||
mMytargetHelper = new MytargetHelper(new MytargetHelper.Listener<Void>()
|
||||
{
|
||||
private void onNoAdsInternal()
|
||||
{
|
||||
mMainMenu.setVisible(MainMenu.Item.SHOWCASE, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoAds()
|
||||
{
|
||||
onNoAdsInternal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataReady(Void data)
|
||||
{
|
||||
mMytargetHelper.loadShowcase(new MytargetHelper.Listener<List<NativeAppwallBanner>>()
|
||||
{
|
||||
@Override
|
||||
public void onNoAds()
|
||||
{
|
||||
onNoAdsInternal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataReady(List<NativeAppwallBanner> banners)
|
||||
{
|
||||
mMainMenu.setShowcaseText(banners.get(0).getTitle());
|
||||
mMainMenu.setVisible(MainMenu.Item.SHOWCASE, true);
|
||||
}
|
||||
}, MwmActivity.this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -15,6 +15,7 @@ public final class CountryItem implements Comparable<CountryItem>
|
|||
static final int CATEGORY_NEAR_ME = 0;
|
||||
static final int CATEGORY_DOWNLOADED = 1;
|
||||
static final int CATEGORY_AVAILABLE = 2;
|
||||
static final int CATEGORY__LAST = CATEGORY_AVAILABLE;
|
||||
|
||||
// Must correspond to NodeStatus in storage_defines.hpp
|
||||
public static final int STATUS_UNKNOWN = 0;
|
||||
|
|
|
@ -3,9 +3,11 @@ package com.mapswithme.maps.downloader;
|
|||
import android.app.Activity;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Typeface;
|
||||
import android.location.Location;
|
||||
import android.support.annotation.DrawableRes;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.StringRes;
|
||||
|
@ -19,16 +21,10 @@ import android.util.SparseArray;
|
|||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
|
||||
import com.mapswithme.maps.MwmActivity;
|
||||
import com.mapswithme.maps.MwmApplication;
|
||||
import com.mapswithme.maps.R;
|
||||
|
@ -37,31 +33,54 @@ import com.mapswithme.maps.location.LocationHelper;
|
|||
import com.mapswithme.maps.routing.RoutingController;
|
||||
import com.mapswithme.util.BottomSheetHelper;
|
||||
import com.mapswithme.util.StringUtils;
|
||||
import com.mapswithme.util.ThemeUtils;
|
||||
import com.mapswithme.util.UiUtils;
|
||||
import com.mapswithme.util.statistics.MytargetHelper;
|
||||
import com.mapswithme.util.statistics.Statistics;
|
||||
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;
|
||||
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration;
|
||||
import ru.mail.android.mytarget.core.models.banners.AbstractBanner;
|
||||
import ru.mail.android.mytarget.nativeads.banners.NativeAppwallBanner;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
|
||||
class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolder>
|
||||
class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolderWrapper>
|
||||
implements StickyRecyclerHeadersAdapter<DownloaderAdapter.HeaderViewHolder>
|
||||
{
|
||||
private static final String HEADER_ADVERTISMENT_TITLE = "MY.COM";
|
||||
private static final int HEADER_ADVERTISMENT_ID = CountryItem.CATEGORY__LAST + 1;
|
||||
|
||||
private static final int KIND_COUNTRY = 0;
|
||||
private static final int KIND_ADVERTISMENT = 1;
|
||||
|
||||
private final RecyclerView mRecycler;
|
||||
private final Activity mActivity;
|
||||
private final DownloaderFragment mFragment;
|
||||
private final StickyRecyclerHeadersDecoration mHeadersDecoration;
|
||||
|
||||
private boolean mMyMapsMode = true;
|
||||
private boolean mAdsLoaded;
|
||||
private boolean mAdsLoading;
|
||||
private boolean mShowAds;
|
||||
private boolean mSearchResultsMode;
|
||||
private String mSearchQuery;
|
||||
|
||||
private final List<CountryItem> mItems = new ArrayList<>();
|
||||
private final Map<String, CountryItem> mCountryIndex = new HashMap<>(); // Country.id -> Country
|
||||
private final List<NativeAppwallBanner> mAds = new ArrayList<>();
|
||||
|
||||
private final SparseArray<String> mHeaders = new SparseArray<>();
|
||||
private final Stack<PathEntry> mPath = new Stack<>(); // Holds navigation history. The last element is the current level.
|
||||
private int mNearMeCount;
|
||||
|
||||
private int mListenerSlot;
|
||||
private MytargetHelper mMytargetHelper;
|
||||
|
||||
private enum MenuItem
|
||||
{
|
||||
|
@ -248,9 +267,9 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
|
||||
for (int i = first; i <= last; i++)
|
||||
{
|
||||
ViewHolder vh = (ViewHolder)mRecycler.findViewHolderForAdapterPosition(i);
|
||||
if (vh != null && vh.mItem.id.equals(countryId))
|
||||
vh.bind(vh.mItem);
|
||||
ViewHolderWrapper vh = (ViewHolderWrapper)mRecycler.findViewHolderForAdapterPosition(i);
|
||||
if (vh != null && vh.mKind == KIND_COUNTRY && ((CountryItem)vh.mHolder.mItem).id.equals(countryId))
|
||||
vh.mHolder.rebind();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -284,7 +303,59 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
}
|
||||
};
|
||||
|
||||
class ViewHolder extends RecyclerView.ViewHolder
|
||||
private View createViewHolderFrame(ViewGroup parent, int kind)
|
||||
{
|
||||
return inflate(parent, (kind == KIND_ADVERTISMENT ? R.layout.downloader_item_ad
|
||||
: R.layout.downloader_item));
|
||||
}
|
||||
|
||||
class ViewHolderWrapper extends RecyclerView.ViewHolder
|
||||
{
|
||||
private final int mKind;
|
||||
private final BaseInnerViewHolder mHolder;
|
||||
|
||||
ViewHolderWrapper(ViewGroup parent, int kind)
|
||||
{
|
||||
super(createViewHolderFrame(parent, kind));
|
||||
|
||||
mKind = kind;
|
||||
mHolder = (kind == KIND_ADVERTISMENT) ? new AdViewHolder(itemView)
|
||||
: new ItemViewHolder(itemView);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
void bind(int position)
|
||||
{
|
||||
int kind = DownloaderAdapter.this.getItemViewType(position);
|
||||
if (kind == KIND_ADVERTISMENT)
|
||||
{
|
||||
mHolder.bind(mAds.get(position - mNearMeCount));
|
||||
return;
|
||||
}
|
||||
|
||||
if (position > mNearMeCount)
|
||||
position -= getAdsCount();
|
||||
|
||||
mHolder.bind(mItems.get(position));
|
||||
}
|
||||
}
|
||||
|
||||
private static abstract class BaseInnerViewHolder<T>
|
||||
{
|
||||
T mItem;
|
||||
|
||||
void bind(T item)
|
||||
{
|
||||
mItem = item;
|
||||
}
|
||||
|
||||
void rebind()
|
||||
{
|
||||
bind(mItem);
|
||||
}
|
||||
}
|
||||
|
||||
private class ItemViewHolder extends BaseInnerViewHolder<CountryItem>
|
||||
{
|
||||
private final DownloaderStatusIcon mStatusIcon;
|
||||
private final TextView mName;
|
||||
|
@ -292,8 +363,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
private final TextView mFoundName;
|
||||
private final TextView mSize;
|
||||
|
||||
private CountryItem mItem;
|
||||
|
||||
private void processClick(boolean clickOnStatus)
|
||||
{
|
||||
switch (mItem.status)
|
||||
|
@ -409,10 +478,8 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
}).tint().show();
|
||||
}
|
||||
|
||||
public ViewHolder(View frame)
|
||||
ItemViewHolder(View frame)
|
||||
{
|
||||
super(frame);
|
||||
|
||||
mStatusIcon = new DownloaderStatusIcon(frame.findViewById(R.id.downloader_status_frame))
|
||||
{
|
||||
@Override
|
||||
|
@ -480,9 +547,10 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
void bind(CountryItem item)
|
||||
{
|
||||
mItem = item;
|
||||
super.bind(item);
|
||||
|
||||
if (mSearchResultsMode)
|
||||
{
|
||||
|
@ -530,21 +598,84 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
}
|
||||
}
|
||||
|
||||
class HeaderViewHolder extends RecyclerView.ViewHolder {
|
||||
class HeaderViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
private final TextView mTitle;
|
||||
|
||||
HeaderViewHolder(View frame) {
|
||||
HeaderViewHolder(View frame)
|
||||
{
|
||||
super(frame);
|
||||
mTitle = (TextView) frame.findViewById(R.id.title);
|
||||
}
|
||||
|
||||
void bind(int position) {
|
||||
mTitle.setText(mHeaders.get(mItems.get(position).headerId));
|
||||
void bind(int position)
|
||||
{
|
||||
if (position >= mNearMeCount && position < mNearMeCount + getAdsCount())
|
||||
mTitle.setText(HEADER_ADVERTISMENT_TITLE);
|
||||
else
|
||||
mTitle.setText(mHeaders.get(mItems.get(position).headerId));
|
||||
}
|
||||
}
|
||||
|
||||
class AdViewHolder extends BaseInnerViewHolder<NativeAppwallBanner>
|
||||
{
|
||||
private final ImageView mIcon;
|
||||
private final TextView mTitle;
|
||||
private final TextView mSubtitle;
|
||||
private final Button mAction;
|
||||
|
||||
private NativeAppwallBanner mData;
|
||||
|
||||
private final View.OnClickListener mClickListener = new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if (mData == null)
|
||||
return;
|
||||
|
||||
String packageId = ((AbstractBanner)mData).getBundleId();
|
||||
if (mData.isAppInstalled())
|
||||
{
|
||||
PackageManager pm = MwmApplication.get().getPackageManager();
|
||||
Intent intent = pm.getLaunchIntentForPackage(packageId);
|
||||
if (intent != null)
|
||||
mActivity.startActivity(intent);
|
||||
} else
|
||||
mMytargetHelper.onBannerClick(mData);
|
||||
}
|
||||
};
|
||||
|
||||
AdViewHolder(View frame)
|
||||
{
|
||||
mIcon = (ImageView)frame.findViewById(R.id.downloader_ad_icon);
|
||||
mTitle = (TextView)frame.findViewById(R.id.downloader_ad_title);
|
||||
mSubtitle = (TextView)frame.findViewById(R.id.downloader_ad_subtitle);
|
||||
mAction = (Button)frame.findViewById(R.id.downloader_ad_action);
|
||||
|
||||
UiUtils.updateAccentButton(mAction);
|
||||
mAction.setOnClickListener(mClickListener);
|
||||
frame.setOnClickListener(mClickListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
void bind(NativeAppwallBanner item)
|
||||
{
|
||||
mData = item;
|
||||
super.bind(item);
|
||||
|
||||
mIcon.setImageBitmap(item.getIcon().getBitmap());
|
||||
mTitle.setText(item.getTitle());
|
||||
mSubtitle.setText(item.getDescription());
|
||||
|
||||
// TODO: Texts?
|
||||
mAction.setText(item.isAppInstalled() ? "Run" : "Install");
|
||||
}
|
||||
}
|
||||
|
||||
private void collectHeaders()
|
||||
{
|
||||
mNearMeCount = 0;
|
||||
mHeaders.clear();
|
||||
if (mSearchResultsMode)
|
||||
return;
|
||||
|
@ -562,6 +693,8 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
mHeaders.put(headerId, MwmApplication.get().getString(R.string.downloader_near_me_subtitle));
|
||||
prev = ci.category;
|
||||
}
|
||||
|
||||
mNearMeCount++;
|
||||
break;
|
||||
|
||||
case CountryItem.CATEGORY_DOWNLOADED:
|
||||
|
@ -575,7 +708,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
|
||||
default:
|
||||
int prevHeader = headerId;
|
||||
headerId = CountryItem.CATEGORY_AVAILABLE + ci.name.charAt(0);
|
||||
headerId = CountryItem.CATEGORY_AVAILABLE * 10 + ci.name.charAt(0);
|
||||
|
||||
if (headerId != prevHeader)
|
||||
mHeaders.put(headerId, ci.name.substring(0, 1).toUpperCase());
|
||||
|
@ -609,6 +742,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
|
||||
MapManager.nativeListItems(parent, lat, lon, hasLocation, mMyMapsMode, mItems);
|
||||
processData();
|
||||
loadAds();
|
||||
}
|
||||
|
||||
void setSearchResultsMode(Collection<CountryItem> results, String query)
|
||||
|
@ -639,13 +773,13 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
for (CountryItem ci: mItems)
|
||||
mCountryIndex.put(ci.id, ci);
|
||||
|
||||
mHeadersDecoration.invalidateHeaders();
|
||||
notifyDataSetChanged();
|
||||
|
||||
if (mItems.isEmpty())
|
||||
mFragment.setupPlaceholder();
|
||||
|
||||
mFragment.showPlaceholder(mItems.isEmpty());
|
||||
|
||||
mHeadersDecoration.invalidateHeaders();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
DownloaderAdapter(DownloaderFragment fragment)
|
||||
|
@ -657,22 +791,39 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
mRecycler.addItemDecoration(mHeadersDecoration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
|
||||
private View inflate(ViewGroup parent, @LayoutRes int layoutId)
|
||||
{
|
||||
return new ViewHolder(LayoutInflater.from(mActivity).inflate(R.layout.downloader_item, parent, false));
|
||||
return LayoutInflater.from(mActivity).inflate(layoutId, parent, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ViewHolder holder, int position)
|
||||
public int getItemViewType(int position)
|
||||
{
|
||||
holder.bind(mItems.get(position));
|
||||
if (position < mNearMeCount)
|
||||
return KIND_COUNTRY;
|
||||
|
||||
if (position < mNearMeCount + getAdsCount())
|
||||
return KIND_ADVERTISMENT;
|
||||
|
||||
return KIND_COUNTRY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolderWrapper onCreateViewHolder(ViewGroup parent, int viewType)
|
||||
{
|
||||
return new ViewHolderWrapper(parent, viewType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ViewHolderWrapper holder, int position)
|
||||
{
|
||||
holder.bind(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent)
|
||||
{
|
||||
return new HeaderViewHolder(LayoutInflater.from(mActivity).inflate(R.layout.downloader_item_header, parent, false));
|
||||
return new HeaderViewHolder(inflate(parent, R.layout.downloader_item_header));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -684,13 +835,26 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
@Override
|
||||
public long getHeaderId(int position)
|
||||
{
|
||||
if (position >= mNearMeCount)
|
||||
{
|
||||
if (position < mNearMeCount + getAdsCount())
|
||||
return HEADER_ADVERTISMENT_ID;
|
||||
|
||||
position -= getAdsCount();
|
||||
}
|
||||
|
||||
return mItems.get(position).headerId;
|
||||
}
|
||||
|
||||
private int getAdsCount()
|
||||
{
|
||||
return (mShowAds ? mAds.size() : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount()
|
||||
{
|
||||
return mItems.size();
|
||||
return mItems.size() + getAdsCount();
|
||||
}
|
||||
|
||||
private void goDeeper(CountryItem child, boolean refresh)
|
||||
|
@ -776,6 +940,93 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
return mMyMapsMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads banner if:
|
||||
* <ul>
|
||||
* <li>Not in `my maps` mode;</li>
|
||||
* <li>Currently at root level;</li>
|
||||
* <li>Day mode is active;</li>
|
||||
* <li>There is at least one map downloaded.</li>
|
||||
* </ul>
|
||||
*/
|
||||
private void loadAds()
|
||||
{
|
||||
mShowAds = false;
|
||||
if (mAdsLoading)
|
||||
return;
|
||||
|
||||
if (mMyMapsMode || !CountryItem.isRoot(getCurrentRootId()))
|
||||
return;
|
||||
|
||||
if (!ThemeUtils.isDefaultTheme())
|
||||
return;
|
||||
|
||||
if (MapManager.nativeGetDownloadedCount() < 1)
|
||||
return;
|
||||
|
||||
mShowAds = true;
|
||||
if (mAdsLoaded)
|
||||
{
|
||||
mHeadersDecoration.invalidateHeaders();
|
||||
notifyItemRangeInserted(mNearMeCount, mAds.size());
|
||||
return;
|
||||
}
|
||||
|
||||
mAdsLoading = true;
|
||||
mMytargetHelper = new MytargetHelper(new MytargetHelper.Listener<Void>()
|
||||
{
|
||||
private void onNoAdsInternal()
|
||||
{
|
||||
mAdsLoading = false;
|
||||
mAdsLoaded = true;
|
||||
|
||||
int oldSize = mAds.size();
|
||||
mAds.clear();
|
||||
if (oldSize > 0)
|
||||
{
|
||||
mHeadersDecoration.invalidateHeaders();
|
||||
notifyItemRangeRemoved(mNearMeCount, oldSize);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoAds()
|
||||
{
|
||||
onNoAdsInternal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataReady(Void data)
|
||||
{
|
||||
mMytargetHelper.loadShowcase(new MytargetHelper.Listener<List<NativeAppwallBanner>>()
|
||||
{
|
||||
@Override
|
||||
public void onNoAds()
|
||||
{
|
||||
onNoAdsInternal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataReady(List<NativeAppwallBanner> banners)
|
||||
{
|
||||
mAdsLoading = false;
|
||||
mAdsLoaded = true;
|
||||
|
||||
int oldSize = mAds.size();
|
||||
mAds.clear();
|
||||
mAds.addAll(banners);
|
||||
|
||||
mHeadersDecoration.invalidateHeaders();
|
||||
if (oldSize == 0)
|
||||
notifyItemRangeInserted(mNearMeCount, mAds.size());
|
||||
else
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}, mActivity);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void attach()
|
||||
{
|
||||
mListenerSlot = MapManager.nativeSubscribe(mStorageCallback);
|
||||
|
@ -784,6 +1035,11 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
|
|||
void detach()
|
||||
{
|
||||
MapManager.nativeUnsubscribe(mListenerSlot);
|
||||
|
||||
if (mMytargetHelper != null)
|
||||
mMytargetHelper.cancel();
|
||||
|
||||
mAdsLoading = false;
|
||||
}
|
||||
|
||||
boolean isSearchResultsMode()
|
||||
|
|
|
@ -5,11 +5,6 @@ import android.preference.PreferenceManager;
|
|||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.WorkerThread;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
|
||||
import com.mapswithme.maps.MwmApplication;
|
||||
import com.mapswithme.maps.PrivateVariables;
|
||||
import com.mapswithme.maps.R;
|
||||
|
@ -18,6 +13,15 @@ import com.mapswithme.util.concurrency.ThreadPool;
|
|||
import com.mapswithme.util.concurrency.UiThread;
|
||||
import ru.mail.android.mytarget.core.net.Hosts;
|
||||
import ru.mail.android.mytarget.nativeads.NativeAppwallAd;
|
||||
import ru.mail.android.mytarget.nativeads.banners.NativeAppwallBanner;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
|
||||
import static com.mapswithme.maps.MwmApplication.prefs;
|
||||
|
||||
public final class MytargetHelper
|
||||
{
|
||||
|
@ -30,23 +34,24 @@ public final class MytargetHelper
|
|||
private static final int TIMEOUT = 1000;
|
||||
|
||||
private NativeAppwallAd mShowcase;
|
||||
private Activity mActivity;
|
||||
private NativeAppwallAd.AppwallAdListener mListener;
|
||||
private boolean mCancelled;
|
||||
|
||||
public interface Listener<T>
|
||||
{
|
||||
void onNoAds();
|
||||
void onDataReady(T data);
|
||||
}
|
||||
|
||||
static
|
||||
{
|
||||
Hosts.setMyComHost();
|
||||
}
|
||||
|
||||
public MytargetHelper(@NonNull NativeAppwallAd.AppwallAdListener listener, @NonNull Activity activity)
|
||||
public MytargetHelper(final @NonNull Listener<Void> listener)
|
||||
{
|
||||
mListener = listener;
|
||||
mActivity = activity;
|
||||
|
||||
if (!ConnectionState.isConnected() ||
|
||||
!isShowcaseSwitchedOnLocal())
|
||||
if (!ConnectionState.isConnected() || !isShowcaseSwitchedOnLocal())
|
||||
{
|
||||
listener.onNoAd("Switched off", null);
|
||||
listener.onNoAds();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -56,21 +61,22 @@ public final class MytargetHelper
|
|||
public void run()
|
||||
{
|
||||
final boolean showShowcase = getShowcaseSetting();
|
||||
|
||||
if (mCancelled)
|
||||
return;
|
||||
|
||||
UiThread.run(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (mListener == null || mActivity == null)
|
||||
if (mCancelled)
|
||||
return;
|
||||
|
||||
if (!showShowcase)
|
||||
{
|
||||
mListener.onNoAd("Switched off on server", null);
|
||||
return;
|
||||
}
|
||||
|
||||
loadShowcase(mListener, mActivity);
|
||||
if (showShowcase)
|
||||
listener.onDataReady(null);
|
||||
else
|
||||
listener.onNoAds();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -79,14 +85,13 @@ public final class MytargetHelper
|
|||
|
||||
public void cancel()
|
||||
{
|
||||
mListener = null;
|
||||
mActivity = null;
|
||||
mCancelled = true;
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
private static boolean getShowcaseSetting()
|
||||
{
|
||||
final long lastCheckMillis = MwmApplication.prefs().getLong(PREF_CHECK_MILLIS, 0);
|
||||
final long lastCheckMillis = prefs().getLong(PREF_CHECK_MILLIS, 0);
|
||||
final long currentMillis = System.currentTimeMillis();
|
||||
if (currentMillis - lastCheckMillis < CHECK_INTERVAL_MILLIS)
|
||||
return isShowcaseSwitchedOnServer();
|
||||
|
@ -121,20 +126,58 @@ public final class MytargetHelper
|
|||
return false;
|
||||
}
|
||||
|
||||
private void loadShowcase(NativeAppwallAd.AppwallAdListener listener, Activity activity)
|
||||
public void loadShowcase(final @NonNull Listener<List<NativeAppwallBanner>> listener, Activity activity)
|
||||
{
|
||||
mShowcase = new NativeAppwallAd(Integer.parseInt(PrivateVariables.myTargetSlot()), activity);
|
||||
mShowcase.setListener(listener);
|
||||
mShowcase.load();
|
||||
if (mShowcase == null)
|
||||
mShowcase = loadAds(listener, activity);
|
||||
}
|
||||
|
||||
private NativeAppwallAd loadAds(final @NonNull Listener<List<NativeAppwallBanner>> listener, Activity activity)
|
||||
{
|
||||
NativeAppwallAd res = new NativeAppwallAd(PrivateVariables.myTargetSlot(), activity);
|
||||
res.setListener(new NativeAppwallAd.AppwallAdListener()
|
||||
{
|
||||
@Override
|
||||
public void onLoad(NativeAppwallAd ad)
|
||||
{
|
||||
if (mCancelled)
|
||||
return;
|
||||
|
||||
if (ad.getBanners().isEmpty())
|
||||
listener.onNoAds();
|
||||
else
|
||||
listener.onDataReady(ad.getBanners());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoAd(String s, NativeAppwallAd nativeAppwallAd)
|
||||
{
|
||||
listener.onNoAds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(NativeAppwallBanner nativeAppwallBanner, NativeAppwallAd nativeAppwallAd) {}
|
||||
|
||||
@Override
|
||||
public void onDismissDialog(NativeAppwallAd nativeAppwallAd) {}
|
||||
});
|
||||
|
||||
res.load();
|
||||
return res;
|
||||
}
|
||||
|
||||
public void onBannerClick(NativeAppwallBanner banner)
|
||||
{
|
||||
mShowcase.handleBannerClick(banner);
|
||||
}
|
||||
|
||||
public void displayShowcase()
|
||||
{
|
||||
if (!mShowcase.getBanners().isEmpty())
|
||||
mShowcase.handleBannerClick(mShowcase.getBanners().get(0));
|
||||
onBannerClick(mShowcase.getBanners().get(0));
|
||||
}
|
||||
|
||||
public static boolean isShowcaseSwitchedOnLocal()
|
||||
private static boolean isShowcaseSwitchedOnLocal()
|
||||
{
|
||||
return PreferenceManager.getDefaultSharedPreferences(MwmApplication.get())
|
||||
.getBoolean(MwmApplication.get().getString(R.string.pref_showcase_switched_on), false);
|
||||
|
@ -142,12 +185,14 @@ public final class MytargetHelper
|
|||
|
||||
public static boolean isShowcaseSwitchedOnServer()
|
||||
{
|
||||
return MwmApplication.prefs().getBoolean(PREF_CHECK, false);
|
||||
return prefs().getBoolean(PREF_CHECK, true);
|
||||
}
|
||||
|
||||
private static void setShowcaseSwitchedOnServer(boolean switchedOn)
|
||||
{
|
||||
MwmApplication.prefs().edit().putLong(PREF_CHECK_MILLIS, System.currentTimeMillis())
|
||||
.putBoolean(PREF_CHECK, switchedOn).apply();
|
||||
prefs().edit()
|
||||
.putLong(PREF_CHECK_MILLIS, System.currentTimeMillis())
|
||||
.putBoolean(PREF_CHECK, switchedOn)
|
||||
.apply();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue