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

Commit 19e73e70 authored by Aaron Liu's avatar Aaron Liu Committed by Automerger Merge Worker
Browse files

Merge "Asynchronously inflate the bouncer." into tm-qpr-dev am: bbb5aea2 am: 1f28d59a

parents 44b3cfad 1f28d59a
Loading
Loading
Loading
Loading
+0 −41
Original line number Original line Diff line number Diff line
@@ -18,13 +18,9 @@ package com.android.keyguard;


import android.content.Context;
import android.content.Context;
import android.content.res.TypedArray;
import android.content.res.TypedArray;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.TextView;


@@ -33,22 +29,10 @@ import androidx.annotation.Nullable;
import com.android.internal.policy.SystemBarUtils;
import com.android.internal.policy.SystemBarUtils;
import com.android.systemui.R;
import com.android.systemui.R;


import java.lang.ref.WeakReference;

/***
/***
 * Manages a number of views inside of the given layout. See below for a list of widgets.
 * Manages a number of views inside of the given layout. See below for a list of widgets.
 */
 */
public abstract class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
public abstract class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
    /** Handler token posted with accessibility announcement runnables. */
    private static final Object ANNOUNCE_TOKEN = new Object();

    /**
     * Delay before speaking an accessibility announcement. Used to prevent
     * lift-to-type from interrupting itself.
     */
    private static final long ANNOUNCEMENT_DELAY = 250;

    private final Handler mHandler;


    private CharSequence mMessage;
    private CharSequence mMessage;
    private boolean mIsVisible;
    private boolean mIsVisible;
@@ -65,7 +49,6 @@ public abstract class KeyguardMessageArea extends TextView implements SecurityMe
        super(context, attrs);
        super(context, attrs);
        setLayerType(LAYER_TYPE_HARDWARE, null); // work around nested unclipped SaveLayer bug
        setLayerType(LAYER_TYPE_HARDWARE, null); // work around nested unclipped SaveLayer bug


        mHandler = new Handler(Looper.myLooper());
        onThemeChanged();
        onThemeChanged();
    }
    }


@@ -127,9 +110,6 @@ public abstract class KeyguardMessageArea extends TextView implements SecurityMe
    private void securityMessageChanged(CharSequence message) {
    private void securityMessageChanged(CharSequence message) {
        mMessage = message;
        mMessage = message;
        update();
        update();
        mHandler.removeCallbacksAndMessages(ANNOUNCE_TOKEN);
        mHandler.postAtTime(new AnnounceRunnable(this, getText()), ANNOUNCE_TOKEN,
                (SystemClock.uptimeMillis() + ANNOUNCEMENT_DELAY));
    }
    }


    private void clearMessage() {
    private void clearMessage() {
@@ -156,25 +136,4 @@ public abstract class KeyguardMessageArea extends TextView implements SecurityMe


    /** Set the text color */
    /** Set the text color */
    protected abstract void updateTextColor();
    protected abstract void updateTextColor();

    /**
     * Runnable used to delay accessibility announcements.
     */
    private static class AnnounceRunnable implements Runnable {
        private final WeakReference<View> mHost;
        private final CharSequence mTextToAnnounce;

        AnnounceRunnable(View host, CharSequence textToAnnounce) {
            mHost = new WeakReference<View>(host);
            mTextToAnnounce = textToAnnounce;
        }

        @Override
        public void run() {
            final View host = mHost.get();
            if (host != null) {
                host.announceForAccessibility(mTextToAnnounce);
            }
        }
    }
}
}
+45 −0
Original line number Original line Diff line number Diff line
@@ -18,11 +18,17 @@ package com.android.keyguard;


import android.content.res.ColorStateList;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.text.TextUtils;
import android.view.View;

import androidx.annotation.VisibleForTesting;


import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.ViewController;


import java.lang.ref.WeakReference;

import javax.inject.Inject;
import javax.inject.Inject;


/**
/**
@@ -31,8 +37,14 @@ import javax.inject.Inject;
 */
 */
public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
        extends ViewController<T> {
        extends ViewController<T> {
    /**
     * Delay before speaking an accessibility announcement. Used to prevent
     * lift-to-type from interrupting itself.
     */
    private static final long ANNOUNCEMENT_DELAY = 250;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final ConfigurationController mConfigurationController;
    private final ConfigurationController mConfigurationController;
    private final AnnounceRunnable mAnnounceRunnable;


    private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
    private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
        public void onFinishedGoingToSleep(int why) {
        public void onFinishedGoingToSleep(int why) {
@@ -68,6 +80,7 @@ public class KeyguardMessageAreaController<T extends KeyguardMessageArea>


        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mConfigurationController = configurationController;
        mConfigurationController = configurationController;
        mAnnounceRunnable = new AnnounceRunnable(mView);
    }
    }


    @Override
    @Override
@@ -100,6 +113,12 @@ public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
     */
     */
    public void setMessage(CharSequence s, boolean animate) {
    public void setMessage(CharSequence s, boolean animate) {
        mView.setMessage(s, animate);
        mView.setMessage(s, animate);
        CharSequence msg = mView.getText();
        if (!TextUtils.isEmpty(msg)) {
            mView.removeCallbacks(mAnnounceRunnable);
            mAnnounceRunnable.setTextToAnnounce(msg);
            mView.postDelayed(mAnnounceRunnable, ANNOUNCEMENT_DELAY);
        }
    }
    }


    public void setMessage(int resId) {
    public void setMessage(int resId) {
@@ -134,4 +153,30 @@ public class KeyguardMessageAreaController<T extends KeyguardMessageArea>
                    view, mKeyguardUpdateMonitor, mConfigurationController);
                    view, mKeyguardUpdateMonitor, mConfigurationController);
        }
        }
    }
    }

    /**
     * Runnable used to delay accessibility announcements.
     */
    @VisibleForTesting
    public static class AnnounceRunnable implements Runnable {
        private final WeakReference<View> mHost;
        private CharSequence mTextToAnnounce;

        AnnounceRunnable(View host) {
            mHost = new WeakReference<>(host);
        }

        /** Sets the text to announce. */
        public void setTextToAnnounce(CharSequence textToAnnounce) {
            mTextToAnnounce = textToAnnounce;
        }

        @Override
        public void run() {
            final View host = mHost.get();
            if (host != null) {
                host.announceForAccessibility(mTextToAnnounce);
            }
        }
    }
}
}
+12 −7
Original line number Original line Diff line number Diff line
@@ -1066,23 +1066,28 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
    }
    }


    private void reloadColors() {
    private void reloadColors() {
        reinflateViewFlipper();
        reinflateViewFlipper(() -> mView.reloadColors());
        mView.reloadColors();
    }
    }


    /** Handles density or font scale changes. */
    /** Handles density or font scale changes. */
    private void onDensityOrFontScaleChanged() {
    private void onDensityOrFontScaleChanged() {
        reinflateViewFlipper();
        reinflateViewFlipper(() -> mView.onDensityOrFontScaleChanged());
        mView.onDensityOrFontScaleChanged();
    }
    }


    /**
    /**
     * Reinflate the view flipper child view.
     * Reinflate the view flipper child view.
     */
     */
    public void reinflateViewFlipper() {
    public void reinflateViewFlipper(
            KeyguardSecurityViewFlipperController.OnViewInflatedListener onViewInflatedListener) {
        mSecurityViewFlipperController.clearViews();
        mSecurityViewFlipperController.clearViews();
        if (mFeatureFlags.isEnabled(Flags.ASYNC_INFLATE_BOUNCER)) {
            mSecurityViewFlipperController.asynchronouslyInflateView(mCurrentSecurityMode,
                    mKeyguardSecurityCallback, onViewInflatedListener);
        } else {
            mSecurityViewFlipperController.getSecurityView(mCurrentSecurityMode,
            mSecurityViewFlipperController.getSecurityView(mCurrentSecurityMode,
                    mKeyguardSecurityCallback);
                    mKeyguardSecurityCallback);
            onViewInflatedListener.onViewInflated();
        }
    }
    }


    /**
    /**
+50 −4
Original line number Original line Diff line number Diff line
@@ -19,11 +19,16 @@ package com.android.keyguard;
import android.util.Log;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.LayoutInflater;


import androidx.annotation.Nullable;
import androidx.asynclayoutinflater.view.AsyncLayoutInflater;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardInputViewController.Factory;
import com.android.keyguard.KeyguardInputViewController.Factory;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.ViewController;


import java.util.ArrayList;
import java.util.ArrayList;
@@ -44,18 +49,24 @@ public class KeyguardSecurityViewFlipperController
    private final List<KeyguardInputViewController<KeyguardInputView>> mChildren =
    private final List<KeyguardInputViewController<KeyguardInputView>> mChildren =
            new ArrayList<>();
            new ArrayList<>();
    private final LayoutInflater mLayoutInflater;
    private final LayoutInflater mLayoutInflater;
    private final AsyncLayoutInflater mAsyncLayoutInflater;
    private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
    private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
    private final Factory mKeyguardSecurityViewControllerFactory;
    private final Factory mKeyguardSecurityViewControllerFactory;
    private final FeatureFlags mFeatureFlags;


    @Inject
    @Inject
    protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view,
    protected KeyguardSecurityViewFlipperController(KeyguardSecurityViewFlipper view,
            LayoutInflater layoutInflater,
            LayoutInflater layoutInflater,
            AsyncLayoutInflater asyncLayoutInflater,
            KeyguardInputViewController.Factory keyguardSecurityViewControllerFactory,
            KeyguardInputViewController.Factory keyguardSecurityViewControllerFactory,
            EmergencyButtonController.Factory emergencyButtonControllerFactory) {
            EmergencyButtonController.Factory emergencyButtonControllerFactory,
            FeatureFlags featureFlags) {
        super(view);
        super(view);
        mKeyguardSecurityViewControllerFactory = keyguardSecurityViewControllerFactory;
        mKeyguardSecurityViewControllerFactory = keyguardSecurityViewControllerFactory;
        mLayoutInflater = layoutInflater;
        mLayoutInflater = layoutInflater;
        mEmergencyButtonControllerFactory = emergencyButtonControllerFactory;
        mEmergencyButtonControllerFactory = emergencyButtonControllerFactory;
        mAsyncLayoutInflater = asyncLayoutInflater;
        mFeatureFlags = featureFlags;
    }
    }


    @Override
    @Override
@@ -92,13 +103,12 @@ public class KeyguardSecurityViewFlipperController
            }
            }
        }
        }


        if (childController == null
        if (!mFeatureFlags.isEnabled(Flags.ASYNC_INFLATE_BOUNCER) && childController == null
                && securityMode != SecurityMode.None && securityMode != SecurityMode.Invalid) {
                && securityMode != SecurityMode.None && securityMode != SecurityMode.Invalid) {

            int layoutId = getLayoutIdFor(securityMode);
            int layoutId = getLayoutIdFor(securityMode);
            KeyguardInputView view = null;
            KeyguardInputView view = null;
            if (layoutId != 0) {
            if (layoutId != 0) {
                if (DEBUG) Log.v(TAG, "inflating id = " + layoutId);
                if (DEBUG) Log.v(TAG, "inflating on main thread id = " + layoutId);
                view = (KeyguardInputView) mLayoutInflater.inflate(
                view = (KeyguardInputView) mLayoutInflater.inflate(
                        layoutId, mView, false);
                        layoutId, mView, false);
                mView.addView(view);
                mView.addView(view);
@@ -119,6 +129,36 @@ public class KeyguardSecurityViewFlipperController
        return childController;
        return childController;
    }
    }


    /**
     * Asynchronously inflate view and then add it to view flipper on the main thread when complete.
     *
     * OnInflateFinishedListener will be called on the main thread.
     *
     * @param securityMode
     * @param keyguardSecurityCallback
     */
    public void asynchronouslyInflateView(SecurityMode securityMode,
            KeyguardSecurityCallback keyguardSecurityCallback,
            @Nullable OnViewInflatedListener onViewInflatedListener) {
        int layoutId = getLayoutIdFor(securityMode);
        if (layoutId != 0) {
            if (DEBUG) Log.v(TAG, "inflating on bg thread id = " + layoutId);
            mAsyncLayoutInflater.inflate(layoutId, mView,
                    (view, resId, parent) -> {
                        mView.addView(view);
                        KeyguardInputViewController<KeyguardInputView> childController =
                                mKeyguardSecurityViewControllerFactory.create(
                                        (KeyguardInputView) view, securityMode,
                                        keyguardSecurityCallback);
                        childController.init();
                        mChildren.add(childController);
                        if (onViewInflatedListener != null) {
                            onViewInflatedListener.onViewInflated();
                        }
                    });
        }
    }

    private int getLayoutIdFor(SecurityMode securityMode) {
    private int getLayoutIdFor(SecurityMode securityMode) {
        switch (securityMode) {
        switch (securityMode) {
            case Pattern: return R.layout.keyguard_pattern_view;
            case Pattern: return R.layout.keyguard_pattern_view;
@@ -162,4 +202,10 @@ public class KeyguardSecurityViewFlipperController
            return 0;
            return 0;
        }
        }
    }
    }

    /** Listener to when view has finished inflation. */
    public interface OnViewInflatedListener {
        /** Notifies that view has been inflated */
        void onViewInflated();
    }
}
}
+8 −0
Original line number Original line Diff line number Diff line
@@ -98,6 +98,7 @@ import android.view.accessibility.CaptioningManager;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodManager;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassificationManager;


import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.app.NotificationManagerCompat;


import com.android.internal.app.IBatteryStats;
import com.android.internal.app.IBatteryStats;
@@ -395,6 +396,13 @@ public class FrameworkServicesModule {
        return LayoutInflater.from(context);
        return LayoutInflater.from(context);
    }
    }


    /** */
    @Provides
    @Singleton
    public AsyncLayoutInflater provideAsyncLayoutInflater(Context context) {
        return new AsyncLayoutInflater(context);
    }

    @Provides
    @Provides
    static MediaProjectionManager provideMediaProjectionManager(Context context) {
    static MediaProjectionManager provideMediaProjectionManager(Context context) {
        return context.getSystemService(MediaProjectionManager.class);
        return context.getSystemService(MediaProjectionManager.class);
Loading