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]--> <!-- Summary for UWB preference. [CHAR_LIMIT=NONE]-->
<string name="uwb_settings_summary">Helps identify the relative position of nearby devices that have UWB</string> <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> <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] --> <!-- Label for the camera use toggle [CHAR LIMIT=40] -->
<string name="camera_toggle_title">Camera access</string> <string name="camera_toggle_title">Camera access</string>
<!-- Label for the camera use toggle [CHAR LIMIT=40] --> <!-- Label for the camera use toggle [CHAR LIMIT=40] -->

View File

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

View File

@@ -17,6 +17,7 @@
package com.android.settings.uwb; 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_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_DISABLED;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_ACTIVE; import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_ACTIVE;
import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE; import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE;
@@ -62,6 +63,7 @@ import org.robolectric.RobolectricTestRunner;
public class UwbPreferenceControllerTest { public class UwbPreferenceControllerTest {
private static final String TEST_SUMMARY = "uwb"; private static final String TEST_SUMMARY = "uwb";
private static final String TEST_AIRPLANE_SUMMARY = "apm_uwb"; private static final String TEST_AIRPLANE_SUMMARY = "apm_uwb";
private static final String TEST_NO_UWB_REGULATORY_SUMMARY = "regulatory_uwb";
@Rule @Rule
public MockitoRule rule = MockitoJUnit.rule(); public MockitoRule rule = MockitoJUnit.rule();
@@ -96,6 +98,8 @@ public class UwbPreferenceControllerTest {
.thenReturn(TEST_SUMMARY); .thenReturn(TEST_SUMMARY);
when(mResources.getString(R.string.uwb_settings_summary_airplane_mode)) when(mResources.getString(R.string.uwb_settings_summary_airplane_mode))
.thenReturn(TEST_AIRPLANE_SUMMARY); .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.getMainLooper()).thenReturn(mTestLooper.getLooper());
when(mContext.getSystemService(UwbManager.class)).thenReturn(mUwbManager); when(mContext.getSystemService(UwbManager.class)).thenReturn(mUwbManager);
when(mContext.getResources()).thenReturn(mResources); when(mContext.getResources()).thenReturn(mResources);
@@ -219,5 +223,18 @@ public class UwbPreferenceControllerTest {
verify(mPreference).setEnabled(true); verify(mPreference).setEnabled(true);
verify(mPreference, times(2)).setSummary(TEST_SUMMARY); 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);
}
} }