Loading packages/SystemUI/res/layout/unlock_fab.xml 0 → 100644 +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" /> packages/SystemUI/res/values/cm_dimens.xml +4 −0 Original line number Diff line number Diff line Loading @@ -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> packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +50 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -300,6 +312,11 @@ public class NotificationPanelView extends PanelView implements } } }); CmLockPatternUtils lockPatternUtils = new CmLockPatternUtils(getContext()); if (lockPatternUtils.isThirdPartyKeyguardEnabled()) { mThirdPartyKeyguardViewComponent = lockPatternUtils.getThirdPartyKeyguardComponent(); } } @Override Loading Loading @@ -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(); Loading Loading @@ -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; } } packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +17 −2 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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); } } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +66 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -235,6 +241,9 @@ public class StatusBarKeyguardViewManager { mOccluded = occluded; mStatusBarWindowManager.setKeyguardOccluded(occluded); mPhoneStatusBar.getVisualizer().setOccluded(occluded); if (mUnlockFab != null && mUnlockFab.isAttachedToWindow() && !occluded) { hideUnlockFab(); } reset(); } Loading Loading @@ -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); } } Loading Loading @@ -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
packages/SystemUI/res/layout/unlock_fab.xml 0 → 100644 +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" />
packages/SystemUI/res/values/cm_dimens.xml +4 −0 Original line number Diff line number Diff line Loading @@ -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>
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +50 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -300,6 +312,11 @@ public class NotificationPanelView extends PanelView implements } } }); CmLockPatternUtils lockPatternUtils = new CmLockPatternUtils(getContext()); if (lockPatternUtils.isThirdPartyKeyguardEnabled()) { mThirdPartyKeyguardViewComponent = lockPatternUtils.getThirdPartyKeyguardComponent(); } } @Override Loading Loading @@ -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(); Loading Loading @@ -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; } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +17 −2 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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); } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +66 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -235,6 +241,9 @@ public class StatusBarKeyguardViewManager { mOccluded = occluded; mStatusBarWindowManager.setKeyguardOccluded(occluded); mPhoneStatusBar.getVisualizer().setOccluded(occluded); if (mUnlockFab != null && mUnlockFab.isAttachedToWindow() && !occluded) { hideUnlockFab(); } reset(); } Loading Loading @@ -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); } } Loading Loading @@ -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); } }; }