Merge changes If1b263df,I95afbcf0

* changes:
  Move instantiation-through-reflection method to controller
  Minor cleanup in DashboardFragment: remove unused code
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index 777f3dd..1bbee0c 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -25,6 +25,8 @@
 
 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 @@
 
     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;
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 6a88a38..a4f9a6b 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -27,9 +27,6 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.overlay.FeatureFactory;
@@ -58,7 +55,7 @@
             new ArrayMap<>();
     private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
 
-    protected DashboardFeatureProvider mDashboardFeatureProvider;
+    private DashboardFeatureProvider mDashboardFeatureProvider;
     private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController;
     private boolean mListeningToCategoryChange;
     private SummaryLoader mSummaryLoader;
@@ -95,13 +92,6 @@
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        final View view = super.onCreateView(inflater, container, savedInstanceState);
-        return view;
-    }
-
-    @Override
     public void onCategoriesChanged() {
         final DashboardCategory category =
                 mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 11ff1c1..a01ea1b 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.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 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,