Merge "Add settings observing for vibrate icon to Keyguard" into tm-dev am: 2540293518

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18602315

Change-Id: Ic47b95ceaa4615e403fc6f340d51841ae7256065
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Justin Weir
2022-06-08 21:24:51 +00:00
committed by Automerger Merge Worker
3 changed files with 155 additions and 8 deletions

View File

@@ -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<KeyguardStat
private final StatusBarUserSwitcherFeatureController mFeatureController;
private final StatusBarUserSwitcherController mUserSwitcherController;
private final StatusBarUserInfoTracker mStatusBarUserInfoTracker;
private final SecureSettings mSecureSettings;
private final Executor mMainExecutor;
private final Object mLock = new Object();
private final ConfigurationController.ConfigurationListener mConfigurationListener =
new ConfigurationController.ConfigurationListener() {
@@ -206,7 +217,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
}
};
private final List<String> mBlockedIcons;
private final List<String> mBlockedIcons = new ArrayList<>();
private final int mNotificationsHeaderCollideDistance;
private boolean mBatteryListening;
@@ -255,7 +266,9 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
UserManager userManager,
StatusBarUserSwitcherFeatureController featureController,
StatusBarUserSwitcherController userSwitcherController,
StatusBarUserInfoTracker statusBarUserInfoTracker
StatusBarUserInfoTracker statusBarUserInfoTracker,
SecureSettings secureSettings,
@Main Executor mainExecutor
) {
super(view);
mCarrierTextController = carrierTextController;
@@ -277,6 +290,8 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mFeatureController = featureController;
mUserSwitcherController = userSwitcherController;
mStatusBarUserInfoTracker = statusBarUserInfoTracker;
mSecureSettings = secureSettings;
mMainExecutor = mainExecutor;
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
mKeyguardStateController.addCallback(
@@ -292,8 +307,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
);
Resources r = getResources();
mBlockedIcons = Arrays.asList(r.getStringArray(
R.array.config_keyguard_statusbar_icon_blocklist));
updateBlockedIcons();
mNotificationsHeaderCollideDistance = r.getDimensionPixelSize(
R.dimen.header_notifications_collide_distance);
@@ -321,11 +335,16 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
if (mTintedIconManager == null) {
mTintedIconManager =
mTintedIconManagerFactory.create(mView.findViewById(R.id.statusIcons));
mTintedIconManager.setBlockList(mBlockedIcons);
mTintedIconManager.setBlockList(getBlockedIcons());
mStatusBarIconController.addIconGroup(mTintedIconManager);
}
mView.setOnApplyWindowInsetsListener(
(view, windowInsets) -> 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<KeyguardStat
mUserInfoController.removeCallback(mOnUserInfoChangedListener);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
mSecureSettings.unregisterContentObserver(mVolumeSettingObserver);
if (mTintedIconManager != null) {
mStatusBarIconController.removeIconGroup(mTintedIconManager);
}
@@ -486,8 +506,32 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
R.bool.qs_show_user_switcher_for_single_user)));
}
@VisibleForTesting
void updateBlockedIcons() {
List<String> newBlockList = StatusBarIconBlocklistKt
.getStatusBarIconBlocklist(getResources(), mSecureSettings);
synchronized (mLock) {
mBlockedIcons.clear();
mBlockedIcons.addAll(newBlockList);
}
mMainExecutor.execute(() -> {
if (mTintedIconManager != null) {
mTintedIconManager.setBlockList(getBlockedIcons());
}
});
}
@VisibleForTesting
List<String> 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<KeyguardStat
mExplicitAlpha = alpha;
updateViewState();
}
private final ContentObserver mVolumeSettingObserver = new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
updateBlockedIcons();
}
};
}

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2022 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.systemui.statusbar.phone.fragment
import android.content.res.Resources
import android.os.UserHandle
import android.provider.Settings
import com.android.internal.R
import com.android.systemui.util.settings.SecureSettings
/**
* Centralize the logic for the status bar / keyguard status bar icon blocklist. The default is
* loaded from the config, and we currently support a system setting for the vibrate icon. It's
* pretty likely that we would end up supporting more user-configurable settings in the future, so
* breaking this out into its own file for now.
*
* Note for the future: it might be reasonable to turn this into its own class that can listen to
* the system setting and execute a callback when it changes instead of having multiple content
* observers.
*/
fun getStatusBarIconBlocklist(
res: Resources,
settings: SecureSettings
): List<String> {
// 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
}
}

View File

@@ -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);
}