1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.statusbar.policy;
18 
19 import android.app.ActivityManager;
20 import android.content.Context;
21 
22 import com.android.keyguard.KeyguardUpdateMonitor;
23 import com.android.keyguard.KeyguardUpdateMonitorCallback;
24 import com.android.systemui.settings.CurrentUserTracker;
25 
26 import java.util.ArrayList;
27 
28 public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback
29         implements KeyguardMonitor {
30 
31     private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>();
32 
33     private final Context mContext;
34     private final CurrentUserTracker mUserTracker;
35     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
36 
37     private int mCurrentUser;
38     private boolean mShowing;
39     private boolean mSecure;
40     private boolean mOccluded;
41     private boolean mCanSkipBouncer;
42 
43     private boolean mListening;
44     private boolean mKeyguardFadingAway;
45     private long mKeyguardFadingAwayDelay;
46     private long mKeyguardFadingAwayDuration;
47     private boolean mKeyguardGoingAway;
48 
KeyguardMonitorImpl(Context context)49     public KeyguardMonitorImpl(Context context) {
50         mContext = context;
51         mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
52         mUserTracker = new CurrentUserTracker(mContext) {
53             @Override
54             public void onUserSwitched(int newUserId) {
55                 mCurrentUser = newUserId;
56                 updateCanSkipBouncerState();
57             }
58         };
59     }
60 
61     @Override
addCallback(Callback callback)62     public void addCallback(Callback callback) {
63         mCallbacks.add(callback);
64         if (mCallbacks.size() != 0 && !mListening) {
65             mListening = true;
66             mCurrentUser = ActivityManager.getCurrentUser();
67             updateCanSkipBouncerState();
68             mKeyguardUpdateMonitor.registerCallback(this);
69             mUserTracker.startTracking();
70         }
71     }
72 
73     @Override
removeCallback(Callback callback)74     public void removeCallback(Callback callback) {
75         if (mCallbacks.remove(callback) && mCallbacks.size() == 0 && mListening) {
76             mListening = false;
77             mKeyguardUpdateMonitor.removeCallback(this);
78             mUserTracker.stopTracking();
79         }
80     }
81 
82     @Override
isShowing()83     public boolean isShowing() {
84         return mShowing;
85     }
86 
87     @Override
isSecure()88     public boolean isSecure() {
89         return mSecure;
90     }
91 
92     @Override
isOccluded()93     public boolean isOccluded() {
94         return mOccluded;
95     }
96 
97     @Override
canSkipBouncer()98     public boolean canSkipBouncer() {
99         return mCanSkipBouncer;
100     }
101 
notifyKeyguardState(boolean showing, boolean secure, boolean occluded)102     public void notifyKeyguardState(boolean showing, boolean secure, boolean occluded) {
103         if (mShowing == showing && mSecure == secure && mOccluded == occluded) return;
104         mShowing = showing;
105         mSecure = secure;
106         mOccluded = occluded;
107         notifyKeyguardChanged();
108     }
109 
110     @Override
onTrustChanged(int userId)111     public void onTrustChanged(int userId) {
112         updateCanSkipBouncerState();
113         notifyKeyguardChanged();
114     }
115 
isDeviceInteractive()116     public boolean isDeviceInteractive() {
117         return mKeyguardUpdateMonitor.isDeviceInteractive();
118     }
119 
updateCanSkipBouncerState()120     private void updateCanSkipBouncerState() {
121         mCanSkipBouncer = mKeyguardUpdateMonitor.getUserCanSkipBouncer(mCurrentUser);
122     }
123 
notifyKeyguardChanged()124     private void notifyKeyguardChanged() {
125         // Copy the list to allow removal during callback.
126         new ArrayList<Callback>(mCallbacks).forEach(Callback::onKeyguardShowingChanged);
127     }
128 
notifyKeyguardFadingAway(long delay, long fadeoutDuration)129     public void notifyKeyguardFadingAway(long delay, long fadeoutDuration) {
130         mKeyguardFadingAway = true;
131         mKeyguardFadingAwayDelay = delay;
132         mKeyguardFadingAwayDuration = fadeoutDuration;
133     }
134 
notifyKeyguardDoneFading()135     public void notifyKeyguardDoneFading() {
136         mKeyguardFadingAway = false;
137         mKeyguardGoingAway = false;
138     }
139 
140     @Override
isKeyguardFadingAway()141     public boolean isKeyguardFadingAway() {
142         return mKeyguardFadingAway;
143     }
144 
145     @Override
isKeyguardGoingAway()146     public boolean isKeyguardGoingAway() {
147         return mKeyguardGoingAway;
148     }
149 
150     @Override
getKeyguardFadingAwayDelay()151     public long getKeyguardFadingAwayDelay() {
152         return mKeyguardFadingAwayDelay;
153     }
154 
155     @Override
getKeyguardFadingAwayDuration()156     public long getKeyguardFadingAwayDuration() {
157         return mKeyguardFadingAwayDuration;
158     }
159 
notifyKeyguardGoingAway(boolean keyguardGoingAway)160     public void notifyKeyguardGoingAway(boolean keyguardGoingAway) {
161         mKeyguardGoingAway = keyguardGoingAway;
162     }
163 }