From fc520ee38a4df4119e41fb28a9a7864c447f7ad2 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 21 Feb 2018 11:28:41 -0800 Subject: [PATCH] Move instantiation-through-reflection method to controller Bug: 73668763 Test: rerun robotest Change-Id: If1b263dfd6a8c40f563ce53ce3f368aef5ca5a9f --- .../core/BasePreferenceController.java | 40 ++++++++++++++++++ .../settings/slices/SliceBuilderUtils.java | 41 ++----------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java index 777f3dd3ea3..1bbee0c47a9 100644 --- a/src/com/android/settings/core/BasePreferenceController.java +++ b/src/com/android/settings/core/BasePreferenceController.java @@ -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. + *

+ * 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. + *

+ * 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; diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index 11ff1c17515..a01ea1bd0ed 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -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,