package com.lody.virtual.client.hook.delegate; import android.app.Activity; import android.app.Application; import android.app.Instrumentation; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import com.lody.virtual.client.VClientImpl; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.fixer.ActivityFixer; import com.lody.virtual.client.fixer.ContextFixer; import com.lody.virtual.client.interfaces.IInjector; import com.lody.virtual.client.ipc.ActivityClientRecord; import com.lody.virtual.client.ipc.VActivityManager; import com.lody.virtual.helper.compat.BundleCompat; import com.lody.virtual.os.VUserHandle; import com.lody.virtual.server.interfaces.IUiCallback; import mirror.android.app.ActivityThread; /** * @author Lody */ public final class AppInstrumentation extends InstrumentationDelegate implements IInjector { private static final String TAG = AppInstrumentation.class.getSimpleName(); private static AppInstrumentation gDefault; private AppInstrumentation(Instrumentation base) { super(base); } public static AppInstrumentation getDefault() { if (gDefault == null) { synchronized (AppInstrumentation.class) { if (gDefault == null) { gDefault = create(); } } } return gDefault; } private static AppInstrumentation create() { Instrumentation instrumentation = ActivityThread.mInstrumentation.get(VirtualCore.mainThread()); if (instrumentation instanceof AppInstrumentation) { return (AppInstrumentation) instrumentation; } return new AppInstrumentation(instrumentation); } @Override public void inject() throws Throwable { base = ActivityThread.mInstrumentation.get(VirtualCore.mainThread()); ActivityThread.mInstrumentation.set(VirtualCore.mainThread(), this); } @Override public boolean isEnvBad() { return !(ActivityThread.mInstrumentation.get(VirtualCore.mainThread()) instanceof AppInstrumentation); } @Override public void callActivityOnCreate(Activity activity, Bundle icicle) { VirtualCore.get().getComponentDelegate().beforeActivityCreate(activity); IBinder token = mirror.android.app.Activity.mToken.get(activity); ActivityClientRecord r = VActivityManager.get().getActivityRecord(token); if (r != null) { r.activity = activity; } ContextFixer.fixContext(activity); ActivityFixer.fixActivity(activity); ActivityInfo info = null; if (r != null) { info = r.info; } if (info != null) { if (info.theme != 0) { activity.setTheme(info.theme); } if (activity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED && info.screenOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { activity.setRequestedOrientation(info.screenOrientation); } } super.callActivityOnCreate(activity, icicle); VirtualCore.get().getComponentDelegate().afterActivityCreate(activity); } @Override public void callActivityOnResume(Activity activity) { VirtualCore.get().getComponentDelegate().beforeActivityResume(activity); VActivityManager.get().onActivityResumed(activity); super.callActivityOnResume(activity); VirtualCore.get().getComponentDelegate().afterActivityResume(activity); Intent intent = activity.getIntent(); if (intent != null) { Bundle bundle = intent.getBundleExtra("_VA_|_sender_"); if (bundle != null) { IBinder callbackToken = BundleCompat.getBinder(bundle, "_VA_|_ui_callback_"); IUiCallback callback = IUiCallback.Stub.asInterface(callbackToken); if (callback != null) { try { callback.onAppOpened(VClientImpl.get().getCurrentPackage(), VUserHandle.myUserId()); } catch (RemoteException e) { e.printStackTrace(); } } } } } @Override public void callActivityOnDestroy(Activity activity) { VirtualCore.get().getComponentDelegate().beforeActivityDestroy(activity); super.callActivityOnDestroy(activity); VirtualCore.get().getComponentDelegate().afterActivityDestroy(activity); } @Override public void callActivityOnPause(Activity activity) { VirtualCore.get().getComponentDelegate().beforeActivityPause(activity); super.callActivityOnPause(activity); VirtualCore.get().getComponentDelegate().afterActivityPause(activity); } @Override public void callApplicationOnCreate(Application app) { super.callApplicationOnCreate(app); } }