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

Commit 093bdf9a authored by d34d's avatar d34d Committed by Clark Scheff
Browse files

Keyguard: Support for external keyguard views

Change-Id: I3a8cdcc39f24824c2264304e9f5c7ea2c6a5f10d
parent 86595f91
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/show_bouncer"
    android:layout_width="@dimen/unlock_fab_size"
    android:layout_height="@dimen/unlock_fab_size"
    android:layout_gravity="bottom|center_horizontal"
    android:alpha="0.5"
    android:src="@drawable/ic_lock_open_24dp" />
+4 −0
Original line number Diff line number Diff line
@@ -49,4 +49,8 @@
    <dimen name="qs_detail_item_height_twoline">72dp</dimen>

    <dimen name="detail_exterior_padding">8dp</dimen>

    <!-- Size of unlock FAB used when showing external keyguard views -->
    <dimen name="unlock_fab_size">48dp</dimen>

</resources>
+50 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.app.ActivityManager;
import android.app.StatusBarManager;
@@ -35,13 +36,13 @@ import android.graphics.Rect;
import android.net.Uri;
import android.os.Handler;
import android.os.PowerManager;
import android.provider.Settings;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityEvent;
@@ -70,11 +71,13 @@ import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator;

import cyanogenmod.externalviews.KeyguardExternalView;
import cyanogenmod.providers.CMSettings;

import java.util.List;

import cyanogenmod.providers.CMSettings;
import org.cyanogenmod.internal.util.CmLockPatternUtils;

public class NotificationPanelView extends PanelView implements
        ExpandableView.OnHeightChangedListener, ObservableScrollView.Listener,
@@ -100,6 +103,12 @@ public class NotificationPanelView extends PanelView implements

    public static final long DOZE_ANIMATION_DURATION = 700;


    // Layout params for external keyguard view
    private static final FrameLayout.LayoutParams EXTERNAL_KEYGUARD_VIEW_PARAMS =
            new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);

    private KeyguardAffordanceHelper mAfforanceHelper;
    private StatusBarHeaderView mHeader;
    private KeyguardUserSwitcher mKeyguardUserSwitcher;
@@ -215,6 +224,9 @@ public class NotificationPanelView extends PanelView implements
    private boolean mLaunchingAffordance;
    private String mLastCameraLaunchSource = KeyguardBottomAreaView.CAMERA_LAUNCH_SOURCE_AFFORDANCE;

    private ComponentName mThirdPartyKeyguardViewComponent;
    private KeyguardExternalView mKeyguardExternalView;

    private Runnable mHeadsUpExistenceChangedRunnable = new Runnable() {
        @Override
        public void run() {
@@ -300,6 +312,11 @@ public class NotificationPanelView extends PanelView implements
                }
            }
        });

        CmLockPatternUtils lockPatternUtils = new CmLockPatternUtils(getContext());
        if (lockPatternUtils.isThirdPartyKeyguardEnabled()) {
            mThirdPartyKeyguardViewComponent = lockPatternUtils.getThirdPartyKeyguardComponent();
        }
    }

    @Override
@@ -1069,6 +1086,24 @@ public class NotificationPanelView extends PanelView implements
        }
        if (keyguardShowing) {
            updateDozingVisibilities(false /* animate */);
            if (mThirdPartyKeyguardViewComponent != null) {
                if (mKeyguardExternalView == null) {
                    mKeyguardExternalView =
                            getExternalKeyguardView(mThirdPartyKeyguardViewComponent);
                } else {
                    // resume the external view
                    mKeyguardExternalView.onActivityResumed(null);
                }
                if (mKeyguardExternalView != null && !mKeyguardExternalView.isAttachedToWindow()) {
                    addView(mKeyguardExternalView, 0, EXTERNAL_KEYGUARD_VIEW_PARAMS);
                }
            }
        } else {
            if (mKeyguardExternalView != null && mKeyguardExternalView.isAttachedToWindow()) {
                removeView(mKeyguardExternalView);
                // pause the external view since we are no longer showing the keyguard
                mKeyguardExternalView.onActivityPaused(null);
            }
        }
        resetVerticalPanelPosition();
        updateQsState();
@@ -2546,4 +2581,17 @@ public class NotificationPanelView extends PanelView implements
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        return !tasks.isEmpty() && pkgName.equals(tasks.get(0).topActivity.getPackageName());
    }

    public boolean hasExternalKeyguardView() {
        return mKeyguardExternalView != null && mKeyguardExternalView.isAttachedToWindow();
    }

    private KeyguardExternalView getExternalKeyguardView(ComponentName componentName) {
        try {
            return new KeyguardExternalView(getContext(), null, componentName);
        } catch (Exception e) {
            // just return null below and move on
        }
        return null;
    }
}
+17 −2
Original line number Diff line number Diff line
@@ -4459,6 +4459,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        }
    }

    private void showBouncerOrFocusKeyguardExternalView() {
        if (mNotificationPanel.hasExternalKeyguardView() && !isKeyguardShowingMedia()) {
            mStatusBarView.collapseAllPanels(/*animate=*/ false, false /* delayed*/,
                    1.0f /* speedUpFactor */);
            mStatusBarKeyguardViewManager.setKeyguardExternalViewFocus(true);
            setBarState(StatusBarState.SHADE);
        } else {
            showBouncer();
        }
    }

    private void instantExpandNotificationsPanel() {

        // Make our window larger and the panel expanded.
@@ -4536,9 +4547,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

    public void onTrackingStopped(boolean expand) {
        if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
            if (!expand && !mUnlockMethodCache.canSkipBouncer()) {
                showBouncer();
            if (!expand && (!mUnlockMethodCache.canSkipBouncer() ||
                    mNotificationPanel.hasExternalKeyguardView())) {
                showBouncerOrFocusKeyguardExternalView();
            }
        } else if (expand && mStatusBarWindowManager.keyguardExternalViewHasFocus()) {
            mStatusBarKeyguardViewManager.setKeyguardExternalViewFocus(false);
            setBarState(StatusBarState.KEYGUARD);
        }
    }

+66 −1
Original line number Diff line number Diff line
@@ -18,17 +18,21 @@ package com.android.systemui.statusbar.phone;

import android.content.ComponentCallbacks2;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.Trace;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;

import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.R;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.statusbar.CommandQueue;

@@ -79,6 +83,8 @@ public class StatusBarKeyguardViewManager {
    private boolean mDeviceWillWakeUp;
    private boolean mDeferScrimFadeOut;

    private View mUnlockFab;

    public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
            LockPatternUtils lockPatternUtils) {
        mContext = context;
@@ -235,6 +241,9 @@ public class StatusBarKeyguardViewManager {
        mOccluded = occluded;
        mStatusBarWindowManager.setKeyguardOccluded(occluded);
        mPhoneStatusBar.getVisualizer().setOccluded(occluded);
        if (mUnlockFab != null && mUnlockFab.isAttachedToWindow() && !occluded) {
            hideUnlockFab();
        }
        reset();
    }

@@ -371,8 +380,16 @@ public class StatusBarKeyguardViewManager {
     * Dismisses the keyguard by going to the next screen or making it gone.
     */
    public void dismiss() {
        if (mDeviceInteractive || mDeviceWillWakeUp) {
        dismiss(false);
    }

    public void dismiss(boolean focusKeyguardExternalView) {
        if ((mDeviceInteractive || mDeviceWillWakeUp) && !focusKeyguardExternalView) {
            showBouncer();
            hideUnlockFab();
        } else if (focusKeyguardExternalView) {
            showUnlockFab();
            mStatusBarWindowManager.setKeyguardExternalViewFocus(true);
        }
    }

@@ -549,4 +566,52 @@ public class StatusBarKeyguardViewManager {
    public boolean isKeyguardShowingMedia() {
        return mPhoneStatusBar.isKeyguardShowingMedia();
    }

    public void setKeyguardExternalViewFocus(boolean hasFocus) {
        if (hasFocus) {
            showUnlockFab();
        } else {
            hideUnlockFab();
        }
        mStatusBarWindowManager.setKeyguardExternalViewFocus(hasFocus);
    }

    private void showUnlockFab() {
        if (mUnlockFab == null) {
            mUnlockFab = View.inflate(mContext, R.layout.unlock_fab, null);
        }
        if (!mUnlockFab.isAttachedToWindow()) {
            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                            | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                    PixelFormat.TRANSLUCENT);
            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
            lp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
            lp.setTitle("UnlockFab");
            lp.packageName = mContext.getPackageName();
            lp.width = lp.height =
                    mContext.getResources().getDimensionPixelSize(R.dimen.unlock_fab_size);
            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            wm.addView(mUnlockFab, lp);
            mUnlockFab.setOnClickListener(mUnlockFabClickListener);
        }
    }

    private void hideUnlockFab() {
        if (mUnlockFab != null && mUnlockFab.isAttachedToWindow()) {
            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            wm.removeViewImmediate(mUnlockFab);
        }
    }

    private View.OnClickListener mUnlockFabClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mStatusBarWindowManager.setKeyguardExternalViewFocus(false);
            dismiss(false);
        }
    };
}
Loading