Merge "Smartspace - Check sensitivity settings" into sc-dev
This commit is contained in:
@@ -24,8 +24,16 @@ import android.app.WallpaperManager;
|
|||||||
import android.app.smartspace.SmartspaceConfig;
|
import android.app.smartspace.SmartspaceConfig;
|
||||||
import android.app.smartspace.SmartspaceManager;
|
import android.app.smartspace.SmartspaceManager;
|
||||||
import android.app.smartspace.SmartspaceSession;
|
import android.app.smartspace.SmartspaceSession;
|
||||||
|
import android.app.smartspace.SmartspaceTarget;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.pm.UserInfo;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.database.ContentObserver;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.DateFormat;
|
import android.text.format.DateFormat;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -47,6 +55,7 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.IntentStarter;
|
|||||||
import com.android.systemui.plugins.ClockPlugin;
|
import com.android.systemui.plugins.ClockPlugin;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
|
import com.android.systemui.settings.UserTracker;
|
||||||
import com.android.systemui.statusbar.FeatureFlags;
|
import com.android.systemui.statusbar.FeatureFlags;
|
||||||
import com.android.systemui.statusbar.notification.AnimatableProperty;
|
import com.android.systemui.statusbar.notification.AnimatableProperty;
|
||||||
import com.android.systemui.statusbar.notification.PropertyAnimator;
|
import com.android.systemui.statusbar.notification.PropertyAnimator;
|
||||||
@@ -57,6 +66,7 @@ import com.android.systemui.statusbar.phone.NotificationIconContainer;
|
|||||||
import com.android.systemui.statusbar.policy.BatteryController;
|
import com.android.systemui.statusbar.policy.BatteryController;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.util.ViewController;
|
import com.android.systemui.util.ViewController;
|
||||||
|
import com.android.systemui.util.settings.SecureSettings;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
@@ -96,6 +106,14 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
|
|||||||
private FalsingManager mFalsingManager;
|
private FalsingManager mFalsingManager;
|
||||||
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||||
private final KeyguardBypassController mBypassController;
|
private final KeyguardBypassController mBypassController;
|
||||||
|
private Handler mHandler;
|
||||||
|
private UserTracker mUserTracker;
|
||||||
|
private SecureSettings mSecureSettings;
|
||||||
|
private ContentObserver mSettingsObserver;
|
||||||
|
private boolean mShowSensitiveContentForCurrentUser;
|
||||||
|
private boolean mShowSensitiveContentForManagedUser;
|
||||||
|
private UserHandle mManagedUserHandle;
|
||||||
|
private UserTracker.Callback mUserTrackerCallback;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listener for changes to the color palette.
|
* Listener for changes to the color palette.
|
||||||
@@ -151,7 +169,10 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
|
|||||||
ActivityStarter activityStarter,
|
ActivityStarter activityStarter,
|
||||||
FalsingManager falsingManager,
|
FalsingManager falsingManager,
|
||||||
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||||
KeyguardBypassController bypassController) {
|
KeyguardBypassController bypassController,
|
||||||
|
@Main Handler handler,
|
||||||
|
UserTracker userTracker,
|
||||||
|
SecureSettings secureSettings) {
|
||||||
super(keyguardClockSwitch);
|
super(keyguardClockSwitch);
|
||||||
mStatusBarStateController = statusBarStateController;
|
mStatusBarStateController = statusBarStateController;
|
||||||
mColorExtractor = colorExtractor;
|
mColorExtractor = colorExtractor;
|
||||||
@@ -168,6 +189,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
|
|||||||
mFalsingManager = falsingManager;
|
mFalsingManager = falsingManager;
|
||||||
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
|
||||||
mBypassController = bypassController;
|
mBypassController = bypassController;
|
||||||
|
mHandler = handler;
|
||||||
|
mUserTracker = userTracker;
|
||||||
|
mSecureSettings = secureSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -258,15 +282,74 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
|
|||||||
mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
|
mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
|
||||||
.createSmartspaceSession(
|
.createSmartspaceSession(
|
||||||
new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
|
new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
|
||||||
mSmartspaceCallback = targets -> smartspaceDataPlugin.onTargetsAvailable(targets);
|
mSmartspaceCallback = targets -> {
|
||||||
|
targets.removeIf(this::filterSmartspaceTarget);
|
||||||
|
smartspaceDataPlugin.onTargetsAvailable(targets);
|
||||||
|
};
|
||||||
mSmartspaceSession.addOnTargetsAvailableListener(mUiExecutor, mSmartspaceCallback);
|
mSmartspaceSession.addOnTargetsAvailableListener(mUiExecutor, mSmartspaceCallback);
|
||||||
mSmartspaceSession.requestSmartspaceUpdate();
|
mSettingsObserver = new ContentObserver(mHandler) {
|
||||||
|
@Override
|
||||||
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
|
reloadSmartspace();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
mUserTrackerCallback = new UserTracker.Callback() {
|
||||||
|
public void onUserChanged(int newUser, Context userContext) {
|
||||||
|
reloadSmartspace();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
mUserTracker.addCallback(mUserTrackerCallback, mUiExecutor);
|
||||||
|
|
||||||
|
getContext().getContentResolver().registerContentObserver(
|
||||||
|
Settings.Secure.getUriFor(
|
||||||
|
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS),
|
||||||
|
true, mSettingsObserver, UserHandle.USER_ALL);
|
||||||
|
reloadSmartspace();
|
||||||
}
|
}
|
||||||
|
|
||||||
float dozeAmount = mStatusBarStateController.getDozeAmount();
|
float dozeAmount = mStatusBarStateController.getDozeAmount();
|
||||||
mStatusBarStateListener.onDozeAmountChanged(dozeAmount, dozeAmount);
|
mStatusBarStateListener.onDozeAmountChanged(dozeAmount, dozeAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
boolean filterSmartspaceTarget(SmartspaceTarget t) {
|
||||||
|
if (!t.isSensitive()) return false;
|
||||||
|
|
||||||
|
if (t.getUserHandle().equals(mUserTracker.getUserHandle())) {
|
||||||
|
return !mShowSensitiveContentForCurrentUser;
|
||||||
|
}
|
||||||
|
if (t.getUserHandle().equals(mManagedUserHandle)) {
|
||||||
|
return !mShowSensitiveContentForManagedUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reloadSmartspace() {
|
||||||
|
mManagedUserHandle = getWorkProfileUser();
|
||||||
|
final String setting = Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS;
|
||||||
|
|
||||||
|
mShowSensitiveContentForCurrentUser =
|
||||||
|
mSecureSettings.getIntForUser(setting, 0, mUserTracker.getUserId()) == 1;
|
||||||
|
if (mManagedUserHandle != null) {
|
||||||
|
int id = mManagedUserHandle.getIdentifier();
|
||||||
|
mShowSensitiveContentForManagedUser =
|
||||||
|
mSecureSettings.getIntForUser(setting, 0, id) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mSmartspaceSession.requestSmartspaceUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserHandle getWorkProfileUser() {
|
||||||
|
for (UserInfo userInfo : mUserTracker.getUserProfiles()) {
|
||||||
|
if (userInfo.isManagedProfile()) {
|
||||||
|
return userInfo.getUserHandle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateWallpaperColor() {
|
private void updateWallpaperColor() {
|
||||||
if (mSmartspaceView != null) {
|
if (mSmartspaceView != null) {
|
||||||
int color = Utils.getColorAttrDefaultColor(getContext(), R.attr.wallpaperTextColor);
|
int color = Utils.getColorAttrDefaultColor(getContext(), R.attr.wallpaperTextColor);
|
||||||
@@ -289,6 +372,14 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
|
|||||||
}
|
}
|
||||||
mStatusBarStateController.removeCallback(mStatusBarStateListener);
|
mStatusBarStateController.removeCallback(mStatusBarStateListener);
|
||||||
mConfigurationController.removeCallback(mConfigurationListener);
|
mConfigurationController.removeCallback(mConfigurationListener);
|
||||||
|
|
||||||
|
if (mSettingsObserver != null) {
|
||||||
|
getContext().getContentResolver().unregisterContentObserver(mSettingsObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mUserTrackerCallback != null) {
|
||||||
|
mUserTracker.removeCallback(mUserTrackerCallback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -437,4 +528,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
|
|||||||
ConfigurationController.ConfigurationListener getConfigurationListener() {
|
ConfigurationController.ConfigurationListener getConfigurationListener() {
|
||||||
return mConfigurationListener;
|
return mConfigurationListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
ContentObserver getSettingsObserver() {
|
||||||
|
return mSettingsObserver;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,14 +19,21 @@ package com.android.keyguard;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.smartspace.SmartspaceTarget;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.UserInfo;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
@@ -47,6 +54,7 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.IntentStarter;
|
|||||||
import com.android.systemui.plugins.ClockPlugin;
|
import com.android.systemui.plugins.ClockPlugin;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
|
import com.android.systemui.settings.UserTracker;
|
||||||
import com.android.systemui.statusbar.FeatureFlags;
|
import com.android.systemui.statusbar.FeatureFlags;
|
||||||
import com.android.systemui.statusbar.StatusBarState;
|
import com.android.systemui.statusbar.StatusBarState;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||||
@@ -54,6 +62,7 @@ import com.android.systemui.statusbar.phone.NotificationIconAreaController;
|
|||||||
import com.android.systemui.statusbar.phone.NotificationIconContainer;
|
import com.android.systemui.statusbar.phone.NotificationIconContainer;
|
||||||
import com.android.systemui.statusbar.policy.BatteryController;
|
import com.android.systemui.statusbar.policy.BatteryController;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
|
import com.android.systemui.util.settings.SecureSettings;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -63,6 +72,8 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.mockito.verification.VerificationMode;
|
import org.mockito.verification.VerificationMode;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
@SmallTest
|
@SmallTest
|
||||||
@@ -119,10 +130,19 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
|
|||||||
KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||||
@Mock
|
@Mock
|
||||||
KeyguardBypassController mBypassController;
|
KeyguardBypassController mBypassController;
|
||||||
|
@Mock
|
||||||
|
Handler mHandler;
|
||||||
|
@Mock
|
||||||
|
UserTracker mUserTracker;
|
||||||
|
@Mock
|
||||||
|
SecureSettings mSecureSettings;
|
||||||
|
|
||||||
private KeyguardClockSwitchController mController;
|
private KeyguardClockSwitchController mController;
|
||||||
private View mStatusArea;
|
private View mStatusArea;
|
||||||
|
|
||||||
|
private static final int USER_ID = 5;
|
||||||
|
private static final int MANAGED_USER_ID = 15;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
@@ -159,7 +179,10 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
|
|||||||
mActivityStarter,
|
mActivityStarter,
|
||||||
mFalsingManager,
|
mFalsingManager,
|
||||||
mKeyguardUpdateMonitor,
|
mKeyguardUpdateMonitor,
|
||||||
mBypassController
|
mBypassController,
|
||||||
|
mHandler,
|
||||||
|
mUserTracker,
|
||||||
|
mSecureSettings
|
||||||
);
|
);
|
||||||
|
|
||||||
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
|
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
|
||||||
@@ -260,6 +283,89 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
|
|||||||
verify(mSmartspaceView, times(2)).setPrimaryTextColor(anyInt());
|
verify(mSmartspaceView, times(2)).setPrimaryTextColor(anyInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void doNotFilterRegularTarget() {
|
||||||
|
setupPrimaryAndManagedUser();
|
||||||
|
mController.init();
|
||||||
|
|
||||||
|
when(mSecureSettings.getIntForUser(anyString(), anyInt(), eq(USER_ID))).thenReturn(0);
|
||||||
|
when(mSecureSettings.getIntForUser(anyString(), anyInt(), eq(MANAGED_USER_ID)))
|
||||||
|
.thenReturn(0);
|
||||||
|
|
||||||
|
mController.getSettingsObserver().onChange(true, null);
|
||||||
|
|
||||||
|
SmartspaceTarget t = mock(SmartspaceTarget.class);
|
||||||
|
when(t.isSensitive()).thenReturn(false);
|
||||||
|
when(t.getUserHandle()).thenReturn(new UserHandle(USER_ID));
|
||||||
|
assertEquals(false, mController.filterSmartspaceTarget(t));
|
||||||
|
|
||||||
|
reset(t);
|
||||||
|
when(t.isSensitive()).thenReturn(false);
|
||||||
|
when(t.getUserHandle()).thenReturn(new UserHandle(MANAGED_USER_ID));
|
||||||
|
assertEquals(false, mController.filterSmartspaceTarget(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void filterAllSensitiveTargetsAllUsers() {
|
||||||
|
setupPrimaryAndManagedUser();
|
||||||
|
mController.init();
|
||||||
|
|
||||||
|
when(mSecureSettings.getIntForUser(anyString(), anyInt(), eq(USER_ID))).thenReturn(0);
|
||||||
|
when(mSecureSettings.getIntForUser(anyString(), anyInt(), eq(MANAGED_USER_ID)))
|
||||||
|
.thenReturn(0);
|
||||||
|
|
||||||
|
mController.getSettingsObserver().onChange(true, null);
|
||||||
|
|
||||||
|
SmartspaceTarget t = mock(SmartspaceTarget.class);
|
||||||
|
when(t.isSensitive()).thenReturn(true);
|
||||||
|
when(t.getUserHandle()).thenReturn(new UserHandle(USER_ID));
|
||||||
|
assertEquals(true, mController.filterSmartspaceTarget(t));
|
||||||
|
|
||||||
|
reset(t);
|
||||||
|
when(t.isSensitive()).thenReturn(true);
|
||||||
|
when(t.getUserHandle()).thenReturn(new UserHandle(MANAGED_USER_ID));
|
||||||
|
assertEquals(true, mController.filterSmartspaceTarget(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void filterSensitiveManagedUserTargets() {
|
||||||
|
setupPrimaryAndManagedUser();
|
||||||
|
mController.init();
|
||||||
|
|
||||||
|
when(mSecureSettings.getIntForUser(anyString(), anyInt(), eq(USER_ID))).thenReturn(1);
|
||||||
|
when(mSecureSettings.getIntForUser(anyString(), anyInt(), eq(MANAGED_USER_ID)))
|
||||||
|
.thenReturn(0);
|
||||||
|
|
||||||
|
mController.getSettingsObserver().onChange(true, null);
|
||||||
|
|
||||||
|
SmartspaceTarget t = mock(SmartspaceTarget.class);
|
||||||
|
when(t.isSensitive()).thenReturn(true);
|
||||||
|
when(t.getUserHandle()).thenReturn(new UserHandle(USER_ID));
|
||||||
|
assertEquals(false, mController.filterSmartspaceTarget(t));
|
||||||
|
|
||||||
|
reset(t);
|
||||||
|
when(t.isSensitive()).thenReturn(true);
|
||||||
|
when(t.getUserHandle()).thenReturn(new UserHandle(MANAGED_USER_ID));
|
||||||
|
assertEquals(true, mController.filterSmartspaceTarget(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPrimaryAndManagedUser() {
|
||||||
|
UserInfo userInfo = mock(UserInfo.class);
|
||||||
|
when(userInfo.isManagedProfile()).thenReturn(true);
|
||||||
|
when(userInfo.getUserHandle()).thenReturn(new UserHandle(MANAGED_USER_ID));
|
||||||
|
when(mUserTracker.getUserProfiles()).thenReturn(List.of(userInfo));
|
||||||
|
|
||||||
|
when(mUserTracker.getUserId()).thenReturn(USER_ID);
|
||||||
|
when(mUserTracker.getUserHandle()).thenReturn(new UserHandle(USER_ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPrimaryAndNoManagedUser() {
|
||||||
|
when(mUserTracker.getUserProfiles()).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
|
when(mUserTracker.getUserId()).thenReturn(USER_ID);
|
||||||
|
when(mUserTracker.getUserHandle()).thenReturn(new UserHandle(USER_ID));
|
||||||
|
}
|
||||||
|
|
||||||
private void verifyAttachment(VerificationMode times) {
|
private void verifyAttachment(VerificationMode times) {
|
||||||
verify(mClockManager, times).addOnClockChangedListener(
|
verify(mClockManager, times).addOnClockChangedListener(
|
||||||
any(ClockManager.ClockChangedListener.class));
|
any(ClockManager.ClockChangedListener.class));
|
||||||
|
|||||||
Reference in New Issue
Block a user