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

Commit b241d683 authored by Matt Pietal's avatar Matt Pietal Committed by Android (Google) Code Review
Browse files

Merge "Load user icon on bg executor" into main

parents 07769937 e61488f1
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -62,7 +62,9 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.user.data.source.UserRecord;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.time.FakeSystemClock;

import org.junit.Before;
import org.junit.Rule;
@@ -96,6 +98,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
    private FalsingA11yDelegate mFalsingA11yDelegate;

    private KeyguardSecurityContainer mKeyguardSecurityContainer;
    private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());

    @Before
    public void setup() {
@@ -106,6 +109,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
        mSecurityViewFlipper = new KeyguardSecurityViewFlipper(getContext());
        mSecurityViewFlipper.setId(View.generateViewId());
        mKeyguardSecurityContainer = new KeyguardSecurityContainer(getContext());
        mKeyguardSecurityContainer.setBackgroundExecutor(mExecutor);
        mKeyguardSecurityContainer.setRight(VIEW_WIDTH);
        mKeyguardSecurityContainer.setLeft(0);
        mKeyguardSecurityContainer.setTop(0);
@@ -342,7 +346,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {

    @Test
    public void testTwoOrMoreUsersDoesAllowDropDown() {
        // GIVEN one user has been setup
        // GIVEN two users have been setup
        ArrayList<UserRecord> records = buildUserRecords(2);
        when(mUserSwitcherController.getCurrentUserRecord()).thenReturn(records.get(0));
        when(mUserSwitcherController.getUsers()).thenReturn(records);
@@ -350,7 +354,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
        // WHEN UserSwitcherViewMode is initialized
        setupUserSwitcher();

        // THEN the UserSwitcher anchor should not be clickable
        // THEN the UserSwitcher anchor should be clickable
        ViewGroup anchor = mKeyguardSecurityContainer.findViewById(R.id.user_switcher_anchor);
        assertThat(anchor.isClickable()).isTrue();
    }
+36 −16
Original line number Diff line number Diff line
@@ -109,6 +109,8 @@ import com.android.systemui.util.settings.GlobalSettings;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.function.Consumer;

/** Determines how the bouncer is displayed to the user. */
public class KeyguardSecurityContainer extends ConstraintLayout {
@@ -170,6 +172,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
    private ViewMode mViewMode = new DefaultViewMode();
    private boolean mIsInteractable;
    protected ViewMediatorCallback mViewMediatorCallback;
    private Executor mBgExecutor;
    /*
     * Using MODE_UNINITIALIZED to mean the view mode is set to DefaultViewMode, but init() has not
     * yet been called on it. This will happen when the ViewController is initialized.
@@ -352,6 +355,10 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
        updateBiometricRetry(securityMode, faceAuthEnabled);
    }

    void setBackgroundExecutor(Executor bgExecutor) {
        mBgExecutor = bgExecutor;
    }

    void initMode(@Mode int mode, GlobalSettings globalSettings, FalsingManager falsingManager,
            UserSwitcherController userSwitcherController,
            UserSwitcherViewMode.UserSwitcherCallback userSwitcherCallback,
@@ -367,7 +374,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
                mViewMode = new OneHandedViewMode();
                break;
            case MODE_USER_SWITCHER:
                mViewMode = new UserSwitcherViewMode(userSwitcherCallback);
                mViewMode = new UserSwitcherViewMode(userSwitcherCallback, mBgExecutor);
                break;
            default:
                mViewMode = new DefaultViewMode();
@@ -991,6 +998,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
        private FalsingManager mFalsingManager;
        private UserSwitcherController mUserSwitcherController;
        private KeyguardUserSwitcherPopupMenu mPopup;
        private Executor mBgExecutor;
        private Resources mResources;
        private UserSwitcherController.UserSwitchCallback mUserSwitchCallback =
                this::setupUserSwitcher;
@@ -998,8 +1006,9 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
        private UserSwitcherCallback mUserSwitcherCallback;
        private FalsingA11yDelegate mFalsingA11yDelegate;

        UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback) {
        UserSwitcherViewMode(UserSwitcherCallback userSwitcherCallback, Executor bgExecutor) {
            mUserSwitcherCallback = userSwitcherCallback;
            mBgExecutor = bgExecutor;
        }

        @Override
@@ -1068,18 +1077,22 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
            mView.removeView(mUserSwitcher);
        }

        private Drawable findLargeUserIcon(int userId) {
        private void findLargeUserIcon(int userId, Consumer<Drawable> consumer) {
            mBgExecutor.execute(() -> {
                Drawable icon;
                Bitmap userIcon = UserManager.get(mView.getContext()).getUserIcon(userId);
                if (userIcon != null) {
                int iconSize =
                        mResources.getDimensionPixelSize(R.dimen.bouncer_user_switcher_icon_size);
                return CircleFramedDrawable.getInstance(
                    int iconSize = mResources.getDimensionPixelSize(
                            R.dimen.bouncer_user_switcher_icon_size);
                    icon = CircleFramedDrawable.getInstance(
                        mView.getContext(),
                        Icon.scaleDownIfNecessary(userIcon, iconSize, iconSize)
                    );
                } else  {
                    icon = UserIcons.getDefaultUserIcon(mResources, userId, false);
                }

            return UserIcons.getDefaultUserIcon(mResources, userId, false);
                consumer.accept(icon);
            });
        }

        @Override
@@ -1136,8 +1149,15 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
                return;
            }
            final String currentUserName = mUserSwitcherController.getCurrentUserName();
            Drawable userIcon = findLargeUserIcon(currentUser.info.id);
            ((ImageView) mView.findViewById(R.id.user_icon)).setImageDrawable(userIcon);
            findLargeUserIcon(currentUser.info.id,
                    (Drawable userIcon) -> {
                        mView.post(() -> {
                            ImageView view = (ImageView) mView.findViewById(R.id.user_icon);
                            if (view != null) {
                                view.setImageDrawable(userIcon);
                            }
                        });
                });
            mUserSwitcher.setText(currentUserName);

            KeyguardUserSwitcherAnchor anchor = mView.findViewById(R.id.user_switcher_anchor);
+6 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.classifier.FalsingA11yDelegate;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
import com.android.systemui.flags.FeatureFlags;
@@ -102,6 +103,7 @@ import kotlinx.coroutines.Job;

import java.io.File;
import java.util.Arrays;
import java.util.concurrent.Executor;

import javax.inject.Inject;
import javax.inject.Provider;
@@ -426,6 +428,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
    private final Provider<JavaAdapter> mJavaAdapter;
    private final DeviceProvisionedController mDeviceProvisionedController;
    private final Lazy<PrimaryBouncerInteractor> mPrimaryBouncerInteractor;
    private final Executor mBgExecutor;
    @Nullable
    private Job mSceneTransitionCollectionJob;

@@ -459,6 +462,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            DevicePolicyManager devicePolicyManager,
            KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
            Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
            @Background Executor bgExecutor,
            Provider<DeviceEntryInteractor> deviceEntryInteractor
    ) {
        super(view);
@@ -493,11 +497,13 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
        mDeviceProvisionedController = deviceProvisionedController;
        mPrimaryBouncerInteractor = primaryBouncerInteractor;
        mDevicePolicyManager = devicePolicyManager;
        mBgExecutor = bgExecutor;
    }

    @Override
    public void onInit() {
        mSecurityViewFlipperController.init();
        mView.setBackgroundExecutor(mBgExecutor);
        updateResources();
        configureMode();
    }
+28 −28
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.statusbar.policy.UserSwitcherController
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.kotlin.JavaAdapter
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argThat
@@ -84,6 +85,7 @@ import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth
import junit.framework.Assert
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -172,6 +174,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
    @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
    private lateinit var sceneTransitionStateFlow: MutableStateFlow<ObservableTransitionState>
    private lateinit var fakeSceneDataSource: FakeSceneDataSource
    private val executor = FakeExecutor(FakeSystemClock())

    private lateinit var underTest: KeyguardSecurityContainerController

@@ -210,13 +213,9 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        featureFlags = FakeFeatureFlags()
        featureFlags.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false)

        mSetFlagsRule.enableFlags(
            AConfigFlags.FLAG_REVAMPED_BOUNCER_MESSAGES,
        )
        mSetFlagsRule.enableFlags(AConfigFlags.FLAG_REVAMPED_BOUNCER_MESSAGES)
        if (!SceneContainerFlag.isEnabled) {
            mSetFlagsRule.disableFlags(
                AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR,
            )
            mSetFlagsRule.disableFlags(AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
        }

        keyguardPasswordViewController =
@@ -239,7 +238,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                mSelectedUserInteractor,
                keyguardKeyboardInteractor,
                null,
                mUserActivityNotifier
                mUserActivityNotifier,
            )

        kosmos = testKosmos()
@@ -283,6 +282,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                devicePolicyManager,
                kosmos.keyguardDismissTransitionInteractor,
                { primaryBouncerInteractor },
                executor,
            ) {
                deviceEntryInteractor
            }
@@ -298,7 +298,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -334,7 +334,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )

        // Update rotation. Should trigger update
@@ -347,7 +347,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -359,7 +359,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                MotionEvent.ACTION_DOWN,
                /* x= */ 0f,
                /* y= */ 0f,
                /* metaState= */ 0
                /* metaState= */ 0,
            )
        )
    }
@@ -386,7 +386,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -401,7 +401,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -416,7 +416,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -431,7 +431,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -446,7 +446,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                eq(falsingManager),
                eq(userSwitcherController),
                any(),
                eq(falsingA11yDelegate)
                eq(falsingA11yDelegate),
            )
    }

@@ -462,7 +462,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            .showMessage(
                /* message= */ context.getString(R.string.keyguard_unlock_to_continue),
                /* colorState= */ null,
                /* animated= */ true
                /* animated= */ true,
            )
    }

@@ -496,7 +496,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* authenticated= */ true,
            TARGET_USER_ID,
            /* bypassSecondaryLockScreen= */ true,
            SecurityMode.SimPin
            SecurityMode.SimPin,
        )

        // THEN the next security method of None will dismiss keyguard.
@@ -514,7 +514,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                /* authenticated= */ true,
                TARGET_USER_ID,
                /* bypassSecondaryLockScreen= */ true,
                SecurityMode.SimPin
                SecurityMode.SimPin,
            )

        // THEN no action has happened, which will not dismiss the security screens
@@ -539,7 +539,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* authenticated= */ true,
            TARGET_USER_ID,
            /* bypassSecondaryLockScreen= */ true,
            SecurityMode.SimPin
            SecurityMode.SimPin,
        )

        // THEN the next security method of None will dismiss keyguard.
@@ -564,7 +564,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* authenticated= */ true,
            TARGET_USER_ID,
            /* bypassSecondaryLockScreen= */ true,
            SecurityMode.SimPin
            SecurityMode.SimPin,
        )

        // THEN the next security method of None will dismiss keyguard.
@@ -589,7 +589,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* authenticated= */ true,
            TARGET_USER_ID,
            /* bypassSecondaryLockScreen= */ true,
            SecurityMode.SimPin
            SecurityMode.SimPin,
        )

        // THEN we will not show the password screen.
@@ -615,7 +615,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* authenticated= */ true,
            TARGET_USER_ID,
            /* bypassSecondaryLockScreen= */ true,
            SecurityMode.SimPin
            SecurityMode.SimPin,
        )

        // THEN we will not show the password screen.
@@ -717,7 +717,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        // Now simulate a config change
        testableResources.addOverride(
            R.integer.keyguard_host_view_gravity,
            Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
            Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM,
        )
        underTest.updateResources()
        verify(view).layoutParams = any()
@@ -728,7 +728,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
        testableResources.addOverride(R.integer.keyguard_host_view_gravity, Gravity.CENTER)
        testableResources.addOverride(
            R.integer.keyguard_host_view_one_handed_gravity,
            Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM
            Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM,
        )

        // Start disabled.
@@ -948,7 +948,7 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* expiringUserId = */ mainUserId,
            /* mainUserId = */ mainUserId,
            /* remainingBeforeWipe = */ 1,
            /* failedAttempts = */ 1
            /* failedAttempts = */ 1,
        )

        verify(view)
@@ -965,14 +965,14 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
            /* expiringUserId = */ secondaryUserId,
            /* mainUserId = */ mainUserId,
            /* remainingBeforeWipe = */ 1,
            /* failedAttempts = */ 1
            /* failedAttempts = */ 1,
        )

        verify(view)
            .showAlmostAtWipeDialog(
                any(),
                any(),
                eq(KeyguardSecurityContainer.USER_TYPE_SECONDARY_USER)
                eq(KeyguardSecurityContainer.USER_TYPE_SECONDARY_USER),
            )
    }