1 package com.android.launcher3.taskbar;
2 
3 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED;
4 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
5 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING;
6 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED;
7 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
8 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
9 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
10 
11 import android.app.KeyguardManager;
12 import android.content.BroadcastReceiver;
13 import android.content.Context;
14 import android.content.Intent;
15 import android.content.IntentFilter;
16 
17 /**
18  * Controller for managing keyguard state for taskbar
19  */
20 public class TaskbarKeyguardController {
21 
22     private static final int KEYGUARD_SYSUI_FLAGS = SYSUI_STATE_BOUNCER_SHOWING |
23             SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING | SYSUI_STATE_DEVICE_DOZING |
24             SYSUI_STATE_OVERVIEW_DISABLED | SYSUI_STATE_HOME_DISABLED |
25             SYSUI_STATE_BACK_DISABLED | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
26 
27     private final TaskbarActivityContext mContext;
28     private int mKeyguardSysuiFlags;
29     private boolean mBouncerShowing;
30     private NavbarButtonsViewController mNavbarButtonsViewController;
31     private final KeyguardManager mKeyguardManager;
32     private boolean mIsScreenOff;
33 
34     private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
35         @Override
36         public void onReceive(Context context, Intent intent) {
37             mIsScreenOff = true;
38         }
39     };
40 
TaskbarKeyguardController(TaskbarActivityContext context)41     public TaskbarKeyguardController(TaskbarActivityContext context) {
42         mContext = context;
43         mKeyguardManager = mContext.getSystemService(KeyguardManager.class);
44     }
45 
init(NavbarButtonsViewController navbarButtonUIController)46     public void init(NavbarButtonsViewController navbarButtonUIController) {
47         mNavbarButtonsViewController = navbarButtonUIController;
48         mContext.registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
49     }
50 
updateStateForSysuiFlags(int systemUiStateFlags)51     public void updateStateForSysuiFlags(int systemUiStateFlags) {
52         boolean bouncerShowing = (systemUiStateFlags & SYSUI_STATE_BOUNCER_SHOWING) != 0;
53         boolean keyguardShowing = (systemUiStateFlags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING)
54                 != 0;
55         boolean keyguardOccluded =
56                 (systemUiStateFlags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED) != 0;
57         boolean dozing = (systemUiStateFlags & SYSUI_STATE_DEVICE_DOZING) != 0;
58 
59         int interestingKeyguardFlags = systemUiStateFlags & KEYGUARD_SYSUI_FLAGS;
60         if (interestingKeyguardFlags == mKeyguardSysuiFlags) {
61             return;
62         }
63         mKeyguardSysuiFlags = interestingKeyguardFlags;
64 
65         mBouncerShowing = bouncerShowing;
66 
67         mNavbarButtonsViewController.setKeyguardVisible(keyguardShowing || dozing,
68                 keyguardOccluded);
69         updateIconsForBouncer();
70     }
71 
isScreenOff()72     public boolean isScreenOff() {
73         return mIsScreenOff;
74     }
75 
setScreenOn()76     public void setScreenOn() {
77         mIsScreenOff = false;
78     }
79 
80     /**
81      * Hides/shows taskbar when keyguard is up
82      */
updateIconsForBouncer()83     private void updateIconsForBouncer() {
84         boolean disableBack = (mKeyguardSysuiFlags & SYSUI_STATE_BACK_DISABLED) != 0;
85         boolean disableRecent = (mKeyguardSysuiFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0;
86         boolean disableHome = (mKeyguardSysuiFlags & SYSUI_STATE_HOME_DISABLED) != 0;
87         boolean onlyBackEnabled = !disableBack && disableRecent && disableHome;
88 
89         boolean showBackForBouncer = onlyBackEnabled &&
90                 mKeyguardManager.isDeviceSecure() &&
91                 mBouncerShowing;
92         mNavbarButtonsViewController.setBackForBouncer(showBackForBouncer);
93     }
94 
onDestroy()95     public void onDestroy() {
96         mContext.unregisterReceiver(mScreenOffReceiver);
97     }
98 }
99