正在查看: Fancy Optimizer v4.6.3 应用的 LocalAdPresenter.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: Fancy Optimizer v4.6.3 应用的 LocalAdPresenter.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.vungle.warren.ui.presenter;
import android.content.DialogInterface;
import android.support.v4.media.c;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewRenderProcess;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.j;
import com.google.gson.m;
import com.vungle.warren.SessionTracker;
import com.vungle.warren.VungleLogger;
import com.vungle.warren.analytics.AdAnalytics;
import com.vungle.warren.analytics.AnalyticsEvent;
import com.vungle.warren.error.VungleException;
import com.vungle.warren.model.Advertisement;
import com.vungle.warren.model.AdvertisementDBAdapter;
import com.vungle.warren.model.Cookie;
import com.vungle.warren.model.Placement;
import com.vungle.warren.model.Report;
import com.vungle.warren.model.ReportDBAdapter;
import com.vungle.warren.model.SessionData;
import com.vungle.warren.model.VisionDataDBAdapter;
import com.vungle.warren.model.token.Gdpr;
import com.vungle.warren.persistence.Repository;
import com.vungle.warren.session.SessionAttribute;
import com.vungle.warren.session.SessionEvent;
import com.vungle.warren.ui.DurationRecorder;
import com.vungle.warren.ui.JavascriptBridge;
import com.vungle.warren.ui.PresenterAppLeftCallback;
import com.vungle.warren.ui.contract.AdContract;
import com.vungle.warren.ui.contract.LocalAdContract;
import com.vungle.warren.ui.state.OptionsState;
import com.vungle.warren.ui.view.WebViewAPI;
import com.vungle.warren.utility.AsyncFileUtils;
import com.vungle.warren.utility.Constants;
import com.vungle.warren.utility.Scheduler;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
public class LocalAdPresenter implements LocalAdContract.LocalPresenter, WebViewAPI.WebClientErrorHandler {
static final String EXTRA_INCENTIVIZED_SENT = "incentivized_sent";
static final String EXTRA_IN_POST = "in_post_roll";
static final String EXTRA_IS_MUTED = "is_muted_mode";
static final String EXTRA_REPORT = "saved_report";
static final String EXTRA_VIDEO_POSITION = "videoPosition";
static final String HTTPS_VUNGLE_COM_PRIVACY = "https://vungle.com/privacy/";
public static final int INCENTIVIZED_TRESHOLD = 75;
static final String TAG = "LocalAdPresenter";
private LocalAdContract.LocalView adView;
private boolean adViewed;
private Advertisement advertisement;
private final AdAnalytics analytics;
private File assetDir;
private AdContract.AdvertisementPresenter.EventListener bus;
private int duration;
private DurationRecorder durationRecorder;
private AsyncFileUtils.ExistenceOperation fileExistenceOperation;
@Nullable
private final String[] impressionUrls;
private boolean inPost;
private boolean muted;
@NonNull
private Placement placement;
private int progress;
private Report report;
private Repository repository;
private final Scheduler scheduler;
private boolean userExitEnabled;
private int videoPosition;
private final WebViewAPI webViewAPI;
private final Map<String, Cookie> cookies = new HashMap();
private String dialogTitle = "Are you sure?";
private String dialogBody = "If you exit now, you will not get your reward";
private String dialogContinue = "Continue";
private String dialogClose = "Close";
private AtomicBoolean sendReportIncentivized = new AtomicBoolean(false);
private AtomicBoolean isDestroying = new AtomicBoolean(false);
private LinkedList<Advertisement.Checkpoint> checkpointList = new LinkedList<>();
private Repository.SaveCallback repoCallback = new Repository.SaveCallback() {
boolean errorHappened = false;
@Override
public void onError(Exception exc) {
if (this.errorHappened) {
return;
}
this.errorHappened = true;
LocalAdPresenter.this.makeBusError(26);
VungleLogger.error("LocalAdPresenter#onError", new VungleException(26).getLocalizedMessage());
LocalAdPresenter.this.closeAndReport();
}
@Override
public void onSaved() {
}
};
private AtomicBoolean busy = new AtomicBoolean(false);
public LocalAdPresenter(@NonNull Advertisement advertisement, @NonNull Placement placement, @NonNull Repository repository, @NonNull Scheduler scheduler, @NonNull AdAnalytics adAnalytics, @NonNull WebViewAPI webViewAPI, @Nullable OptionsState optionsState, @NonNull File file, @Nullable String[] strArr) {
this.advertisement = advertisement;
this.placement = placement;
this.scheduler = scheduler;
this.analytics = adAnalytics;
this.webViewAPI = webViewAPI;
this.repository = repository;
this.assetDir = file;
this.impressionUrls = strArr;
if (advertisement.getCheckpoints() != null) {
this.checkpointList.addAll(advertisement.getCheckpoints());
Collections.sort(this.checkpointList);
}
loadData(optionsState);
}
public void closeAndReport() {
if (this.busy.get()) {
Log.w(TAG, "Busy with closing");
return;
}
this.busy.set(true);
reportAction(JavascriptBridge.MraidHandler.CLOSE_ACTION, null);
this.scheduler.cancelAll();
this.adView.close();
}
public void continueWithPostroll() {
if (this.advertisement.hasPostroll()) {
playPost();
} else {
closeAndReport();
}
}
private void download() {
throw new UnsupportedOperationException("Method not decompiled: com.vungle.warren.ui.presenter.LocalAdPresenter.download():void");
}
private void handleWebViewException(@VungleException.ExceptionCode int i) {
LocalAdContract.LocalView localView = this.adView;
if (localView != null) {
localView.removeWebView();
}
reportErrorAndCloseAd(i);
}
private boolean isWebPageBlank() {
String websiteUrl = this.adView.getWebsiteUrl();
return TextUtils.isEmpty(websiteUrl) || "about:blank".equalsIgnoreCase(websiteUrl);
}
private void loadData(OptionsState optionsState) {
this.cookies.put(Cookie.INCENTIVIZED_TEXT_COOKIE, this.repository.load(Cookie.INCENTIVIZED_TEXT_COOKIE, Cookie.class).get());
this.cookies.put(Cookie.CONSENT_COOKIE, this.repository.load(Cookie.CONSENT_COOKIE, Cookie.class).get());
this.cookies.put(Cookie.CONFIG_COOKIE, this.repository.load(Cookie.CONFIG_COOKIE, Cookie.class).get());
if (optionsState != null) {
String string = optionsState.getString(EXTRA_REPORT);
Report report = TextUtils.isEmpty(string) ? null : (Report) this.repository.load(string, Report.class).get();
if (report != null) {
this.report = report;
}
}
}
public void makeBusError(@VungleException.ExceptionCode int i) {
AdContract.AdvertisementPresenter.EventListener eventListener = this.bus;
if (eventListener != null) {
eventListener.onError(new VungleException(i), this.placement.getId());
}
}
private boolean needShowGDPR(@Nullable Cookie cookie) {
return cookie != null && cookie.getBoolean("is_country_data_protected").booleanValue() && "unknown".equals(cookie.getString("consent_status"));
}
private void playPost() {
File file = new File(this.assetDir.getPath());
StringBuilder sb = new StringBuilder();
sb.append(file.getPath());
final File file2 = new File(c.j(sb, File.separator, "index.html"));
this.fileExistenceOperation = AsyncFileUtils.isFileExistAsync(file2, new AsyncFileUtils.FileExistCallback() {
@Override
public void status(boolean z) {
if (!z) {
LocalAdPresenter.this.makeBusError(27);
LocalAdPresenter.this.makeBusError(10);
VungleLogger.error("LocalAdPresenter#playPost", "Error Rendering Postroll");
LocalAdPresenter.this.closeAndReport();
return;
}
LocalAdPresenter.this.adView.showWebsite(Advertisement.FILE_SCHEME + file2.getPath());
LocalAdPresenter.this.analytics.ping(LocalAdPresenter.this.advertisement.getTpatUrls(AnalyticsEvent.Ad.postrollView));
LocalAdPresenter.this.inPost = true;
}
});
}
private void prepare(@Nullable OptionsState optionsState) {
restoreFromSave(optionsState);
Cookie cookie = this.cookies.get(Cookie.INCENTIVIZED_TEXT_COOKIE);
String string = cookie == null ? null : cookie.getString("userID");
if (this.report == null) {
Report report = new Report(this.advertisement, this.placement, System.currentTimeMillis(), string);
this.report = report;
report.setTtDownload(this.advertisement.getTtDownload());
this.repository.save(this.report, this.repoCallback);
}
if (this.durationRecorder == null) {
this.durationRecorder = new DurationRecorder(this.report, this.repository, this.repoCallback);
}
this.webViewAPI.setErrorHandler(this);
this.adView.showCTAOverlay(this.advertisement.isCtaOverlayEnabled(), this.advertisement.getCtaClickArea());
AdContract.AdvertisementPresenter.EventListener eventListener = this.bus;
if (eventListener != null) {
eventListener.onNext("start", null, this.placement.getId());
}
}
private void reportError(@NonNull String str) {
this.report.recordError(str);
this.repository.save(this.report, this.repoCallback);
makeBusError(27);
if (!this.inPost && this.advertisement.hasPostroll()) {
playPost();
} else {
makeBusError(10);
this.adView.close();
}
}
private void reportErrorAndCloseAd(@VungleException.ExceptionCode int i) {
makeBusError(i);
VungleLogger.error(TAG, "WebViewException: " + new VungleException(i).getLocalizedMessage());
closeAndReport();
}
private void showDialog(String str, String str2, String str3, String str4, DialogInterface.OnClickListener onClickListener) {
this.adView.pauseVideo();
this.adView.showDialog(str, str2, str3, str4, onClickListener);
}
private void showGDPR(@NonNull final Cookie cookie) {
DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
cookie.putValue("consent_status", i == -2 ? "opted_out" : i == -1 ? "opted_in" : Gdpr.OPTED_OUT_BY_TIMEOUT);
cookie.putValue(VisionDataDBAdapter.VisionDataColumns.COLUMN_TIMESTAMP, Long.valueOf(System.currentTimeMillis() / 1000));
cookie.putValue("consent_source", "vungle_modal");
LocalAdPresenter.this.repository.save(cookie, null);
LocalAdPresenter.this.start();
}
};
cookie.putValue("consent_status", Gdpr.OPTED_OUT_BY_TIMEOUT);
cookie.putValue(VisionDataDBAdapter.VisionDataColumns.COLUMN_TIMESTAMP, Long.valueOf(System.currentTimeMillis() / 1000));
cookie.putValue("consent_source", "vungle_modal");
this.repository.save(cookie, this.repoCallback);
showDialog(cookie.getString("consent_title"), cookie.getString("consent_message"), cookie.getString("button_accept"), cookie.getString("button_deny"), onClickListener);
}
private void showIncetivizedDialog() {
String str = this.dialogTitle;
String str2 = this.dialogBody;
String str3 = this.dialogContinue;
String str4 = this.dialogClose;
Cookie cookie = this.cookies.get(Cookie.INCENTIVIZED_TEXT_COOKIE);
if (cookie != null) {
str = cookie.getString("title");
if (TextUtils.isEmpty(str)) {
str = this.dialogTitle;
}
str2 = cookie.getString("body");
if (TextUtils.isEmpty(str2)) {
str2 = this.dialogBody;
}
str3 = cookie.getString("continue");
if (TextUtils.isEmpty(str3)) {
str3 = this.dialogContinue;
}
str4 = cookie.getString(JavascriptBridge.MraidHandler.CLOSE_ACTION);
if (TextUtils.isEmpty(str4)) {
str4 = this.dialogClose;
}
}
showDialog(str, str2, str3, str4, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == -2) {
LocalAdPresenter.this.reportAction(AnalyticsEvent.Ad.videoClose, null);
LocalAdPresenter.this.continueWithPostroll();
}
}
});
}
@Override
public void detach(@AdContract.AdStopReason int i) {
AsyncFileUtils.ExistenceOperation existenceOperation = this.fileExistenceOperation;
if (existenceOperation != null) {
existenceOperation.cancel();
}
stop(i);
this.adView.destroyAdView(0L);
}
@Override
public void generateSaveState(@Nullable OptionsState optionsState) {
if (optionsState == null) {
return;
}
this.repository.save(this.report, this.repoCallback);
Report report = this.report;
optionsState.put(EXTRA_REPORT, report == null ? null : report.getId());
optionsState.put(EXTRA_INCENTIVIZED_SENT, this.sendReportIncentivized.get());
optionsState.put(EXTRA_IN_POST, this.inPost);
optionsState.put(EXTRA_IS_MUTED, this.muted);
LocalAdContract.LocalView localView = this.adView;
optionsState.put(EXTRA_VIDEO_POSITION, (localView == null || !localView.isVideoPlaying()) ? this.videoPosition : this.adView.getVideoPosition());
}
@Override
public boolean handleExit() {
if (this.inPost) {
closeAndReport();
return true;
}
if (!this.userExitEnabled) {
return false;
}
if (this.placement.isIncentivized() && this.progress <= 75) {
showIncetivizedDialog();
return false;
}
reportAction(AnalyticsEvent.Ad.videoClose, null);
if (this.advertisement.hasPostroll()) {
playPost();
return false;
}
closeAndReport();
return true;
}
@Override
public void onDownload() {
download();
}
@Override
public boolean onMediaError(@NonNull String str) {
reportError(str);
VungleLogger.error("LocalAdPresenter#onMediaError", "Media Error: " + str);
return false;
}
@Override
public void onMraidAction(@NonNull String str) {
str.getClass();
switch (str) {
case "privacy":
return;
case "close":
closeAndReport();
return;
case "download":
download();
closeAndReport();
return;
default:
VungleLogger.error("LocalAdPresenter#onMraidAction", "Unknown MRAID Command");
throw new IllegalArgumentException("Unknown action ".concat(str));
}
}
@Override
public void onMute(boolean z) {
this.muted = z;
if (z) {
reportAction(AnalyticsEvent.Ad.mute, "true");
} else {
reportAction(AnalyticsEvent.Ad.unmute, "false");
}
}
@Override
public void onPrivacy() {
this.adView.open(null, HTTPS_VUNGLE_COM_PRIVACY, new PresenterAppLeftCallback(this.bus, this.placement), null);
}
@Override
public void onProgressUpdate(int i, float f) {
this.progress = (int) ((i / f) * 100.0f);
this.videoPosition = i;
this.durationRecorder.update();
AdContract.AdvertisementPresenter.EventListener eventListener = this.bus;
if (eventListener != null) {
eventListener.onNext("percentViewed:" + this.progress, null, this.placement.getId());
}
AdContract.AdvertisementPresenter.EventListener eventListener2 = this.bus;
if (eventListener2 != null && i > 0 && !this.adViewed) {
this.adViewed = true;
eventListener2.onNext("adViewed", null, this.placement.getId());
String[] strArr = this.impressionUrls;
if (strArr != null) {
this.analytics.ping(strArr);
}
}
reportAction("video_viewed", String.format(Locale.ENGLISH, "%d", Integer.valueOf(i)));
if (this.progress == 100) {
if (this.checkpointList.peekLast() != null && this.checkpointList.peekLast().getPercentage() == 100) {
this.analytics.ping(this.checkpointList.pollLast().getUrls());
}
continueWithPostroll();
}
this.report.recordProgress(this.videoPosition);
this.repository.save(this.report, this.repoCallback);
while (this.checkpointList.peek() != null && this.progress > this.checkpointList.peek().getPercentage()) {
this.analytics.ping(this.checkpointList.poll().getUrls());
}
Cookie cookie = this.cookies.get(Cookie.CONFIG_COOKIE);
if (!this.placement.isIncentivized() || this.progress <= 75 || cookie == null || !cookie.getBoolean("isReportIncentivizedEnabled").booleanValue() || this.sendReportIncentivized.getAndSet(true)) {
return;
}
j jVar = new j();
jVar.n(new m(this.placement.getId()), "placement_reference_id");
jVar.n(new m(this.advertisement.getAppID()), AdvertisementDBAdapter.AdvertisementColumns.COLUMN_APP_ID);
jVar.n(new m(Long.valueOf(this.report.getAdStartTime())), ReportDBAdapter.ReportColumns.COLUMN_AD_START_TIME);
jVar.n(new m(this.report.getUserID()), "user");
this.analytics.ri(jVar);
}
@Override
public void onReceivedError(String str, boolean z) {
Report report = this.report;
if (report != null) {
report.recordError(str);
this.repository.save(this.report, this.repoCallback);
VungleLogger.error("LocalAdPresenteronReceivedError", str);
}
}
@Override
public void onRenderProcessUnresponsive(@NonNull WebView webView, @Nullable WebViewRenderProcess webViewRenderProcess) {
handleWebViewException(32);
VungleLogger.error("LocalAdPresenter#onRenderProcessUnresponsive", new VungleException(32).getLocalizedMessage());
}
@Override
public void onVideoStart(int i, float f) {
reportAction("videoLength", String.format(Locale.ENGLISH, "%d", Integer.valueOf((int) f)));
}
@Override
public void onViewConfigurationChanged() {
this.webViewAPI.notifyPropertiesChange(true);
this.adView.refreshDialogIfVisible();
}
@Override
public boolean onWebRenderingProcessGone(WebView webView, boolean z) {
handleWebViewException(31);
VungleLogger.error("LocalAdPresenter#onWebRenderingProcessGone", new VungleException(31).getLocalizedMessage());
return true;
}
public void reportAction(@NonNull String str, @Nullable String str2) {
if (str.equals("videoLength")) {
int parseInt = Integer.parseInt(str2);
this.duration = parseInt;
this.report.setVideoLength(parseInt);
this.repository.save(this.report, this.repoCallback);
return;
}
switch (str) {
case "unmute":
case "mute":
case "video_close":
this.analytics.ping(this.advertisement.getTpatUrls(str));
break;
}
this.report.recordAction(str, str2, System.currentTimeMillis());
this.repository.save(this.report, this.repoCallback);
}
@Override
public void restoreFromSave(@Nullable OptionsState optionsState) {
if (optionsState == null) {
return;
}
if (optionsState.getBoolean(EXTRA_INCENTIVIZED_SENT, false)) {
this.sendReportIncentivized.set(true);
}
this.inPost = optionsState.getBoolean(EXTRA_IN_POST, this.inPost);
this.muted = optionsState.getBoolean(EXTRA_IS_MUTED, this.muted);
this.videoPosition = optionsState.getInt(EXTRA_VIDEO_POSITION, this.videoPosition).intValue();
}
@Override
public void setEventListener(@Nullable AdContract.AdvertisementPresenter.EventListener eventListener) {
this.bus = eventListener;
}
@Override
public void start() {
this.durationRecorder.start();
if (!this.adView.hasWebView()) {
reportErrorAndCloseAd(31);
VungleLogger.error("LocalAdPresenter#start", new VungleException(31).getLocalizedMessage());
return;
}
this.adView.setImmersiveMode();
this.adView.resumeWeb();
Cookie cookie = this.cookies.get(Cookie.CONSENT_COOKIE);
if (needShowGDPR(cookie)) {
showGDPR(cookie);
return;
}
if (this.inPost) {
if (isWebPageBlank()) {
playPost();
}
} else {
if (this.adView.isVideoPlaying() || this.adView.isDialogVisible()) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append(this.assetDir.getPath());
this.adView.playVideo(new File(c.j(sb, File.separator, Advertisement.KEY_VIDEO)), this.muted, this.videoPosition);
int showCloseDelay = this.advertisement.getShowCloseDelay(this.placement.isIncentivized());
if (showCloseDelay > 0) {
this.scheduler.schedule(new Runnable() {
@Override
public void run() {
LocalAdPresenter.this.userExitEnabled = true;
if (LocalAdPresenter.this.inPost) {
return;
}
LocalAdPresenter.this.adView.showCloseButton();
}
}, showCloseDelay);
} else {
this.userExitEnabled = true;
this.adView.showCloseButton();
}
}
}
@Override
public void stop(@AdContract.AdStopReason int i) {
this.durationRecorder.stop();
boolean z = (i & 1) != 0;
boolean z2 = (i & 2) != 0;
this.adView.pauseWeb();
if (this.adView.isVideoPlaying()) {
this.videoPosition = this.adView.getVideoPosition();
this.adView.pauseVideo();
}
if (z || !z2) {
if (this.inPost || z2) {
this.adView.showWebsite("about:blank");
return;
}
return;
}
if (this.isDestroying.getAndSet(true)) {
return;
}
reportAction(JavascriptBridge.MraidHandler.CLOSE_ACTION, null);
this.scheduler.cancelAll();
AdContract.AdvertisementPresenter.EventListener eventListener = this.bus;
if (eventListener != null) {
eventListener.onNext("end", this.report.isCTAClicked() ? "isCTAClicked" : null, this.placement.getId());
}
}
@Override
public void attach(@NonNull LocalAdContract.LocalView localView, @Nullable OptionsState optionsState) {
this.isDestroying.set(false);
this.adView = localView;
localView.setPresenter(this);
AdContract.AdvertisementPresenter.EventListener eventListener = this.bus;
if (eventListener != null) {
eventListener.onNext(Constants.ATTACH, this.advertisement.getCreativeId(), this.placement.getId());
}
int settings = this.advertisement.getAdConfig().getSettings();
if (settings > 0) {
this.muted = (settings & 1) == 1;
this.userExitEnabled = (settings & 2) == 2;
}
int adOrientation = this.advertisement.getAdConfig().getAdOrientation();
int i = 6;
if (adOrientation == 3) {
int orientation = this.advertisement.getOrientation();
if (orientation != 0) {
if (orientation != 1) {
i = -1;
}
}
i = 7;
} else {
if (adOrientation != 0) {
if (adOrientation != 1) {
i = 4;
}
}
i = 7;
}
Log.d(TAG, "Requested Orientation " + i);
localView.setOrientation(i);
prepare(optionsState);
SessionTracker.getInstance().trackEvent(new SessionData.Builder().setEvent(SessionEvent.PLAY_AD).addData(SessionAttribute.SUCCESS, true).addData(SessionAttribute.EVENT_ID, this.advertisement.getId()).build());
}
}