导航菜单

页面标题

页面副标题

CallApp v2.226 - MraidWebViewController.java 源代码

正在查看: CallApp v2.226 应用的 MraidWebViewController.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package io.bidmachine.iab.mraid;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Base64;
import android.webkit.RenderProcessGoneDetail;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.n;
import io.bidmachine.iab.IabError;
import io.bidmachine.iab.bridge.JsBridgeHandler;
import io.bidmachine.iab.mraid.MraidWebView;
import io.bidmachine.iab.utils.Logger;
import io.bidmachine.iab.utils.Utils;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.Map;

public class MraidWebViewController {

    @NonNull
    public static final String TAG = "MraidWebViewController";
    private final Callback a;
    final MraidWebView b;
    private boolean c;
    private boolean d;
    private boolean e;
    private MraidOrientationProperties f;

    public interface Callback {
        void onCalendarEvent(@Nullable String str);

        void onClose();

        void onError(@NonNull IabError iabError);

        void onExpand(@Nullable String str);

        void onLoaded();

        void onOpen(@NonNull String str);

        void onOpenPrivacySheet(@NonNull String str);

        void onOrientation(@NonNull MraidOrientationProperties mraidOrientationProperties);

        void onPageFinished(@NonNull String str);

        void onPlayVideo(@Nullable String str);

        void onResize(@NonNull MraidResizeProperties mraidResizeProperties);

        void onStorePicture(@Nullable String str);

        void onUseCustomClose(boolean z);

        void onViewableChanged(boolean z);
    }

    public class a implements MraidWebView.MraidWebViewListener {
        public a() {
        }

        @Override
        public void onViewableChanged(boolean z) {
            if (MraidWebViewController.this.c) {
                MraidWebViewController.this.applyViewable(z);
            }
            MraidWebViewController.this.a.onViewableChanged(z);
        }
    }

    public class b extends WebViewClient {
        private b() {
        }

        private WebResourceResponse a() {
            String b = MraidUtils.b();
            Charset charset = StandardCharsets.UTF_8;
            return new WebResourceResponse("text/javascript", charset.name(), new ByteArrayInputStream(b.getBytes(charset)));
        }

        @Override
        public void onPageFinished(WebView webView, String str) {
            super.onPageFinished(webView, str);
            MraidLog.d(MraidWebViewController.TAG, "onPageFinished", new Object[0]);
            if (MraidWebViewController.this.c) {
                return;
            }
            MraidWebViewController.this.c = true;
            MraidWebViewController.this.a.onPageFinished(str);
            MraidWebViewController.this.getWebView().onPageFinished();
        }

        @Override
        public void onPageStarted(WebView webView, String str, Bitmap bitmap) {
            super.onPageStarted(webView, str, bitmap);
            MraidLog.d(MraidWebViewController.TAG, "onPageStarted", new Object[0]);
        }

        @Override
        public void onReceivedError(WebView webView, int i, String str, String str2) {
            a(str2, str, i);
            super.onReceivedError(webView, i, str, str2);
        }

        @Override
        public boolean onRenderProcessGone(WebView webView, RenderProcessGoneDetail renderProcessGoneDetail) {
            MraidLog.d(MraidWebViewController.TAG, "onRenderProcessGone", new Object[0]);
            MraidWebViewController.this.destroy();
            MraidWebViewController.this.a.onError(IabError.internal("WebViewClient - onRenderProcessGone"));
            return true;
        }

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
            return a(webResourceRequest.getUrl()) ? a() : super.shouldInterceptRequest(webView, webResourceRequest);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView webView, String str) {
            if (str.startsWith(MraidUtils.COMMAND_URL_PREFIX)) {
                MraidWebViewController.this.a(str);
                return true;
            }
            if (JsBridgeHandler.isHandled(str)) {
                JsBridgeHandler.handleJsCommand(MraidWebViewController.this.b, str);
                return true;
            }
            MraidWebViewController.this.c(str);
            return true;
        }

        public b(MraidWebViewController mraidWebViewController, a aVar) {
            this();
        }

        private void a(String str, String str2, int i) {
            MraidLog.d(MraidWebViewController.TAG, "onError: %s / %s / %d", str, str2, Integer.valueOf(i));
            if (str2 == null || !str2.contains("ERR_INTERNET_DISCONNECTED")) {
                return;
            }
            MraidWebViewController.this.e = true;
        }

        @Override
        public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
            Uri url = webResourceRequest.getUrl();
            a(url != null ? url.toString() : null, webResourceError.getDescription().toString(), webResourceError.getErrorCode());
            super.onReceivedError(webView, webResourceRequest, webResourceError);
        }

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webView, String str) {
            return a(str) ? a() : super.shouldInterceptRequest(webView, str);
        }

        public boolean a(Uri uri) {
            return "mraid.js".equals(uri.getLastPathSegment());
        }

        public boolean a(String str) {
            return a(Uri.parse(str.toLowerCase(Locale.US)));
        }
    }

    public MraidWebViewController(@NonNull Context context, @NonNull Callback callback) {
        this.a = callback;
        MraidWebView mraidWebView = new MraidWebView(context);
        this.b = mraidWebView;
        mraidWebView.setWebViewClient(new b(this, null));
        mraidWebView.setListener(new a());
        this.d = false;
        this.e = false;
    }

    public void c(String str) {
        if (!this.b.wasClicked()) {
            MraidLog.d(TAG, "Can't open url because webView wasn't clicked", new Object[0]);
        } else {
            this.a.onOpen(str);
            this.b.resetClicked();
        }
    }

    public void applyClick(int i, int i2) {
        b(n.h(i, i2, "(function click(x, y) {var ev = new MouseEvent('click', {    'view': window,    'bubbles': true,    'cancelable': true,    'screenX': x,    'screenY': y});var el = document.elementFromPoint(x, y);if (el !== null) {      el.dispatchEvent(ev); }})(", ", ", ")"));
    }

    public void applyLogLevel(@Nullable Logger.LogLevel logLevel) {
        String str;
        if (logLevel == Logger.LogLevel.debug) {
            str = "mraid.logLevel = mraid.LogLevelEnum.DEBUG;";
        } else if (logLevel == Logger.LogLevel.info) {
            str = "mraid.logLevel = mraid.LogLevelEnum.INFO;";
        } else if (logLevel == Logger.LogLevel.warning) {
            str = "mraid.logLevel = mraid.LogLevelEnum.WARNING;";
        } else if (logLevel == Logger.LogLevel.error) {
            str = "mraid.logLevel = mraid.LogLevelEnum.ERROR;";
        } else if (logLevel != Logger.LogLevel.none) {
            return;
        } else {
            str = "mraid.logLevel = mraid.LogLevelEnum.NONE;";
        }
        b(str);
    }

    public void applyPlacement(@NonNull MraidPlacementType mraidPlacementType) {
        b("mraid.setPlacementType('" + mraidPlacementType.b() + "');");
    }

    public void applyScreenMetrics(@NonNull MraidScreenMetrics mraidScreenMetrics) {
        Rect e = mraidScreenMetrics.e();
        Rect d = mraidScreenMetrics.d();
        b("mraid.setScreenSize(" + e.width() + "," + e.height() + ");mraid.setMaxSize(" + d.width() + "," + d.height() + ");mraid.setCurrentPosition(" + Utils.stringifyRect(mraidScreenMetrics.a()) + ");mraid.setDefaultPosition(" + Utils.stringifyRect(mraidScreenMetrics.c()) + ");mraid.fireSizeChangeEvent(" + Utils.stringifySize(mraidScreenMetrics.a()) + ");");
    }

    public void applyState(@NonNull MraidViewState mraidViewState) {
        b("mraid.fireStateChangeEvent('" + mraidViewState.toJsString() + "');");
    }

    public void applySupportedServices(@NonNull MraidNativeFeatureManager mraidNativeFeatureManager) {
        b("mraid.setSupports(mraid.SUPPORTED_FEATURES.CALENDAR, " + mraidNativeFeatureManager.isCalendarFeatureAvailable() + ");mraid.setSupports(mraid.SUPPORTED_FEATURES.INLINEVIDEO, " + mraidNativeFeatureManager.isInlineVideoFeatureAvailable() + ");mraid.setSupports(mraid.SUPPORTED_FEATURES.SMS, " + mraidNativeFeatureManager.isSmsFeatureAvailable() + ");mraid.setSupports(mraid.SUPPORTED_FEATURES.STOREPICTURE, " + mraidNativeFeatureManager.isStorePictureFeatureAvailable() + ");mraid.setSupports(mraid.SUPPORTED_FEATURES.TEL, " + mraidNativeFeatureManager.isTelFeatureAvailable() + ");");
    }

    public void applyViewable(boolean z) {
        b("mraid.fireViewableChangeEvent(" + z + ");");
    }

    public void destroy() {
        MraidWebView webView = getWebView();
        Utils.removeFromParent(webView);
        webView.destroy();
    }

    @Nullable
    public MraidOrientationProperties getLastOrientationProperties() {
        return this.f;
    }

    @NonNull
    public MraidWebView getWebView() {
        return this.b;
    }

    public boolean isReceivedJsError() {
        return this.e;
    }

    public boolean isUseCustomClose() {
        return this.d;
    }

    public boolean isViewable() {
        return this.b.isViewable();
    }

    public void load(@NonNull String str) {
        this.c = false;
        getWebView().loadUrl(str);
    }

    public void notifyReady() {
        b("mraid.fireReadyEvent();");
    }

    public void reset() {
        getWebView().reset();
    }

    public void load(@Nullable String str, @NonNull String str2, @Nullable String str3, @Nullable String str4) {
        this.c = false;
        getWebView().loadDataWithBaseURL(str, str2, str3, str4, null);
    }

    public void a(String str) {
        Map<String, String> parseCommandUrl;
        MraidLog.d(TAG, "handleJsCommand - %s", str);
        try {
            parseCommandUrl = MraidUtils.parseCommandUrl(str);
        } catch (Throwable th) {
            th.printStackTrace();
        }
        if (parseCommandUrl == null) {
            return;
        }
        String str2 = parseCommandUrl.get("command");
        if (str2 == null) {
            MraidLog.w(TAG, "handleJsCommand not found", new Object[0]);
        } else {
            a(str2, parseCommandUrl);
            a();
        }
    }

    public void b(String str) {
        this.b.injectJs(str);
    }

    private void a() {
        b("mraid.nativeCallComplete();");
    }

    private void a(String str, Map map) {
        str.getClass();
        switch (str) {
            case "playVideo":
                this.a.onPlayVideo((String) map.get("url"));
                break;
            case "openPrivacySheet":
                String str2 = (String) map.get("data");
                if (TextUtils.isEmpty(str2)) {
                    MraidLog.e(TAG, "data is null or empty", new Object[0]);
                    break;
                } else {
                    try {
                        this.a.onOpenPrivacySheet(new String(Base64.decode(str2, 2)));
                        break;
                    } catch (Throwable unused) {
                        MraidLog.e(TAG, "data must be base64 encoded json", new Object[0]);
                        return;
                    }
                }
            case "expand":
                MraidLog.d(TAG, "mraid.expand is not supported", new Object[0]);
                break;
            case "loaded":
                this.a.onLoaded();
                break;
            case "noFill":
                this.a.onError(IabError.noFIll("Fired noFill event from mraid.js"));
                break;
            case "resize":
                MraidLog.d(TAG, "mraid.resize is not supported", new Object[0]);
                break;
            case "createCalendarEvent":
                this.a.onCalendarEvent((String) map.get("eventJSON"));
                break;
            case "open":
                String str3 = (String) map.get("url");
                if (!TextUtils.isEmpty(str3)) {
                    c(str3);
                    break;
                } else {
                    MraidLog.e(TAG, "url is null or empty", new Object[0]);
                    break;
                }
            case "close":
                this.a.onClose();
                break;
            case "setOrientationProperties":
                MraidOrientationProperties mraidOrientationProperties = new MraidOrientationProperties(Boolean.parseBoolean((String) map.get("allowOrientationChange")), MraidOrientationProperties.forceOrientationFromString((String) map.get("forceOrientation")));
                this.f = mraidOrientationProperties;
                this.a.onOrientation(mraidOrientationProperties);
                break;
            case "storePicture":
                this.a.onStorePicture((String) map.get("url"));
                break;
            case "useCustomClose":
                boolean parseBoolean = Boolean.parseBoolean((String) map.get("useCustomClose"));
                if (this.d != parseBoolean) {
                    this.d = parseBoolean;
                    this.a.onUseCustomClose(parseBoolean);
                    break;
                }
                break;
        }
    }
}