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

Commit e112db8a authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

Extracts interface from UserSwitcherController.

Our goal with this refactor is to provide a differnt implementation of
UserSwitcherController that uses modern architecture inside itself. To
achieve that, we need to be able to provide a new implementation
alongside the existing implementation and switch between them based on
our feature flags.

This CL extracts an interface our of the UserSwitcherController class,
also named UserSwitcherController (to minimize changes to downstream
customers of this class) and moves the current implementation to
UserSwitcherControllerOldImpl.

As a side-effect, we also had to move the old
UserSwitcherController.BaseUserAdapter out into its own class,
BaseUserSwitcherAdapter.

This CL was done almost entirely automatically using tools provided by
the Android Studio IDE. There are no logical changes in this CL at all.

Bug: 246631653
Test: Manually verified that user switcher works properly in
full-screen, from quick settings, and from the bouncer.

Change-Id: I383f1bb9147c7afc3047bcf2ad7422b7c6894821
parent 0582bb68
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -813,7 +813,7 @@
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallLoggerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManagerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherControllerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherControllerOldImplTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLoggerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositoryImplTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorTest.kt
@@ -828,7 +828,7 @@
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherAdapterTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SafetyControllerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerOldImplTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/VariableDateViewControllerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/WalletControllerImplTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/window/StatusBarWindowStateControllerTest.kt
+3 −6
Original line number Diff line number Diff line
@@ -22,8 +22,6 @@ import static android.view.WindowInsets.Type.systemBars;
import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP;

import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY;
import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_DISABLED_ALPHA;
import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_ENABLED_ALPHA;

import static java.lang.Integer.max;

@@ -87,8 +85,8 @@ import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.policy.BaseUserSwitcherAdapter;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.UserSwitcherController.BaseUserAdapter;
import com.android.systemui.user.data.source.UserRecord;
import com.android.systemui.util.settings.GlobalSettings;

@@ -1137,7 +1135,7 @@ public class KeyguardSecurityContainer extends FrameLayout {

            KeyguardUserSwitcherAnchor anchor = mView.findViewById(R.id.user_switcher_anchor);

            BaseUserAdapter adapter = new BaseUserAdapter(mUserSwitcherController) {
            BaseUserSwitcherAdapter adapter = new BaseUserSwitcherAdapter(mUserSwitcherController) {
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    UserRecord item = getItem(position);
@@ -1172,8 +1170,7 @@ public class KeyguardSecurityContainer extends FrameLayout {
                    }
                    textView.setSelected(item == currentUser);
                    view.setEnabled(item.isSwitchToEnabled);
                    view.setAlpha(view.isEnabled() ? USER_SWITCH_ENABLED_ALPHA :
                            USER_SWITCH_DISABLED_ALPHA);
                    UserSwitcherController.setSelectableAlpha(view);
                    return view;
                }

+4 −5
Original line number Diff line number Diff line
@@ -16,9 +16,6 @@

package com.android.systemui.qs.tiles;

import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_DISABLED_ALPHA;
import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_ENABLED_ALPHA;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
@@ -42,6 +39,7 @@ import com.android.systemui.qs.PseudoGridView;
import com.android.systemui.qs.QSUserSwitcherEvent;
import com.android.systemui.qs.user.UserSwitchDialogController;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.BaseUserSwitcherAdapter;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.user.data.source.UserRecord;

@@ -73,7 +71,8 @@ public class UserDetailView extends PseudoGridView {
        mAdapter.refresh();
    }

    public static class Adapter extends UserSwitcherController.BaseUserAdapter
    /** Provides views for user detail items. */
    public static class Adapter extends BaseUserSwitcherAdapter
            implements OnClickListener {

        private final Context mContext;
@@ -137,7 +136,7 @@ public class UserDetailView extends PseudoGridView {
            v.setActivated(item.isCurrent);
            v.setDisabledByAdmin(mController.isDisabledByAdmin(item));
            v.setEnabled(item.isSwitchToEnabled);
            v.setAlpha(v.isEnabled() ? USER_SWITCH_ENABLED_ALPHA : USER_SWITCH_DISABLED_ALPHA);
            UserSwitcherController.setSelectableAlpha(v);

            if (item.isCurrent) {
                mCurrentUserView = v;
+3 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.qs.FooterActionsView;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.user.UserSwitchDialogController;
import com.android.systemui.statusbar.policy.BaseUserSwitcherAdapter;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.user.UserSwitcherActivity;
import com.android.systemui.util.ViewController;
@@ -49,7 +50,7 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
    private final ActivityStarter mActivityStarter;
    private final FeatureFlags mFeatureFlags;

    private UserSwitcherController.BaseUserAdapter mUserListener;
    private BaseUserSwitcherAdapter mUserListener;

    private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
@@ -135,7 +136,7 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {

            final UserSwitcherController controller = mUserSwitcherController;
            if (controller != null) {
                mUserListener = new UserSwitcherController.BaseUserAdapter(controller) {
                mUserListener = new BaseUserSwitcherAdapter(controller) {
                    @Override
                    public void notifyDataSetChanged() {
                        mView.refreshContentDescription(getCurrentUser());
+119 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.android.systemui.statusbar.policy

import android.content.Context
import android.graphics.ColorFilter
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.drawable.Drawable
import android.os.UserHandle
import android.widget.BaseAdapter
import com.android.systemui.qs.user.UserSwitchDialogController.DialogShower
import com.android.systemui.user.data.source.UserRecord
import com.android.systemui.user.legacyhelper.ui.LegacyUserUiHelper.getUserRecordName
import com.android.systemui.user.legacyhelper.ui.LegacyUserUiHelper.getUserSwitcherActionIconResourceId
import java.lang.ref.WeakReference

/** Provides views for user switcher experiences. */
abstract class BaseUserSwitcherAdapter
protected constructor(
    protected val controller: UserSwitcherController,
) : BaseAdapter() {

    protected open val users: ArrayList<UserRecord>
        get() = controller.users

    init {
        controller.addAdapter(WeakReference(this))
    }

    override fun getCount(): Int {
        return if (controller.isKeyguardShowing) {
            users.count { !it.isRestricted }
        } else {
            users.size
        }
    }

    override fun getItem(position: Int): UserRecord {
        return users[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    /**
     * Notifies that a user item in the UI has been clicked.
     *
     * If the user switcher is hosted in a dialog, passing a non-null [dialogShower] will allow
     * animation to and from the parent dialog.
     */
    @JvmOverloads
    fun onUserListItemClicked(
        record: UserRecord,
        dialogShower: DialogShower? = null,
    ) {
        controller.onUserListItemClicked(record, dialogShower)
    }

    open fun getName(context: Context, item: UserRecord): String {
        return getName(context, item, false)
    }

    /** Returns the name for the given {@link UserRecord}. */
    open fun getName(context: Context, item: UserRecord, isTablet: Boolean): String {
        return getUserRecordName(
            context = context,
            record = item,
            isGuestUserAutoCreated = controller.isGuestUserAutoCreated,
            isGuestUserResetting = controller.isGuestUserResetting,
            isTablet = isTablet,
        )
    }

    fun refresh() {
        controller.refreshUsers(UserHandle.USER_NULL)
    }

    companion object {
        @JvmStatic
        protected val disabledUserAvatarColorFilter: ColorFilter by lazy {
            val matrix = ColorMatrix()
            matrix.setSaturation(0f) // 0 - grayscale
            ColorMatrixColorFilter(matrix)
        }

        @JvmStatic
        @JvmOverloads
        protected fun getIconDrawable(
            context: Context,
            item: UserRecord,
            isTablet: Boolean = false,
        ): Drawable {
            val iconRes =
                getUserSwitcherActionIconResourceId(
                    item.isAddUser,
                    item.isGuest,
                    item.isAddSupervisedUser,
                    isTablet,
                )
            return checkNotNull(context.getDrawable(iconRes))
        }
    }
}
Loading