blob: 63be102451a1626e2445c81ab6aa1c3e7f45ac9b [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 */
Jim Miller5ecd8112013-01-09 18:50:26 -080016package com.android.keyguard;
Jim Millerdcb3d842012-08-23 19:18:12 -070017
18import android.animation.ObjectAnimator;
Jim Millerd5428102013-08-29 18:58:21 -070019import android.app.ActivityManager;
Sandeep Siddhartha42c3e022013-08-26 20:58:53 -070020import android.app.PendingIntent;
Jim Millerdcb3d842012-08-23 19:18:12 -070021import android.app.SearchManager;
Jim Miller48b9b0d2012-09-19 23:16:50 -070022import android.app.admin.DevicePolicyManager;
Jim Millerdcb3d842012-08-23 19:18:12 -070023import android.content.ComponentName;
24import android.content.Context;
25import android.content.Intent;
Chris Wrenefbfa682012-11-07 19:18:46 -050026import android.graphics.drawable.Drawable;
Sandeep Siddhartha42c3e022013-08-26 20:58:53 -070027import android.os.Bundle;
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -070028import android.os.PowerManager;
Jim Millerdcb3d842012-08-23 19:18:12 -070029import android.os.UserHandle;
John Spurlockfafdb6f2012-10-09 18:30:11 -040030import android.provider.Settings;
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -070031import android.telephony.TelephonyManager;
Jim Millerdcb3d842012-08-23 19:18:12 -070032import android.util.AttributeSet;
33import android.util.Log;
34import android.util.Slog;
35import android.view.View;
Jim Millerdcb3d842012-08-23 19:18:12 -070036import android.widget.LinearLayout;
37
Jim Miller47df44a2012-09-06 17:51:12 -070038import com.android.internal.telephony.IccCardConstants.State;
Jim Millerdcb3d842012-08-23 19:18:12 -070039import com.android.internal.widget.LockPatternUtils;
40import com.android.internal.widget.multiwaveview.GlowPadView;
41import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
Jim Millerdcb3d842012-08-23 19:18:12 -070042
43public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
44 private static final boolean DEBUG = KeyguardHostView.DEBUG;
45 private static final String TAG = "SecuritySelectorView";
46 private static final String ASSIST_ICON_METADATA_NAME =
47 "com.android.systemui.action_assist_icon";
Jim Millerd5428102013-08-29 18:58:21 -070048
Jim Millerdcb3d842012-08-23 19:18:12 -070049 private KeyguardSecurityCallback mCallback;
50 private GlowPadView mGlowPadView;
Jim Millerdcb3d842012-08-23 19:18:12 -070051 private ObjectAnimator mAnim;
Jim Miller109f1fd2012-09-19 20:44:16 -070052 private View mFadeView;
Chris Wrenefbfa682012-11-07 19:18:46 -050053 private boolean mIsBouncing;
Jim Millerdcb3d842012-08-23 19:18:12 -070054 private boolean mCameraDisabled;
55 private boolean mSearchDisabled;
56 private LockPatternUtils mLockPatternUtils;
Chris Wrenefbfa682012-11-07 19:18:46 -050057 private SecurityMessageDisplay mSecurityMessageDisplay;
58 private Drawable mBouncerFrame;
Jim Millerdcb3d842012-08-23 19:18:12 -070059
60 OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
61
62 public void onTrigger(View v, int target) {
63 final int resId = mGlowPadView.getResourceIdForTarget(target);
Sandeep Siddhartha42c3e022013-08-26 20:58:53 -070064
Jim Millerdcb3d842012-08-23 19:18:12 -070065 switch (resId) {
Jim Miller5ecd8112013-01-09 18:50:26 -080066 case R.drawable.ic_action_assist_generic:
Jim Millerdcb3d842012-08-23 19:18:12 -070067 Intent assistIntent =
68 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -080069 .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
Jim Millerdcb3d842012-08-23 19:18:12 -070070 if (assistIntent != null) {
John Spurlock57f928f2012-11-02 13:09:25 -040071 mActivityLauncher.launchActivity(assistIntent, false, true, null, null);
Jim Millerdcb3d842012-08-23 19:18:12 -070072 } else {
73 Log.w(TAG, "Failed to get intent for assist activity");
74 }
75 mCallback.userActivity(0);
76 break;
77
Jim Miller5ecd8112013-01-09 18:50:26 -080078 case R.drawable.ic_lockscreen_camera:
John Spurlock57f928f2012-11-02 13:09:25 -040079 mActivityLauncher.launchCamera(null, null);
Jim Millerdcb3d842012-08-23 19:18:12 -070080 mCallback.userActivity(0);
81 break;
82
Jim Miller5ecd8112013-01-09 18:50:26 -080083 case R.drawable.ic_lockscreen_unlock_phantom:
84 case R.drawable.ic_lockscreen_unlock:
Jeff Brown3dc524b2012-09-30 19:49:11 -070085 mCallback.userActivity(0);
Jim Millerdcb3d842012-08-23 19:18:12 -070086 mCallback.dismiss(false);
87 break;
88 }
89 }
90
91 public void onReleased(View v, int handle) {
Chris Wrenefbfa682012-11-07 19:18:46 -050092 if (!mIsBouncing) {
93 doTransition(mFadeView, 1.0f);
94 }
Jim Millerdcb3d842012-08-23 19:18:12 -070095 }
96
97 public void onGrabbed(View v, int handle) {
Jeff Brown3dc524b2012-09-30 19:49:11 -070098 mCallback.userActivity(0);
Jim Miller109f1fd2012-09-19 20:44:16 -070099 doTransition(mFadeView, 0.0f);
Jim Millerdcb3d842012-08-23 19:18:12 -0700100 }
101
102 public void onGrabbedStateChange(View v, int handle) {
103
104 }
105
106 public void onFinishFinalAnimation() {
107
108 }
109
110 };
111
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700112 KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
Jim Millerdcb3d842012-08-23 19:18:12 -0700113
114 @Override
115 public void onDevicePolicyManagerStateChanged() {
116 updateTargets();
117 }
118
119 @Override
Jim Miller47df44a2012-09-06 17:51:12 -0700120 public void onSimStateChanged(State simState) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700121 updateTargets();
122 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700123 };
124
John Spurlockdcc96812012-10-25 14:35:19 -0400125 private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() {
126
127 @Override
128 KeyguardSecurityCallback getCallback() {
129 return mCallback;
130 }
131
132 @Override
133 LockPatternUtils getLockPatternUtils() {
134 return mLockPatternUtils;
135 }
136
137 @Override
138 Context getContext() {
139 return mContext;
140 }};
141
Jim Millerdcb3d842012-08-23 19:18:12 -0700142 public KeyguardSelectorView(Context context) {
143 this(context, null);
144 }
145
146 public KeyguardSelectorView(Context context, AttributeSet attrs) {
147 super(context, attrs);
148 mLockPatternUtils = new LockPatternUtils(getContext());
149 }
150
151 @Override
152 protected void onFinishInflate() {
153 super.onFinishInflate();
154 mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
155 mGlowPadView.setOnTriggerListener(mOnTriggerListener);
Jim Millerdcb3d842012-08-23 19:18:12 -0700156 updateTargets();
Chris Wrenefbfa682012-11-07 19:18:46 -0500157
158 mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
159 View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame);
160 mBouncerFrame = bouncerFrameView.getBackground();
Jim Millerdcb3d842012-08-23 19:18:12 -0700161 }
162
Jim Miller0ff7f012012-10-11 20:40:01 -0700163 public void setCarrierArea(View carrierArea) {
164 mFadeView = carrierArea;
165 }
166
Jim Millerdcb3d842012-08-23 19:18:12 -0700167 public boolean isTargetPresent(int resId) {
168 return mGlowPadView.getTargetPosition(resId) != -1;
169 }
170
Adam Cohen6fb841f2012-10-24 13:15:38 -0700171 @Override
172 public void showUsabilityHint() {
Adam Cohen0a8d3262012-10-03 13:50:55 -0700173 mGlowPadView.ping();
174 }
175
Jim Millerdcb3d842012-08-23 19:18:12 -0700176 private void updateTargets() {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700177 int currentUserHandle = mLockPatternUtils.getCurrentUser();
Jim Miller48b9b0d2012-09-19 23:16:50 -0700178 DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
179 int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
180 boolean secureCameraDisabled = mLockPatternUtils.isSecure()
181 && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
182 boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
183 || secureCameraDisabled;
Jim Millerdcb3d842012-08-23 19:18:12 -0700184 final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
185 boolean disabledBySimState = monitor.isSimLocked();
186 boolean cameraTargetPresent =
Jim Miller5ecd8112013-01-09 18:50:26 -0800187 isTargetPresent(R.drawable.ic_lockscreen_camera);
Jim Millerdcb3d842012-08-23 19:18:12 -0700188 boolean searchTargetPresent =
Jim Miller5ecd8112013-01-09 18:50:26 -0800189 isTargetPresent(R.drawable.ic_action_assist_generic);
Jim Millerdcb3d842012-08-23 19:18:12 -0700190
Jim Miller48b9b0d2012-09-19 23:16:50 -0700191 if (cameraDisabledByAdmin) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700192 Log.v(TAG, "Camera disabled by Device Policy");
193 } else if (disabledBySimState) {
194 Log.v(TAG, "Camera disabled by Sim State");
195 }
John Spurlockfafdb6f2012-10-09 18:30:11 -0400196 boolean currentUserSetup = 0 != Settings.Secure.getIntForUser(
197 mContext.getContentResolver(),
198 Settings.Secure.USER_SETUP_COMPLETE,
199 0 /*default */,
200 currentUserHandle);
Jim Millerdcb3d842012-08-23 19:18:12 -0700201 boolean searchActionAvailable =
202 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800203 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
John Spurlockfafdb6f2012-10-09 18:30:11 -0400204 mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent
205 || !currentUserSetup;
206 mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent
207 || !currentUserSetup;
Jim Millerdcb3d842012-08-23 19:18:12 -0700208 updateResources();
209 }
210
211 public void updateResources() {
212 // Update the search icon with drawable from the search .apk
213 if (!mSearchDisabled) {
214 Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800215 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT);
Jim Millerdcb3d842012-08-23 19:18:12 -0700216 if (intent != null) {
217 // XXX Hack. We need to substitute the icon here but haven't formalized
218 // the public API. The "_google" metadata will be going away, so
219 // DON'T USE IT!
220 ComponentName component = intent.getComponent();
221 boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
Jim Miller5ecd8112013-01-09 18:50:26 -0800222 ASSIST_ICON_METADATA_NAME + "_google", R.drawable.ic_action_assist_generic);
Jim Millerdcb3d842012-08-23 19:18:12 -0700223
224 if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
Jim Miller5ecd8112013-01-09 18:50:26 -0800225 ASSIST_ICON_METADATA_NAME, R.drawable.ic_action_assist_generic)) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700226 Slog.w(TAG, "Couldn't grab icon from package " + component);
227 }
228 }
229 }
230
Jim Miller5ecd8112013-01-09 18:50:26 -0800231 mGlowPadView.setEnableTarget(R.drawable.ic_lockscreen_camera, !mCameraDisabled);
232 mGlowPadView.setEnableTarget(R.drawable.ic_action_assist_generic, !mSearchDisabled);
Jim Millerdcb3d842012-08-23 19:18:12 -0700233 }
234
Jim Miller109f1fd2012-09-19 20:44:16 -0700235 void doTransition(View view, float to) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700236 if (mAnim != null) {
237 mAnim.cancel();
238 }
Jim Miller109f1fd2012-09-19 20:44:16 -0700239 mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
Jim Millerdcb3d842012-08-23 19:18:12 -0700240 mAnim.start();
241 }
242
243 public void setKeyguardCallback(KeyguardSecurityCallback callback) {
244 mCallback = callback;
245 }
246
247 public void setLockPatternUtils(LockPatternUtils utils) {
248 mLockPatternUtils = utils;
249 }
250
Jim Millerdcb3d842012-08-23 19:18:12 -0700251 @Override
252 public void reset() {
253 mGlowPadView.reset(false);
254 }
255
256 @Override
257 public boolean needsInput() {
258 return false;
259 }
260
261 @Override
262 public void onPause() {
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700263 KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mUpdateCallback);
Jim Millerdcb3d842012-08-23 19:18:12 -0700264 }
265
266 @Override
Chris Wrena042ac92012-11-07 11:37:06 -0500267 public void onResume(int reason) {
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700268 KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mUpdateCallback);
Jim Millerdcb3d842012-08-23 19:18:12 -0700269 }
270
271 @Override
272 public KeyguardSecurityCallback getCallback() {
273 return mCallback;
274 }
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500275
276 @Override
277 public void showBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500278 mIsBouncing = true;
279 KeyguardSecurityViewHelper.
280 showBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500281 }
282
283 @Override
284 public void hideBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500285 mIsBouncing = false;
286 KeyguardSecurityViewHelper.
287 hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500288 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700289}