From 6fc40046a386ae5b1a50da32ab0ff4ad77c014cd Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Wed, 5 Apr 2023 13:40:05 -0700 Subject: [PATCH] settings(uwb): Show message when UWB is unavailable due to regulatory Bug: 270515435 Test: Manual tests Test: atest UwbPreferenceControllerTest Change-Id: I8a6f01aba237234fe88e42ba338a1df02623f7da --- res/values/strings.xml | 5 ++++- .../settings/uwb/UwbPreferenceController.java | 17 ++++++++++++++--- .../uwb/UwbPreferenceControllerTest.java | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) 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); + } }