package com.topjohnwu.magisk; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AppComponentFactory; import android.app.Application; import android.app.Service; import android.content.BroadcastReceiver; import android.content.ContentProvider; import android.content.Intent; import android.content.pm.ApplicationInfo; import com.topjohnwu.magisk.dummy.DummyProvider; import com.topjohnwu.magisk.dummy.DummyReceiver; import com.topjohnwu.magisk.dummy.DummyService; @SuppressLint("NewApi") public class DelegateComponentFactory extends AppComponentFactory { AppComponentFactory receiver; public DelegateComponentFactory() { DynLoad.componentFactory = this; } @Override public ClassLoader instantiateClassLoader(ClassLoader cl, ApplicationInfo info) { return new DelegateClassLoader(); } @Override public Application instantiateApplication(ClassLoader cl, String className) { return new DelegateApplication(); } @Override public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) throws ClassNotFoundException, IllegalAccessException, InstantiationException { if (receiver != null) return receiver.instantiateActivity(DynLoad.activeClassLoader, className, intent); return create(className, DownloadActivity.class); } @Override public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) throws ClassNotFoundException, IllegalAccessException, InstantiationException { if (receiver != null) return receiver.instantiateReceiver(DynLoad.activeClassLoader, className, intent); return create(className, DummyReceiver.class); } @Override public Service instantiateService(ClassLoader cl, String className, Intent intent) throws ClassNotFoundException, IllegalAccessException, InstantiationException { if (receiver != null) return receiver.instantiateService(DynLoad.activeClassLoader, className, intent); return create(className, DummyService.class); } @Override public ContentProvider instantiateProvider(ClassLoader cl, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException { if (receiver != null) return receiver.instantiateProvider(DynLoad.activeClassLoader, className); return create(className, DummyProvider.class); } private T create(String name, Class fallback) throws IllegalAccessException, InstantiationException { try { // noinspection unchecked return (T) DynLoad.activeClassLoader.loadClass(name).newInstance(); } catch (ClassNotFoundException e) { return fallback.newInstance(); } } }