Merge "Fix Bluetooth device details crash on screen rotation" into oc-dr1-dev am: 6d50576496

am: 5438319677

Change-Id: I1595e3c80b731a4c7f86faa198f2cc6e7f05d710
This commit is contained in:
Antony Sargent
2017-07-05 23:15:53 +00:00
committed by android-build-merger
9 changed files with 142 additions and 12 deletions

View File

@@ -22,6 +22,7 @@ import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.PreferenceScreen;
import android.util.Pair;
import com.android.settings.R;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -31,6 +32,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
* This class adds a header with device name and status (connected/disconnected, etc.).
*/
public class BluetoothDetailsHeaderController extends BluetoothDetailsController {
private static final String KEY_DEVICE_HEADER = "bluetooth_device_header";
private EntityHeaderController mHeaderController;
@@ -41,10 +43,11 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
@Override
protected void init(PreferenceScreen screen) {
final LayoutPreference headerPreference =
(LayoutPreference) screen.findPreference(KEY_DEVICE_HEADER);
mHeaderController = EntityHeaderController.newInstance(mFragment.getActivity(), mFragment,
null);
LayoutPreference pref = mHeaderController.done(mFragment.getActivity(), mContext);
screen.addPreference(pref);
headerPreference.findViewById(R.id.entity_header));
screen.addPreference(headerPreference);
}
protected void setHeaderProperties() {
@@ -66,6 +69,6 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
@Override
public String getPreferenceKey() {
return EntityHeaderController.PREF_KEY_APP_HEADER;
return KEY_DEVICE_HEADER;
}
}

View File

@@ -45,7 +45,7 @@ public class BluetoothDetailsMacAddressController extends BluetoothDetailsContro
protected void init(PreferenceScreen screen) {
mFooterPreference = mFooterPreferenceMixin.createFooterPreference();
mFooterPreference.setTitle(mContext.getString(
R.string.bluetooth_device_mac_address, mCachedDevice.getDevice().getAddress()));
R.string.bluetooth_device_mac_address, mCachedDevice.getAddress()));
}
@Override

View File

@@ -44,6 +44,22 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
@VisibleForTesting
static int EDIT_DEVICE_NAME_ITEM_ID = Menu.FIRST;
/**
* An interface to let tests override the normal mechanism for looking up the
* CachedBluetoothDevice and LocalBluetoothManager, and substitute their own mocks instead.
* This is only needed in situations where you instantiate the fragment indirectly (eg via an
* intent) and can't use something like spying on an instance you construct directly via
* newInstance.
*/
@VisibleForTesting
interface TestDataFactory {
CachedBluetoothDevice getDevice(String deviceAddress);
LocalBluetoothManager getManager(Context context);
}
@VisibleForTesting
static TestDataFactory sTestDataFactory;
private String mDeviceAddress;
private LocalBluetoothManager mManager;
private CachedBluetoothDevice mCachedDevice;
@@ -54,11 +70,17 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
@VisibleForTesting
LocalBluetoothManager getLocalBluetoothManager(Context context) {
if (sTestDataFactory != null) {
return sTestDataFactory.getManager(context);
}
return Utils.getLocalBtManager(context);
}
@VisibleForTesting
CachedBluetoothDevice getCachedDevice(String deviceAddress) {
if (sTestDataFactory != null) {
return sTestDataFactory.getDevice(deviceAddress);
}
BluetoothDevice remoteDevice =
mManager.getBluetoothAdapter().getRemoteDevice(deviceAddress);
return mManager.getCachedDeviceManager().findDevice(remoteDevice);