settings(uwb): Show message when UWB is unavailable due to regulatory

Bug: 270515435
Test: Manual tests
Test: atest UwbPreferenceControllerTest
Change-Id: I8a6f01aba237234fe88e42ba338a1df02623f7da
This commit is contained in:
Roshan Pius
2023-04-05 13:40:05 -07:00
parent 95892f3394
commit 6fc40046a3
3 changed files with 35 additions and 4 deletions

View File

@@ -11522,9 +11522,12 @@
<!-- Summary for UWB preference. [CHAR_LIMIT=NONE]-->
<string name="uwb_settings_summary">Helps identify the relative position of nearby devices that have UWB</string>
<!-- Summary for UWB preference when airplane mode is disabled. [CHAR_LIMIT=NONE]-->
<!-- Summary for UWB preference when airplane mode is enabled. [CHAR_LIMIT=NONE]-->
<string name="uwb_settings_summary_airplane_mode">Turn off airplane mode to use UWB </string>
<!-- Summary for UWB preference when UWB is unavailable due to regulatory requirements. [CHAR_LIMIT=NONE]-->
<string name="uwb_settings_summary_no_uwb_regulatory">UWB is unavailable in the current location</string>
<!-- Label for the camera use toggle [CHAR LIMIT=40] -->
<string name="camera_toggle_title">Camera access</string>
<!-- Label for the camera use toggle [CHAR LIMIT=40] -->

View File

@@ -16,6 +16,8 @@
package com.android.settings.uwb;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_REGULATION;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_DISABLED;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_ACTIVE;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE;
@@ -50,7 +52,7 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
private final UwbUtils mUwbUtils;
private boolean mAirplaneModeOn;
private /* @AdapterStateCallback.State */ int mState;
private /* @AdapterStateCallback.StateChangedReason */ int mReason;
private /* @AdapterStateCallback.StateChangedReason */ int mStateReason;
private final BroadcastReceiver mAirplaneModeChangedReceiver;
private final AdapterStateCallback mAdapterStateCallback;
private final Executor mExecutor;
@@ -74,7 +76,7 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
};
mAdapterStateCallback = (state, reason) -> {
mState = state;
mReason = reason;
mStateReason = reason;
updateState(mPreference);
};
} else {
@@ -92,12 +94,18 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB);
}
private boolean isUwbDisabledDueToRegulatory() {
return mState == STATE_DISABLED && mStateReason == STATE_CHANGED_REASON_SYSTEM_REGULATION;
}
@Override
public int getAvailabilityStatus() {
if (!isUwbSupportedOnDevice()) {
return UNSUPPORTED_ON_DEVICE;
} else if (mAirplaneModeOn) {
return DISABLED_DEPENDENT_SETTING;
} else if (isUwbDisabledDueToRegulatory()) {
return CONDITIONALLY_UNAVAILABLE;
} else {
return AVAILABLE;
}
@@ -134,7 +142,7 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
public void onStart() {
if (isUwbSupportedOnDevice()) {
mState = mUwbManager.getAdapterState();
mReason = AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN;
mStateReason = AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN;
mAirplaneModeOn = mUwbUtils.isAirplaneModeOn(mContext);
mUwbManager.registerAdapterStateCallback(mExecutor, mAdapterStateCallback);
mContext.registerReceiver(mAirplaneModeChangedReceiver,
@@ -163,6 +171,9 @@ public class UwbPreferenceController extends TogglePreferenceController implemen
public CharSequence getSummary() {
if (mAirplaneModeOn) {
return mContext.getResources().getString(R.string.uwb_settings_summary_airplane_mode);
} else if (isUwbDisabledDueToRegulatory()) {
return mContext.getResources().getString(
R.string.uwb_settings_summary_no_uwb_regulatory);
} else {
return mContext.getResources().getString(R.string.uwb_settings_summary);
}

View File

@@ -17,6 +17,7 @@
package com.android.settings.uwb;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_POLICY;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_REGULATION;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_DISABLED;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_ACTIVE;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE;
@@ -62,6 +63,7 @@ import org.robolectric.RobolectricTestRunner;
public class UwbPreferenceControllerTest {
private static final String TEST_SUMMARY = "uwb";
private static final String TEST_AIRPLANE_SUMMARY = "apm_uwb";
private static final String TEST_NO_UWB_REGULATORY_SUMMARY = "regulatory_uwb";
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@@ -96,6 +98,8 @@ public class UwbPreferenceControllerTest {
.thenReturn(TEST_SUMMARY);
when(mResources.getString(R.string.uwb_settings_summary_airplane_mode))
.thenReturn(TEST_AIRPLANE_SUMMARY);
when(mResources.getString(R.string.uwb_settings_summary_no_uwb_regulatory))
.thenReturn(TEST_NO_UWB_REGULATORY_SUMMARY);
when(mContext.getMainLooper()).thenReturn(mTestLooper.getLooper());
when(mContext.getSystemService(UwbManager.class)).thenReturn(mUwbManager);
when(mContext.getResources()).thenReturn(mResources);
@@ -219,5 +223,18 @@ public class UwbPreferenceControllerTest {
verify(mPreference).setEnabled(true);
verify(mPreference, times(2)).setSummary(TEST_SUMMARY);
}
@Test
public void updateStateAndSummary_uwbDisabledDueToRegulatory() {
startControllerAndCaptureCallbacks();
clearInvocations(mUwbManager, mPreference);
mAdapterStateCallbackArgumentCaptor.getValue().onStateChanged(
STATE_DISABLED, STATE_CHANGED_REASON_SYSTEM_REGULATION);
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
verify(mPreference, times(2)).setSummary(TEST_NO_UWB_REGULATORY_SUMMARY);
}
}