Loading packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +12 −2 Original line number Diff line number Diff line Loading @@ -315,6 +315,7 @@ public class KeyguardSecurityContainer extends FrameLayout { Log.i(TAG, "Switching mode from " + modeToString(mCurrentMode) + " to " + modeToString(mode)); mCurrentMode = mode; mViewMode.onDestroy(); switch (mode) { case MODE_ONE_HANDED: Loading Loading @@ -710,7 +711,6 @@ public class KeyguardSecurityContainer extends FrameLayout { * Enscapsulates the differences between bouncer modes for the container. */ interface ViewMode { default void init(@NonNull ViewGroup v, @NonNull GlobalSettings globalSettings, @NonNull KeyguardSecurityViewFlipper viewFlipper, @NonNull FalsingManager falsingManager, Loading Loading @@ -738,6 +738,9 @@ public class KeyguardSecurityContainer extends FrameLayout { default int getChildWidthMeasureSpec(int parentWidthMeasureSpec) { return parentWidthMeasureSpec; } /** Called when we are setting a new ViewMode */ default void onDestroy() {}; } /** Loading Loading @@ -781,6 +784,8 @@ public class KeyguardSecurityContainer extends FrameLayout { private UserSwitcherController mUserSwitcherController; private KeyguardUserSwitcherPopupMenu mPopup; private Resources mResources; private UserSwitcherController.UserSwitchCallback mUserSwitchCallback = this::setupUserSwitcher; @Override public void init(@NonNull ViewGroup v, @NonNull GlobalSettings globalSettings, Loading @@ -805,6 +810,7 @@ public class KeyguardSecurityContainer extends FrameLayout { mUserSwitcher = mView.findViewById(R.id.user_switcher_header); setupUserSwitcher(); mUserSwitcherController.addUserSwitchCallback(mUserSwitchCallback); } @Override Loading @@ -813,7 +819,11 @@ public class KeyguardSecurityContainer extends FrameLayout { mPopup.dismiss(); mPopup = null; } setupUserSwitcher(); } @Override public void onDestroy() { mUserSwitcherController.removeUserSwitchCallback(mUserSwitchCallback); } private Drawable findUserIcon(int userId) { Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +43 −1 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -161,6 +162,8 @@ public class UserSwitcherController implements Dumpable { private View mView; private String mCreateSupervisedUserPackage; private GlobalSettings mGlobalSettings; private List<UserSwitchCallback> mUserSwitchCallbacks = Collections.synchronizedList(new ArrayList<>()); @Inject public UserSwitcherController(Context context, Loading Loading @@ -225,7 +228,8 @@ public class UserSwitcherController implements Dumpable { filter.addAction(Intent.ACTION_USER_STOPPED); filter.addAction(Intent.ACTION_USER_UNLOCKED); mBroadcastDispatcher.registerReceiver( mReceiver, filter, null /* handler */, UserHandle.SYSTEM); mReceiver, filter, null /* executor */, UserHandle.SYSTEM, Context.RECEIVER_EXPORTED, null /* permission */); mSimpleUserSwitcher = shouldUseSimpleUserSwitcher(); Loading Loading @@ -652,6 +656,7 @@ public class UserSwitcherController implements Dumpable { i--; } } notifyUserSwitchCallbacks(); notifyAdapters(); // Disconnect from the old secondary user's service Loading Loading @@ -1053,6 +1058,33 @@ public class UserSwitcherController implements Dumpable { mActivityStarter.startActivity(intent, true); } /** * Add a subscriber to when user switches. */ public void addUserSwitchCallback(UserSwitchCallback callback) { mUserSwitchCallbacks.add(callback); } /** * Remove a subscriber to when user switches. */ public void removeUserSwitchCallback(UserSwitchCallback callback) { mUserSwitchCallbacks.remove(callback); } /** * Notify user switch callbacks that user has switched. */ private void notifyUserSwitchCallbacks() { List<UserSwitchCallback> temp; synchronized (mUserSwitchCallbacks) { temp = new ArrayList<>(mUserSwitchCallbacks); } for (UserSwitchCallback callback : temp) { callback.onUserSwitched(); } } public static final class UserRecord { public final UserInfo info; public final Bitmap picture; Loading Loading @@ -1233,4 +1265,14 @@ public class UserSwitcherController implements Dumpable { } } } /** * Callback to for when this controller receives the intent to switch users. */ public interface UserSwitchCallback { /** * Called when user has switched. */ void onUserSwitched(); } } packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt +21 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy import android.app.IActivityManager import android.app.admin.DevicePolicyManager import android.content.BroadcastReceiver import android.content.Context import android.content.DialogInterface import android.content.Intent Loading Loading @@ -52,6 +53,10 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.NotificationShadeWindowView import com.android.systemui.telephony.TelephonyListenerManager import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.nullable import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.FakeSystemClock Loading @@ -63,10 +68,8 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.any import org.mockito.Mockito.doNothing import org.mockito.Mockito.doReturn import org.mockito.Mockito.eq Loading Loading @@ -529,4 +532,20 @@ class UserSwitcherControllerTest : SysuiTestCase() { setupController() assertFalse(userSwitcherController.canCreateSupervisedUser()) } @Test fun addUserSwitchCallback() { val broadcastReceiverCaptor = argumentCaptor<BroadcastReceiver>() verify(broadcastDispatcher).registerReceiver( capture(broadcastReceiverCaptor), any(), nullable(), nullable(), anyInt(), nullable()) val cb = mock(UserSwitcherController.UserSwitchCallback::class.java) userSwitcherController.addUserSwitchCallback(cb) val intent = Intent(Intent.ACTION_USER_SWITCHED).putExtra(Intent.EXTRA_USER_HANDLE, guestId) broadcastReceiverCaptor.value.onReceive(context, intent) verify(cb).onUserSwitched() } } Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +12 −2 Original line number Diff line number Diff line Loading @@ -315,6 +315,7 @@ public class KeyguardSecurityContainer extends FrameLayout { Log.i(TAG, "Switching mode from " + modeToString(mCurrentMode) + " to " + modeToString(mode)); mCurrentMode = mode; mViewMode.onDestroy(); switch (mode) { case MODE_ONE_HANDED: Loading Loading @@ -710,7 +711,6 @@ public class KeyguardSecurityContainer extends FrameLayout { * Enscapsulates the differences between bouncer modes for the container. */ interface ViewMode { default void init(@NonNull ViewGroup v, @NonNull GlobalSettings globalSettings, @NonNull KeyguardSecurityViewFlipper viewFlipper, @NonNull FalsingManager falsingManager, Loading Loading @@ -738,6 +738,9 @@ public class KeyguardSecurityContainer extends FrameLayout { default int getChildWidthMeasureSpec(int parentWidthMeasureSpec) { return parentWidthMeasureSpec; } /** Called when we are setting a new ViewMode */ default void onDestroy() {}; } /** Loading Loading @@ -781,6 +784,8 @@ public class KeyguardSecurityContainer extends FrameLayout { private UserSwitcherController mUserSwitcherController; private KeyguardUserSwitcherPopupMenu mPopup; private Resources mResources; private UserSwitcherController.UserSwitchCallback mUserSwitchCallback = this::setupUserSwitcher; @Override public void init(@NonNull ViewGroup v, @NonNull GlobalSettings globalSettings, Loading @@ -805,6 +810,7 @@ public class KeyguardSecurityContainer extends FrameLayout { mUserSwitcher = mView.findViewById(R.id.user_switcher_header); setupUserSwitcher(); mUserSwitcherController.addUserSwitchCallback(mUserSwitchCallback); } @Override Loading @@ -813,7 +819,11 @@ public class KeyguardSecurityContainer extends FrameLayout { mPopup.dismiss(); mPopup = null; } setupUserSwitcher(); } @Override public void onDestroy() { mUserSwitcherController.removeUserSwitchCallback(mUserSwitchCallback); } private Drawable findUserIcon(int userId) { Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +43 −1 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -161,6 +162,8 @@ public class UserSwitcherController implements Dumpable { private View mView; private String mCreateSupervisedUserPackage; private GlobalSettings mGlobalSettings; private List<UserSwitchCallback> mUserSwitchCallbacks = Collections.synchronizedList(new ArrayList<>()); @Inject public UserSwitcherController(Context context, Loading Loading @@ -225,7 +228,8 @@ public class UserSwitcherController implements Dumpable { filter.addAction(Intent.ACTION_USER_STOPPED); filter.addAction(Intent.ACTION_USER_UNLOCKED); mBroadcastDispatcher.registerReceiver( mReceiver, filter, null /* handler */, UserHandle.SYSTEM); mReceiver, filter, null /* executor */, UserHandle.SYSTEM, Context.RECEIVER_EXPORTED, null /* permission */); mSimpleUserSwitcher = shouldUseSimpleUserSwitcher(); Loading Loading @@ -652,6 +656,7 @@ public class UserSwitcherController implements Dumpable { i--; } } notifyUserSwitchCallbacks(); notifyAdapters(); // Disconnect from the old secondary user's service Loading Loading @@ -1053,6 +1058,33 @@ public class UserSwitcherController implements Dumpable { mActivityStarter.startActivity(intent, true); } /** * Add a subscriber to when user switches. */ public void addUserSwitchCallback(UserSwitchCallback callback) { mUserSwitchCallbacks.add(callback); } /** * Remove a subscriber to when user switches. */ public void removeUserSwitchCallback(UserSwitchCallback callback) { mUserSwitchCallbacks.remove(callback); } /** * Notify user switch callbacks that user has switched. */ private void notifyUserSwitchCallbacks() { List<UserSwitchCallback> temp; synchronized (mUserSwitchCallbacks) { temp = new ArrayList<>(mUserSwitchCallbacks); } for (UserSwitchCallback callback : temp) { callback.onUserSwitched(); } } public static final class UserRecord { public final UserInfo info; public final Bitmap picture; Loading Loading @@ -1233,4 +1265,14 @@ public class UserSwitcherController implements Dumpable { } } } /** * Callback to for when this controller receives the intent to switch users. */ public interface UserSwitchCallback { /** * Called when user has switched. */ void onUserSwitched(); } }
packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt +21 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy import android.app.IActivityManager import android.app.admin.DevicePolicyManager import android.content.BroadcastReceiver import android.content.Context import android.content.DialogInterface import android.content.Intent Loading Loading @@ -52,6 +53,10 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.NotificationShadeWindowView import com.android.systemui.telephony.TelephonyListenerManager import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.nullable import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.FakeSystemClock Loading @@ -63,10 +68,8 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.any import org.mockito.Mockito.doNothing import org.mockito.Mockito.doReturn import org.mockito.Mockito.eq Loading Loading @@ -529,4 +532,20 @@ class UserSwitcherControllerTest : SysuiTestCase() { setupController() assertFalse(userSwitcherController.canCreateSupervisedUser()) } @Test fun addUserSwitchCallback() { val broadcastReceiverCaptor = argumentCaptor<BroadcastReceiver>() verify(broadcastDispatcher).registerReceiver( capture(broadcastReceiverCaptor), any(), nullable(), nullable(), anyInt(), nullable()) val cb = mock(UserSwitcherController.UserSwitchCallback::class.java) userSwitcherController.addUserSwitchCallback(cb) val intent = Intent(Intent.ACTION_USER_SWITCHED).putExtra(Intent.EXTRA_USER_HANDLE, guestId) broadcastReceiverCaptor.value.onReceive(context, intent) verify(cb).onUserSwitched() } }