MD5 校验值:59d6bb13fd8223deae94352611fb8159
LocalAdPresenter.java 文件包含反编译后的源代码,请注意,该内容仅供学习和参考使用,不得用于非法用途。
package com.vungle.warren.ui.presenter; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.text.TextUtils; import android.util.Log; import android.webkit.WebView; import android.webkit.WebViewRenderProcess; import com.facebook.gamingservices.cloudgaming.internal.SDKConstants; import com.facebook.internal.ServerProtocol; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; 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.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.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.PresenterAdOpenCallback; 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; private final String[] impressionUrls; private boolean inPost; private boolean muted; 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 onSaved() { } @Override public void onError(Exception exc) { if (this.errorHappened) { return; } this.errorHappened = true; LocalAdPresenter.this.makeBusError(26); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#onError", new VungleException(26).getLocalizedMessage()); LocalAdPresenter.this.closeAndReport(); } }; private AtomicBoolean busy = new AtomicBoolean(false); public LocalAdPresenter(Advertisement advertisement, Placement placement, Repository repository, Scheduler scheduler, AdAnalytics adAnalytics, WebViewAPI webViewAPI, OptionsState optionsState, File file, 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); } @Override public void setEventListener(AdContract.AdvertisementPresenter.EventListener eventListener) { this.bus = eventListener; } private void reportError(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(); } } public void reportAction(String str, 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; } char c = 65535; int hashCode = str.hashCode(); if (hashCode != -840405966) { if (hashCode != 3363353) { if (hashCode == 1370606900 && str.equals(AnalyticsEvent.Ad.videoClose)) { c = 2; } } else if (str.equals(AnalyticsEvent.Ad.mute)) { c = 0; } } else if (str.equals(AnalyticsEvent.Ad.unmute)) { c = 1; } if (c == 0 || c == 1 || c == 2) { this.analytics.ping(this.advertisement.getTpatUrls(str)); } this.report.recordAction(str, str2, System.currentTimeMillis()); this.repository.save(this.report, this.repoCallback); } @Override public void onViewConfigurationChanged() { this.webViewAPI.notifyPropertiesChange(true); this.adView.refreshDialogIfVisible(); } @Override public void attach(LocalAdContract.LocalView localView, 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 i = -1; int adOrientation = this.advertisement.getAdConfig().getAdOrientation(); int i2 = 6; if (adOrientation == 3) { int orientation = this.advertisement.getOrientation(); if (orientation == 0) { i = 7; } else if (orientation == 1) { i = 6; } i2 = i; } else if (adOrientation == 0) { i2 = 7; } else if (adOrientation != 1) { i2 = 4; } Log.d(TAG, "Requested Orientation " + i2); localView.setOrientation(i2); prepare(optionsState); SessionTracker.getInstance().trackEvent(new SessionData.Builder().setEvent(SessionEvent.PLAY_AD).addData(SessionAttribute.SUCCESS, true).addData(SessionAttribute.EVENT_ID, this.advertisement.getId()).build()); } @Override public void detach(int i) { AsyncFileUtils.ExistenceOperation existenceOperation = this.fileExistenceOperation; if (existenceOperation != null) { existenceOperation.cancel(); } stop(i); this.adView.destroyAdView(0L); } private void playPost() { final File file = new File(new File(this.assetDir.getPath()).getPath() + File.separator + "index.html"); this.fileExistenceOperation = AsyncFileUtils.isFileExistAsync(file, new AsyncFileUtils.FileExistCallback() { @Override public void status(boolean z) { if (z) { LocalAdPresenter.this.adView.showWebsite(Advertisement.FILE_SCHEME + file.getPath()); LocalAdPresenter.this.analytics.ping(LocalAdPresenter.this.advertisement.getTpatUrls(AnalyticsEvent.Ad.postrollView)); LocalAdPresenter.this.inPost = true; return; } LocalAdPresenter.this.makeBusError(27); LocalAdPresenter.this.makeBusError(10); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#playPost", "Error Rendering Postroll"); LocalAdPresenter.this.closeAndReport(); } }); } private void prepare(OptionsState optionsState) { restoreFromSave(optionsState); Cookie cookie = this.cookies.get(Cookie.INCENTIVIZED_TEXT_COOKIE); String string = cookie == null ? null : cookie.getString(SDKConstants.PARAM_USER_ID); 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 boolean needShowGDPR(Cookie cookie) { return cookie != null && cookie.getBoolean("is_country_data_protected").booleanValue() && "unknown".equals(cookie.getString("consent_status")); } private void showGDPR(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("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("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); } @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; } 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(SDKConstants.PARAM_A2U_BODY); if (TextUtils.isEmpty(str2)) { str2 = this.dialogBody; } str3 = cookie.getString("continue"); if (TextUtils.isEmpty(str3)) { str3 = this.dialogContinue; } str4 = cookie.getString("close"); 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(); } } }); } 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); } public void continueWithPostroll() { if (this.advertisement.hasPostroll()) { playPost(); } else { closeAndReport(); } } private boolean isWebPageBlank() { String websiteUrl = this.adView.getWebsiteUrl(); return TextUtils.isEmpty(websiteUrl) || "about:blank".equalsIgnoreCase(websiteUrl); } @Override public void start() { this.durationRecorder.start(); if (!this.adView.hasWebView()) { reportErrorAndCloseAd(31); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#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(); return; } return; } if (this.adView.isVideoPlaying() || this.adView.isDialogVisible()) { return; } this.adView.playVideo(new File(this.assetDir.getPath() + File.separator + "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(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.isDestroying.getAndSet(true)) { return; } reportAction("close", null); this.scheduler.cancelAll(); AdContract.AdvertisementPresenter.EventListener eventListener = this.bus; if (eventListener != null) { eventListener.onNext("end", this.report.isCTAClicked() ? "isCTAClicked" : null, this.placement.getId()); return; } return; } if (this.inPost || z2) { this.adView.showWebsite("about:blank"); } } @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; } JsonObject jsonObject = new JsonObject(); jsonObject.add("placement_reference_id", new JsonPrimitive(this.placement.getId())); jsonObject.add("app_id", new JsonPrimitive(this.advertisement.getAppID())); jsonObject.add(ReportDBAdapter.ReportColumns.COLUMN_AD_START_TIME, new JsonPrimitive(Long.valueOf(this.report.getAdStartTime()))); jsonObject.add("user", new JsonPrimitive(this.report.getUserID())); this.analytics.ri(jsonObject); } @Override public void onVideoStart(int i, float f) { reportAction("videoLength", String.format(Locale.ENGLISH, "%d", Integer.valueOf((int) f))); } @Override public void onMute(boolean z) { this.muted = z; if (z) { reportAction(AnalyticsEvent.Ad.mute, ServerProtocol.DIALOG_RETURN_SCOPES_TRUE); } else { reportAction(AnalyticsEvent.Ad.unmute, "false"); } } @Override public void onDownload() { download(); } @Override public boolean onMediaError(String str) { reportError(str); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#onMediaError", "Media Error: " + str); return false; } @Override public void onPrivacy() { this.adView.open(null, HTTPS_VUNGLE_COM_PRIVACY, new PresenterAppLeftCallback(this.bus, this.placement), null); } @Override public void generateSaveState(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 void restoreFromSave(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 onMraidAction(String str) { char c; int hashCode = str.hashCode(); if (hashCode == -314498168) { if (str.equals("privacy")) { c = 2; } c = 65535; } else if (hashCode != 94756344) { if (hashCode == 1427818632 && str.equals(JavascriptBridge.MraidHandler.DOWNLOAD_ACTION)) { c = 1; } c = 65535; } else { if (str.equals("close")) { c = 0; } c = 65535; } if (c == 0) { closeAndReport(); return; } if (c == 1) { download(); closeAndReport(); } else { if (c == 2) { return; } VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#onMraidAction", "Unknown MRAID Command"); throw new IllegalArgumentException("Unknown action " + str); } } private void download() { reportAction(SDKConstants.PARAM_GAME_REQUESTS_CTA, ""); try { this.analytics.ping(this.advertisement.getTpatUrls(AnalyticsEvent.Ad.postrollClick)); this.analytics.ping(this.advertisement.getTpatUrls(AnalyticsEvent.Ad.clickUrl)); this.analytics.ping(this.advertisement.getTpatUrls(AnalyticsEvent.Ad.videoClick)); this.analytics.ping(new String[]{this.advertisement.getCTAURL(true)}); reportAction(JavascriptBridge.MraidHandler.DOWNLOAD_ACTION, null); String ctaurl = this.advertisement.getCTAURL(false); if (ctaurl != null && !ctaurl.isEmpty()) { this.adView.open(this.advertisement.getDeeplinkUrl(), ctaurl, new PresenterAppLeftCallback(this.bus, this.placement), new PresenterAdOpenCallback() { @Override public void onAdOpenType(PresenterAdOpenCallback.AdOpenType adOpenType) { if (adOpenType == PresenterAdOpenCallback.AdOpenType.DEEP_LINK) { LocalAdPresenter.this.reportAction("deeplinkSuccess", null); } } }); if (this.bus == null) { this.bus.onNext("open", "adClick", this.placement.getId()); return; } return; } Log.e(TAG, "CTA destination URL is not configured properly"); if (this.bus == null) { } } catch (ActivityNotFoundException unused) { Log.e(TAG, "Unable to find destination activity"); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#download", "Download - Activity Not Found"); } } public void closeAndReport() { if (this.busy.get()) { Log.w(TAG, "Busy with closing"); return; } this.busy.set(true); reportAction("close", null); this.scheduler.cancelAll(); this.adView.close(); } 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; } } } @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(LocalAdPresenter.class.getSimpleName() + "onReceivedError", str); } } @Override public boolean onWebRenderingProcessGone(WebView webView, boolean z) { handleWebViewException(31); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#onWebRenderingProcessGone", new VungleException(31).getLocalizedMessage()); return true; } @Override public void onRenderProcessUnresponsive(WebView webView, WebViewRenderProcess webViewRenderProcess) { handleWebViewException(32); VungleLogger.error(LocalAdPresenter.class.getSimpleName() + "#onRenderProcessUnresponsive", new VungleException(32).getLocalizedMessage()); } private void handleWebViewException(int i) { LocalAdContract.LocalView localView = this.adView; if (localView != null) { localView.removeWebView(); } reportErrorAndCloseAd(i); } private void reportErrorAndCloseAd(int i) { makeBusError(i); VungleLogger.error(LocalAdPresenter.class.getSimpleName(), "WebViewException: " + new VungleException(i).getLocalizedMessage()); closeAndReport(); } public void makeBusError(int i) { AdContract.AdvertisementPresenter.EventListener eventListener = this.bus; if (eventListener != null) { eventListener.onError(new VungleException(i), this.placement.getId()); } } }