From 0a4a1575981c180ebf6cf30228dced0bebc8746c Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Wed, 25 May 2022 18:59:43 -0400 Subject: Add settings observing for vibrate icon to Keyguard KeyguardStatusBarViewController now listens to the "show vibrate icon in status bar" setting and observes changes to the setting. Added a utility function in StatusBarIconBlocklist to keep the logic in sync, with a place for expansion in the future. Test: atest KeyguardStatusbarViewControllerTest; manual Fixes: 200246761 Change-Id: Idd2c7f6c706ad40946f0d067a442ea87636ec68c --- .../phone/KeyguardStatusBarViewController.java | 65 +++++++++++++++++++--- .../phone/fragment/StatusBarIconBlocklist.kt | 52 +++++++++++++++++ .../phone/KeyguardStatusBarViewControllerTest.java | 46 ++++++++++++++- 3 files changed, 155 insertions(+), 8 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarIconBlocklist.kt diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index 779c6b461378..def574c1890f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -23,12 +23,16 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.res.Configuration; import android.content.res.Resources; +import android.database.ContentObserver; import android.hardware.biometrics.BiometricSourceType; +import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import android.util.MathUtils; import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.android.keyguard.CarrierTextController; import com.android.keyguard.KeyguardUpdateMonitor; @@ -36,6 +40,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; import com.android.systemui.battery.BatteryMeterViewController; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; @@ -45,6 +50,7 @@ import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.fragment.StatusBarIconBlocklistKt; import com.android.systemui.statusbar.phone.fragment.StatusBarSystemEventAnimator; import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserInfoTracker; import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherController; @@ -54,10 +60,12 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.util.ViewController; +import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -98,6 +106,9 @@ public class KeyguardStatusBarViewController extends ViewController mBlockedIcons; + private final List mBlockedIcons = new ArrayList<>(); private final int mNotificationsHeaderCollideDistance; private boolean mBatteryListening; @@ -255,7 +266,9 @@ public class KeyguardStatusBarViewController extends ViewController mView.updateWindowInsets(windowInsets, mInsetsProvider)); + mSecureSettings.registerContentObserverForUser( + Settings.Secure.getUriFor(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON), + false, + mVolumeSettingObserver, + UserHandle.USER_ALL); updateUserSwitcher(); onThemeChanged(); } @@ -337,6 +356,7 @@ public class KeyguardStatusBarViewController extends ViewController newBlockList = StatusBarIconBlocklistKt + .getStatusBarIconBlocklist(getResources(), mSecureSettings); + + synchronized (mLock) { + mBlockedIcons.clear(); + mBlockedIcons.addAll(newBlockList); + } + + mMainExecutor.execute(() -> { + if (mTintedIconManager != null) { + mTintedIconManager.setBlockList(getBlockedIcons()); + } + }); + } + + @VisibleForTesting + List getBlockedIcons() { + synchronized (mLock) { + return new ArrayList<>(mBlockedIcons); + } + } + /** - * Update {@link KeyguardStatusBarView}'s visibility based on whether keyguard is showing and + Update {@link KeyguardStatusBarView}'s visibility based on whether keyguard is showing and * whether heads up is visible. */ public void updateForHeadsUp() { @@ -533,4 +577,11 @@ public class KeyguardStatusBarViewController extends ViewController { + // Load the default blocklist from res + val blocklist = res.getStringArray( + com.android.systemui.R.array.config_collapsed_statusbar_icon_blocklist).toList() + + val vibrateIconSlot: String = res.getString(R.string.status_bar_volume) + val showVibrateIcon = settings.getIntForUser( + Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, + 0, + UserHandle.USER_CURRENT) == 0 + + // Filter out vibrate icon from the blocklist if the setting is on + return blocklist.filter { icon -> + !icon.equals(vibrateIconSlot) || showVibrateIcon + } +} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java index 39d5a160c657..4e1a7088b17f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java @@ -22,6 +22,8 @@ import static com.android.systemui.statusbar.StatusBarState.SHADE; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.clearInvocations; @@ -29,7 +31,9 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.LayoutInflater; @@ -55,6 +59,9 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.settings.SecureSettings; +import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; @@ -108,10 +115,12 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { private StatusBarUserSwitcherController mStatusBarUserSwitcherController; @Mock private StatusBarUserInfoTracker mStatusBarUserInfoTracker; + @Mock private SecureSettings mSecureSettings; private TestNotificationPanelViewStateProvider mNotificationPanelViewStateProvider; private KeyguardStatusBarView mKeyguardStatusBarView; private KeyguardStatusBarViewController mController; + private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); @Before public void setup() throws Exception { @@ -150,7 +159,9 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { mUserManager, mStatusBarUserSwitcherFeatureController, mStatusBarUserSwitcherController, - mStatusBarUserInfoTracker + mStatusBarUserInfoTracker, + mSecureSettings, + mFakeExecutor ); } @@ -420,6 +431,39 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { assertThat(mKeyguardStatusBarView.isKeyguardUserAvatarEnabled()).isTrue(); } + @Test + public void testBlockedIcons_obeysSettingForVibrateIcon_settingOff() { + String str = mContext.getString(com.android.internal.R.string.status_bar_volume); + + // GIVEN the setting is off + when(mSecureSettings.getInt(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0)) + .thenReturn(0); + + // WHEN CollapsedStatusBarFragment builds the blocklist + mController.updateBlockedIcons(); + + // THEN status_bar_volume SHOULD be present in the list + boolean contains = mController.getBlockedIcons().contains(str); + assertTrue(contains); + } + + @Test + public void testBlockedIcons_obeysSettingForVibrateIcon_settingOn() { + String str = mContext.getString(com.android.internal.R.string.status_bar_volume); + + // GIVEN the setting is ON + when(mSecureSettings.getIntForUser(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0, + UserHandle.USER_CURRENT)) + .thenReturn(1); + + // WHEN CollapsedStatusBarFragment builds the blocklist + mController.updateBlockedIcons(); + + // THEN status_bar_volume SHOULD NOT be present in the list + boolean contains = mController.getBlockedIcons().contains(str); + assertFalse(contains); + } + private void updateStateToNotKeyguard() { updateStatusBarState(SHADE); } -- cgit v1.2.3-59-g8ed1b