diff --git a/res/values/strings.xml b/res/values/strings.xml
index f47620c1466..fc33e5914f1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11522,9 +11522,12 @@
Helps identify the relative position of nearby devices that have UWB
-
+
Turn off airplane mode to use UWB
+
+ UWB is unavailable in the current location
+
Camera access
diff --git a/src/com/android/settings/uwb/UwbPreferenceController.java b/src/com/android/settings/uwb/UwbPreferenceController.java
index d2f7e05d4f5..7f19765b67c 100644
--- a/src/com/android/settings/uwb/UwbPreferenceController.java
+++ b/src/com/android/settings/uwb/UwbPreferenceController.java
@@ -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);
}
diff --git a/tests/robotests/src/com/android/settings/uwb/UwbPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/uwb/UwbPreferenceControllerTest.java
index 529afa1b06e..23aca51429f 100644
--- a/tests/robotests/src/com/android/settings/uwb/UwbPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/uwb/UwbPreferenceControllerTest.java
@@ -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);
+ }
}