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

Commit f6032e30 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

2/N Use KeyguardHostViewController in KeyguardBouncer.

This mostly proxies existing calls through to the view. A few
exceptions were made where it was obvious what to change.

Also, make ViewController take a View type to streamling
initialization a bit more.

Bug: 166448040
Test: atest SystemUITests && manual.
Change-Id: If849ff57c4b8462e07cc9a4b0546fe7d2a6a0c0a
parent 617777eb
Loading
Loading
Loading
Loading
+0 −37
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.res.Resources;
import android.graphics.Canvas;
import android.media.AudioManager;
import android.os.SystemClock;
import android.service.trust.TrustAgentService;
import android.telephony.TelephonyManager;
import android.util.AttributeSet;
import android.util.Log;
@@ -36,7 +35,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;

@@ -60,40 +58,6 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback {
    private OnDismissAction mDismissAction;
    private Runnable mCancelAction;

    private final KeyguardUpdateMonitorCallback mUpdateCallback =
            new KeyguardUpdateMonitorCallback() {

        @Override
        public void onUserSwitchComplete(int userId) {
            getSecurityContainer().showPrimarySecurityScreen(false /* turning off */);
        }

        @Override
        public void onTrustGrantedWithFlags(int flags, int userId) {
            if (userId != KeyguardUpdateMonitor.getCurrentUser()) return;
            if (!isAttachedToWindow()) return;
            boolean bouncerVisible = isVisibleToUser();
            boolean initiatedByUser =
                    (flags & TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER) != 0;
            boolean dismissKeyguard =
                    (flags & TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD) != 0;

            if (initiatedByUser || dismissKeyguard) {
                if (mViewMediatorCallback.isScreenOn() && (bouncerVisible || dismissKeyguard)) {
                    if (!bouncerVisible) {
                        // The trust agent dismissed the keyguard without the user proving
                        // that they are present (by swiping up to show the bouncer). That's fine if
                        // the user proved presence via some other way to the trust agent.
                        Log.i(TAG, "TrustAgent dismissed Keyguard.");
                    }
                    dismiss(false /* authenticated */, userId,
                            /* bypassSecondaryLockScreen */ false);
                } else {
                    mViewMediatorCallback.playTrustedSound();
                }
            }
        }
    };

    // Whether the volume keys should be handled by keyguard. If true, then
    // they will be handled here for specific media types such as music, otherwise
@@ -111,7 +75,6 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback {

    public KeyguardHostView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mUpdateCallback);
    }

    @Override
+168 −7
Original line number Diff line number Diff line
@@ -16,27 +16,77 @@

package com.android.keyguard;

import android.content.res.ColorStateList;
import android.service.trust.TrustAgentService;
import android.util.Log;
import android.util.MathUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;

import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.util.ViewController;

import javax.inject.Inject;

/** Controller for a {@link KeyguardHostView}. */
@KeyguardBouncerScope
public class KeyguardHostViewController extends ViewController {
    private final KeyguardHostView mView;
public class KeyguardHostViewController extends ViewController<KeyguardHostView> {
    private static final String TAG = "KeyguardViewBase";

    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final KeyguardSecurityContainerController mKeyguardSecurityContainerController;
    private final LockPatternUtils mLockPatternUtils;
    private final ViewMediatorCallback mViewMediatorCallback;

    private final KeyguardUpdateMonitorCallback mUpdateCallback =
            new KeyguardUpdateMonitorCallback() {
                @Override
                public void onUserSwitchComplete(int userId) {
                    mView.getSecurityContainer().showPrimarySecurityScreen(false /* turning off */);
                }

                @Override
                public void onTrustGrantedWithFlags(int flags, int userId) {
                    if (userId != KeyguardUpdateMonitor.getCurrentUser()) return;
                    boolean bouncerVisible = mView.isVisibleToUser();
                    boolean initiatedByUser =
                            (flags & TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER) != 0;
                    boolean dismissKeyguard =
                            (flags & TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD) != 0;

                    if (initiatedByUser || dismissKeyguard) {
                        if (mViewMediatorCallback.isScreenOn()
                                && (bouncerVisible || dismissKeyguard)) {
                            if (!bouncerVisible) {
                                // The trust agent dismissed the keyguard without the user proving
                                // that they are present (by swiping up to show the bouncer). That's
                                // fine if the user proved presence via some other way to the trust
                                //agent.
                                Log.i(TAG, "TrustAgent dismissed Keyguard.");
                            }
                            mView.dismiss(false /* authenticated */, userId,
                                    /* bypassSecondaryLockScreen */ false);
                        } else {
                            mViewMediatorCallback.playTrustedSound();
                        }
                    }
                }
            };

    @Inject
    public KeyguardHostViewController(KeyguardHostView view,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            KeyguardSecurityContainerController keyguardSecurityContainerController,
            LockPatternUtils lockPatternUtils,
            ViewMediatorCallback viewMediatorCallback) {
        super(view);
        mView = view;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mKeyguardSecurityContainerController = keyguardSecurityContainerController;
        mLockPatternUtils = lockPatternUtils;
        mViewMediatorCallback = viewMediatorCallback;
@@ -52,18 +102,129 @@ public class KeyguardHostViewController extends ViewController {

    @Override
    protected void onViewAttached() {
        mKeyguardUpdateMonitor.registerCallback(mUpdateCallback);
    }

    @Override
    protected void onViewDetached() {
    }

    public KeyguardHostView getView() {
        return mView;
        mKeyguardUpdateMonitor.removeCallback(mUpdateCallback);
    }

     /** Called before this view is being removed. */
    public void cleanUp() {
        mKeyguardSecurityContainerController.onPause();
    }

    public void resetSecurityContainer() {
        mView.resetSecurityContainer();
    }

    public boolean dismiss(int activeUserId) {
        return mView.dismiss(activeUserId);
    }

    public void onResume() {
        mView.onResume();
    }

    public CharSequence getAccessibilityTitleForCurrentMode() {
        return mView.getAccessibilityTitleForCurrentMode();
    }

    public void showErrorMessage(CharSequence customMessage) {
        mView.showErrorMessage(customMessage);
    }

    public void appear(int statusBarHeight) {
        // We might still be collapsed and the view didn't have time to layout yet or still
        // be small, let's wait on the predraw to do the animation in that case.
        if (mView.getHeight() != 0 && mView.getHeight() != statusBarHeight) {
            mView.startAppearAnimation();
        } else {
            mView.getViewTreeObserver().addOnPreDrawListener(
                    new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            mView.getViewTreeObserver().removeOnPreDrawListener(this);
                            mView.startAppearAnimation();
                            return true;
                        }
                    });
            mView.requestLayout();
        }
    }

    public void showPromptReason(int reason) {
        mView.showPromptReason(reason);
    }

    public void showMessage(String message, ColorStateList colorState) {
        mView.showMessage(message, colorState);
    }

    public void setOnDismissAction(ActivityStarter.OnDismissAction action, Runnable cancelAction) {
        mView.setOnDismissAction(action, cancelAction);
    }

    public void cancelDismissAction() {
        mView.cancelDismissAction();
    }

    public void startDisappearAnimation(Runnable runnable) {
        mView.startDisappearAnimation(runnable);
    }

    public void onPause() {
        mView.onPause();
    }

    public void showPrimarySecurityScreen() {
        mView.showPrimarySecurityScreen();
    }

    public void setExpansion(float fraction) {
        float alpha = MathUtils.map(KeyguardBouncer.ALPHA_EXPANSION_THRESHOLD, 1, 1, 0, fraction);
        mView.setAlpha(MathUtils.constrain(alpha, 0f, 1f));
        mView.setTranslationY(fraction * mView.getHeight());
    }

    public void onStartingToHide() {
        mView.onStartingToHide();
    }

    public boolean hasDismissActions() {
        return mView.hasDismissActions();
    }

    public SecurityMode getCurrentSecurityMode() {
        return mView.getCurrentSecurityMode();
    }

    public int getTop() {
        int top = mView.getTop();
        // The password view has an extra top padding that should be ignored.
        if (getCurrentSecurityMode() == SecurityMode.Password) {
            View messageArea = mView.findViewById(R.id.keyguard_message_area);
            top += messageArea.getTop();
        }
        return top;
    }

    public boolean handleBackKey() {
        return mView.handleBackKey();
    }

    public boolean shouldEnableMenuKey() {
        return mView.shouldEnableMenuKey();
    }

    public boolean interceptMediaKey(KeyEvent event) {
        return mView.interceptMediaKey(event);
    }

    public void finish(boolean strongAuth, int currentUser) {
        mView.finish(strongAuth, currentUser);
    }


}
+1 −3
Original line number Diff line number Diff line
@@ -22,8 +22,7 @@ import com.android.systemui.util.ViewController;
import javax.inject.Inject;

/** Controller for a {@link KeyguardMessageAreaController}. */
public class KeyguardMessageAreaController extends ViewController {
    private final KeyguardMessageArea mView;
public class KeyguardMessageAreaController extends ViewController<KeyguardMessageArea> {
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final ConfigurationController mConfigurationController;

@@ -32,7 +31,6 @@ public class KeyguardMessageAreaController extends ViewController {
            ConfigurationController configurationController) {
        super(view);

        mView = view;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mConfigurationController = configurationController;
    }
+1 −4
Original line number Diff line number Diff line
@@ -26,13 +26,10 @@ import com.android.systemui.util.ViewController;
import javax.inject.Inject;
/** Controller for a {@link KeyguardBouncer}'s Root view. */
@KeyguardBouncerScope
public class KeyguardRootViewController extends ViewController {
    private final ViewGroup mView;

public class KeyguardRootViewController extends ViewController<ViewGroup> {
    @Inject
    public KeyguardRootViewController(@RootView ViewGroup view) {
        super(view);
        mView = view;
    }

    public ViewGroup getView() {
+1 −3
Original line number Diff line number Diff line
@@ -21,16 +21,14 @@ import com.android.systemui.util.ViewController;
import javax.inject.Inject;

/** Controller for {@link KeyguardSecurityContainer} */
public class KeyguardSecurityContainerController extends ViewController {
public class KeyguardSecurityContainerController extends ViewController<KeyguardSecurityContainer> {

    private final KeyguardSecurityContainer mView;
    private final KeyguardSecurityViewController.Factory mKeyguardSecurityViewControllerFactory;

    @Inject
    KeyguardSecurityContainerController(KeyguardSecurityContainer view,
            KeyguardSecurityViewController.Factory keyguardSecurityViewControllerFactory) {
        super(view);
        mView = view;
        mKeyguardSecurityViewControllerFactory = keyguardSecurityViewControllerFactory;
    }

Loading