Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fc40046 authored by Roshan Pius's avatar Roshan Pius
Browse files

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

Bug: 270515435
Test: Manual tests
Test: atest UwbPreferenceControllerTest
Change-Id: I8a6f01aba237234fe88e42ba338a1df02623f7da
parent 95892f33
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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] -->
+14 −3
Original line number Diff line number Diff line
@@ -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);
        }
+17 −0
Original line number Diff line number Diff line
@@ -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);
    }
}