blob: 97aec689ef74164ddcf2bf7d6cabcc6c2d53a3bf [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 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;
Jim Millerdcb3d842012-08-23 19:18:12 -070037
38public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
39 private static final boolean DEBUG = KeyguardHostView.DEBUG;
40 private static final String TAG = "SecuritySelectorView";
41 private static final String ASSIST_ICON_METADATA_NAME =
42 "com.android.systemui.action_assist_icon";
Jim Millerd5428102013-08-29 18:58:21 -070043
Jim Millerdcb3d842012-08-23 19:18:12 -070044 private KeyguardSecurityCallback mCallback;
45 private GlowPadView mGlowPadView;
Jim Millerdcb3d842012-08-23 19:18:12 -070046 private ObjectAnimator mAnim;
Jim Miller109f1fd2012-09-19 20:44:16 -070047 private View mFadeView;
Chris Wrenefbfa682012-11-07 19:18:46 -050048 private boolean mIsBouncing;
Jim Millerdcb3d842012-08-23 19:18:12 -070049 private boolean mCameraDisabled;
50 private boolean mSearchDisabled;
51 private LockPatternUtils mLockPatternUtils;
Chris Wrenefbfa682012-11-07 19:18:46 -050052 private SecurityMessageDisplay mSecurityMessageDisplay;
53 private Drawable mBouncerFrame;
Jim Millerdcb3d842012-08-23 19:18:12 -070054
55 OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
56
57 public void onTrigger(View v, int target) {
58 final int resId = mGlowPadView.getResourceIdForTarget(target);
Sandeep Siddhartha42c3e022013-08-26 20:58:53 -070059
Jim Millerdcb3d842012-08-23 19:18:12 -070060 switch (resId) {
Jim Miller5ecd8112013-01-09 18:50:26 -080061 case R.drawable.ic_lockscreen_unlock_phantom:
62 case R.drawable.ic_lockscreen_unlock:
Jeff Brown3dc524b2012-09-30 19:49:11 -070063 mCallback.userActivity(0);
Jim Millerdcb3d842012-08-23 19:18:12 -070064 mCallback.dismiss(false);
65 break;
66 }
67 }
68
69 public void onReleased(View v, int handle) {
Chris Wrenefbfa682012-11-07 19:18:46 -050070 if (!mIsBouncing) {
71 doTransition(mFadeView, 1.0f);
72 }
Jim Millerdcb3d842012-08-23 19:18:12 -070073 }
74
75 public void onGrabbed(View v, int handle) {
Jeff Brown3dc524b2012-09-30 19:49:11 -070076 mCallback.userActivity(0);
Jim Miller109f1fd2012-09-19 20:44:16 -070077 doTransition(mFadeView, 0.0f);
Jim Millerdcb3d842012-08-23 19:18:12 -070078 }
79
80 public void onGrabbedStateChange(View v, int handle) {
81
82 }
83
84 public void onFinishFinalAnimation() {
85
86 }
87
88 };
89
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -070090 KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
Jim Millerdcb3d842012-08-23 19:18:12 -070091
92 @Override
93 public void onDevicePolicyManagerStateChanged() {
94 updateTargets();
95 }
96
97 @Override
Jim Miller47df44a2012-09-06 17:51:12 -070098 public void onSimStateChanged(State simState) {
Jim Millerdcb3d842012-08-23 19:18:12 -070099 updateTargets();
100 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700101 };
102
103 public KeyguardSelectorView(Context context) {
104 this(context, null);
105 }
106
107 public KeyguardSelectorView(Context context, AttributeSet attrs) {
108 super(context, attrs);
109 mLockPatternUtils = new LockPatternUtils(getContext());
110 }
111
112 @Override
113 protected void onFinishInflate() {
114 super.onFinishInflate();
115 mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
116 mGlowPadView.setOnTriggerListener(mOnTriggerListener);
Jim Millerdcb3d842012-08-23 19:18:12 -0700117 updateTargets();
Chris Wrenefbfa682012-11-07 19:18:46 -0500118
119 mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
120 View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame);
121 mBouncerFrame = bouncerFrameView.getBackground();
Jim Millerdcb3d842012-08-23 19:18:12 -0700122 }
123
Jim Miller0ff7f012012-10-11 20:40:01 -0700124 public void setCarrierArea(View carrierArea) {
125 mFadeView = carrierArea;
126 }
127
Jim Millerdcb3d842012-08-23 19:18:12 -0700128 public boolean isTargetPresent(int resId) {
129 return mGlowPadView.getTargetPosition(resId) != -1;
130 }
131
Adam Cohen6fb841f2012-10-24 13:15:38 -0700132 @Override
133 public void showUsabilityHint() {
Adam Cohen0a8d3262012-10-03 13:50:55 -0700134 mGlowPadView.ping();
135 }
136
Jim Millerdcb3d842012-08-23 19:18:12 -0700137 private void updateTargets() {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700138 int currentUserHandle = mLockPatternUtils.getCurrentUser();
Jim Miller48b9b0d2012-09-19 23:16:50 -0700139 DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
140 int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
141 boolean secureCameraDisabled = mLockPatternUtils.isSecure()
142 && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
143 boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
144 || secureCameraDisabled;
Jim Millerdcb3d842012-08-23 19:18:12 -0700145 final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
146 boolean disabledBySimState = monitor.isSimLocked();
147 boolean cameraTargetPresent =
Jim Miller5ecd8112013-01-09 18:50:26 -0800148 isTargetPresent(R.drawable.ic_lockscreen_camera);
Jim Millerdcb3d842012-08-23 19:18:12 -0700149 boolean searchTargetPresent =
Jim Miller5ecd8112013-01-09 18:50:26 -0800150 isTargetPresent(R.drawable.ic_action_assist_generic);
Jim Millerdcb3d842012-08-23 19:18:12 -0700151
Jim Miller48b9b0d2012-09-19 23:16:50 -0700152 if (cameraDisabledByAdmin) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700153 Log.v(TAG, "Camera disabled by Device Policy");
154 } else if (disabledBySimState) {
155 Log.v(TAG, "Camera disabled by Sim State");
156 }
John Spurlockfafdb6f2012-10-09 18:30:11 -0400157 boolean currentUserSetup = 0 != Settings.Secure.getIntForUser(
158 mContext.getContentResolver(),
159 Settings.Secure.USER_SETUP_COMPLETE,
160 0 /*default */,
161 currentUserHandle);
Jim Millerdcb3d842012-08-23 19:18:12 -0700162 boolean searchActionAvailable =
163 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800164 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
John Spurlockfafdb6f2012-10-09 18:30:11 -0400165 mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent
166 || !currentUserSetup;
167 mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent
168 || !currentUserSetup;
Jim Millerdcb3d842012-08-23 19:18:12 -0700169 updateResources();
170 }
171
172 public void updateResources() {
173 // Update the search icon with drawable from the search .apk
174 if (!mSearchDisabled) {
175 Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800176 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT);
Jim Millerdcb3d842012-08-23 19:18:12 -0700177 if (intent != null) {
178 // XXX Hack. We need to substitute the icon here but haven't formalized
179 // the public API. The "_google" metadata will be going away, so
180 // DON'T USE IT!
181 ComponentName component = intent.getComponent();
182 boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
Jim Miller5ecd8112013-01-09 18:50:26 -0800183 ASSIST_ICON_METADATA_NAME + "_google", R.drawable.ic_action_assist_generic);
Jim Millerdcb3d842012-08-23 19:18:12 -0700184
185 if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
Jim Miller5ecd8112013-01-09 18:50:26 -0800186 ASSIST_ICON_METADATA_NAME, R.drawable.ic_action_assist_generic)) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700187 Slog.w(TAG, "Couldn't grab icon from package " + component);
188 }
189 }
190 }
191
Jim Miller5ecd8112013-01-09 18:50:26 -0800192 mGlowPadView.setEnableTarget(R.drawable.ic_lockscreen_camera, !mCameraDisabled);
193 mGlowPadView.setEnableTarget(R.drawable.ic_action_assist_generic, !mSearchDisabled);
Jim Millerdcb3d842012-08-23 19:18:12 -0700194 }
195
Jim Miller109f1fd2012-09-19 20:44:16 -0700196 void doTransition(View view, float to) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700197 if (mAnim != null) {
198 mAnim.cancel();
199 }
Jim Miller109f1fd2012-09-19 20:44:16 -0700200 mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
Jim Millerdcb3d842012-08-23 19:18:12 -0700201 mAnim.start();
202 }
203
204 public void setKeyguardCallback(KeyguardSecurityCallback callback) {
205 mCallback = callback;
206 }
207
208 public void setLockPatternUtils(LockPatternUtils utils) {
209 mLockPatternUtils = utils;
210 }
211
Jim Millerdcb3d842012-08-23 19:18:12 -0700212 @Override
213 public void reset() {
214 mGlowPadView.reset(false);
215 }
216
217 @Override
218 public boolean needsInput() {
219 return false;
220 }
221
222 @Override
223 public void onPause() {
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700224 KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mUpdateCallback);
Jim Millerdcb3d842012-08-23 19:18:12 -0700225 }
226
227 @Override
Chris Wrena042ac92012-11-07 11:37:06 -0500228 public void onResume(int reason) {
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700229 KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mUpdateCallback);
Jim Millerdcb3d842012-08-23 19:18:12 -0700230 }
231
232 @Override
233 public KeyguardSecurityCallback getCallback() {
234 return mCallback;
235 }
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500236
237 @Override
238 public void showBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500239 mIsBouncing = true;
240 KeyguardSecurityViewHelper.
241 showBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500242 }
243
244 @Override
245 public void hideBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500246 mIsBouncing = false;
247 KeyguardSecurityViewHelper.
248 hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500249 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700250}