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