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:
@@ -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] -->
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user