package net.rdrei.android.scdl2.ui;
import android.view.InflateException;
import android.view.View;
import android.view.ViewGroup;
import com.crashlytics.android.Crashlytics;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.gu.option.Function;
import com.gu.option.Option;
import com.gu.option.UnitFunction;
import net.rdrei.android.scdl2.ApplicationPreferences;
import net.rdrei.android.scdl2.R;
import net.rdrei.android.scdl2.guice.ActivityLayoutInflater;
import roboguice.util.Ln;
/**
* Loads and injects an AdView if required into an existing layout.
*
* @author pascal
*/
public class AdViewManager {
private Provider<ApplicationPreferences> mPreferencesProvider;
private ActivityLayoutInflater mInflater;
@Inject
public AdViewManager(Provider<ApplicationPreferences> preferencesProvider,
ActivityLayoutInflater inflater) {
this.mPreferencesProvider = preferencesProvider;
this.mInflater = inflater;
}
private Option<View> getAdView(final ViewGroup baseView) {
try {
return Option.some(mInflater.inflate(R.layout.adview, baseView, false));
} catch (InflateException exc) {
Ln.e(exc);
Crashlytics.logException(exc);
}
return Option.none();
}
private Option<AdView> setupView(final View view) {
AdView adView;
try {
adView = (AdView) view;
} catch (ClassCastException err) {
adView = null;
Crashlytics.logException(err);
}
if (adView != null) {
final AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
// http://crashes.to/s/a45228d86d4
try {
adView.loadAd(adRequest);
} catch (OutOfMemoryError err) {
return Option.none();
}
return Option.some(adView);
}
return Option.none();
}
/**
* Add the AdView to the given baseView.
*
* @param baseView The layout element to add the view to.
*/
public void addToView(final ViewGroup baseView) {
final Option<View> adView = getAdView(baseView);
adView.flatMap((v) -> setupView(v)).foreach(baseView::addView);
}
/**
* Add to the given baseView, but only if the application is non-adfree.
*
* @param baseView The view you want to see your ads in.
* @return True if added to layout, false if not.
*/
public boolean addToViewIfRequired(final ViewGroup baseView) {
final boolean showAds = !mPreferencesProvider.get().isAdFree();
if (showAds) {
addToView(baseView);
}
return showAds;
}
}