Handle additional users settings custom clock faces.

Fixes: 128607948
Test: Switched user and checked clock face.
Change-Id: I2dc895f2b82cfa39f64588215a535ade4c90054e
This commit is contained in:
Robert Snoeberger
2019-04-08 17:07:14 -04:00
parent ac54e30fe5
commit 372e13ff25
4 changed files with 51 additions and 26 deletions

View File

@@ -138,6 +138,7 @@ public class KeyguardClockSwitch extends RelativeLayout {
ClockManager clockManager) {
super(context, attrs);
mStatusBarStateController = statusBarStateController;
mStatusBarState = mStatusBarStateController.getState();
mSysuiColorExtractor = colorExtractor;
mClockManager = clockManager;
mTransition = new ClockBoundsTransition();

View File

@@ -20,8 +20,10 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
@@ -35,6 +37,7 @@ import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager.DockEventListener;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.InjectionInflationController;
@@ -61,6 +64,7 @@ public final class ClockManager {
private final ContentResolver mContentResolver;
private final SettingsWrapper mSettingsWrapper;
private final Handler mMainHandler = new Handler(Looper.getMainLooper());
private final CurrentUserTracker mCurrentUserTracker;
/**
* Observe settings changes to know when to switch the clock face.
@@ -68,9 +72,11 @@ public final class ClockManager {
private final ContentObserver mContentObserver =
new ContentObserver(mMainHandler) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
reload();
public void onChange(boolean selfChange, Uri uri, int userId) {
super.onChange(selfChange, uri, userId);
if (userId == mCurrentUserTracker.getCurrentUserId()) {
reload();
}
}
};
@@ -123,6 +129,12 @@ public final class ClockManager {
mPluginManager = pluginManager;
mContentResolver = contentResolver;
mSettingsWrapper = settingsWrapper;
mCurrentUserTracker = new CurrentUserTracker(context) {
@Override
public void onUserSwitched(int newUserId) {
reload();
}
};
mPreviewClocks = new AvailableClocks();
Resources res = context.getResources();
@@ -203,10 +215,11 @@ public final class ClockManager {
mPluginManager.addPluginListener(mPreviewClocks, ClockPlugin.class, true);
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE),
false, mContentObserver);
false, mContentObserver, UserHandle.USER_ALL);
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.DOCKED_CLOCK_FACE),
false, mContentObserver);
false, mContentObserver, UserHandle.USER_ALL);
mCurrentUserTracker.startTracking();
if (mDockManager == null) {
mDockManager = SysUiServiceProvider.getComponent(mContext, DockManager.class);
}
@@ -218,6 +231,7 @@ public final class ClockManager {
private void unregister() {
mPluginManager.removePluginListener(mPreviewClocks);
mContentResolver.unregisterContentObserver(mContentObserver);
mCurrentUserTracker.stopTracking();
if (mDockManager != null) {
mDockManager.removeListener(mDockEventListener);
}
@@ -334,7 +348,8 @@ public final class ClockManager {
private ClockPlugin getClockPlugin() {
ClockPlugin plugin = null;
if (ClockManager.this.isDocked()) {
final String name = mSettingsWrapper.getDockedClockFace();
final String name = mSettingsWrapper.getDockedClockFace(
mCurrentUserTracker.getCurrentUserId());
if (name != null) {
plugin = mClocks.get(name);
if (plugin != null) {
@@ -342,7 +357,8 @@ public final class ClockManager {
}
}
}
final String name = mSettingsWrapper.getLockScreenCustomClockFace();
final String name = mSettingsWrapper.getLockScreenCustomClockFace(
mCurrentUserTracker.getCurrentUserId());
if (name != null) {
plugin = mClocks.get(name);
}

View File

@@ -34,15 +34,19 @@ public class SettingsWrapper {
/**
* Gets the value stored in settings for the custom clock face.
*
* @param userId ID of the user.
*/
public String getLockScreenCustomClockFace() {
return Settings.Secure.getString(mContentResolver, CUSTOM_CLOCK_FACE);
public String getLockScreenCustomClockFace(int userId) {
return Settings.Secure.getStringForUser(mContentResolver, CUSTOM_CLOCK_FACE, userId);
}
/**
* Gets the value stored in settings for the clock face to use when docked.
*
* @param userId ID of the user.
*/
public String getDockedClockFace() {
return Settings.Secure.getString(mContentResolver, DOCKED_CLOCK_FACE);
public String getDockedClockFace(int userId) {
return Settings.Secure.getStringForUser(mContentResolver, DOCKED_CLOCK_FACE, userId);
}
}

View File

@@ -18,12 +18,14 @@ package com.android.keyguard.clock;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -52,6 +54,8 @@ public final class ClockManagerTest extends SysuiTestCase {
private static final String BUBBLE_CLOCK = BubbleClockController.class.getName();
private static final Class<?> BUBBLE_CLOCK_CLASS = BubbleClockController.class;
private static final int USER_ID = 0;
private static final Uri SETTINGS_URI = null;
private ClockManager mClockManager;
private ContentObserver mContentObserver;
@@ -106,10 +110,10 @@ public final class ClockManagerTest extends SysuiTestCase {
@Test
public void getCurrentClock_default() {
// GIVEN that settings doesn't contain any values
when(mMockSettingsWrapper.getLockScreenCustomClockFace()).thenReturn(null);
when(mMockSettingsWrapper.getDockedClockFace()).thenReturn(null);
when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(null);
when(mMockSettingsWrapper.getDockedClockFace(anyInt())).thenReturn(null);
// WHEN settings change event is fired
mContentObserver.onChange(false);
mContentObserver.onChange(false, SETTINGS_URI, USER_ID);
// THEN the result is null, indicated the default clock face should be used.
assertThat(mClockManager.getCurrentClock()).isNull();
}
@@ -117,9 +121,9 @@ public final class ClockManagerTest extends SysuiTestCase {
@Test
public void getCurrentClock_customClock() {
// GIVEN that settings is set to the bubble clock face
when(mMockSettingsWrapper.getLockScreenCustomClockFace()).thenReturn(BUBBLE_CLOCK);
when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK);
// WHEN settings change event is fired
mContentObserver.onChange(false);
mContentObserver.onChange(false, SETTINGS_URI, USER_ID);
// THEN the plugin is the bubble clock face.
assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS);
}
@@ -127,9 +131,9 @@ public final class ClockManagerTest extends SysuiTestCase {
@Test
public void onClockChanged_customClock() {
// GIVEN that settings is set to the bubble clock face
when(mMockSettingsWrapper.getLockScreenCustomClockFace()).thenReturn(BUBBLE_CLOCK);
when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK);
// WHEN settings change event is fired
mContentObserver.onChange(false);
mContentObserver.onChange(false, SETTINGS_URI, USER_ID);
// THEN the plugin is the bubble clock face.
ArgumentCaptor<ClockPlugin> captor = ArgumentCaptor.forClass(ClockPlugin.class);
verify(mMockListener1).onClockChanged(captor.capture());
@@ -139,9 +143,9 @@ public final class ClockManagerTest extends SysuiTestCase {
@Test
public void onClockChanged_uniqueInstances() {
// GIVEN that settings is set to the bubble clock face
when(mMockSettingsWrapper.getLockScreenCustomClockFace()).thenReturn(BUBBLE_CLOCK);
when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK);
// WHEN settings change event is fired
mContentObserver.onChange(false);
mContentObserver.onChange(false, SETTINGS_URI, USER_ID);
// THEN the listeners receive separate instances of the Bubble clock plugin.
ArgumentCaptor<ClockPlugin> captor1 = ArgumentCaptor.forClass(ClockPlugin.class);
ArgumentCaptor<ClockPlugin> captor2 = ArgumentCaptor.forClass(ClockPlugin.class);
@@ -156,9 +160,9 @@ public final class ClockManagerTest extends SysuiTestCase {
public void getCurrentClock_badSettingsValue() {
// GIVEN that settings contains a value that doesn't correspond to a
// custom clock face.
when(mMockSettingsWrapper.getLockScreenCustomClockFace()).thenReturn("bad value");
when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn("bad value");
// WHEN settings change event is fired
mContentObserver.onChange(false);
mContentObserver.onChange(false, SETTINGS_URI, USER_ID);
// THEN the result is null.
assertThat(mClockManager.getCurrentClock()).isNull();
}
@@ -174,7 +178,7 @@ public final class ClockManagerTest extends SysuiTestCase {
@Test
public void getCurrentClock_dockedCustomClock() {
// GIVEN settings is set to the bubble clock face
when(mMockSettingsWrapper.getDockedClockFace()).thenReturn(BUBBLE_CLOCK);
when(mMockSettingsWrapper.getDockedClockFace(anyInt())).thenReturn(BUBBLE_CLOCK);
// WHEN dock event fires
mFakeDockManager.setDockEvent(DockManager.STATE_DOCKED);
// THEN the plugin is the bubble clock face.
@@ -184,7 +188,7 @@ public final class ClockManagerTest extends SysuiTestCase {
@Test
public void getCurrentClock_badDockedSettingsValue() {
// GIVEN settings contains a value that doesn't correspond to an available clock face.
when(mMockSettingsWrapper.getDockedClockFace()).thenReturn("bad value");
when(mMockSettingsWrapper.getDockedClockFace(anyInt())).thenReturn("bad value");
// WHEN dock event fires
mFakeDockManager.setDockEvent(DockManager.STATE_DOCKED);
// THEN the result is null.
@@ -195,8 +199,8 @@ public final class ClockManagerTest extends SysuiTestCase {
public void getCurrentClock_badDockedSettingsFallback() {
// GIVEN settings contains a value that doesn't correspond to an available clock face, but
// locked screen settings is set to bubble clock.
when(mMockSettingsWrapper.getDockedClockFace()).thenReturn("bad value");
when(mMockSettingsWrapper.getLockScreenCustomClockFace()).thenReturn(BUBBLE_CLOCK);
when(mMockSettingsWrapper.getDockedClockFace(anyInt())).thenReturn("bad value");
when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK);
// WHEN dock event is fired
mFakeDockManager.setDockEvent(DockManager.STATE_DOCKED);
// THEN the plugin is the bubble clock face.