blob: 68590422fd007ab22ba673744634c3761d24e1e5 [file] [log] [blame]
Jim Millerdcb3d842012-08-23 19:18:12 -07001/*
2 * Copyright (C) 2012 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 */
16package com.android.internal.policy.impl.keyguard;
17
18import android.animation.ObjectAnimator;
Jim Millerdcb3d842012-08-23 19:18:12 -070019import android.app.SearchManager;
Jim Miller48b9b0d2012-09-19 23:16:50 -070020import android.app.admin.DevicePolicyManager;
Jim Millerdcb3d842012-08-23 19:18:12 -070021import android.content.ComponentName;
22import android.content.Context;
23import android.content.Intent;
Chris Wrenefbfa682012-11-07 19:18:46 -050024import android.graphics.drawable.Drawable;
Jim Millerdcb3d842012-08-23 19:18:12 -070025import android.os.UserHandle;
John Spurlockfafdb6f2012-10-09 18:30:11 -040026import android.provider.Settings;
Jim Millerdcb3d842012-08-23 19:18:12 -070027import android.util.AttributeSet;
28import android.util.Log;
29import android.util.Slog;
30import android.view.View;
Jim Millerdcb3d842012-08-23 19:18:12 -070031import android.widget.LinearLayout;
32
Jim Miller47df44a2012-09-06 17:51:12 -070033import com.android.internal.telephony.IccCardConstants.State;
Jim Millerdcb3d842012-08-23 19:18:12 -070034import com.android.internal.widget.LockPatternUtils;
35import com.android.internal.widget.multiwaveview.GlowPadView;
36import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
37import com.android.internal.R;
38
39public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
40 private static final boolean DEBUG = KeyguardHostView.DEBUG;
41 private static final String TAG = "SecuritySelectorView";
42 private static final String ASSIST_ICON_METADATA_NAME =
43 "com.android.systemui.action_assist_icon";
Jim Miller47df44a2012-09-06 17:51:12 -070044
Jim Millerdcb3d842012-08-23 19:18:12 -070045 private KeyguardSecurityCallback mCallback;
46 private GlowPadView mGlowPadView;
Jim Millerdcb3d842012-08-23 19:18:12 -070047 private ObjectAnimator mAnim;
Jim Miller109f1fd2012-09-19 20:44:16 -070048 private View mFadeView;
Chris Wrenefbfa682012-11-07 19:18:46 -050049 private boolean mIsBouncing;
Jim Millerdcb3d842012-08-23 19:18:12 -070050 private boolean mCameraDisabled;
51 private boolean mSearchDisabled;
52 private LockPatternUtils mLockPatternUtils;
Chris Wrenefbfa682012-11-07 19:18:46 -050053 private SecurityMessageDisplay mSecurityMessageDisplay;
54 private Drawable mBouncerFrame;
Jim Millerdcb3d842012-08-23 19:18:12 -070055
56 OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
57
58 public void onTrigger(View v, int target) {
59 final int resId = mGlowPadView.getResourceIdForTarget(target);
60 switch (resId) {
61 case com.android.internal.R.drawable.ic_action_assist_generic:
62 Intent assistIntent =
63 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -080064 .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
Jim Millerdcb3d842012-08-23 19:18:12 -070065 if (assistIntent != null) {
John Spurlock57f928f2012-11-02 13:09:25 -040066 mActivityLauncher.launchActivity(assistIntent, false, true, null, null);
Jim Millerdcb3d842012-08-23 19:18:12 -070067 } else {
68 Log.w(TAG, "Failed to get intent for assist activity");
69 }
70 mCallback.userActivity(0);
71 break;
72
73 case com.android.internal.R.drawable.ic_lockscreen_camera:
John Spurlock57f928f2012-11-02 13:09:25 -040074 mActivityLauncher.launchCamera(null, null);
Jim Millerdcb3d842012-08-23 19:18:12 -070075 mCallback.userActivity(0);
76 break;
77
78 case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
79 case com.android.internal.R.drawable.ic_lockscreen_unlock:
Jeff Brown3dc524b2012-09-30 19:49:11 -070080 mCallback.userActivity(0);
Jim Millerdcb3d842012-08-23 19:18:12 -070081 mCallback.dismiss(false);
82 break;
83 }
84 }
85
86 public void onReleased(View v, int handle) {
Chris Wrenefbfa682012-11-07 19:18:46 -050087 if (!mIsBouncing) {
88 doTransition(mFadeView, 1.0f);
89 }
Jim Millerdcb3d842012-08-23 19:18:12 -070090 }
91
92 public void onGrabbed(View v, int handle) {
Jeff Brown3dc524b2012-09-30 19:49:11 -070093 mCallback.userActivity(0);
Jim Miller109f1fd2012-09-19 20:44:16 -070094 doTransition(mFadeView, 0.0f);
Jim Millerdcb3d842012-08-23 19:18:12 -070095 }
96
97 public void onGrabbedStateChange(View v, int handle) {
98
99 }
100
101 public void onFinishFinalAnimation() {
102
103 }
104
105 };
106
Jim Miller47df44a2012-09-06 17:51:12 -0700107 KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
Jim Millerdcb3d842012-08-23 19:18:12 -0700108
109 @Override
110 public void onDevicePolicyManagerStateChanged() {
111 updateTargets();
112 }
113
114 @Override
Jim Miller47df44a2012-09-06 17:51:12 -0700115 public void onSimStateChanged(State simState) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700116 updateTargets();
117 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700118 };
119
John Spurlockdcc96812012-10-25 14:35:19 -0400120 private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() {
121
122 @Override
123 KeyguardSecurityCallback getCallback() {
124 return mCallback;
125 }
126
127 @Override
128 LockPatternUtils getLockPatternUtils() {
129 return mLockPatternUtils;
130 }
131
132 @Override
133 Context getContext() {
134 return mContext;
135 }};
136
Jim Millerdcb3d842012-08-23 19:18:12 -0700137 public KeyguardSelectorView(Context context) {
138 this(context, null);
139 }
140
141 public KeyguardSelectorView(Context context, AttributeSet attrs) {
142 super(context, attrs);
143 mLockPatternUtils = new LockPatternUtils(getContext());
144 }
145
146 @Override
147 protected void onFinishInflate() {
148 super.onFinishInflate();
149 mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
150 mGlowPadView.setOnTriggerListener(mOnTriggerListener);
Jim Millerdcb3d842012-08-23 19:18:12 -0700151 updateTargets();
Chris Wrenefbfa682012-11-07 19:18:46 -0500152
153 mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
154 View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame);
155 mBouncerFrame = bouncerFrameView.getBackground();
Jim Millerdcb3d842012-08-23 19:18:12 -0700156 }
157
Jim Miller0ff7f012012-10-11 20:40:01 -0700158 public void setCarrierArea(View carrierArea) {
159 mFadeView = carrierArea;
160 }
161
Jim Millerdcb3d842012-08-23 19:18:12 -0700162 public boolean isTargetPresent(int resId) {
163 return mGlowPadView.getTargetPosition(resId) != -1;
164 }
165
Adam Cohen6fb841f2012-10-24 13:15:38 -0700166 @Override
167 public void showUsabilityHint() {
Adam Cohen0a8d3262012-10-03 13:50:55 -0700168 mGlowPadView.ping();
169 }
170
Jim Millerdcb3d842012-08-23 19:18:12 -0700171 private void updateTargets() {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700172 int currentUserHandle = mLockPatternUtils.getCurrentUser();
Jim Miller48b9b0d2012-09-19 23:16:50 -0700173 DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
174 int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
175 boolean secureCameraDisabled = mLockPatternUtils.isSecure()
176 && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
177 boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
178 || secureCameraDisabled;
Jim Millerdcb3d842012-08-23 19:18:12 -0700179 final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
180 boolean disabledBySimState = monitor.isSimLocked();
181 boolean cameraTargetPresent =
182 isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera);
183 boolean searchTargetPresent =
184 isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic);
185
Jim Miller48b9b0d2012-09-19 23:16:50 -0700186 if (cameraDisabledByAdmin) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700187 Log.v(TAG, "Camera disabled by Device Policy");
188 } else if (disabledBySimState) {
189 Log.v(TAG, "Camera disabled by Sim State");
190 }
John Spurlockfafdb6f2012-10-09 18:30:11 -0400191 boolean currentUserSetup = 0 != Settings.Secure.getIntForUser(
192 mContext.getContentResolver(),
193 Settings.Secure.USER_SETUP_COMPLETE,
194 0 /*default */,
195 currentUserHandle);
Jim Millerdcb3d842012-08-23 19:18:12 -0700196 boolean searchActionAvailable =
197 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800198 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
John Spurlockfafdb6f2012-10-09 18:30:11 -0400199 mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent
200 || !currentUserSetup;
201 mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent
202 || !currentUserSetup;
Jim Millerdcb3d842012-08-23 19:18:12 -0700203 updateResources();
204 }
205
206 public void updateResources() {
207 // Update the search icon with drawable from the search .apk
208 if (!mSearchDisabled) {
209 Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800210 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT);
Jim Millerdcb3d842012-08-23 19:18:12 -0700211 if (intent != null) {
212 // XXX Hack. We need to substitute the icon here but haven't formalized
213 // the public API. The "_google" metadata will be going away, so
214 // DON'T USE IT!
215 ComponentName component = intent.getComponent();
216 boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
217 ASSIST_ICON_METADATA_NAME + "_google",
218 com.android.internal.R.drawable.ic_action_assist_generic);
219
220 if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
221 ASSIST_ICON_METADATA_NAME,
222 com.android.internal.R.drawable.ic_action_assist_generic)) {
223 Slog.w(TAG, "Couldn't grab icon from package " + component);
224 }
225 }
226 }
227
228 mGlowPadView.setEnableTarget(com.android.internal.R.drawable
229 .ic_lockscreen_camera, !mCameraDisabled);
230 mGlowPadView.setEnableTarget(com.android.internal.R.drawable
231 .ic_action_assist_generic, !mSearchDisabled);
232 }
233
Jim Miller109f1fd2012-09-19 20:44:16 -0700234 void doTransition(View view, float to) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700235 if (mAnim != null) {
236 mAnim.cancel();
237 }
Jim Miller109f1fd2012-09-19 20:44:16 -0700238 mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
Jim Millerdcb3d842012-08-23 19:18:12 -0700239 mAnim.start();
240 }
241
242 public void setKeyguardCallback(KeyguardSecurityCallback callback) {
243 mCallback = callback;
244 }
245
246 public void setLockPatternUtils(LockPatternUtils utils) {
247 mLockPatternUtils = utils;
248 }
249
Jim Millerdcb3d842012-08-23 19:18:12 -0700250 @Override
251 public void reset() {
252 mGlowPadView.reset(false);
253 }
254
255 @Override
256 public boolean needsInput() {
257 return false;
258 }
259
260 @Override
261 public void onPause() {
262 KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback);
263 }
264
265 @Override
Chris Wrena042ac92012-11-07 11:37:06 -0500266 public void onResume(int reason) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700267 KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
268 }
269
270 @Override
271 public KeyguardSecurityCallback getCallback() {
272 return mCallback;
273 }
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500274
275 @Override
276 public void showBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500277 mIsBouncing = true;
278 KeyguardSecurityViewHelper.
279 showBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500280 }
281
282 @Override
283 public void hideBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500284 mIsBouncing = false;
285 KeyguardSecurityViewHelper.
286 hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500287 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700288}