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/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
index 466d60e1d0b..dab4f231e35 100644
--- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
@@ -24,6 +24,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.settings.connecteddevice.DevicePreferenceCallback;
+import com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
@@ -42,13 +43,15 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
private static final String PREF_KEY = "saved_bt";
+ private final boolean mDisplayConnected;
+
@VisibleForTesting
BluetoothAdapter mBluetoothAdapter;
public SavedBluetoothDeviceUpdater(Context context, DashboardFragment fragment,
DevicePreferenceCallback devicePreferenceCallback) {
super(context, fragment, devicePreferenceCallback);
-
+ mDisplayConnected = (fragment instanceof PreviouslyConnectedDeviceDashboardFragment);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@@ -101,7 +104,8 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
", is connected : " + device.isConnected() + ", is profile connected : "
+ cachedDevice.isConnected());
}
- return device.getBondState() == BluetoothDevice.BOND_BONDED && !device.isConnected();
+ return device.getBondState() == BluetoothDevice.BOND_BONDED
+ && (mDisplayConnected || !device.isConnected());
}
@Override
@@ -109,6 +113,9 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater
mMetricsFeatureProvider.logClickedPreference(preference, mFragment.getMetricsCategory());
final CachedBluetoothDevice device = ((BluetoothDevicePreference) preference)
.getBluetoothDevice();
+ if (device.isConnected()) {
+ return device.setActive();
+ }
device.connect();
return true;
}
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/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java
index 94a4f50fac1..b9d43b465b9 100644
--- a/src/com/android/settings/media/MediaOutputSlice.java
+++ b/src/com/android/settings/media/MediaOutputSlice.java
@@ -106,10 +106,15 @@ public class MediaOutputSlice implements CustomSliceable {
final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice();
if (devices.size() == 1) {
// Zero state
- for (MediaDevice device : devices) {
- addRow(device, device, listBuilder);
+ final MediaDevice device = devices.iterator().next();
+ addRow(device, device, listBuilder);
+ // Add "pair new" only when local output device exists
+ final int type = device.getDeviceType();
+ if (type == MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE
+ || type == MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE
+ || type == MediaDevice.MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE) {
+ listBuilder.addRow(getPairNewRow());
}
- listBuilder.addRow(getPairNewRow());
} else {
final boolean isTouched = worker.getIsTouched();
// Fix the last top device when user press device to transfer.
diff --git a/src/com/android/settings/wifi/WifiConnectionPreferenceController.java b/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
index 12a6d143656..126a72e2c19 100644
--- a/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiConnectionPreferenceController.java
@@ -18,7 +18,6 @@ package com.android.settings.wifi;
import android.content.Context;
import android.os.Bundle;
-import android.util.FeatureFlagUtils;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
@@ -26,7 +25,6 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
-import com.android.settings.wifi.details2.WifiNetworkDetailsFragment2;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.wifi.AccessPoint;
@@ -131,31 +129,17 @@ public class WifiConnectionPreferenceController extends AbstractPreferenceContro
mPreference.refresh();
mPreference.setOrder(order);
- if (FeatureFlagUtils.isEnabled(mPrefContext, FeatureFlagUtils.SETTINGS_WIFITRACKER2)) {
- mPreference.setOnPreferenceClickListener(pref -> {
- Bundle args = new Bundle();
- mPreference.getAccessPoint().saveWifiState(args);
- new SubSettingLauncher(mPrefContext)
- .setTitleRes(R.string.pref_title_network_details)
- .setDestination(WifiNetworkDetailsFragment2.class.getName())
- .setArguments(args)
- .setSourceMetricsCategory(mMetricsCategory)
- .launch();
- return true;
- });
- } else {
- mPreference.setOnPreferenceClickListener(pref -> {
- Bundle args = new Bundle();
- mPreference.getAccessPoint().saveWifiState(args);
- new SubSettingLauncher(mPrefContext)
- .setTitleRes(R.string.pref_title_network_details)
- .setDestination(WifiNetworkDetailsFragment.class.getName())
- .setArguments(args)
- .setSourceMetricsCategory(mMetricsCategory)
- .launch();
- return true;
- });
- }
+ mPreference.setOnPreferenceClickListener(pref -> {
+ Bundle args = new Bundle();
+ mPreference.getAccessPoint().saveWifiState(args);
+ new SubSettingLauncher(mPrefContext)
+ .setTitleRes(R.string.pref_title_network_details)
+ .setDestination(WifiNetworkDetailsFragment.class.getName())
+ .setArguments(args)
+ .setSourceMetricsCategory(mMetricsCategory)
+ .launch();
+ return true;
+ });
mPreferenceGroup.addPreference(mPreference);
}
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
index da117811233..20cc59deca2 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java
@@ -144,6 +144,15 @@ public class SavedBluetoothDeviceUpdaterTest {
verify(mCachedBluetoothDevice).connect();
}
+ @Test
+ public void onClick_Preference_connected_setActive() {
+ when(mCachedBluetoothDevice.isConnected()).thenReturn(true);
+
+ mBluetoothDeviceUpdater.onPreferenceClick(mPreference);
+
+ verify(mCachedBluetoothDevice).setActive();
+ }
+
@Test
public void forceUpdate_findCachedBluetoothDeviceIsMatched_addPreference() {
final List bluetoothDevices = new ArrayList<>();
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));
+ }
}