Merge "Add “Rename device” on Bluetooth screen" into pi-dev
diff --git a/res/xml/bluetooth_pairing_detail.xml b/res/xml/bluetooth_pairing_detail.xml
index e654a3c..86fb9e4 100644
--- a/res/xml/bluetooth_pairing_detail.xml
+++ b/res/xml/bluetooth_pairing_detail.xml
@@ -16,12 +16,14 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/bluetooth_pairing_pref_title">
 
     <Preference
         android:key="bt_pair_rename_devices"
         android:title="@string/bluetooth_device_name"
-        android:summary="@string/summary_placeholder" />
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController"/>
 
     <com.android.settings.bluetooth.BluetoothProgressCategory
         android:key="available_devices"
diff --git a/res/xml/bluetooth_screen.xml b/res/xml/bluetooth_screen.xml
index 9f09a8a..5679cd4 100644
--- a/res/xml/bluetooth_screen.xml
+++ b/res/xml/bluetooth_screen.xml
@@ -19,6 +19,12 @@
     android:key="bluetooth_switchbar_screen"
     android:title="@string/bluetooth_settings_title">
 
+    <Preference
+        android:key="bluetooth_screen_bt_pair_rename_devices"
+        android:title="@string/bluetooth_device_name"
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController"/>
+
     <com.android.settingslib.RestrictedPreference
         android:key="bluetooth_screen_add_bt_devices"
         android:title="@string/bluetooth_pairing_pref_title"
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
index 8827a71..05b5a8a 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
@@ -32,7 +32,6 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -44,16 +43,16 @@
         LifecycleObserver, OnStart, OnStop {
     private static final String TAG = "BluetoothNamePrefCtrl";
 
-    public static final String KEY_DEVICE_NAME = "device_name";
-
-
     @VisibleForTesting
     Preference mPreference;
     private LocalBluetoothManager mLocalManager;
     private LocalBluetoothAdapter mLocalAdapter;
 
-    public BluetoothDeviceNamePreferenceController(Context context, Lifecycle lifecycle) {
-        this(context, (LocalBluetoothAdapter) null);
+    /**
+     * Constructor exclusively used for Slice.
+     */
+    public BluetoothDeviceNamePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
 
         mLocalManager = Utils.getLocalBtManager(context);
         if (mLocalManager == null) {
@@ -61,22 +60,12 @@
             return;
         }
         mLocalAdapter = mLocalManager.getBluetoothAdapter();
-
-        if (lifecycle != null) {
-            lifecycle.addObserver(this);
-        }
-    }
-
-    /**
-     * Constructor exclusively used for Slice.
-     */
-    public BluetoothDeviceNamePreferenceController(Context context) {
-        this(context, (Lifecycle) null);
     }
 
     @VisibleForTesting
-    BluetoothDeviceNamePreferenceController(Context context, LocalBluetoothAdapter localAdapter) {
-        super(context, KEY_DEVICE_NAME);
+    BluetoothDeviceNamePreferenceController(Context context, LocalBluetoothAdapter localAdapter,
+            String preferenceKey) {
+        super(context, preferenceKey);
         mLocalAdapter = localAdapter;
     }
 
@@ -103,11 +92,6 @@
     }
 
     @Override
-    public String getPreferenceKey() {
-        return KEY_DEVICE_NAME;
-    }
-
-    @Override
     public void updateState(Preference preference) {
         updateDeviceName(preference);
     }
@@ -134,7 +118,7 @@
     public Preference createBluetoothDeviceNamePreference(PreferenceScreen screen, int order) {
         mPreference = new Preference(screen.getContext());
         mPreference.setOrder(order);
-        mPreference.setKey(KEY_DEVICE_NAME);
+        mPreference.setKey(getPreferenceKey());
         screen.addPreference(mPreference);
 
         return mPreference;
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
index 262d6b3..21f0487 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
@@ -26,44 +26,35 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 
 public class BluetoothDeviceRenamePreferenceController extends
         BluetoothDeviceNamePreferenceController {
 
-    private final Fragment mFragment;
-    private String mPrefKey;
+    private Fragment mFragment;
     private MetricsFeatureProvider mMetricsFeatureProvider;
 
-    public BluetoothDeviceRenamePreferenceController(Context context, String prefKey,
-            Fragment fragment, Lifecycle lifecycle) {
-        super(context, lifecycle);
-        mPrefKey = prefKey;
-        mFragment = fragment;
-        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
-    }
-
     /**
      * Constructor exclusively used for Slice.
      */
-    public BluetoothDeviceRenamePreferenceController(Context context, String prefKey) {
-        super(context, (Lifecycle) null);
-        mPrefKey = prefKey;
-        mFragment = null;
-    }
-
-    @VisibleForTesting
-    BluetoothDeviceRenamePreferenceController(Context context, String prefKey, Fragment fragment,
-            LocalBluetoothAdapter localAdapter) {
-        super(context, localAdapter);
-        mPrefKey = prefKey;
-        mFragment = fragment;
+    public BluetoothDeviceRenamePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
-    @Override
-    public String getPreferenceKey() {
-        return mPrefKey;
+    @VisibleForTesting
+    BluetoothDeviceRenamePreferenceController(Context context, LocalBluetoothAdapter localAdapter,
+            String preferenceKey) {
+        super(context, localAdapter, preferenceKey);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+    }
+
+    /**
+     * Set the {@link Fragment} that used to show {@link LocalDeviceNameDialogFragment}
+     * in {@code handlePreferenceTreeClick}
+     */
+    @VisibleForTesting
+    public void setFragment(Fragment fragment) {
+        mFragment = fragment;
     }
 
     @Override
@@ -78,7 +69,7 @@
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (TextUtils.equals(mPrefKey, preference.getKey()) && mFragment != null) {
+        if (TextUtils.equals(getPreferenceKey(), preference.getKey()) && mFragment != null) {
             mMetricsFeatureProvider.action(mContext,
                     MetricsProto.MetricsEvent.ACTION_BLUETOOTH_RENAME);
             LocalDeviceNameDialogFragment.newInstance()
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java
index b31d4c8..1ab7f87 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java
@@ -30,12 +30,8 @@
 import com.android.settings.search.Indexable;
 import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.widget.FooterPreference;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * BluetoothPairingDetail is a page to scan bluetooth devices and pair them.
  */
@@ -47,7 +43,6 @@
     static final String KEY_AVAIL_DEVICES = "available_devices";
     @VisibleForTesting
     static final String KEY_FOOTER_PREF = "footer_preference";
-    private static final String KEY_RENAME_DEVICES = "bt_pair_rename_devices";
 
     @VisibleForTesting
     BluetoothProgressCategory mAvailableDevicesCategory;
@@ -80,6 +75,12 @@
         mAvailableDevicesCategory.setProgress(mLocalAdapter.isDiscovering());
     }
 
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(BluetoothDeviceRenamePreferenceController.class).setFragment(this);
+    }
+
     @VisibleForTesting
     void updateBluetooth() {
         if (mLocalAdapter.isEnabled()) {
@@ -200,16 +201,6 @@
     }
 
     @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(
-                new BluetoothDeviceRenamePreferenceController(context, KEY_RENAME_DEVICES, this,
-                        getLifecycle()));
-
-        return controllers;
-    }
-
-    @Override
     public String getDeviceListKey() {
         return KEY_AVAIL_DEVICES;
     }
diff --git a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
index 77b75c5..3b24271 100644
--- a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
@@ -24,6 +24,7 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController;
 import com.android.settings.bluetooth.BluetoothSwitchPreferenceController;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.TogglePreferenceController;
@@ -79,6 +80,12 @@
     }
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(BluetoothDeviceRenamePreferenceController.class).setFragment(this);
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
index f5070ef..1d37883 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
@@ -43,6 +43,7 @@
 
     private static final String DEVICE_NAME = "Nightshade";
     private static final int ORDER = 1;
+    private static final String KEY_DEVICE_NAME = "test_key_name";
 
     private Context mContext;
     @Mock
@@ -61,8 +62,9 @@
 
         when(mPreferenceScreen.getContext()).thenReturn(mContext);
         mPreference = new Preference(mContext);
-        mPreference.setKey(BluetoothDeviceNamePreferenceController.KEY_DEVICE_NAME);
-        mController = spy(new BluetoothDeviceNamePreferenceController(mContext, mLocalAdapter));
+        mPreference.setKey(KEY_DEVICE_NAME);
+        mController = spy(new BluetoothDeviceNamePreferenceController(mContext, mLocalAdapter,
+                KEY_DEVICE_NAME));
         doReturn(DEVICE_NAME).when(mController).getDeviceName();
     }
 
@@ -82,7 +84,7 @@
         Preference preference =
             mController.createBluetoothDeviceNamePreference(mPreferenceScreen, ORDER);
 
-        assertThat(preference.getKey()).isEqualTo(mController.KEY_DEVICE_NAME);
+        assertThat(preference.getKey()).isEqualTo(mController.getPreferenceKey());
         assertThat(preference.getOrder()).isEqualTo(ORDER);
         verify(mPreferenceScreen).addPreference(preference);
     }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceControllerTest.java
index 6ba8593..65eae2c 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceControllerTest.java
@@ -67,8 +67,9 @@
         mPreference = new Preference(mContext);
         mPreference.setKey(PREF_KEY);
 
-        mController = spy(new BluetoothDeviceRenamePreferenceController(
-                mContext, PREF_KEY, mFragment, mLocalAdapter));
+        mController = spy(new BluetoothDeviceRenamePreferenceController(mContext, mLocalAdapter,
+                PREF_KEY));
+        mController.setFragment(mFragment);
         doReturn(DEVICE_NAME).when(mController).getDeviceName();
     }