blob: 62552b217dbbb9f1267cfef635242ef779711de9 [file] [log] [blame]
Jorim Jaggia6310292014-04-16 14:11:52 +02001/*
2 * Copyright (C) 2014 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 */
16
17package com.android.systemui.statusbar.phone;
18
19import android.app.ActivityManagerNative;
20import android.app.admin.DevicePolicyManager;
21import android.content.BroadcastReceiver;
22import android.content.Context;
23import android.content.Intent;
24import android.content.IntentFilter;
Jorim Jaggi97b63c42014-05-02 23:03:34 +020025import android.content.pm.PackageManager;
Adrian Roosa06905b2014-05-28 12:13:48 +020026import android.content.pm.ResolveInfo;
Jorim Jaggie210cc82014-08-12 23:44:59 +020027import android.content.res.Configuration;
Yorke Lee583a20242014-08-12 18:47:08 -070028import android.os.AsyncTask;
Jorim Jaggib2e104f2014-08-15 18:12:36 +020029import android.os.Bundle;
Jorim Jaggia6310292014-04-16 14:11:52 +020030import android.os.RemoteException;
31import android.os.UserHandle;
32import android.provider.MediaStore;
Yorke Lee583a20242014-08-12 18:47:08 -070033import android.telecomm.TelecommManager;
Jorim Jaggia6310292014-04-16 14:11:52 +020034import android.util.AttributeSet;
35import android.util.Log;
Jorim Jaggie210cc82014-08-12 23:44:59 +020036import android.util.TypedValue;
Jorim Jaggia6310292014-04-16 14:11:52 +020037import android.view.View;
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +020038import android.view.ViewGroup;
Jorim Jaggib2e104f2014-08-15 18:12:36 +020039import android.view.accessibility.AccessibilityNodeInfo;
Jorim Jaggia6310292014-04-16 14:11:52 +020040import android.widget.FrameLayout;
Jorim Jaggie210cc82014-08-12 23:44:59 +020041import android.widget.TextView;
Adrian Roosa06905b2014-05-28 12:13:48 +020042
43import com.android.internal.widget.LockPatternUtils;
44import com.android.keyguard.KeyguardUpdateMonitor;
45import com.android.keyguard.KeyguardUpdateMonitorCallback;
Jorim Jaggia6310292014-04-16 14:11:52 +020046import com.android.systemui.R;
Jorim Jaggib2e104f2014-08-15 18:12:36 +020047import com.android.systemui.statusbar.CommandQueue;
Selim Cinekbaa23272014-07-08 18:01:07 +020048import com.android.systemui.statusbar.KeyguardAffordanceView;
Jorim Jaggib2e104f2014-08-15 18:12:36 +020049import com.android.systemui.statusbar.KeyguardIndicationController;
50import com.android.systemui.statusbar.policy.AccessibilityController;
51import com.android.systemui.statusbar.policy.FlashlightController;
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +020052import com.android.systemui.statusbar.policy.PreviewInflater;
Jorim Jaggia6310292014-04-16 14:11:52 +020053
Jorim Jaggib2e104f2014-08-15 18:12:36 +020054import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
55import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
56
Jorim Jaggia6310292014-04-16 14:11:52 +020057/**
58 * Implementation for the bottom area of the Keyguard, including camera/phone affordance and status
59 * text.
60 */
Selim Cinek4c6969a2014-05-26 19:22:17 +020061public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickListener,
Jorim Jaggib2e104f2014-08-15 18:12:36 +020062 UnlockMethodCache.OnUnlockMethodChangedListener,
63 AccessibilityController.AccessibilityStateChangedCallback, View.OnLongClickListener {
Jorim Jaggia6310292014-04-16 14:11:52 +020064
65 final static String TAG = "PhoneStatusBar/KeyguardBottomAreaView";
66
Adrian Roosa06905b2014-05-28 12:13:48 +020067 private static final Intent SECURE_CAMERA_INTENT =
68 new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE)
69 .addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
70 private static final Intent INSECURE_CAMERA_INTENT =
71 new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
Jorim Jaggi97b63c42014-05-02 23:03:34 +020072 private static final Intent PHONE_INTENT = new Intent(Intent.ACTION_DIAL);
73
Selim Cinekbaa23272014-07-08 18:01:07 +020074 private KeyguardAffordanceView mCameraImageView;
75 private KeyguardAffordanceView mPhoneImageView;
76 private KeyguardAffordanceView mLockIcon;
Jorim Jaggie210cc82014-08-12 23:44:59 +020077 private TextView mIndicationText;
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +020078 private ViewGroup mPreviewContainer;
79
80 private View mPhonePreview;
81 private View mCameraPreview;
Jorim Jaggi97b63c42014-05-02 23:03:34 +020082
Jorim Jaggi97b63c42014-05-02 23:03:34 +020083 private ActivityStarter mActivityStarter;
Jorim Jaggiecc798e2014-05-26 18:14:37 +020084 private UnlockMethodCache mUnlockMethodCache;
Adrian Roosa06905b2014-05-28 12:13:48 +020085 private LockPatternUtils mLockPatternUtils;
Adrian Roos1e1d6ac2014-07-22 17:18:55 +020086 private FlashlightController mFlashlightController;
Jorim Jaggi781c29c2014-08-05 20:39:15 +020087 private PreviewInflater mPreviewInflater;
Adrian Roos4ebcdfd2014-08-12 23:33:49 +020088 private KeyguardIndicationController mIndicationController;
Jorim Jaggib2e104f2014-08-15 18:12:36 +020089 private AccessibilityController mAccessibilityController;
90 private PhoneStatusBar mPhoneStatusBar;
Adrian Roos2fe592d2014-05-17 03:11:59 +020091
Adrian Roos2e3ccbb2014-08-19 22:23:37 +020092 private final TrustDrawable mTrustDrawable;
93
Jorim Jaggia6310292014-04-16 14:11:52 +020094 public KeyguardBottomAreaView(Context context) {
Adrian Roos2e3ccbb2014-08-19 22:23:37 +020095 this(context, null);
Jorim Jaggia6310292014-04-16 14:11:52 +020096 }
97
98 public KeyguardBottomAreaView(Context context, AttributeSet attrs) {
Adrian Roos2e3ccbb2014-08-19 22:23:37 +020099 this(context, attrs, 0);
Jorim Jaggia6310292014-04-16 14:11:52 +0200100 }
101
102 public KeyguardBottomAreaView(Context context, AttributeSet attrs, int defStyleAttr) {
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200103 this(context, attrs, defStyleAttr, 0);
Jorim Jaggia6310292014-04-16 14:11:52 +0200104 }
105
106 public KeyguardBottomAreaView(Context context, AttributeSet attrs, int defStyleAttr,
107 int defStyleRes) {
108 super(context, attrs, defStyleAttr, defStyleRes);
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200109 mTrustDrawable = new TrustDrawable(mContext);
Jorim Jaggia6310292014-04-16 14:11:52 +0200110 }
111
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200112 private AccessibilityDelegate mAccessibilityDelegate = new AccessibilityDelegate() {
113 @Override
114 public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
115 super.onInitializeAccessibilityNodeInfo(host, info);
116 String label = null;
117 if (host == mLockIcon) {
118 label = getResources().getString(R.string.unlock_label);
119 } else if (host == mCameraImageView) {
120 label = getResources().getString(R.string.camera_label);
121 } else if (host == mPhoneImageView) {
122 label = getResources().getString(R.string.phone_label);
123 }
124 info.addAction(new AccessibilityAction(ACTION_CLICK, label));
125 }
126
127 @Override
128 public boolean performAccessibilityAction(View host, int action, Bundle args) {
129 if (action == ACTION_CLICK) {
130 if (host == mLockIcon) {
131 mPhoneStatusBar.animateCollapsePanels(
132 CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
133 return true;
134 } else if (host == mCameraImageView) {
135 launchCamera();
136 return true;
137 } else if (host == mPhoneImageView) {
138 launchPhone();
139 return true;
140 }
141 }
142 return super.performAccessibilityAction(host, action, args);
143 }
144 };
145
Jorim Jaggia6310292014-04-16 14:11:52 +0200146 @Override
147 protected void onFinishInflate() {
148 super.onFinishInflate();
Adrian Roosa06905b2014-05-28 12:13:48 +0200149 mLockPatternUtils = new LockPatternUtils(mContext);
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +0200150 mPreviewContainer = (ViewGroup) findViewById(R.id.preview_container);
Selim Cinekbaa23272014-07-08 18:01:07 +0200151 mCameraImageView = (KeyguardAffordanceView) findViewById(R.id.camera_button);
152 mPhoneImageView = (KeyguardAffordanceView) findViewById(R.id.phone_button);
153 mLockIcon = (KeyguardAffordanceView) findViewById(R.id.lock_icon);
Jorim Jaggie210cc82014-08-12 23:44:59 +0200154 mIndicationText = (TextView) findViewById(R.id.keyguard_indication_text);
Adrian Roosa06905b2014-05-28 12:13:48 +0200155 watchForCameraPolicyChanges();
Jorim Jaggia6310292014-04-16 14:11:52 +0200156 updateCameraVisibility();
Jorim Jaggi97b63c42014-05-02 23:03:34 +0200157 updatePhoneVisibility();
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200158 mUnlockMethodCache = UnlockMethodCache.getInstance(getContext());
159 mUnlockMethodCache.addListener(this);
Jorim Jaggie7b12522014-08-06 16:41:21 +0200160 updateLockIcon();
Selim Cinekbaa23272014-07-08 18:01:07 +0200161 setClipChildren(false);
162 setClipToPadding(false);
Jorim Jaggi781c29c2014-08-05 20:39:15 +0200163 mPreviewInflater = new PreviewInflater(mContext, new LockPatternUtils(mContext));
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +0200164 inflatePreviews();
Adrian Roos4ebcdfd2014-08-12 23:33:49 +0200165 mLockIcon.setOnClickListener(this);
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200166 mLockIcon.setBackground(mTrustDrawable);
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200167 mLockIcon.setOnLongClickListener(this);
168 mCameraImageView.setOnClickListener(this);
169 mPhoneImageView.setOnClickListener(this);
170 initAccessibility();
171 }
172
173 private void initAccessibility() {
174 mLockIcon.setAccessibilityDelegate(mAccessibilityDelegate);
175 mPhoneImageView.setAccessibilityDelegate(mAccessibilityDelegate);
176 mCameraImageView.setAccessibilityDelegate(mAccessibilityDelegate);
Jorim Jaggia6310292014-04-16 14:11:52 +0200177 }
178
Jorim Jaggie210cc82014-08-12 23:44:59 +0200179 @Override
180 protected void onConfigurationChanged(Configuration newConfig) {
181 super.onConfigurationChanged(newConfig);
182 int indicationBottomMargin = getResources().getDimensionPixelSize(
183 R.dimen.keyguard_indication_margin_bottom);
184 MarginLayoutParams mlp = (MarginLayoutParams) mIndicationText.getLayoutParams();
185 if (mlp.bottomMargin != indicationBottomMargin) {
186 mlp.bottomMargin = indicationBottomMargin;
187 mIndicationText.setLayoutParams(mlp);
188 }
189
190 // Respect font size setting.
191 mIndicationText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
192 getResources().getDimensionPixelSize(
193 com.android.internal.R.dimen.text_size_small_material));
194 }
195
Jorim Jaggi97b63c42014-05-02 23:03:34 +0200196 public void setActivityStarter(ActivityStarter activityStarter) {
197 mActivityStarter = activityStarter;
198 }
199
Adrian Roos1e1d6ac2014-07-22 17:18:55 +0200200 public void setFlashlightController(FlashlightController flashlightController) {
201 mFlashlightController = flashlightController;
202 }
203
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200204 public void setAccessibilityController(AccessibilityController accessibilityController) {
205 mAccessibilityController = accessibilityController;
206 accessibilityController.addStateChangedCallback(this);
207 }
208
209 public void setPhoneStatusBar(PhoneStatusBar phoneStatusBar) {
210 mPhoneStatusBar = phoneStatusBar;
211 }
212
Adrian Roosa06905b2014-05-28 12:13:48 +0200213 private Intent getCameraIntent() {
214 KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
215 boolean currentUserHasTrust = updateMonitor.getUserHasTrust(
216 mLockPatternUtils.getCurrentUser());
217 return mLockPatternUtils.isSecure() && !currentUserHasTrust
218 ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT;
219 }
220
Jorim Jaggia6310292014-04-16 14:11:52 +0200221 private void updateCameraVisibility() {
Adrian Roosa06905b2014-05-28 12:13:48 +0200222 ResolveInfo resolved = mContext.getPackageManager().resolveActivityAsUser(getCameraIntent(),
223 PackageManager.MATCH_DEFAULT_ONLY,
224 mLockPatternUtils.getCurrentUser());
Jorim Jaggi15dac5f2014-08-27 19:08:26 +0200225 boolean visible = !isCameraDisabledByDpm() && resolved != null
226 && getResources().getBoolean(R.bool.config_keyguardShowCameraAffordance);
Selim Cinek4c6969a2014-05-26 19:22:17 +0200227 mCameraImageView.setVisibility(visible ? View.VISIBLE : View.GONE);
Jorim Jaggia6310292014-04-16 14:11:52 +0200228 }
229
Jorim Jaggi97b63c42014-05-02 23:03:34 +0200230 private void updatePhoneVisibility() {
231 boolean visible = isPhoneVisible();
Selim Cinek4c6969a2014-05-26 19:22:17 +0200232 mPhoneImageView.setVisibility(visible ? View.VISIBLE : View.GONE);
Jorim Jaggi97b63c42014-05-02 23:03:34 +0200233 }
234
235 private boolean isPhoneVisible() {
236 PackageManager pm = mContext.getPackageManager();
237 return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
238 && pm.resolveActivity(PHONE_INTENT, 0) != null;
239 }
240
Jorim Jaggia6310292014-04-16 14:11:52 +0200241 private boolean isCameraDisabledByDpm() {
242 final DevicePolicyManager dpm =
243 (DevicePolicyManager) getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
244 if (dpm != null) {
245 try {
246 final int userId = ActivityManagerNative.getDefault().getCurrentUser().id;
247 final int disabledFlags = dpm.getKeyguardDisabledFeatures(null, userId);
248 final boolean disabledBecauseKeyguardSecure =
249 (disabledFlags & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0
250 && KeyguardTouchDelegate.getInstance(getContext()).isSecure();
251 return dpm.getCameraDisabled(null) || disabledBecauseKeyguardSecure;
252 } catch (RemoteException e) {
253 Log.e(TAG, "Can't get userId", e);
254 }
255 }
256 return false;
257 }
258
Adrian Roosa06905b2014-05-28 12:13:48 +0200259 private void watchForCameraPolicyChanges() {
Jorim Jaggia6310292014-04-16 14:11:52 +0200260 final IntentFilter filter = new IntentFilter();
261 filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
Adrian Roosa06905b2014-05-28 12:13:48 +0200262 getContext().registerReceiverAsUser(mDevicePolicyReceiver,
263 UserHandle.ALL, filter, null, null);
264 KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
Jorim Jaggia6310292014-04-16 14:11:52 +0200265 }
266
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200267 @Override
268 public void onStateChanged(boolean accessibilityEnabled, boolean touchExplorationEnabled) {
269 mCameraImageView.setClickable(touchExplorationEnabled);
270 mPhoneImageView.setClickable(touchExplorationEnabled);
271 mCameraImageView.setFocusable(accessibilityEnabled);
272 mPhoneImageView.setFocusable(accessibilityEnabled);
273 updateLockIconClickability();
Jorim Jaggia6310292014-04-16 14:11:52 +0200274 }
275
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200276 private void updateLockIconClickability() {
277 if (mAccessibilityController == null) {
278 return;
279 }
280 mLockIcon.setClickable(mUnlockMethodCache.isTrustManaged()
281 || mAccessibilityController.isTouchExplorationEnabled());
282 mLockIcon.setLongClickable(mAccessibilityController.isTouchExplorationEnabled()
283 && mUnlockMethodCache.isTrustManaged());
284 mLockIcon.setFocusable(mAccessibilityController.isAccessibilityEnabled());
Jorim Jaggia6310292014-04-16 14:11:52 +0200285 }
286
Selim Cinek4c6969a2014-05-26 19:22:17 +0200287 @Override
288 public void onClick(View v) {
289 if (v == mCameraImageView) {
290 launchCamera();
291 } else if (v == mPhoneImageView) {
292 launchPhone();
Adrian Roos4ebcdfd2014-08-12 23:33:49 +0200293 } if (v == mLockIcon) {
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200294 if (!mAccessibilityController.isAccessibilityEnabled()) {
295 handleTrustCircleClick();
296 } else {
297 mPhoneStatusBar.animateCollapsePanels(
298 CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
299 }
Selim Cinek4c6969a2014-05-26 19:22:17 +0200300 }
301 }
302
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200303 @Override
304 public boolean onLongClick(View v) {
305 handleTrustCircleClick();
306 return true;
307 }
308
309 private void handleTrustCircleClick() {
310 mIndicationController.showTransientIndication(
311 R.string.keyguard_indication_trust_disabled);
312 mLockPatternUtils.requireCredentialEntry(mLockPatternUtils.getCurrentUser());
313 }
314
Selim Cinek4c6969a2014-05-26 19:22:17 +0200315 public void launchCamera() {
Adrian Roos1e1d6ac2014-07-22 17:18:55 +0200316 mFlashlightController.killFlashlight();
Adrian Roosa06905b2014-05-28 12:13:48 +0200317 Intent intent = getCameraIntent();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200318 boolean wouldLaunchResolverActivity = mPreviewInflater.wouldLaunchResolverActivity(intent);
319 if (intent == SECURE_CAMERA_INTENT && !wouldLaunchResolverActivity) {
Adrian Roosa06905b2014-05-28 12:13:48 +0200320 mContext.startActivityAsUser(intent, UserHandle.CURRENT);
321 } else {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200322
323 // We need to delay starting the activity because ResolverActivity finishes itself if
324 // launched behind lockscreen.
325 mActivityStarter.startActivity(intent, false /* dismissShade */,
326 wouldLaunchResolverActivity /* afterKeyguardGone */);
Adrian Roosa06905b2014-05-28 12:13:48 +0200327 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200328 }
329
Selim Cinek4c6969a2014-05-26 19:22:17 +0200330 public void launchPhone() {
Nancy Chen0eb1e402014-08-21 22:52:29 -0700331 final TelecommManager tm = TelecommManager.from(mContext);
332 if (tm.isInCall()) {
Yorke Lee583a20242014-08-12 18:47:08 -0700333 AsyncTask.execute(new Runnable() {
334 @Override
335 public void run() {
Nancy Chen0eb1e402014-08-21 22:52:29 -0700336 tm.showInCallScreen(false /* showDialpad */);
Yorke Lee583a20242014-08-12 18:47:08 -0700337 }
338 });
339 } else {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200340 mActivityStarter.startActivity(PHONE_INTENT, false /* dismissShade */,
341 mPreviewInflater.wouldLaunchResolverActivity(PHONE_INTENT));
Yorke Lee583a20242014-08-12 18:47:08 -0700342 }
Jorim Jaggi97b63c42014-05-02 23:03:34 +0200343 }
344
Adrian Roos2fe592d2014-05-17 03:11:59 +0200345
346 @Override
347 protected void onVisibilityChanged(View changedView, int visibility) {
348 super.onVisibilityChanged(changedView, visibility);
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200349 if (isShown()) {
350 mTrustDrawable.start();
351 } else {
352 mTrustDrawable.stop();
353 }
Adrian Roos2fe592d2014-05-17 03:11:59 +0200354 if (changedView == this && visibility == VISIBLE) {
Jorim Jaggie7b12522014-08-06 16:41:21 +0200355 updateLockIcon();
Adrian Roosa06905b2014-05-28 12:13:48 +0200356 updateCameraVisibility();
Adrian Roos2fe592d2014-05-17 03:11:59 +0200357 }
358 }
359
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200360 @Override
361 protected void onDetachedFromWindow() {
362 super.onDetachedFromWindow();
363 mTrustDrawable.stop();
364 }
365
Jorim Jaggie7b12522014-08-06 16:41:21 +0200366 private void updateLockIcon() {
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200367 boolean visible = isShown() && KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
368 if (visible) {
369 mTrustDrawable.start();
370 } else {
371 mTrustDrawable.stop();
372 }
373 if (!visible) {
Adrian Roos2fe592d2014-05-17 03:11:59 +0200374 return;
375 }
Jorim Jaggie7b12522014-08-06 16:41:21 +0200376 // TODO: Real icon for facelock.
Adrian Roos4a410172014-08-20 17:41:44 +0200377 int iconRes = mUnlockMethodCache.isFaceUnlockRunning() ? R.drawable.ic_account_circle
Jorim Jaggie7b12522014-08-06 16:41:21 +0200378 : mUnlockMethodCache.isMethodInsecure() ? R.drawable.ic_lock_open_24dp
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200379 : R.drawable.ic_lock_24dp;
Adrian Roos2fe592d2014-05-17 03:11:59 +0200380 mLockIcon.setImageResource(iconRes);
Adrian Roos7861c662014-07-25 15:37:28 +0200381 boolean trustManaged = mUnlockMethodCache.isTrustManaged();
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200382 mTrustDrawable.setTrustManaged(trustManaged);
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200383
Jorim Jaggib2e104f2014-08-15 18:12:36 +0200384 updateLockIconClickability();
Jorim Jaggibaef32f2014-08-21 14:51:58 +0200385 updateLockIconContentDescription(mUnlockMethodCache.isFaceUnlockRunning(),
386 mUnlockMethodCache.isMethodInsecure(), trustManaged);
Adrian Roos2fe592d2014-05-17 03:11:59 +0200387 }
388
Jorim Jaggibaef32f2014-08-21 14:51:58 +0200389 private void updateLockIconContentDescription(boolean faceUnlockRunning, boolean insecure,
390 boolean trustManaged) {
391 mLockIcon.setContentDescription(getResources().getString(
392 faceUnlockRunning ? R.string.accessibility_unlock_button_face_unlock_running
393 : insecure && !trustManaged ? R.string.accessibility_unlock_button_not_secured
394 : insecure ? R.string.accessibility_unlock_button_not_secured_trust_managed
395 : !trustManaged ? R.string.accessibility_unlock_button_secured
396 : R.string.accessibility_unlock_button_secured_trust_managed));
397 }
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200398
Selim Cinekbaa23272014-07-08 18:01:07 +0200399 public KeyguardAffordanceView getPhoneView() {
Selim Cinek4c6969a2014-05-26 19:22:17 +0200400 return mPhoneImageView;
401 }
402
Selim Cinekbaa23272014-07-08 18:01:07 +0200403 public KeyguardAffordanceView getCameraView() {
Selim Cinek4c6969a2014-05-26 19:22:17 +0200404 return mCameraImageView;
405 }
406
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +0200407 public View getPhonePreview() {
408 return mPhonePreview;
409 }
410
411 public View getCameraPreview() {
412 return mCameraPreview;
413 }
414
Selim Cinekbaa23272014-07-08 18:01:07 +0200415 public KeyguardAffordanceView getLockIcon() {
Selim Cinek4c6969a2014-05-26 19:22:17 +0200416 return mLockIcon;
417 }
418
Selim Cinekf99d0002014-06-13 07:36:01 +0200419 public View getIndicationView() {
420 return mIndicationText;
421 }
422
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200423 @Override
Jorim Jaggi2580a9762014-06-25 03:08:25 +0200424 public boolean hasOverlappingRendering() {
425 return false;
426 }
427
428 @Override
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200429 public void onMethodSecureChanged(boolean methodSecure) {
Jorim Jaggie7b12522014-08-06 16:41:21 +0200430 updateLockIcon();
Adrian Roosa06905b2014-05-28 12:13:48 +0200431 updateCameraVisibility();
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200432 }
Adrian Roosa06905b2014-05-28 12:13:48 +0200433
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +0200434 private void inflatePreviews() {
Jorim Jaggi781c29c2014-08-05 20:39:15 +0200435 mPhonePreview = mPreviewInflater.inflatePreview(PHONE_INTENT);
436 mCameraPreview = mPreviewInflater.inflatePreview(getCameraIntent());
Jorim Jaggib6cdcbc2014-07-25 21:58:29 +0200437 if (mPhonePreview != null) {
438 mPreviewContainer.addView(mPhonePreview);
439 mPhonePreview.setVisibility(View.INVISIBLE);
440 }
441 if (mCameraPreview != null) {
442 mPreviewContainer.addView(mCameraPreview);
443 mCameraPreview.setVisibility(View.INVISIBLE);
444 }
445 }
446
Adrian Roosa06905b2014-05-28 12:13:48 +0200447 private final BroadcastReceiver mDevicePolicyReceiver = new BroadcastReceiver() {
448 public void onReceive(Context context, Intent intent) {
449 post(new Runnable() {
450 @Override
451 public void run() {
452 updateCameraVisibility();
453 }
454 });
455 }
456 };
457
458 private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
459 new KeyguardUpdateMonitorCallback() {
460 @Override
461 public void onUserSwitchComplete(int userId) {
462 updateCameraVisibility();
463 }
Jorim Jaggie7b12522014-08-06 16:41:21 +0200464
465 @Override
Adrian Roos2e3ccbb2014-08-19 22:23:37 +0200466 public void onScreenTurnedOn() {
467 updateLockIcon();
468 }
469
470 @Override
471 public void onScreenTurnedOff(int why) {
472 updateLockIcon();
473 }
Adrian Roosa06905b2014-05-28 12:13:48 +0200474 };
Adrian Roos4ebcdfd2014-08-12 23:33:49 +0200475
476 public void setKeyguardIndicationController(
477 KeyguardIndicationController keyguardIndicationController) {
478 mIndicationController = keyguardIndicationController;
479 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200480}