package com.topjohnwu.magisk; import android.app.Application; import android.content.Context; import android.content.ContextWrapper; import android.content.res.Configuration; import android.os.Build; import java.lang.reflect.Method; public class DelegateApplication extends Application { static boolean dynLoad = false; private Application receiver; @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // Only dynamic load full APK if hidden and supported dynLoad = Build.VERSION.SDK_INT >= 21 && !base.getPackageName().equals(BuildConfig.APPLICATION_ID); receiver = InjectAPK.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 onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (receiver != null) receiver.onConfigurationChanged(newConfig); } }