blob: 03e7b075c8332934e3bc11e2899b6bb8493bd7ab [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 {
Jim Millerdcb3d842012-08-23 19:18:12 -070039 private static final String TAG = "SecuritySelectorView";
40 private static final String ASSIST_ICON_METADATA_NAME =
41 "com.android.systemui.action_assist_icon";
Jim Millerd5428102013-08-29 18:58:21 -070042
Jim Millerdcb3d842012-08-23 19:18:12 -070043 private KeyguardSecurityCallback mCallback;
44 private GlowPadView mGlowPadView;
Jim Millerdcb3d842012-08-23 19:18:12 -070045 private ObjectAnimator mAnim;
Jim Miller109f1fd2012-09-19 20:44:16 -070046 private View mFadeView;
Chris Wrenefbfa682012-11-07 19:18:46 -050047 private boolean mIsBouncing;
Jim Millerdcb3d842012-08-23 19:18:12 -070048 private boolean mCameraDisabled;
49 private boolean mSearchDisabled;
50 private LockPatternUtils mLockPatternUtils;
Chris Wrenefbfa682012-11-07 19:18:46 -050051 private SecurityMessageDisplay mSecurityMessageDisplay;
52 private Drawable mBouncerFrame;
Jim Millerdcb3d842012-08-23 19:18:12 -070053
54 OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
55
56 public void onTrigger(View v, int target) {
57 final int resId = mGlowPadView.getResourceIdForTarget(target);
Sandeep Siddhartha42c3e022013-08-26 20:58:53 -070058
Jorim Jaggi380ecb82014-03-14 17:25:20 +010059 if (resId == R.drawable.ic_lockscreen_unlock_phantom
60 || resId == R.drawable.ic_lockscreen_unlock) {
61 mCallback.userActivity(0);
62 mCallback.dismiss(false);
Jim Millerdcb3d842012-08-23 19:18:12 -070063 }
64 }
65
66 public void onReleased(View v, int handle) {
Chris Wrenefbfa682012-11-07 19:18:46 -050067 if (!mIsBouncing) {
68 doTransition(mFadeView, 1.0f);
69 }
Jim Millerdcb3d842012-08-23 19:18:12 -070070 }
71
72 public void onGrabbed(View v, int handle) {
Jeff Brown3dc524b2012-09-30 19:49:11 -070073 mCallback.userActivity(0);
Jim Miller109f1fd2012-09-19 20:44:16 -070074 doTransition(mFadeView, 0.0f);
Jim Millerdcb3d842012-08-23 19:18:12 -070075 }
76
77 public void onGrabbedStateChange(View v, int handle) {
78
79 }
80
81 public void onFinishFinalAnimation() {
82
83 }
84
85 };
86
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -070087 KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
Jim Millerdcb3d842012-08-23 19:18:12 -070088
89 @Override
90 public void onDevicePolicyManagerStateChanged() {
91 updateTargets();
92 }
93
94 @Override
Jim Miller47df44a2012-09-06 17:51:12 -070095 public void onSimStateChanged(State simState) {
Jim Millerdcb3d842012-08-23 19:18:12 -070096 updateTargets();
97 }
Jim Millerdcb3d842012-08-23 19:18:12 -070098 };
99
100 public KeyguardSelectorView(Context context) {
101 this(context, null);
102 }
103
104 public KeyguardSelectorView(Context context, AttributeSet attrs) {
105 super(context, attrs);
106 mLockPatternUtils = new LockPatternUtils(getContext());
107 }
108
109 @Override
110 protected void onFinishInflate() {
111 super.onFinishInflate();
112 mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
113 mGlowPadView.setOnTriggerListener(mOnTriggerListener);
Jim Millerdcb3d842012-08-23 19:18:12 -0700114 updateTargets();
Chris Wrenefbfa682012-11-07 19:18:46 -0500115
116 mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
117 View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame);
118 mBouncerFrame = bouncerFrameView.getBackground();
Jim Millerdcb3d842012-08-23 19:18:12 -0700119 }
120
Jim Miller0ff7f012012-10-11 20:40:01 -0700121 public void setCarrierArea(View carrierArea) {
122 mFadeView = carrierArea;
123 }
124
Jim Millerdcb3d842012-08-23 19:18:12 -0700125 public boolean isTargetPresent(int resId) {
126 return mGlowPadView.getTargetPosition(resId) != -1;
127 }
128
Adam Cohen6fb841f2012-10-24 13:15:38 -0700129 @Override
130 public void showUsabilityHint() {
Adam Cohen0a8d3262012-10-03 13:50:55 -0700131 mGlowPadView.ping();
132 }
133
Jim Millerdcb3d842012-08-23 19:18:12 -0700134 private void updateTargets() {
Amith Yamasani599dd7c2012-09-14 23:20:08 -0700135 int currentUserHandle = mLockPatternUtils.getCurrentUser();
Jim Miller48b9b0d2012-09-19 23:16:50 -0700136 DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
137 int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
138 boolean secureCameraDisabled = mLockPatternUtils.isSecure()
139 && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
140 boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
141 || secureCameraDisabled;
Jim Millerdcb3d842012-08-23 19:18:12 -0700142 final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
143 boolean disabledBySimState = monitor.isSimLocked();
144 boolean cameraTargetPresent =
Jim Miller5ecd8112013-01-09 18:50:26 -0800145 isTargetPresent(R.drawable.ic_lockscreen_camera);
Jim Millerdcb3d842012-08-23 19:18:12 -0700146 boolean searchTargetPresent =
Jim Miller5ecd8112013-01-09 18:50:26 -0800147 isTargetPresent(R.drawable.ic_action_assist_generic);
Jim Millerdcb3d842012-08-23 19:18:12 -0700148
Jim Miller48b9b0d2012-09-19 23:16:50 -0700149 if (cameraDisabledByAdmin) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700150 Log.v(TAG, "Camera disabled by Device Policy");
151 } else if (disabledBySimState) {
152 Log.v(TAG, "Camera disabled by Sim State");
153 }
John Spurlockfafdb6f2012-10-09 18:30:11 -0400154 boolean currentUserSetup = 0 != Settings.Secure.getIntForUser(
155 mContext.getContentResolver(),
156 Settings.Secure.USER_SETUP_COMPLETE,
157 0 /*default */,
158 currentUserHandle);
Jim Millerdcb3d842012-08-23 19:18:12 -0700159 boolean searchActionAvailable =
160 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800161 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
John Spurlockfafdb6f2012-10-09 18:30:11 -0400162 mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent
163 || !currentUserSetup;
164 mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent
165 || !currentUserSetup;
Jim Millerdcb3d842012-08-23 19:18:12 -0700166 updateResources();
167 }
168
169 public void updateResources() {
170 // Update the search icon with drawable from the search .apk
171 if (!mSearchDisabled) {
172 Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800173 .getAssistIntent(mContext, false, UserHandle.USER_CURRENT);
Jim Millerdcb3d842012-08-23 19:18:12 -0700174 if (intent != null) {
175 // XXX Hack. We need to substitute the icon here but haven't formalized
176 // the public API. The "_google" metadata will be going away, so
177 // DON'T USE IT!
178 ComponentName component = intent.getComponent();
179 boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
Jim Miller5ecd8112013-01-09 18:50:26 -0800180 ASSIST_ICON_METADATA_NAME + "_google", R.drawable.ic_action_assist_generic);
Jim Millerdcb3d842012-08-23 19:18:12 -0700181
182 if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
Jim Miller5ecd8112013-01-09 18:50:26 -0800183 ASSIST_ICON_METADATA_NAME, R.drawable.ic_action_assist_generic)) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700184 Slog.w(TAG, "Couldn't grab icon from package " + component);
185 }
186 }
187 }
188
Jim Miller5ecd8112013-01-09 18:50:26 -0800189 mGlowPadView.setEnableTarget(R.drawable.ic_lockscreen_camera, !mCameraDisabled);
190 mGlowPadView.setEnableTarget(R.drawable.ic_action_assist_generic, !mSearchDisabled);
Jim Millerdcb3d842012-08-23 19:18:12 -0700191 }
192
Jim Miller109f1fd2012-09-19 20:44:16 -0700193 void doTransition(View view, float to) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700194 if (mAnim != null) {
195 mAnim.cancel();
196 }
Jim Miller109f1fd2012-09-19 20:44:16 -0700197 mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
Jim Millerdcb3d842012-08-23 19:18:12 -0700198 mAnim.start();
199 }
200
201 public void setKeyguardCallback(KeyguardSecurityCallback callback) {
202 mCallback = callback;
203 }
204
205 public void setLockPatternUtils(LockPatternUtils utils) {
206 mLockPatternUtils = utils;
207 }
208
Jim Millerdcb3d842012-08-23 19:18:12 -0700209 @Override
210 public void reset() {
211 mGlowPadView.reset(false);
212 }
213
214 @Override
215 public boolean needsInput() {
216 return false;
217 }
218
219 @Override
220 public void onPause() {
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700221 KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mUpdateCallback);
Jim Millerdcb3d842012-08-23 19:18:12 -0700222 }
223
224 @Override
Chris Wrena042ac92012-11-07 11:37:06 -0500225 public void onResume(int reason) {
Sandeep Siddharthaf4d922b2013-08-15 16:08:42 -0700226 KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mUpdateCallback);
Jim Millerdcb3d842012-08-23 19:18:12 -0700227 }
228
229 @Override
230 public KeyguardSecurityCallback getCallback() {
231 return mCallback;
232 }
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500233
234 @Override
235 public void showBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500236 mIsBouncing = true;
237 KeyguardSecurityViewHelper.
238 showBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500239 }
240
241 @Override
242 public void hideBouncer(int duration) {
Chris Wrenefbfa682012-11-07 19:18:46 -0500243 mIsBouncing = false;
244 KeyguardSecurityViewHelper.
245 hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration);
Chris Wrenc0ae9e62012-11-05 13:16:31 -0500246 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700247}