AppLovin Execution Path: DirectDownloadActivity loads a WebView

This post is part of AppLovin Nonconsensual Installs > Execution Path. See important disclosures.

DirectDownloadActivity.onCreate() passes execution to onAppDetailsCreate():

public void onCreate(Bundle savedInstanceState) {
        if (isPreferences()) {
            onPreferencesCreate(savedInstanceState);
        } else {
            onAppDetailsCreate(savedInstanceState);
        }

Next onAppDetailsCreate() passes execution to setupAppDetailsFragment():

private final void onAppDetailsCreate(Bundle savedInstanceState) {
        AbstractC3305b3.f10440a.m2458q("DirectDownloadActivity::onCreate", new Object[0]);
        setupAppDetailsFragment();
    }

Then setupAppDetailsFragment() creates the coroutine continuation class C3359j1:

private final void setupAppDetailsFragment() {
    ...
    C1059x c1059xM2213d = C1043j.m2213d(c4147iM6305K.f12547o, "DDNotificationsPermissionsCheck", c1057vM687d0, AbstractC1499w3.m3265I(c1061z).m2211a(new C1028b0()), 8);
    AbstractC4118e.m6305K(this).f12514C.getClass();
    Boolean bool = Boolean.TRUE;
    C1878p c1878p = new C1878p();
    c1878p.m3940c0(bool);
    AbstractC1838d0.m3857y(this.intentCoroutineScope, null, null, new C3338g1(c1878p, c1059xM2213d, null), 3);
    AbstractC0419z0 supportFragmentManager = getSupportFragmentManager();
    AbstractC4226k.m6578d(supportFragmentManager, "getSupportFragmentManager(...)");
if (findDirectDownloadMainFragment(supportFragmentManager) == null) {
AbstractC1838d0.m3857y(this.intentCoroutineScope, null, null, new C3359j1(this, c1878p, null), 3); ...

Then c3359j1 continuation entry point mo410r() passes execution to DirectDownloadMainFragment C3374l2:

public final Object mo410r(Object obj) {
    ...
    AbstractC0419z0 supportFragmentManager = directDownloadActivity3.getSupportFragmentManager();
    C0346a c0346a = new C0346a(supportFragmentManager);
    c0346a.f1416q = true;
    c0346a.m1138j(C3374l2.class, "com.applovin.array.directdownload.DirectDownloadActivity.TAG.DirectDownloadMainFragment");
    ...

C3374l2.mo1147B(), the obfuscated version of onViewCreated, launches a coroutine C3339g2:

public final void mo1147B(View view, Bundle bundle) { //WebView loader
    ...
    super.mo1147B(view, bundle);
    AbstractC1838d0.m3857y(AbstractC1150s0.m2348e(m1163h()), null, null, new C3360j2(this, null), 3);
    AbstractC1838d0.m3857y(AbstractC1150s0.m2348e(m1163h()), null, null, new C3339g2(this, null), 3);
}

C3374l2’s parent class is AbstractC3404p4, so the reference to super.mo1147B() passes execution to AbstractC3404p4.mo1147B() which creates a WebView and configures its settings and permissions:

public void mo1147B(View view, Bundle bundle) throws Exception { //Fragment onViewCreated
    ...
    AbstractC3305b3.f10440a.m2458q("DirectDownloadFragment::onViewCreated", new Object[0]);
    ...
    WebView webView = (WebView) viewFindViewById;
    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setDomStorageEnabled(true);
    settings.setDatabaseEnabled(true);
    settings.setMediaPlaybackRequiresUserGesture(false);
    settings.setJavaScriptCanOpenWindowsAutomatically(true);
    webView.setBackgroundColor(0);
    C2574e0 c2574e0 = AbstractC1743j.f5392a;
    WebView.setWebContentsDebuggingEnabled(false);
    mo5736N().f10643j.incrementAndGet();
    mo5737O();
    ...
    AbstractC1838d0.m3857y(AbstractC1150s0.m2348e(m1163h()), null, null, new C3390n4(this, webView, null), 3);
    AbstractC1838d0.m3857y(AbstractC1150s0.m2348e(m1163h()), null, null, new C3334f4(this, webView, null), 3);
    AbstractC1838d0.m3857y(AbstractC1150s0.m2348e(m1163h()), null, null, new C3376l4(this, null), 3);
}

Return to C3374l2.mo1147B() (one step above) and notice that it also creates a new C3339g2. C3339g2 in turn passes execution to C3332f2 continuation entry point mo410r() and then to C3325e2 continuation entry point mo410r():

public final Object mo410r(Object obj) {
    ...
    AbstractC6434a.m9578e(obj);
    EnumC1139n enumC1139n = EnumC1139n.f3808u;
    C3374l2 c3374l2 = this.f10528x;
    C3332f2 c3332f2 = new C3332f2(c3374l2, null);
    this.f10527w = 1;
    ...

public final Object mo410r(Object obj) {
    ...
    AbstractC6434a.m9578e(obj);
    C3374l2 c3374l2 = this.f10513x;
    InterfaceC2618h m4562l = AbstractC2611e1.m4562l(new C2627k(6, new C1739h(c3374l2.mo5736N().f10412w, 1)));
    C3325e2 c3325e2 = new C3325e2(c3374l2, null);
    this.f10512w = 1;
    ...
    ((C2638n1) interfaceC2664x0).m4576l(obj);
    ...

Then C3325e2 continuation entry point mo410(r) calls coroutine continuation orchestrator m5734P to load the WebView:

public final Object mo410r(Object obj) {
    ...
    obj = C3374l2.m5734P(c3374l2, c1059xM2213d, c0857r, this);

m5734P calls m5748L to get the URL to be loaded into the WebView.

public static final Comparable m5734P(C3374l2 c3374l2, C1059x c1059x, C0857r c0857r, AbstractC1576c abstractC1576c) {
    ...
    objM5738Q = c3374l2.m5738Q(c0857r, c1059x, c3297a2);
    return c3374l2.m5748L((C3447v5) objM5738Q);
    ...

public final Uri m5748L(C3447v5 c3447v5) { //Create URI with configuration
    Uri.Builder buildUpon = C4785e.f14377e.buildUpon();
    byte[] bytes = c6488c.m9632c(C3447v5.Companion.serializer(), c3447v5).getBytes(C0929a.f3221a);
    String encodeToString = Base64.encodeToString(bytes, 11);
    Uri build = buildUpon.fragment(encodeToString).build();
    return build;
}

Return to AbstractC3404p4.mo1147B(), two steps above. Notice that it also creates C3334f4, whose continuation entry point mo410(r) passes execution to C3320d4:

public final Object mo410r(Object obj) {
    ...
    C3320d4 c3320d4 = new C3320d4(abstractC3404p4, c4236u, this.f10508y, null);

Then C3320d4 continuation entry point mo410r() loads the specified URL into the WebView

public final Object mo410r(Object obj) {  //WebView loader - actually loads the WebView
    WebView webView;
    Uri uri;
    EnumC1084a enumC1084a = EnumC1084a.f3658a;
    int i = this.f10487x;
    WebView webView2 = this.f10485B;
    AbstractC3404p4 abstractC3404p4 = this.f10489z;
    if (i == 0) {
        AbstractC6434a.m9578e(obj);
        Uri uri2 = (Uri) this.f10488y;
        C1057v c1057vM687d0 = AbstractC0192d0.m687d0(abstractC3404p4.f10704p0);
        C1036f0 c1036f0 = C1036f0.f3471c;
        C1059x c1059xM2213d = C1043j.m2213d(AbstractC4118e.m6295A(abstractC3404p4).f12547o, "DDWebViewPageLoad", c1057vM687d0, AbstractC1499w3.m3259C().m2211a(new C1030c0(abstractC3404p4.f10708t0)), 8);
        C4236u c4236u = this.f10484A;
        InterfaceC1843e1 interfaceC1843e1 = (InterfaceC1843e1) c4236u.f12868a;
        if (interfaceC1843e1 != null) {
            interfaceC1843e1.mo3869d(null);
        }
        c4236u.f12868a = AbstractC1838d0.m3857y(AbstractC1150s0.m2348e(abstractC3404p4.m1163h()), null, null, new C3397o4(abstractC3404p4, c1059xM2213d, null), 3);
        C1854h0 c1854h0 = abstractC3404p4.mo5736N().f10646m;
        this.f10488y = uri2;
        this.f10486w = webView2;
        this.f10487x = 1;
        Object objM3951z = c1854h0.m3951z(this);
        if (objM3951z == enumC1084a) {
            return enumC1084a;
        }
        webView = webView2;
        obj = objM3951z;
        uri = uri2;
    } else {
        if (i != 1) {
            throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
        }
        webView = this.f10486w;
        uri = (Uri) this.f10488y;
        AbstractC6434a.m9578e(obj);
    }
    webView.setWebViewClient((WebViewClient) obj);
    webView2.loadUrl(uri.toString());
    abstractC3404p4.mo5736N().f10649p = true;
    AbstractC3305b3.f10440a.m2458q("WebView::loadUrl", new Object[0]);
    return C6458y.f19392a;

Execution continues in WebView loads JavaScript Resources files that check and act on auto-install