Files
Magisk/stub/src/main/java/com/topjohnwu/magisk/DelegateComponentFactory.java
2022-05-22 19:36:47 -07:00

79 lines
2.8 KiB
Java

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> T create(String name, Class<T> fallback)
throws IllegalAccessException, InstantiationException {
try {
// noinspection unchecked
return (T) DynLoad.activeClassLoader.loadClass(name).newInstance();
} catch (ClassNotFoundException e) {
return fallback.newInstance();
}
}
}