Move instantiation-through-reflection method to controller
Bug: 73668763 Test: rerun robotest Change-Id: If1b263dfd6a8c40f563ce53ce3f368aef5ca5a9f
This commit is contained in:
@@ -25,6 +25,8 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -73,6 +75,44 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl
|
||||
|
||||
protected Lifecycle mLifecycle;
|
||||
|
||||
/**
|
||||
* Instantiate a controller as specified controller type and user-defined key.
|
||||
* <p/>
|
||||
* This is done through reflection. Do not use this method unless you know what you are doing.
|
||||
*/
|
||||
public static BasePreferenceController createInstance(Context context,
|
||||
String controllerName, String key) {
|
||||
try {
|
||||
final Class<?> clazz = Class.forName(controllerName);
|
||||
final Constructor<?> preferenceConstructor =
|
||||
clazz.getConstructor(Context.class, String.class);
|
||||
final Object[] params = new Object[] {context, key};
|
||||
return (BasePreferenceController) preferenceConstructor.newInstance(params);
|
||||
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
|
||||
IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
|
||||
throw new IllegalStateException(
|
||||
"Invalid preference controller: " + controllerName, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiate a controller as specified controller type.
|
||||
* <p/>
|
||||
* This is done through reflection. Do not use this method unless you know what you are doing.
|
||||
*/
|
||||
public static BasePreferenceController createInstance(Context context, String controllerName) {
|
||||
try {
|
||||
final Class<?> clazz = Class.forName(controllerName);
|
||||
final Constructor<?> preferenceConstructor = clazz.getConstructor(Context.class);
|
||||
final Object[] params = new Object[] {context};
|
||||
return (BasePreferenceController) preferenceConstructor.newInstance(params);
|
||||
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
|
||||
IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
|
||||
throw new IllegalStateException(
|
||||
"Invalid preference controller: " + controllerName, e);
|
||||
}
|
||||
}
|
||||
|
||||
public BasePreferenceController(Context context, String preferenceKey) {
|
||||
super(context);
|
||||
mPreferenceKey = preferenceKey;
|
||||
|
@@ -33,9 +33,6 @@ import com.android.settings.core.TogglePreferenceController;
|
||||
import com.android.settings.search.DatabaseIndexingUtils;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
import androidx.app.slice.Slice;
|
||||
import androidx.app.slice.builders.ListBuilder;
|
||||
import androidx.app.slice.builders.ListBuilder.RowBuilder;
|
||||
@@ -87,46 +84,16 @@ public class SliceBuilderUtils {
|
||||
public static BasePreferenceController getPreferenceController(Context context,
|
||||
SliceData sliceData) {
|
||||
try {
|
||||
return getController(context, sliceData, true /* isContextOnly */);
|
||||
return BasePreferenceController.createInstance(context,
|
||||
sliceData.getPreferenceController());
|
||||
} catch (IllegalStateException e) {
|
||||
// Do nothing
|
||||
Log.d(TAG, "Could not find Context-only controller for preference controller: "
|
||||
+ sliceData.getKey());
|
||||
}
|
||||
|
||||
return getController(context, sliceData, false /* isContextOnly */);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to build a {@link BasePreferenceController} from {@param SliceData}.
|
||||
*
|
||||
* @param sliceData Backing data for the Slice.
|
||||
* @param contextOnlyCtor {@code true} when the constructor for the
|
||||
* {@link BasePreferenceController}
|
||||
* only takes a {@link Context}. Else the constructor will be ({@link
|
||||
* Context}, {@code String}.
|
||||
*/
|
||||
private static BasePreferenceController getController(Context context, SliceData sliceData,
|
||||
boolean contextOnlyCtor) {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(sliceData.getPreferenceController());
|
||||
Constructor<?> preferenceConstructor;
|
||||
Object[] params;
|
||||
|
||||
if (contextOnlyCtor) {
|
||||
preferenceConstructor = clazz.getConstructor(Context.class);
|
||||
params = new Object[]{context};
|
||||
} else {
|
||||
preferenceConstructor = clazz.getConstructor(Context.class, String.class);
|
||||
params = new Object[]{context, sliceData.getKey()};
|
||||
}
|
||||
|
||||
return (BasePreferenceController) preferenceConstructor.newInstance(params);
|
||||
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
|
||||
IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
|
||||
throw new IllegalStateException(
|
||||
"Invalid preference controller: " + sliceData.getPreferenceController(), e);
|
||||
}
|
||||
return BasePreferenceController.createInstance(context, sliceData.getPreferenceController(),
|
||||
sliceData.getKey());
|
||||
}
|
||||
|
||||
private static void addToggleAction(Context context, RowBuilder builder, boolean isChecked,
|
||||
|
Reference in New Issue
Block a user