package de.jeisfeld.augendiagnoselib.util;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.View;
import com.admarvel.android.ads.AdMarvelUtils;
import com.admarvel.android.ads.AdMarvelUtils.ErrorReason;
import com.admarvel.android.ads.AdMarvelUtils.SDKAdNetwork;
import com.admarvel.android.ads.AdMarvelView;
import com.admarvel.android.ads.AdMarvelView.AdMarvelViewListener;
import de.jeisfeld.augendiagnoselib.Application;
import de.jeisfeld.augendiagnoselib.Application.AuthorizationLevel;
import de.jeisfeld.augendiagnoselib.R;
import de.jeisfeld.augendiagnoselib.activities.AdMarvelActivity;
/**
* Utility class for handling AdMarvel ads.
*/
public final class AdMarvelUtil {
/**
* The AdMarvel partnerId.
*/
private static final String PARTNER_ID = "50a68fd597efa11b";
/**
* SiteId for BNR (320x50).
*/
private static final String SITE_BNR = "130360";
/**
* SiteId for MREC (300x250).
*/
public static final String SITE_MREC = "130361";
/**
* SiteId for LDR (728x90).
*/
private static final String SITE_LDR = "130362";
/**
* The countries where ads are displayed.
*/
private static final String[] AD_COUNTRIES = {"US"};
/**
* Frequency after how many ad displays the tip is displayed.
*/
private static final int TIP_FREQUENCY = 5;
/**
* User key prefix that overrides the country setting for displaying the ad.
*/
public static final String FORCE_AD_USER = "AdMarvel";
/**
* Hide default constructor.
*/
private AdMarvelUtil() {
throw new UnsupportedOperationException();
}
/**
* Check if the app is eligible for displaying an ad.
*
* @return true if eligible.
*/
private static boolean isEligibleForAd() {
// Only for certain access level.
if (Application.getAuthorizationLevel() != AuthorizationLevel.FULL_ACCESS_WITH_ADS) {
return false;
}
// After clicking
if (PreferenceUtil.getSharedPreferenceBoolean(R.string.key_admarvel_iscurrentlyclicked)) {
return false;
}
// Special user to test ads
String userKey = PreferenceUtil.getSharedPreferenceString(R.string.key_user_key);
if (userKey != null && userKey.startsWith(FORCE_AD_USER)) {
return true;
}
// no ads except for certain countries. (Exception for special user key, in order to allow testing.)
String country = SystemUtil.getUserCountry();
if (country == null || !Arrays.asList(AD_COUNTRIES).contains(country)) {
return false;
}
// no ads before user has had some minimum usage of app
return PreferenceUtil.getSharedPreferenceInt(R.string.key_statistics_countdisplay, 0) >= 2;
}
/**
* Initialize the AdMarvel SDK. Currently not used.
*
* @param activity The triggering activity.
*/
public static void initializeSdk(final Activity activity) {
Map<SDKAdNetwork, String> publisherIds = new HashMap<>();
// publisherIds.put(SDKAdNetwork.ADMARVEL, "<App IDs for that AdNetwork>");
AdMarvelUtils.initialize(activity, publisherIds);
}
/**
* Request a banner ad.
*
* @param activity The triggering activity.
*/
private static void requestBannerAd(@NonNull final AdMarvelActivity activity) {
try {
Map<String, Object> targetParams = new HashMap<>();
targetParams.put("KEYWORDS", "HCP");
targetParams.put("APP_VERSION", Application.getVersionString());
AdMarvelView adMarvelView = activity.getAdMarvelView();
adMarvelView.setListener(new AdMarvelListener(activity));
adMarvelView.requestNewAd(targetParams, PARTNER_ID, SystemUtil.isTablet() ? SITE_LDR : SITE_BNR);
}
catch (Exception e) {
Log.e(Application.TAG, "Error when requesting banner ad.", e);
}
}
/**
* Request a banner ad after checking eligibility.
*
* @param activity The triggering activity.
*/
public static void requestBannerAdIfEligible(@NonNull final AdMarvelActivity activity) {
if (AdMarvelUtil.isEligibleForAd()) {
AdMarvelView adMarvelView = activity.getAdMarvelView();
if (adMarvelView != null) {
requestBannerAd(activity);
}
}
else {
AdMarvelView adMarvelView = activity.getAdMarvelView();
if (adMarvelView != null) {
adMarvelView.setVisibility(View.GONE);
}
}
}
/**
* Listener for tracking AdMarvel ad actions.
*/
private static class AdMarvelListener implements AdMarvelViewListener {
/**
* The triggering activity.
*/
private final AdMarvelActivity mActivity;
/**
* Constructor handing over the activity.
*
* @param activity The triggering activity.
*/
AdMarvelListener(final AdMarvelActivity activity) {
this.mActivity = activity;
}
@Override
public void onClickAd(final AdMarvelView arg0, final String arg1) {
PreferenceUtil.incrementCounter(R.string.key_admarvel_countclicks);
PreferenceUtil.setSharedPreferenceInt(R.string.key_admarvel_checkssincelastclick, 0);
PreferenceUtil.setSharedPreferenceBoolean(R.string.key_admarvel_iscurrentlyclicked, true);
}
@Override
public void onClose(final AdMarvelView arg0) {
// do nothing.
}
@Override
public void onExpand(final AdMarvelView arg0) {
// do nothing.
}
@Override
public void onFailedToReceiveAd(final AdMarvelView arg0, final int arg1, @NonNull final ErrorReason errorReason) {
Log.w(Application.TAG, "Failed to receive ad: " + errorReason.toString());
AdMarvelView adMarvelView = mActivity.getAdMarvelView();
if (adMarvelView != null) {
adMarvelView.setVisibility(View.GONE);
}
}
@Override
public void onReceiveAd(final AdMarvelView arg0) {
AdMarvelView adMarvelView = mActivity.getAdMarvelView();
if (adMarvelView != null) {
adMarvelView.setVisibility(View.VISIBLE);
int counter = PreferenceUtil.incrementCounter(R.string.key_admarvel_countdisplays);
if (counter % TIP_FREQUENCY == 0) {
DialogUtil.displayTip(mActivity, R.string.message_tip_admarvel, R.string.key_tip_admarvel);
}
}
}
@Override
public void onRequestAd(final AdMarvelView arg0) {
// do nothing.
}
}
}