KeyguardServiceDelegate.java revision 5ecd81154fa039961f65bb4e36d18ac555b0d1d6
1package com.android.internal.policy.impl.keyguard; 2 3import android.content.ComponentName; 4import android.content.Context; 5import android.content.Intent; 6import android.content.ServiceConnection; 7import android.os.Bundle; 8import android.os.IBinder; 9import android.os.RemoteException; 10import android.os.UserHandle; 11import android.util.Log; 12import android.util.Slog; 13import android.view.WindowManagerPolicy.OnKeyguardExitResult; 14 15import com.android.internal.policy.IKeyguardResult; 16import com.android.internal.policy.IKeyguardService; 17import com.android.internal.widget.LockPatternUtils; 18import com.android.internal.policy.impl.KeyguardServiceWrapper; 19import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate.ShowListener; 20 21/** 22 * A local class that keeps a cache of keyguard state that can be restored in the event 23 * keyguard crashes. It currently also allows runtime-selectable 24 * local or remote instances of keyguard. 25 */ 26public class KeyguardServiceDelegate { 27 private static final String KEYGUARD_PACKAGE = "com.android.keyguard"; 28 private static final String KEYGUARD_CLASS = "com.android.keyguard.KeyguardService"; 29 private static final String TAG = "KeyguardServiceDelegate"; 30 private final static boolean DEBUG = true; 31 private ServiceConnection mKeyguardConnection; 32 protected KeyguardServiceWrapper mKeyguardService; 33 private KeyguardState mKeyguardState = new KeyguardState(); 34 35 /* package */ class KeyguardState { 36 boolean showing; 37 boolean showingAndNotHidden; 38 boolean inputRestricted; 39 boolean hidden; 40 boolean secure; 41 boolean dreaming; 42 boolean systemIsReady; 43 public boolean enabled; 44 public boolean dismissable; 45 public int offReason; 46 public int currentUser; 47 public boolean screenIsOn; 48 public boolean restoreStateWhenConnected; 49 public ShowListener showListener; 50 }; 51 52 public interface ShowListener { 53 public void onShown(IBinder windowToken); 54 } 55 56 private class KeyguardResult extends IKeyguardResult.Stub { 57 private ShowListener mShowListener; 58 private OnKeyguardExitResult mOnKeyguardExitResult; 59 60 KeyguardResult(ShowListener showListener, OnKeyguardExitResult onKeyguardExitResult) { 61 mShowListener = showListener; 62 mOnKeyguardExitResult = onKeyguardExitResult; 63 } 64 65 @Override 66 public IBinder asBinder() { 67 if (DEBUG) Log.v(TAG, "asBinder() called for KeyguardResult, " 68 + "mShowListener = " + mShowListener 69 + ", mOnKeyguardExitResult = " + mOnKeyguardExitResult); 70 return super.asBinder(); 71 } 72 73 @Override 74 public void onShown(IBinder windowToken) throws RemoteException { 75 if (DEBUG) Log.v(TAG, "**** SHOWN CALLED ****"); 76 if (mShowListener != null) { 77 mShowListener.onShown(windowToken); 78 } 79 } 80 81 @Override 82 public void onKeyguardExitResult(boolean success) throws RemoteException { 83 if (DEBUG) Log.v(TAG, "**** onKeyguardExitResult(" + success +") CALLED ****"); 84 if (mOnKeyguardExitResult != null) { 85 mOnKeyguardExitResult.onKeyguardExitResult(success); 86 } 87 } 88 }; 89 90 public KeyguardServiceDelegate(Context context, LockPatternUtils lockPatternUtils) { 91 mKeyguardConnection = createServiceConnection(); 92 Intent intent = new Intent(); 93 intent.setClassName(KEYGUARD_PACKAGE, KEYGUARD_CLASS); 94 if (!context.bindServiceAsUser(intent, mKeyguardConnection, 95 Context.BIND_AUTO_CREATE, UserHandle.OWNER)) { 96 if (DEBUG) Log.v(TAG, "*** Keyguard: can't bind to " + KEYGUARD_CLASS); 97 } else { 98 if (DEBUG) Log.v(TAG, "*** Keyguard started"); 99 } 100 } 101 102 private ServiceConnection createServiceConnection() { 103 return new ServiceConnection() { 104 105 @Override 106 public void onServiceConnected(ComponentName name, IBinder service) { 107 if (DEBUG) Log.v(TAG, "*** Keyguard connected (yay!)"); 108 mKeyguardService = new KeyguardServiceWrapper( 109 IKeyguardService.Stub.asInterface(service)); 110 if (mKeyguardState.systemIsReady) { 111 mKeyguardService.onSystemReady(); 112 } 113 } 114 115 @Override 116 public void onServiceDisconnected(ComponentName name) { 117 if (DEBUG) Log.v(TAG, "*** Keyguard disconnected (boo!)"); 118 mKeyguardService = null; 119 } 120 121 }; 122 } 123 124 public boolean isShowing() { 125 if (mKeyguardService != null) { 126 mKeyguardState.showing = mKeyguardService.isShowing(); 127 } 128 return mKeyguardState.showing; 129 } 130 131 public boolean isShowingAndNotHidden() { 132 if (mKeyguardService != null) { 133 mKeyguardState.showingAndNotHidden = mKeyguardService.isShowingAndNotHidden(); 134 } 135 return mKeyguardState.showingAndNotHidden; 136 } 137 138 public boolean isInputRestricted() { 139 if (mKeyguardService != null) { 140 mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted(); 141 } 142 return mKeyguardState.inputRestricted; 143 } 144 145 public void verifyUnlock(final OnKeyguardExitResult onKeyguardExitResult) { 146 if (mKeyguardService != null) { 147 mKeyguardService.verifyUnlock(new KeyguardResult(null, onKeyguardExitResult)); 148 } 149 } 150 151 public void keyguardDone(boolean authenticated, boolean wakeup) { 152 if (mKeyguardService != null) { 153 mKeyguardService.keyguardDone(authenticated, wakeup); 154 } 155 } 156 157 public void setHidden(boolean isHidden) { 158 if (mKeyguardService != null) { 159 mKeyguardService.setHidden(isHidden); 160 } 161 mKeyguardState.hidden = isHidden; 162 } 163 164 public void dismiss() { 165 if (mKeyguardService != null) { 166 mKeyguardService.dismiss(); 167 } 168 } 169 170 public boolean isSecure() { 171 if (mKeyguardService != null) { 172 mKeyguardState.secure = mKeyguardService.isSecure(); 173 } 174 return mKeyguardState.secure; 175 } 176 177 public void onWakeKeyWhenKeyguardShowingTq(int keycodePower) { 178 if (mKeyguardService != null) { 179 mKeyguardService.onWakeKeyWhenKeyguardShowingTq(keycodePower); 180 } 181 } 182 183 public void onWakeMotionWhenKeyguardShowingTq() { 184 if (mKeyguardService != null) { 185 mKeyguardService.onWakeMotionWhenKeyguardShowingTq(); 186 } 187 } 188 189 public void onDreamingStarted() { 190 if (mKeyguardService != null) { 191 mKeyguardService.onDreamingStarted(); 192 } 193 mKeyguardState.dreaming = true; 194 } 195 196 public void onDreamingStopped() { 197 if (mKeyguardService != null) { 198 mKeyguardService.onDreamingStopped(); 199 } 200 mKeyguardState.dreaming = false; 201 } 202 203 public void onScreenTurnedOn(final ShowListener showListener) { 204 if (mKeyguardService != null) { 205 if (DEBUG) Log.v(TAG, "onScreenTurnedOn(showListener = " + showListener + ")"); 206 mKeyguardService.onScreenTurnedOn(new KeyguardResult(showListener, null)); 207 } else { 208 // try again when we establish a connection 209 if (DEBUG) Log.w(TAG, "onScreenTurnedOn(): no keyguard service!"); 210 mKeyguardState.showListener = showListener; 211 mKeyguardState.restoreStateWhenConnected = true; 212 } 213 mKeyguardState.screenIsOn = true; 214 } 215 216 public void onScreenTurnedOff(int why) { 217 if (mKeyguardService != null) { 218 mKeyguardService.onScreenTurnedOff(why); 219 } 220 mKeyguardState.offReason = why; 221 mKeyguardState.screenIsOn = false; 222 } 223 224 public void setKeyguardEnabled(boolean enabled) { 225 if (mKeyguardService != null) { 226 mKeyguardService.setKeyguardEnabled(enabled); 227 } 228 mKeyguardState.enabled = enabled; 229 } 230 231 public boolean isDismissable() { 232 if (mKeyguardService != null) { 233 mKeyguardState.dismissable = mKeyguardService.isDismissable(); 234 } 235 return mKeyguardState.dismissable; 236 } 237 238 public void onSystemReady() { 239 if (mKeyguardService != null) { 240 mKeyguardService.onSystemReady(); 241 } else { 242 if (DEBUG) Log.v(TAG, "onSystemReady() called before keyguard service was ready"); 243 mKeyguardState.systemIsReady = true; 244 } 245 } 246 247 public void doKeyguardTimeout(Bundle options) { 248 if (mKeyguardService != null) { 249 mKeyguardService.doKeyguardTimeout(options); 250 } 251 } 252 253 public void showAssistant() { 254 if (mKeyguardService != null) { 255 mKeyguardService.showAssistant(); 256 } 257 } 258 259 public void setCurrentUser(int newUserId) { 260 if (mKeyguardService != null) { 261 mKeyguardService.setCurrentUser(newUserId); 262 } 263 mKeyguardState.currentUser = newUserId; 264 } 265 266 public void userActivity() { 267 if (mKeyguardService != null) { 268 mKeyguardService.userActivity(); 269 } 270 } 271 272} 273