From a6f33abf53a45f529cf3572cdaa768ef9c8d16d5 Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Thu, 18 May 2023 16:19:11 +0000 Subject: [PATCH 1/3] Add new bond entry to HearingAidInfoReported There's a new pairing page in "Settings > Accessibility > Hearing devices" which will initiate the bonding process. Add this page as a new bond entry to make logging more explicit. Bug: 283203351 Test: m statsd_testdrive & statsd_testdrive 513 Change-Id: I562a435c60cb1046cd62459c40604a25aa308aef --- .../settings/accessibility/AccessibilityStatsLogUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/android/settings/accessibility/AccessibilityStatsLogUtils.java b/src/com/android/settings/accessibility/AccessibilityStatsLogUtils.java index e78982a94d9..75cf58acb72 100644 --- a/src/com/android/settings/accessibility/AccessibilityStatsLogUtils.java +++ b/src/com/android/settings/accessibility/AccessibilityStatsLogUtils.java @@ -131,6 +131,8 @@ public final class AccessibilityStatsLogUtils { return FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__ACCESSIBILITY_HEARING_AID_PAIR_ANOTHER; case SettingsStatsLog.SETTINGS_UICHANGED__PAGE_ID__BLUETOOTH_FRAGMENT: return FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH; + case SettingsStatsLog.SETTINGS_UICHANGED__PAGE_ID__ACCESSIBILITY_HEARING_AID_SETTINGS: + return FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__ACCESSIBILITY_HEARING_AID_SETTINGS; default: return FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__PAGE_UNKNOWN; } From 9872f4322b2a89350dd290b986415f0734d591f1 Mon Sep 17 00:00:00 2001 From: Lucas Silva Date: Thu, 18 May 2023 14:38:54 -0400 Subject: [PATCH 2/3] Disable dreams home controls button when disabled on lockscreen. When home controls are disable on lockscreen, we should also disable them on dreams. Bug: 282680621 Test: flashed device, disabled/enabled home controls on lockscreen and verified that dreams home controls button was hidden/shown correctly Test: make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.dream.DreamHomeControlsPreferenceControllerTest" Change-Id: I535b079cabc2838e77f3afc74bb8f8730b850653 --- ...DreamHomeControlsPreferenceController.java | 22 +++++++++++++++++-- ...mHomeControlsPreferenceControllerTest.java | 21 ++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java b/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java index b39f3b1ace6..0e777ec4c9d 100644 --- a/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java +++ b/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java @@ -17,6 +17,9 @@ package com.android.settings.dream; import android.content.Context; +import android.provider.Settings; + +import androidx.preference.Preference; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; @@ -46,12 +49,21 @@ public class DreamHomeControlsPreferenceController extends TogglePreferenceContr final boolean supported = mBackend.getSupportedComplications() .contains(DreamBackend.COMPLICATION_TYPE_HOME_CONTROLS); - return supported ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + + return controlsEnabledOnLockscreen() ? (supported ? AVAILABLE : CONDITIONALLY_UNAVAILABLE) + : DISABLED_DEPENDENT_SETTING; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + preference.setEnabled(getAvailabilityStatus() == AVAILABLE); + refreshSummary(preference); } @Override public boolean isChecked() { - return mBackend.getEnabledComplications().contains( + return controlsEnabledOnLockscreen() && mBackend.getEnabledComplications().contains( DreamBackend.COMPLICATION_TYPE_HOME_CONTROLS); } @@ -61,6 +73,12 @@ public class DreamHomeControlsPreferenceController extends TogglePreferenceContr return true; } + private boolean controlsEnabledOnLockscreen() { + return Settings.Secure.getInt( + mContext.getContentResolver(), + Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, 0) != 0; + } + @Override public int getSliceHighlightMenuRes() { return R.string.menu_key_display; diff --git a/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java index 452604c8012..57736151419 100644 --- a/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.content.Context; +import android.provider.Settings; import android.util.ArraySet; import androidx.preference.PreferenceScreen; @@ -80,6 +81,7 @@ public class DreamHomeControlsPreferenceControllerTest { @Test public void testSetChecked_setTrue_enablesSetting() { + setControlsEnabledOnLockscreen(true); mBackend.setHomeControlsEnabled(false); assertThat(mBackend.getEnabledComplications()) .doesNotContain(COMPLICATION_TYPE_HOME_CONTROLS); @@ -91,6 +93,7 @@ public class DreamHomeControlsPreferenceControllerTest { @Test public void testSetChecked_setFalse_disablesSetting() { + setControlsEnabledOnLockscreen(true); mBackend.setHomeControlsEnabled(true); assertThat(mBackend.getEnabledComplications()) .contains(COMPLICATION_TYPE_HOME_CONTROLS); @@ -102,15 +105,33 @@ public class DreamHomeControlsPreferenceControllerTest { @Test public void testIsChecked_returnsFalse() { + setControlsEnabledOnLockscreen(true); mBackend.setHomeControlsEnabled(false); assertThat(mController.isChecked()).isFalse(); } @Test public void testIsChecked_returnsTrue() { + setControlsEnabledOnLockscreen(true); mBackend.setHomeControlsEnabled(true); assertThat(mBackend.getEnabledComplications()) .contains(COMPLICATION_TYPE_HOME_CONTROLS); assertThat(mController.isChecked()).isTrue(); } + + @Test + public void testIsChecked_lockScreenDisabled_returnsFalse() { + setControlsEnabledOnLockscreen(false); + mBackend.setHomeControlsEnabled(true); + assertThat(mBackend.getEnabledComplications()) + .doesNotContain(COMPLICATION_TYPE_HOME_CONTROLS); + assertThat(mController.isChecked()).isFalse(); + } + + private void setControlsEnabledOnLockscreen(boolean enabled) { + Settings.Secure.putInt( + mContext.getContentResolver(), + Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, + enabled ? 1 : 0); + } } From a95d62a4a82d9ef5b80fbdd6f63a5e8ccd52ec9f Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 23 May 2023 14:21:03 +0800 Subject: [PATCH 3/3] Fix the bytes displayed unit This used to by MByte and GByte, not used in other places in Settings, and not align with the data summary on the same page. Unify to MB and GB to align with other places in Settings and the data summary on the same page. Fix: 277900792 Test: Visual Test: Unit test Change-Id: I9f8ceac470aede135b7921c391c063ba87da661e --- .../datausage/BillingCycleSettings.java | 10 +--- .../settings/datausage/DataUsageFormatter.kt | 32 ++++++++++++ .../datausage/DataUsageFormatterTest.kt | 50 +++++++++++++++++++ 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/com/android/settings/datausage/DataUsageFormatter.kt create mode 100644 tests/spa_unit/src/com/android/settings/datausage/DataUsageFormatterTest.kt diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 3047d73dddf..c3ddb2eac2d 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -22,8 +22,6 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; -import android.icu.text.MeasureFormat; -import android.icu.util.MeasureUnit; import android.net.NetworkPolicy; import android.net.NetworkTemplate; import android.os.Bundle; @@ -322,14 +320,10 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); final long bytes = isLimit ? editor.getPolicyLimitBytes(template) : editor.getPolicyWarningBytes(template); - final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED; - final MeasureFormat formatter = MeasureFormat.getInstance( - getContext().getResources().getConfiguration().locale, - MeasureFormat.FormatWidth.SHORT); final String[] unitNames = new String[] { - formatter.getUnitDisplayName(MeasureUnit.MEGABYTE), - formatter.getUnitDisplayName(MeasureUnit.GIGABYTE) + DataUsageFormatter.INSTANCE.getBytesDisplayUnit(getResources(), MIB_IN_BYTES), + DataUsageFormatter.INSTANCE.getBytesDisplayUnit(getResources(), GIB_IN_BYTES), }; final ArrayAdapter adapter = new ArrayAdapter( getContext(), android.R.layout.simple_spinner_item, unitNames); diff --git a/src/com/android/settings/datausage/DataUsageFormatter.kt b/src/com/android/settings/datausage/DataUsageFormatter.kt new file mode 100644 index 00000000000..16a9ae8b6b0 --- /dev/null +++ b/src/com/android/settings/datausage/DataUsageFormatter.kt @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.datausage + +import android.content.res.Resources +import android.text.format.Formatter + +object DataUsageFormatter { + + /** + * Gets the display unit of the given bytes. + * + * Similar to MeasureFormat.getUnitDisplayName(), but with the expected result for the bytes in + * Settings, and align with other places in Settings. + */ + fun Resources.getBytesDisplayUnit(bytes: Long): String = + Formatter.formatBytes(this, bytes, Formatter.FLAG_IEC_UNITS).units +} \ No newline at end of file diff --git a/tests/spa_unit/src/com/android/settings/datausage/DataUsageFormatterTest.kt b/tests/spa_unit/src/com/android/settings/datausage/DataUsageFormatterTest.kt new file mode 100644 index 00000000000..dc6a421b940 --- /dev/null +++ b/tests/spa_unit/src/com/android/settings/datausage/DataUsageFormatterTest.kt @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.datausage + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settings.datausage.DataUsageFormatter.getBytesDisplayUnit +import com.google.common.truth.Truth.assertThat + +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class DataUsageFormatterTest { + private val context: Context = ApplicationProvider.getApplicationContext() + + @Test + fun getUnitDisplayName_megaByte() { + val displayName = context.resources.getBytesDisplayUnit(ONE_MEGA_BYTE_IN_BYTES) + + assertThat(displayName).isEqualTo("MB") + } + + @Test + fun getUnitDisplayName_gigaByte() { + val displayName = context.resources.getBytesDisplayUnit(ONE_GIGA_BYTE_IN_BYTES) + + assertThat(displayName).isEqualTo("GB") + } + + private companion object { + const val ONE_MEGA_BYTE_IN_BYTES = 1024L * 1024 + const val ONE_GIGA_BYTE_IN_BYTES = 1024L * 1024 * 1024 + } +} \ No newline at end of file