package com.topjohnwu.magisk; import android.app.Application; import android.content.Context; import android.content.ContextWrapper; import android.content.res.Configuration; import java.lang.reflect.Method; import io.michaelrocks.paranoid.Obfuscate; @Obfuscate public class DelegateApplication extends Application { private Application receiver; @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); receiver = DynLoad.setup(this); if (receiver != null) try { // Call attachBaseContext without ContextImpl to show it is being wrapped Method m = ContextWrapper.class.getDeclaredMethod("attachBaseContext", Context.class); m.setAccessible(true); m.invoke(receiver, this); } catch (Exception ignored) { /* Impossible */ } } @Override public void onCreate() { super.onCreate(); if (receiver != null) receiver.onCreate(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (receiver != null) receiver.onConfigurationChanged(newConfig); } }