Merge "Fix settings crash" into rvc-qpr-dev

This commit is contained in:
TreeHugger Robot
2020-09-16 03:09:38 +00:00
committed by Android (Google) Code Review
3 changed files with 75 additions and 27 deletions

View File

@@ -96,7 +96,6 @@ public final class BluetoothDevicePreference extends GearPreference implements
} }
mCachedDevice = cachedDevice; mCachedDevice = cachedDevice;
mCachedDevice.registerCallback(this);
mCurrentTime = System.currentTimeMillis(); mCurrentTime = System.currentTimeMillis();
mType = type; mType = type;
@@ -127,13 +126,24 @@ public final class BluetoothDevicePreference extends GearPreference implements
@Override @Override
protected void onPrepareForRemoval() { protected void onPrepareForRemoval() {
super.onPrepareForRemoval(); super.onPrepareForRemoval();
mCachedDevice.unregisterCallback(this);
if (mDisconnectDialog != null) { if (mDisconnectDialog != null) {
mDisconnectDialog.dismiss(); mDisconnectDialog.dismiss();
mDisconnectDialog = null; mDisconnectDialog = null;
} }
} }
@Override
public void onAttached() {
super.onAttached();
mCachedDevice.registerCallback(this);
}
@Override
public void onDetached() {
super.onDetached();
mCachedDevice.unregisterCallback(this);
}
public CachedBluetoothDevice getBluetoothDevice() { public CachedBluetoothDevice getBluetoothDevice() {
return mCachedDevice; return mCachedDevice;
} }

View File

@@ -51,14 +51,15 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final int MAX_DEVICE_NUM = 3; private static final int MAX_DEVICE_NUM = 3;
private static final int DOCK_DEVICE_INDEX = 9;
private static final String KEY_SEE_ALL = "previously_connected_devices_see_all"; private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
private final List<Preference> mDevicesList = new ArrayList<>(); private final List<Preference> mDevicesList = new ArrayList<>();
private final List<Preference> mDockDevicesList = new ArrayList<>();
private PreferenceGroup mPreferenceGroup; private PreferenceGroup mPreferenceGroup;
private BluetoothDeviceUpdater mBluetoothDeviceUpdater; private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
private DockUpdater mSavedDockUpdater; private DockUpdater mSavedDockUpdater;
private int mPreferenceSize;
private BluetoothAdapter mBluetoothAdapter; private BluetoothAdapter mBluetoothAdapter;
@VisibleForTesting @VisibleForTesting
@@ -126,33 +127,38 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
@Override @Override
public void onDeviceAdded(Preference preference) { public void onDeviceAdded(Preference preference) {
mPreferenceSize++;
final List<BluetoothDevice> bluetoothDevices = final List<BluetoothDevice> bluetoothDevices =
mBluetoothAdapter.getMostRecentlyConnectedDevices(); mBluetoothAdapter.getMostRecentlyConnectedDevices();
final int index = bluetoothDevices.indexOf(((BluetoothDevicePreference) preference) final int index = preference instanceof BluetoothDevicePreference
.getBluetoothDevice().getDevice()); ? bluetoothDevices.indexOf(((BluetoothDevicePreference) preference)
.getBluetoothDevice().getDevice()) : DOCK_DEVICE_INDEX;
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onDeviceAdded() " + preference.getTitle() + ", index of : " + index); Log.d(TAG, "onDeviceAdded() " + preference.getTitle() + ", index of : " + index);
for (BluetoothDevice device : bluetoothDevices) { for (BluetoothDevice device : bluetoothDevices) {
Log.d(TAG, "onDeviceAdded() most recently device : " + device.getName()); Log.d(TAG, "onDeviceAdded() most recently device : " + device.getName());
} }
} }
if (mPreferenceSize <= MAX_DEVICE_NUM) { addPreference(index, preference);
addPreference(mPreferenceSize, index, preference);
} else {
addPreference(MAX_DEVICE_NUM, index, preference);
}
updatePreferenceVisibility(); updatePreferenceVisibility();
} }
private void addPreference(int size, int index, Preference preference) { private void addPreference(int index, Preference preference) {
if (mDevicesList.size() >= index) { if (preference instanceof BluetoothDevicePreference) {
mDevicesList.add(index, preference); if (mDevicesList.size() >= index) {
mDevicesList.add(index, preference);
} else {
mDevicesList.add(preference);
}
} else { } else {
mDevicesList.add(preference); mDockDevicesList.add(preference);
} }
addPreference();
}
private void addPreference() {
mPreferenceGroup.removeAll(); mPreferenceGroup.removeAll();
mPreferenceGroup.addPreference(mSeeAllPreference); mPreferenceGroup.addPreference(mSeeAllPreference);
final int size = getDeviceListSize();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "addPreference() add device : " + mDevicesList.get(i).getTitle()); Log.d(TAG, "addPreference() add device : " + mDevicesList.get(i).getTitle());
@@ -160,23 +166,37 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
mDevicesList.get(i).setOrder(i); mDevicesList.get(i).setOrder(i);
mPreferenceGroup.addPreference(mDevicesList.get(i)); mPreferenceGroup.addPreference(mDevicesList.get(i));
} }
if (mDockDevicesList.size() > 0) {
for (int i = 0; i < getDockDeviceListSize(MAX_DEVICE_NUM - size); i++) {
if (DEBUG) {
Log.d(TAG, "addPreference() add dock device : "
+ mDockDevicesList.get(i).getTitle());
}
mDockDevicesList.get(i).setOrder(DOCK_DEVICE_INDEX);
mPreferenceGroup.addPreference(mDockDevicesList.get(i));
}
}
}
private int getDeviceListSize() {
return mDevicesList.size() >= MAX_DEVICE_NUM
? MAX_DEVICE_NUM : mDevicesList.size();
}
private int getDockDeviceListSize(int availableSize) {
return mDockDevicesList.size() >= availableSize
? availableSize : mDockDevicesList.size();
} }
@Override @Override
public void onDeviceRemoved(Preference preference) { public void onDeviceRemoved(Preference preference) {
mPreferenceSize--; if (preference instanceof BluetoothDevicePreference) {
mDevicesList.remove(preference); mDevicesList.remove(preference);
mPreferenceGroup.removeAll(); } else {
mPreferenceGroup.addPreference(mSeeAllPreference); mDockDevicesList.remove(preference);
final int size = mDevicesList.size() >= MAX_DEVICE_NUM
? MAX_DEVICE_NUM : mDevicesList.size();
for (int i = 0; i < size; i++) {
if (DEBUG) {
Log.d(TAG, "onDeviceRemoved() add device : " + mDevicesList.get(i).getTitle());
}
mDevicesList.get(i).setOrder(i);
mPreferenceGroup.addPreference(mDevicesList.get(i));
} }
addPreference();
updatePreferenceVisibility(); updatePreferenceVisibility();
} }

View File

@@ -41,6 +41,7 @@ import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.connecteddevice.dock.DockUpdater; import com.android.settings.connecteddevice.dock.DockUpdater;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.widget.SingleTargetGearPreference;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import org.junit.Before; import org.junit.Before;
@@ -187,6 +188,16 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
} }
@Test
public void onDeviceAdded_addDockDevicePreference_displayIt() {
final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference(
mContext, null /* AttributeSet */);
mPreConnectedDeviceController.onDeviceAdded(dockPreference);
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
}
@Test @Test
public void onDeviceAdded_addFourDevicePreference_onlyDisplayThree() { public void onDeviceAdded_addFourDevicePreference_onlyDisplayThree() {
final BluetoothDevicePreference preference1 = new BluetoothDevicePreference( final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(
@@ -197,11 +208,14 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
mContext, mCachedDevice3, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); mContext, mCachedDevice3, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
final BluetoothDevicePreference preference4 = new BluetoothDevicePreference( final BluetoothDevicePreference preference4 = new BluetoothDevicePreference(
mContext, mCachedDevice4, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); mContext, mCachedDevice4, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference(
mContext, null /* AttributeSet */);
mPreConnectedDeviceController.onDeviceAdded(preference1); mPreConnectedDeviceController.onDeviceAdded(preference1);
mPreConnectedDeviceController.onDeviceAdded(preference2); mPreConnectedDeviceController.onDeviceAdded(preference2);
mPreConnectedDeviceController.onDeviceAdded(preference3); mPreConnectedDeviceController.onDeviceAdded(preference3);
mPreConnectedDeviceController.onDeviceAdded(preference4); mPreConnectedDeviceController.onDeviceAdded(preference4);
mPreConnectedDeviceController.onDeviceAdded(dockPreference);
// 3 BluetoothDevicePreference and 1 see all preference // 3 BluetoothDevicePreference and 1 see all preference
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4);
@@ -211,9 +225,13 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
public void onDeviceRemoved_removeLastDevice_showSeeAllPreference() { public void onDeviceRemoved_removeLastDevice_showSeeAllPreference() {
final BluetoothDevicePreference preference1 = new BluetoothDevicePreference( final BluetoothDevicePreference preference1 = new BluetoothDevicePreference(
mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT);
final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference(
mContext, null /* AttributeSet */);
mPreferenceGroup.addPreference(preference1); mPreferenceGroup.addPreference(preference1);
mPreferenceGroup.addPreference(dockPreference);
mPreConnectedDeviceController.onDeviceRemoved(preference1); mPreConnectedDeviceController.onDeviceRemoved(preference1);
mPreConnectedDeviceController.onDeviceRemoved(dockPreference);
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
} }