KeyguardSelectorView.java revision 0ff7f010f8bfd011f0915031b02739ae3bee401e
1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/* 2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project 3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License. 6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at 7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * http://www.apache.org/licenses/LICENSE-2.0 9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software 11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and 14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License. 15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard; 17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.animation.ObjectAnimator; 19dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ActivityManagerNative; 20dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.SearchManager; 2148b9b0d068844af9eb37c215484831c4d6b831b0Jim Millerimport android.app.admin.DevicePolicyManager; 22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.ActivityNotFoundException; 23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.ComponentName; 24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Intent; 26ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Millerimport android.content.pm.PackageManager; 27ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Millerimport android.content.pm.ResolveInfo; 28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException; 29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.UserHandle; 30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.provider.MediaStore; 31fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlockimport android.provider.Settings; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log; 34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Slog; 35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View; 36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.LinearLayout; 37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Millerimport com.android.internal.telephony.IccCardConstants.State; 39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils; 40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.multiwaveview.GlowPadView; 41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; 42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.R; 43dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 44ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Millerimport java.util.List; 45ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller 46dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView { 47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final boolean DEBUG = KeyguardHostView.DEBUG; 48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final String TAG = "SecuritySelectorView"; 49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final String ASSIST_ICON_METADATA_NAME = 50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller "com.android.systemui.action_assist_icon"; 5147df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller 52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityCallback mCallback; 53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private GlowPadView mGlowPadView; 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private ObjectAnimator mAnim; 55109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller private View mFadeView; 56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean mCameraDisabled; 57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private boolean mSearchDisabled; 58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternUtils mLockPatternUtils; 59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 60dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller OnTriggerListener mOnTriggerListener = new OnTriggerListener() { 61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 62dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onTrigger(View v, int target) { 63dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final int resId = mGlowPadView.getResourceIdForTarget(target); 64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller switch (resId) { 65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case com.android.internal.R.drawable.ic_action_assist_generic: 66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent assistIntent = 67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .getAssistIntent(mContext, UserHandle.USER_CURRENT); 69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (assistIntent != null) { 705f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller launchActivity(assistIntent, false); 71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Log.w(TAG, "Failed to get intent for assist activity"); 73dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.userActivity(0); 75dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case com.android.internal.R.drawable.ic_lockscreen_camera: 785f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller launchCamera(); 79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.userActivity(0); 80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom: 83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller case com.android.internal.R.drawable.ic_lockscreen_unlock: 843dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mCallback.userActivity(0); 85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.dismiss(false); 86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller break; 87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onReleased(View v, int handle) { 91109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller doTransition(mFadeView, 1.0f); 92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onGrabbed(View v, int handle) { 953dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mCallback.userActivity(0); 96109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller doTransition(mFadeView, 0.0f); 97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onGrabbedStateChange(View v, int handle) { 100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onFinishFinalAnimation() { 104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 10947df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { 110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onDevicePolicyManagerStateChanged() { 113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller updateTargets(); 114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 11747df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller public void onSimStateChanged(State simState) { 118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller updateTargets(); 119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSelectorView(Context context) { 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 126ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller private boolean wouldLaunchResolverActivity(Intent intent) { 127ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller PackageManager packageManager = mContext.getPackageManager(); 128ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, 129ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser()); 130ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser( 131ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller intent, PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser()); 132ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller // If the list contains the above resolved activity, then it can't be 133ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller // ResolverActivity itself. 134ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller for (int i = 0; i < appList.size(); i++) { 135ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller ResolveInfo tmp = appList.get(i); 136ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller if (tmp.activityInfo.name.equals(resolved.activityInfo.name) 137ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) { 138ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller return false; 139ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller } 140ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller } 141ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller return true; 142ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller } 143ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller 1445f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller protected void launchCamera() { 1455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller if (mLockPatternUtils.isSecure()) { 1465f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller // Launch the secure version of the camera 147ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller final Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE); 1482ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 149ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller 150ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller if (wouldLaunchResolverActivity(intent)) { 151ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller // TODO: Show disambiguation dialog instead. 152ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller // For now, we'll treat this like launching any other app from secure keyguard. 153ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller // When they do, user sees the system's ResolverActivity which lets them choose 154ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller // which secure camera to use. 155ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller launchActivity(intent, false); 156ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller } else { 157ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller launchActivity(intent, true); 158ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller } 1595f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } else { 1605f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller // Launch the normal camera 1615f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false); 1625f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 1635f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 1645f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSelectorView(Context context, AttributeSet attrs) { 166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = new LockPatternUtils(getContext()); 168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 172dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); 174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mGlowPadView.setOnTriggerListener(mOnTriggerListener); 175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller updateTargets(); 176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1780ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller public void setCarrierArea(View carrierArea) { 1790ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller mFadeView = carrierArea; 1800ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 1810ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean isTargetPresent(int resId) { 183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mGlowPadView.getTargetPosition(resId) != -1; 184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1860a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen public void ping() { 1870a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen mGlowPadView.ping(); 1880a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen } 1890a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen 190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private void updateTargets() { 191599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani int currentUserHandle = mLockPatternUtils.getCurrentUser(); 19248b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager(); 19348b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle); 19448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller boolean secureCameraDisabled = mLockPatternUtils.isSecure() 19548b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0; 19648b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle) 19748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller || secureCameraDisabled; 198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext()); 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean disabledBySimState = monitor.isSimLocked(); 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean cameraTargetPresent = 201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera); 202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean searchTargetPresent = 203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic); 204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 20548b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller if (cameraDisabledByAdmin) { 206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Log.v(TAG, "Camera disabled by Device Policy"); 207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else if (disabledBySimState) { 208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Log.v(TAG, "Camera disabled by Sim State"); 209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 210fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock boolean currentUserSetup = 0 != Settings.Secure.getIntForUser( 211fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock mContext.getContentResolver(), 212fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock Settings.Secure.USER_SETUP_COMPLETE, 213fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock 0 /*default */, 214fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock currentUserHandle); 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean searchActionAvailable = 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null; 218fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent 219fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock || !currentUserSetup; 220fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent 221fafdb6f9ca2ded293ed45e9436f04bbc03e75072John Spurlock || !currentUserSetup; 222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller updateResources(); 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void updateResources() { 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Update the search icon with drawable from the search .apk 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (!mSearchDisabled) { 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .getAssistIntent(mContext, UserHandle.USER_CURRENT); 230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (intent != null) { 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // XXX Hack. We need to substitute the icon here but haven't formalized 232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // the public API. The "_google" metadata will be going away, so 233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // DON'T USE IT! 234dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ComponentName component = intent.getComponent(); 235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component, 236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ASSIST_ICON_METADATA_NAME + "_google", 237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller com.android.internal.R.drawable.ic_action_assist_generic); 238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 239dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component, 240dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ASSIST_ICON_METADATA_NAME, 241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller com.android.internal.R.drawable.ic_action_assist_generic)) { 242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Slog.w(TAG, "Couldn't grab icon from package " + component); 243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mGlowPadView.setEnableTarget(com.android.internal.R.drawable 248dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .ic_lockscreen_camera, !mCameraDisabled); 249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mGlowPadView.setEnableTarget(com.android.internal.R.drawable 250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .ic_action_assist_generic, !mSearchDisabled); 251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 253109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller void doTransition(View view, float to) { 254dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mAnim != null) { 255dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAnim.cancel(); 256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 257109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller mAnim = ObjectAnimator.ofFloat(view, "alpha", to); 258dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mAnim.start(); 259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void setKeyguardCallback(KeyguardSecurityCallback callback) { 262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback = callback; 263dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void setLockPatternUtils(LockPatternUtils utils) { 266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = utils; 267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 269dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Launches the said intent for the current foreground user. 271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * @param intent 2725f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller * @param showsWhileLocked true if the activity can be run on top of keyguard. 2735f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED} 274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 2755f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller private void launchActivity(final Intent intent, boolean showsWhileLocked) { 2762ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li intent.addFlags( 277dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Intent.FLAG_ACTIVITY_NEW_TASK 278dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller | Intent.FLAG_ACTIVITY_SINGLE_TOP 279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller | Intent.FLAG_ACTIVITY_CLEAR_TOP); 2805f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller boolean isSecure = mLockPatternUtils.isSecure(); 2815f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller if (!isSecure || showsWhileLocked) { 2825f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller if (!isSecure) try { 2835f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); 2845f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } catch (RemoteException e) { 2855f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller Log.w(TAG, "can't dismiss keyguard on launch"); 2865f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 2875f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller try { 2885f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); 2895f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } catch (ActivityNotFoundException e) { 2905f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller Log.w(TAG, "Activity not found for intent + " + intent.getAction()); 2915f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 2925f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } else { 2935f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller // Create a runnable to start the activity and ask the user to enter their 2945f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller // credentials. 2955f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller mCallback.setOnDismissRunnable(new Runnable() { 2965f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller @Override 2975f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller public void run() { 2985f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); 2995f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller } 3005f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller }); 3015f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller mCallback.dismiss(false); 302dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 303dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 304dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 305dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 306dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reset() { 307dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mGlowPadView.reset(false); 308dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 310dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 311dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean needsInput() { 312dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return false; 313dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 314dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 315dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 316dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onPause() { 317dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback); 318dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 319dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 320dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 321dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onResume() { 322dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback); 323dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 324dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 325dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 326dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSecurityCallback getCallback() { 327dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mCallback; 328dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 329dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3300ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller @Override 3310ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller public void setSecurityMessageDisplay(SecurityMessageDisplay display) { 3320ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller } 333dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 334