Merge "Display "see all" option when bluetooth is off" into rvc-qpr-dev

This commit is contained in:
TreeHugger Robot
2020-09-15 08:01:48 +00:00
committed by Android (Google) Code Review
5 changed files with 153 additions and 9 deletions

View File

@@ -12179,4 +12179,7 @@
<string name="media_controls_apps_title">Allowed apps</string> <string name="media_controls_apps_title">Allowed apps</string>
<!-- Keywords for the media controls setting [CHAR LIMIT=NONE]--> <!-- Keywords for the media controls setting [CHAR LIMIT=NONE]-->
<string name="keywords_media_controls">media</string> <string name="keywords_media_controls">media</string>
<!-- Summary for see all preference when bluetooth is disable [CHAR LIMIT=none]-->
<string name="connected_device_see_all_summary">Bluetooth will turn on</string>
</resources> </resources>

View File

@@ -16,7 +16,11 @@
package com.android.settings.connecteddevice; package com.android.settings.connecteddevice;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothAdapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import androidx.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
@@ -32,6 +36,9 @@ public class PreviouslyConnectedDeviceDashboardFragment extends DashboardFragmen
private static final String TAG = "PreConnectedDeviceFrag"; private static final String TAG = "PreConnectedDeviceFrag";
static final String KEY_PREVIOUSLY_CONNECTED_DEVICES = "saved_device_list"; static final String KEY_PREVIOUSLY_CONNECTED_DEVICES = "saved_device_list";
@VisibleForTesting
BluetoothAdapter mBluetoothAdapter;
@Override @Override
public int getHelpResource() { public int getHelpResource() {
return R.string.help_url_previously_connected_devices; return R.string.help_url_previously_connected_devices;
@@ -52,12 +59,32 @@ public class PreviouslyConnectedDeviceDashboardFragment extends DashboardFragmen
return SettingsEnums.PREVIOUSLY_CONNECTED_DEVICES; return SettingsEnums.PREVIOUSLY_CONNECTED_DEVICES;
} }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
use(SavedDeviceGroupController.class).init(this); use(SavedDeviceGroupController.class).init(this);
} }
@Override
public void onStart() {
super.onStart();
enableBluetoothIfNecessary();
}
@VisibleForTesting
void enableBluetoothIfNecessary() {
if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();
}
}
/** /**
* For Search. * For Search.
*/ */

View File

@@ -15,7 +15,11 @@
*/ */
package com.android.settings.connecteddevice; package com.android.settings.connecteddevice;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -23,6 +27,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothDeviceUpdater; import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater; import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater;
import com.android.settings.connecteddevice.dock.DockUpdater; import com.android.settings.connecteddevice.dock.DockUpdater;
@@ -37,17 +42,34 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback { implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback {
private static final int MAX_DEVICE_NUM = 3; private static final int MAX_DEVICE_NUM = 3;
private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
private PreferenceGroup mPreferenceGroup; private PreferenceGroup mPreferenceGroup;
private BluetoothDeviceUpdater mBluetoothDeviceUpdater; private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
private DockUpdater mSavedDockUpdater; private DockUpdater mSavedDockUpdater;
private int mPreferenceSize; private int mPreferenceSize;
private BluetoothAdapter mBluetoothAdapter;
@VisibleForTesting
Preference mSeeAllPreference;
@VisibleForTesting
IntentFilter mIntentFilter;
@VisibleForTesting
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updatePreferenceVisibility();
}
};
public PreviouslyConnectedDevicePreferenceController(Context context, String preferenceKey) { public PreviouslyConnectedDevicePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey); super(context, preferenceKey);
mSavedDockUpdater = FeatureFactory.getFactory( mSavedDockUpdater = FeatureFactory.getFactory(
context).getDockUpdaterFeatureProvider().getSavedDockUpdater(context, this); context).getDockUpdaterFeatureProvider().getSavedDockUpdater(context, this);
mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
} }
@Override @Override
@@ -62,7 +84,8 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mPreferenceGroup = screen.findPreference(getPreferenceKey()); mPreferenceGroup = screen.findPreference(getPreferenceKey());
mPreferenceGroup.setVisible(false); mSeeAllPreference = mPreferenceGroup.findPreference(KEY_SEE_ALL);
updatePreferenceVisibility();
if (isAvailable()) { if (isAvailable()) {
final Context context = screen.getContext(); final Context context = screen.getContext();
@@ -75,12 +98,14 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
public void onStart() { public void onStart() {
mBluetoothDeviceUpdater.registerCallback(); mBluetoothDeviceUpdater.registerCallback();
mSavedDockUpdater.registerCallback(); mSavedDockUpdater.registerCallback();
mContext.registerReceiver(mReceiver, mIntentFilter);
} }
@Override @Override
public void onStop() { public void onStop() {
mBluetoothDeviceUpdater.unregisterCallback(); mBluetoothDeviceUpdater.unregisterCallback();
mSavedDockUpdater.unregisterCallback(); mSavedDockUpdater.unregisterCallback();
mContext.unregisterReceiver(mReceiver);
} }
public void init(DashboardFragment fragment) { public void init(DashboardFragment fragment) {
@@ -94,14 +119,14 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
if (mPreferenceSize <= MAX_DEVICE_NUM) { if (mPreferenceSize <= MAX_DEVICE_NUM) {
mPreferenceGroup.addPreference(preference); mPreferenceGroup.addPreference(preference);
} }
updatePreferenceVisiblity(); updatePreferenceVisibility();
} }
@Override @Override
public void onDeviceRemoved(Preference preference) { public void onDeviceRemoved(Preference preference) {
mPreferenceSize--; mPreferenceSize--;
mPreferenceGroup.removePreference(preference); mPreferenceGroup.removePreference(preference);
updatePreferenceVisiblity(); updatePreferenceVisibility();
} }
@VisibleForTesting @VisibleForTesting
@@ -120,7 +145,12 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
} }
@VisibleForTesting @VisibleForTesting
void updatePreferenceVisiblity() { void updatePreferenceVisibility() {
mPreferenceGroup.setVisible(mPreferenceSize > 0); if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
mSeeAllPreference.setSummary("");
} else {
mSeeAllPreference.setSummary(
mContext.getString(R.string.connected_device_see_all_summary));
}
} }
} }

View File

@@ -0,0 +1,57 @@
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.connecteddevice;
import static com.google.common.truth.Truth.assertThat;
import android.bluetooth.BluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowBluetoothAdapter.class)
public class PreviouslyConnectedDeviceDashboardFragmentTest {
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
private PreviouslyConnectedDeviceDashboardFragment mFragment;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mFragment = new PreviouslyConnectedDeviceDashboardFragment();
mFragment.mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Test
public void onStart_bluetoothIsDisable_enableBluetooth() {
mShadowBluetoothAdapter.setEnabled(false);
assertThat(mFragment.mBluetoothAdapter.isEnabled()).isFalse();
mFragment.enableBluetoothIfNecessary();
assertThat(mFragment.mBluetoothAdapter.isEnabled()).isTrue();
}
}

View File

@@ -24,6 +24,7 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.bluetooth.BluetoothAdapter;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -32,9 +33,11 @@ import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothDeviceUpdater; 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 org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -43,8 +46,11 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowBluetoothAdapter.class)
public class PreviouslyConnectedDevicePreferenceControllerTest { public class PreviouslyConnectedDevicePreferenceControllerTest {
private final String KEY = "test_key"; private final String KEY = "test_key";
@@ -59,10 +65,13 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
private PackageManager mPackageManager; private PackageManager mPackageManager;
@Mock @Mock
private PreferenceManager mPreferenceManager; private PreferenceManager mPreferenceManager;
@Mock
private Preference mSeeAllPreference;
private Context mContext; private Context mContext;
private PreviouslyConnectedDevicePreferenceController mPreConnectedDeviceController; private PreviouslyConnectedDevicePreferenceController mPreConnectedDeviceController;
private PreferenceGroup mPreferenceGroup; private PreferenceGroup mPreferenceGroup;
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
@Before @Before
public void setUp() { public void setUp() {
@@ -74,11 +83,13 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
new PreviouslyConnectedDevicePreferenceController(mContext, KEY); new PreviouslyConnectedDevicePreferenceController(mContext, KEY);
mPreConnectedDeviceController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater); mPreConnectedDeviceController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater);
mPreConnectedDeviceController.setSavedDockUpdater(mDockUpdater); mPreConnectedDeviceController.setSavedDockUpdater(mDockUpdater);
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mPreferenceGroup = spy(new PreferenceCategory(mContext)); mPreferenceGroup = spy(new PreferenceCategory(mContext));
doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager(); doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager();
mPreferenceGroup.setVisible(false); mPreferenceGroup.setVisible(false);
mPreConnectedDeviceController.setPreferenceGroup(mPreferenceGroup); mPreConnectedDeviceController.setPreferenceGroup(mPreferenceGroup);
mPreConnectedDeviceController.mSeeAllPreference = mSeeAllPreference;
} }
@Test @Test
@@ -87,11 +98,14 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
mPreConnectedDeviceController.onStart(); mPreConnectedDeviceController.onStart();
verify(mBluetoothDeviceUpdater).registerCallback(); verify(mBluetoothDeviceUpdater).registerCallback();
verify(mDockUpdater).registerCallback(); verify(mDockUpdater).registerCallback();
verify(mContext).registerReceiver(mPreConnectedDeviceController.mReceiver,
mPreConnectedDeviceController.mIntentFilter);
// unregister the callback in onStop() // unregister the callback in onStop()
mPreConnectedDeviceController.onStop(); mPreConnectedDeviceController.onStop();
verify(mBluetoothDeviceUpdater).unregisterCallback(); verify(mBluetoothDeviceUpdater).unregisterCallback();
verify(mDockUpdater).unregisterCallback(); verify(mDockUpdater).unregisterCallback();
verify(mContext).unregisterReceiver(mPreConnectedDeviceController.mReceiver);
} }
@Test @Test
@@ -124,7 +138,6 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
public void onDeviceAdded_addDevicePreference_displayIt() { public void onDeviceAdded_addDevicePreference_displayIt() {
mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext));
assertThat(mPreferenceGroup.isVisible()).isTrue();
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
} }
@@ -135,7 +148,6 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext));
mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext));
assertThat(mPreferenceGroup.isVisible()).isTrue();
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
} }
@@ -143,11 +155,26 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
public void onDeviceRemoved_removeLastDevice_setInvisible() { public void onDeviceRemoved_removeLastDevice_setInvisible() {
final Preference preference = new Preference(mContext); final Preference preference = new Preference(mContext);
mPreferenceGroup.addPreference(preference); mPreferenceGroup.addPreference(preference);
mPreferenceGroup.setVisible(true);
mPreConnectedDeviceController.onDeviceRemoved(preference); mPreConnectedDeviceController.onDeviceRemoved(preference);
assertThat(mPreferenceGroup.isVisible()).isFalse();
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
} }
@Test
public void updatePreferenceVisibility_bluetoothIsEnable_shouldShowCorrectText() {
mShadowBluetoothAdapter.setEnabled(true);
mPreConnectedDeviceController.updatePreferenceVisibility();
verify(mSeeAllPreference).setSummary("");
}
@Test
public void updatePreferenceVisibility_bluetoothIsDisable_shouldShowCorrectText() {
mShadowBluetoothAdapter.setEnabled(false);
mPreConnectedDeviceController.updatePreferenceVisibility();
verify(mSeeAllPreference).setSummary(
mContext.getString(R.string.connected_device_see_all_summary));
}
} }