Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 372e13ff authored by Robert Snoeberger's avatar Robert Snoeberger
Browse files

Handle additional users settings custom clock faces.

Fixes: 128607948
Test: Switched user and checked clock face.
Change-Id: I2dc895f2b82cfa39f64588215a535ade4c90054e
parent ac54e30f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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();
+23 −7
Original line number Diff line number Diff line
@@ -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,10 +72,12 @@ public final class ClockManager {
    private final ContentObserver mContentObserver =
            new ContentObserver(mMainHandler) {
                @Override
                public void onChange(boolean selfChange) {
                    super.onChange(selfChange);
                public void onChange(boolean selfChange, Uri uri, int userId) {
                    super.onChange(selfChange, uri, userId);
                    if (userId == mCurrentUserTracker.getCurrentUserId()) {
                        reload();
                    }
                }
            };

    private final PluginManager mPluginManager;
@@ -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);
            }
+8 −4
Original line number Diff line number Diff line
@@ -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);
    }
}
+19 −15
Original line number Diff line number Diff line
@@ -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.