diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1a7e5e5fd47..5085fc1f7f6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -12179,4 +12179,7 @@
Allowed apps
media
+
+
+ Bluetooth will turn on
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java
index d3f5c28afbe..05a17cc9a9f 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java
@@ -16,7 +16,11 @@
package com.android.settings.connecteddevice;
import android.app.settings.SettingsEnums;
+import android.bluetooth.BluetoothAdapter;
import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
@@ -32,6 +36,9 @@ public class PreviouslyConnectedDeviceDashboardFragment extends DashboardFragmen
private static final String TAG = "PreConnectedDeviceFrag";
static final String KEY_PREVIOUSLY_CONNECTED_DEVICES = "saved_device_list";
+ @VisibleForTesting
+ BluetoothAdapter mBluetoothAdapter;
+
@Override
public int getHelpResource() {
return R.string.help_url_previously_connected_devices;
@@ -52,12 +59,32 @@ public class PreviouslyConnectedDeviceDashboardFragment extends DashboardFragmen
return SettingsEnums.PREVIOUSLY_CONNECTED_DEVICES;
}
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ }
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
use(SavedDeviceGroupController.class).init(this);
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ enableBluetoothIfNecessary();
+ }
+
+ @VisibleForTesting
+ void enableBluetoothIfNecessary() {
+ if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
+ mBluetoothAdapter.enable();
+ }
+ }
+
/**
* For Search.
*/
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
index 5b23d69cf91..3d4dd29d38f 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
@@ -15,7 +15,11 @@
*/
package com.android.settings.connecteddevice;
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import androidx.annotation.VisibleForTesting;
@@ -23,6 +27,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
+import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater;
import com.android.settings.connecteddevice.dock.DockUpdater;
@@ -37,17 +42,34 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback {
private static final int MAX_DEVICE_NUM = 3;
+ private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
private PreferenceGroup mPreferenceGroup;
private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
private DockUpdater mSavedDockUpdater;
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) {
super(context, preferenceKey);
mSavedDockUpdater = FeatureFactory.getFactory(
context).getDockUpdaterFeatureProvider().getSavedDockUpdater(context, this);
+ mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+ mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
@@ -62,7 +84,8 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceGroup = screen.findPreference(getPreferenceKey());
- mPreferenceGroup.setVisible(false);
+ mSeeAllPreference = mPreferenceGroup.findPreference(KEY_SEE_ALL);
+ updatePreferenceVisibility();
if (isAvailable()) {
final Context context = screen.getContext();
@@ -75,12 +98,14 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
public void onStart() {
mBluetoothDeviceUpdater.registerCallback();
mSavedDockUpdater.registerCallback();
+ mContext.registerReceiver(mReceiver, mIntentFilter);
}
@Override
public void onStop() {
mBluetoothDeviceUpdater.unregisterCallback();
mSavedDockUpdater.unregisterCallback();
+ mContext.unregisterReceiver(mReceiver);
}
public void init(DashboardFragment fragment) {
@@ -94,14 +119,14 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
if (mPreferenceSize <= MAX_DEVICE_NUM) {
mPreferenceGroup.addPreference(preference);
}
- updatePreferenceVisiblity();
+ updatePreferenceVisibility();
}
@Override
public void onDeviceRemoved(Preference preference) {
mPreferenceSize--;
mPreferenceGroup.removePreference(preference);
- updatePreferenceVisiblity();
+ updatePreferenceVisibility();
}
@VisibleForTesting
@@ -120,7 +145,12 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
}
@VisibleForTesting
- void updatePreferenceVisiblity() {
- mPreferenceGroup.setVisible(mPreferenceSize > 0);
+ void updatePreferenceVisibility() {
+ if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
+ mSeeAllPreference.setSummary("");
+ } else {
+ mSeeAllPreference.setSummary(
+ mContext.getString(R.string.connected_device_see_all_summary));
+ }
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragmentTest.java
new file mode 100644
index 00000000000..62610157278
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragmentTest.java
@@ -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();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
index 90cbea9e5f1..e8b88f50389 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -32,9 +33,11 @@ import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
+import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.connecteddevice.dock.DockUpdater;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import org.junit.Before;
import org.junit.Test;
@@ -43,8 +46,11 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowBluetoothAdapter.class)
public class PreviouslyConnectedDevicePreferenceControllerTest {
private final String KEY = "test_key";
@@ -59,10 +65,13 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
private PackageManager mPackageManager;
@Mock
private PreferenceManager mPreferenceManager;
+ @Mock
+ private Preference mSeeAllPreference;
private Context mContext;
private PreviouslyConnectedDevicePreferenceController mPreConnectedDeviceController;
private PreferenceGroup mPreferenceGroup;
+ private ShadowBluetoothAdapter mShadowBluetoothAdapter;
@Before
public void setUp() {
@@ -74,11 +83,13 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
new PreviouslyConnectedDevicePreferenceController(mContext, KEY);
mPreConnectedDeviceController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater);
mPreConnectedDeviceController.setSavedDockUpdater(mDockUpdater);
+ mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
mPreferenceGroup = spy(new PreferenceCategory(mContext));
doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager();
mPreferenceGroup.setVisible(false);
mPreConnectedDeviceController.setPreferenceGroup(mPreferenceGroup);
+ mPreConnectedDeviceController.mSeeAllPreference = mSeeAllPreference;
}
@Test
@@ -87,11 +98,14 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
mPreConnectedDeviceController.onStart();
verify(mBluetoothDeviceUpdater).registerCallback();
verify(mDockUpdater).registerCallback();
+ verify(mContext).registerReceiver(mPreConnectedDeviceController.mReceiver,
+ mPreConnectedDeviceController.mIntentFilter);
// unregister the callback in onStop()
mPreConnectedDeviceController.onStop();
verify(mBluetoothDeviceUpdater).unregisterCallback();
verify(mDockUpdater).unregisterCallback();
+ verify(mContext).unregisterReceiver(mPreConnectedDeviceController.mReceiver);
}
@Test
@@ -124,7 +138,6 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
public void onDeviceAdded_addDevicePreference_displayIt() {
mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext));
- assertThat(mPreferenceGroup.isVisible()).isTrue();
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
}
@@ -135,7 +148,6 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext));
mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext));
- assertThat(mPreferenceGroup.isVisible()).isTrue();
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
}
@@ -143,11 +155,26 @@ public class PreviouslyConnectedDevicePreferenceControllerTest {
public void onDeviceRemoved_removeLastDevice_setInvisible() {
final Preference preference = new Preference(mContext);
mPreferenceGroup.addPreference(preference);
- mPreferenceGroup.setVisible(true);
mPreConnectedDeviceController.onDeviceRemoved(preference);
- assertThat(mPreferenceGroup.isVisible()).isFalse();
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));
+ }
}