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)); + } }