KeyguardSelectorView.java revision a042ac90640c0c3fd3c5349083b86bbfd6319b64
1/* 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; 19import android.app.SearchManager; 20import android.app.admin.DevicePolicyManager; 21import android.content.ComponentName; 22import android.content.Context; 23import android.content.Intent; 24import android.os.UserHandle; 25import android.provider.Settings; 26import android.util.AttributeSet; 27import android.util.Log; 28import android.util.Slog; 29import android.view.View; 30import android.widget.LinearLayout; 31 32import com.android.internal.telephony.IccCardConstants.State; 33import com.android.internal.widget.LockPatternUtils; 34import com.android.internal.widget.multiwaveview.GlowPadView; 35import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; 36import com.android.internal.R; 37 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"; 43 44 private KeyguardSecurityCallback mCallback; 45 private GlowPadView mGlowPadView; 46 private ObjectAnimator mAnim; 47 private View mFadeView; 48 private boolean mCameraDisabled; 49 private boolean mSearchDisabled; 50 private LockPatternUtils mLockPatternUtils; 51 52 OnTriggerListener mOnTriggerListener = new OnTriggerListener() { 53 54 public void onTrigger(View v, int target) { 55 final int resId = mGlowPadView.getResourceIdForTarget(target); 56 switch (resId) { 57 case com.android.internal.R.drawable.ic_action_assist_generic: 58 Intent assistIntent = 59 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 60 .getAssistIntent(mContext, UserHandle.USER_CURRENT); 61 if (assistIntent != null) { 62 mActivityLauncher.launchActivity(assistIntent, false, true, null, null); 63 } else { 64 Log.w(TAG, "Failed to get intent for assist activity"); 65 } 66 mCallback.userActivity(0); 67 break; 68 69 case com.android.internal.R.drawable.ic_lockscreen_camera: 70 mActivityLauncher.launchCamera(null, null); 71 mCallback.userActivity(0); 72 break; 73 74 case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom: 75 case com.android.internal.R.drawable.ic_lockscreen_unlock: 76 mCallback.userActivity(0); 77 mCallback.dismiss(false); 78 break; 79 } 80 } 81 82 public void onReleased(View v, int handle) { 83 doTransition(mFadeView, 1.0f); 84 } 85 86 public void onGrabbed(View v, int handle) { 87 mCallback.userActivity(0); 88 doTransition(mFadeView, 0.0f); 89 } 90 91 public void onGrabbedStateChange(View v, int handle) { 92 93 } 94 95 public void onFinishFinalAnimation() { 96 97 } 98 99 }; 100 101 KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { 102 103 @Override 104 public void onDevicePolicyManagerStateChanged() { 105 updateTargets(); 106 } 107 108 @Override 109 public void onSimStateChanged(State simState) { 110 updateTargets(); 111 } 112 }; 113 114 private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { 115 116 @Override 117 KeyguardSecurityCallback getCallback() { 118 return mCallback; 119 } 120 121 @Override 122 LockPatternUtils getLockPatternUtils() { 123 return mLockPatternUtils; 124 } 125 126 @Override 127 Context getContext() { 128 return mContext; 129 }}; 130 131 public KeyguardSelectorView(Context context) { 132 this(context, null); 133 } 134 135 public KeyguardSelectorView(Context context, AttributeSet attrs) { 136 super(context, attrs); 137 mLockPatternUtils = new LockPatternUtils(getContext()); 138 } 139 140 @Override 141 protected void onFinishInflate() { 142 super.onFinishInflate(); 143 mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); 144 mGlowPadView.setOnTriggerListener(mOnTriggerListener); 145 updateTargets(); 146 } 147 148 public void setCarrierArea(View carrierArea) { 149 mFadeView = carrierArea; 150 } 151 152 public boolean isTargetPresent(int resId) { 153 return mGlowPadView.getTargetPosition(resId) != -1; 154 } 155 156 @Override 157 public void showUsabilityHint() { 158 mGlowPadView.ping(); 159 } 160 161 private void updateTargets() { 162 int currentUserHandle = mLockPatternUtils.getCurrentUser(); 163 DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager(); 164 int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle); 165 boolean secureCameraDisabled = mLockPatternUtils.isSecure() 166 && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0; 167 boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle) 168 || secureCameraDisabled; 169 final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext()); 170 boolean disabledBySimState = monitor.isSimLocked(); 171 boolean cameraTargetPresent = 172 isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera); 173 boolean searchTargetPresent = 174 isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic); 175 176 if (cameraDisabledByAdmin) { 177 Log.v(TAG, "Camera disabled by Device Policy"); 178 } else if (disabledBySimState) { 179 Log.v(TAG, "Camera disabled by Sim State"); 180 } 181 boolean currentUserSetup = 0 != Settings.Secure.getIntForUser( 182 mContext.getContentResolver(), 183 Settings.Secure.USER_SETUP_COMPLETE, 184 0 /*default */, 185 currentUserHandle); 186 boolean searchActionAvailable = 187 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 188 .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null; 189 mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent 190 || !currentUserSetup; 191 mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent 192 || !currentUserSetup; 193 updateResources(); 194 } 195 196 public void updateResources() { 197 // Update the search icon with drawable from the search .apk 198 if (!mSearchDisabled) { 199 Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 200 .getAssistIntent(mContext, UserHandle.USER_CURRENT); 201 if (intent != null) { 202 // XXX Hack. We need to substitute the icon here but haven't formalized 203 // the public API. The "_google" metadata will be going away, so 204 // DON'T USE IT! 205 ComponentName component = intent.getComponent(); 206 boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component, 207 ASSIST_ICON_METADATA_NAME + "_google", 208 com.android.internal.R.drawable.ic_action_assist_generic); 209 210 if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component, 211 ASSIST_ICON_METADATA_NAME, 212 com.android.internal.R.drawable.ic_action_assist_generic)) { 213 Slog.w(TAG, "Couldn't grab icon from package " + component); 214 } 215 } 216 } 217 218 mGlowPadView.setEnableTarget(com.android.internal.R.drawable 219 .ic_lockscreen_camera, !mCameraDisabled); 220 mGlowPadView.setEnableTarget(com.android.internal.R.drawable 221 .ic_action_assist_generic, !mSearchDisabled); 222 } 223 224 void doTransition(View view, float to) { 225 if (mAnim != null) { 226 mAnim.cancel(); 227 } 228 mAnim = ObjectAnimator.ofFloat(view, "alpha", to); 229 mAnim.start(); 230 } 231 232 public void setKeyguardCallback(KeyguardSecurityCallback callback) { 233 mCallback = callback; 234 } 235 236 public void setLockPatternUtils(LockPatternUtils utils) { 237 mLockPatternUtils = utils; 238 } 239 240 @Override 241 public void reset() { 242 mGlowPadView.reset(false); 243 } 244 245 @Override 246 public boolean needsInput() { 247 return false; 248 } 249 250 @Override 251 public void onPause() { 252 KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback); 253 } 254 255 @Override 256 public void onResume(int reason) { 257 KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback); 258 } 259 260 @Override 261 public KeyguardSecurityCallback getCallback() { 262 return mCallback; 263 } 264 265 @Override 266 public void showBouncer(int duration) { 267 } 268 269 @Override 270 public void hideBouncer(int duration) { 271 } 272} 273