From 1f440aacec4e38f7fb507e96a91901dfa41f2675 Mon Sep 17 00:00:00 2001 From: tomhsu Date: Wed, 8 May 2024 03:52:36 +0000 Subject: [PATCH] Show dialog on BT entries in Settings - When satellite mode is switched on BT entries shall show the warning dialog and avoid user uses these functions. Bug: 337154438 Test: Manual test. Test: atest pass Change-Id: Ic9b6d44731684d1cfba87570d72dcacb905a66d2 (cherry picked from commit c8f52f816c97b2d98909db6bbf698d5cc15e9bc1) Merged-In: Ic9b6d44731684d1cfba87570d72dcacb905a66d2 --- .../settings/bluetooth/BluetoothEnabler.java | 37 ++++++++++++++++++ .../bluetooth/BluetoothPairingDetail.java | 38 +++++++++++++++++++ .../bluetooth/BluetoothEnablerTest.java | 14 +++++++ 3 files changed, 89 insertions(+) diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java index eaa0b9666d9..df5cc72fae1 100644 --- a/src/com/android/settings/bluetooth/BluetoothEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java @@ -16,6 +16,9 @@ package com.android.settings.bluetooth; +import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG; +import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_BLUETOOTH; + import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; @@ -23,22 +26,32 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.UserManager; import android.provider.Settings; +import android.util.Log; import android.widget.Toast; import androidx.annotation.VisibleForTesting; import com.android.settings.R; +import com.android.settings.network.SatelliteRepository; +import com.android.settings.network.SatelliteWarningDialogActivity; import com.android.settings.widget.SwitchWidgetController; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.WirelessUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; + /** * BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox * preference. It turns on/off Bluetooth and ensures the summary of the * preference reflects the current state. */ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchChangeListener { + private static final String TAG = BluetoothEnabler.class.getSimpleName(); private final SwitchWidgetController mSwitchController; private final MetricsFeatureProvider mMetricsFeatureProvider; private Context mContext; @@ -51,6 +64,9 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh private static final String EVENT_DATA_IS_BT_ON = "is_bluetooth_on"; private static final int EVENT_UPDATE_INDEX = 0; private final int mMetricsEvent; + private SatelliteRepository mSatelliteRepository; + @VisibleForTesting + AtomicBoolean mIsSatelliteOn = new AtomicBoolean(false); private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -81,6 +97,7 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh } mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); mRestrictionUtils = restrictionUtils; + mSatelliteRepository = new SatelliteRepository(context); } public void setupSwitchController() { @@ -112,6 +129,15 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh mContext.registerReceiver(mReceiver, mIntentFilter, Context.RECEIVER_EXPORTED_UNAUDITED); mValidListener = true; + + new Thread(() -> { + try { + mIsSatelliteOn.set(mSatelliteRepository.requestIsEnabled( + Executors.newSingleThreadExecutor()).get(3000, TimeUnit.MILLISECONDS)); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + Log.e(TAG, "Error to get satellite status : " + e); + } + }).start(); } public void pause() { @@ -168,6 +194,17 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh return true; } + if (mIsSatelliteOn.get()) { + mContext.startActivity( + new Intent(mContext, SatelliteWarningDialogActivity.class) + .putExtra( + EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, + TYPE_IS_BLUETOOTH) + ); + mSwitchController.setChecked(!isChecked); + return false; + } + // Show toast message if Bluetooth is not allowed in airplane mode if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_BLUETOOTH)) { diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java index 234d6d2eb45..ca538540807 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java @@ -16,10 +16,15 @@ package com.android.settings.bluetooth; +import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG; +import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_BLUETOOTH; + import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothAdapter; import android.content.Context; +import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.View; import androidx.annotation.NonNull; @@ -27,10 +32,17 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.settings.R; +import com.android.settings.network.SatelliteRepository; +import com.android.settings.network.SatelliteWarningDialogActivity; import com.android.settingslib.bluetooth.BluetoothDeviceFilter; import com.android.settingslib.search.Indexable; import com.android.settingslib.widget.FooterPreference; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + /** * BluetoothPairingDetail is a page to scan bluetooth devices and pair them. */ @@ -55,9 +67,35 @@ public class BluetoothPairingDetail extends BluetoothDevicePairingDetailBase imp @Override public void onAttach(Context context) { super.onAttach(context); + if (mayStartSatelliteWarningDialog()) { + finish(); + return; + } use(BluetoothDeviceRenamePreferenceController.class).setFragment(this); } + private boolean mayStartSatelliteWarningDialog() { + SatelliteRepository satelliteRepository = new SatelliteRepository(this.getContext()); + boolean isSatelliteOn = true; + try { + isSatelliteOn = + satelliteRepository.requestIsEnabled( + Executors.newSingleThreadExecutor()).get(3000, TimeUnit.MILLISECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + Log.e(TAG, "Error to get satellite status : " + e); + } + if (!isSatelliteOn) { + return false; + } + startActivity( + new Intent(getContext(), SatelliteWarningDialogActivity.class) + .putExtra( + EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, + TYPE_IS_BLUETOOTH) + ); + return true; + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java index 4b827826f7d..9052268fc09 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java @@ -34,6 +34,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.UserHandle; import android.os.UserManager; +import android.util.AndroidRuntimeException; import android.view.View; import androidx.preference.PreferenceViewHolder; @@ -101,6 +102,19 @@ public class BluetoothEnablerTest { mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); } + @Test + public void onSwitchToggled_satelliteOn_showWarningDialog() { + mBluetoothEnabler.mIsSatelliteOn.set(true); + + try { + mBluetoothEnabler.onSwitchToggled(true); + } catch (AndroidRuntimeException e) { + // Catch exception of starting activity . + } + + verify(mContext).startActivity(any()); + } + @Test public void onSwitchToggled_shouldLogActionWithSuppliedEvent() { // WHEN the switch is toggled...