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
This commit is contained in:
tomhsu
2024-05-08 03:52:36 +00:00
parent 42b714f450
commit c8f52f816c
3 changed files with 89 additions and 0 deletions

View File

@@ -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)) {

View File

@@ -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);

View File

@@ -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...