KeyguardSelectorView.java revision 0a8d32673b3d34153c287916f0ca8d4439f3087e
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;
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log;
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Slog;
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View;
35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.LinearLayout;
36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3747df44aad773fb2a46d4c07e20278c7d8c0b16beJim Millerimport com.android.internal.telephony.IccCardConstants.State;
38dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils;
39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.multiwaveview.GlowPadView;
40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.R;
42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
43ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Millerimport java.util.List;
44ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller
45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
46dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final boolean DEBUG = KeyguardHostView.DEBUG;
47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final String TAG = "SecuritySelectorView";
48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final String ASSIST_ICON_METADATA_NAME =
49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        "com.android.systemui.action_assist_icon";
5047df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardSecurityCallback mCallback;
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private GlowPadView mGlowPadView;
53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private ObjectAnimator mAnim;
54109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    private View mFadeView;
55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean mCameraDisabled;
56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean mSearchDisabled;
57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
60dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onTrigger(View v, int target) {
62dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int resId = mGlowPadView.getResourceIdForTarget(target);
63dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            switch (resId) {
64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_action_assist_generic:
65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    Intent assistIntent =
66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            .getAssistIntent(mContext, UserHandle.USER_CURRENT);
68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    if (assistIntent != null) {
695f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                        launchActivity(assistIntent, false);
70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    } else {
71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        Log.w(TAG, "Failed to get intent for assist activity");
72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
73dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.userActivity(0);
74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    break;
75dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_camera:
775f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                    launchCamera();
78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.userActivity(0);
79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    break;
80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock:
833dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown                    mCallback.userActivity(0);
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.dismiss(false);
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                break;
86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onReleased(View v, int handle) {
90109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            doTransition(mFadeView, 1.0f);
91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbed(View v, int handle) {
943dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown            mCallback.userActivity(0);
95109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            doTransition(mFadeView, 0.0f);
96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbedStateChange(View v, int handle) {
99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onFinishFinalAnimation() {
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
10847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onDevicePolicyManagerStateChanged() {
112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
11647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        public void onSimStateChanged(State simState) {
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context) {
122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
125ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller    private boolean wouldLaunchResolverActivity(Intent intent) {
126ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        PackageManager packageManager = mContext.getPackageManager();
127ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        ResolveInfo resolved = packageManager.resolveActivityAsUser(intent,
128ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser());
129ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser(
130ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                intent, PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser());
131ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        // If the list contains the above resolved activity, then it can't be
132ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        // ResolverActivity itself.
133ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        for (int i = 0; i < appList.size(); i++) {
134ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            ResolveInfo tmp = appList.get(i);
135ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            if (tmp.activityInfo.name.equals(resolved.activityInfo.name)
136ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                    && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) {
137ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                return false;
138ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            }
139ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        }
140ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller        return true;
141ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller    }
142ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller
1435f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    protected void launchCamera() {
1445f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (mLockPatternUtils.isSecure()) {
1455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the secure version of the camera
146ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            final Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
1472ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
148ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller
149ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            if (wouldLaunchResolverActivity(intent)) {
150ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                // TODO: Show disambiguation dialog instead.
151ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                // For now, we'll treat this like launching any other app from secure keyguard.
152ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                // When they do, user sees the system's ResolverActivity which lets them choose
153ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                // which secure camera to use.
154ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                launchActivity(intent, false);
155ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            } else {
156ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller                launchActivity(intent, true);
157ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            }
1585f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
1595f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the normal camera
1605f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false);
1615f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        }
1625f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    }
1635f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller
164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context, AttributeSet attrs) {
165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = new LockPatternUtils(getContext());
167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onFinishInflate() {
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onFinishInflate();
172dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setOnTriggerListener(mOnTriggerListener);
174109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mFadeView = (View) findViewById(R.id.keyguard_selector_fade_container);
175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateTargets();
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean isTargetPresent(int resId) {
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mGlowPadView.getTargetPosition(resId) != -1;
180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1820a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen    public void ping() {
1830a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen        mGlowPadView.ping();
1840a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen    }
1850a8d32673b3d34153c287916f0ca8d4439f3087eAdam Cohen
186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private void updateTargets() {
187599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani        int currentUserHandle = mLockPatternUtils.getCurrentUser();
18848b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
18948b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
19048b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        boolean secureCameraDisabled = mLockPatternUtils.isSecure()
19148b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
19248b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
19348b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                || secureCameraDisabled;
194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean disabledBySimState = monitor.isSimLocked();
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean cameraTargetPresent =
197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera);
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean searchTargetPresent =
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic);
200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
20148b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        if (cameraDisabledByAdmin) {
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Log.v(TAG, "Camera disabled by Device Policy");
203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else if (disabledBySimState) {
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Log.v(TAG, "Camera disabled by Sim State");
205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean searchActionAvailable =
207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
20948b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent;
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent;
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateResources();
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void updateResources() {
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // Update the search icon with drawable from the search .apk
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (!mSearchDisabled) {
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (intent != null) {
220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // XXX Hack. We need to substitute the icon here but haven't formalized
221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // the public API. The "_google" metadata will be going away, so
222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // DON'T USE IT!
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                ComponentName component = intent.getComponent();
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        ASSIST_ICON_METADATA_NAME + "_google",
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        com.android.internal.R.drawable.ic_action_assist_generic);
227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            ASSIST_ICON_METADATA_NAME,
230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            com.android.internal.R.drawable.ic_action_assist_generic)) {
231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        Slog.w(TAG, "Couldn't grab icon from package " + component);
232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                }
233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
234dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .ic_lockscreen_camera, !mCameraDisabled);
238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
239dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .ic_action_assist_generic, !mSearchDisabled);
240dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
242109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    void doTransition(View view, float to) {
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mAnim != null) {
244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mAnim.cancel();
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
246109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAnim.start();
248dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mCallback = callback;
252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
253dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
254dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setLockPatternUtils(LockPatternUtils utils) {
255dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = utils;
256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
257dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
258dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Launches the said intent for the current foreground user.
260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * @param intent
2615f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * @param showsWhileLocked true if the activity can be run on top of keyguard.
2625f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED}
263dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
2645f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    private void launchActivity(final Intent intent, boolean showsWhileLocked) {
2652ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li        intent.addFlags(
266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                Intent.FLAG_ACTIVITY_NEW_TASK
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                | Intent.FLAG_ACTIVITY_SINGLE_TOP
268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2695f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        boolean isSecure = mLockPatternUtils.isSecure();
2705f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (!isSecure || showsWhileLocked) {
2715f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            if (!isSecure) try {
2725f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
2735f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            } catch (RemoteException e) {
2745f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                Log.w(TAG, "can't dismiss keyguard on launch");
2755f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            }
2765f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            try {
2775f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2785f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            } catch (ActivityNotFoundException e) {
2795f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                Log.w(TAG, "Activity not found for intent + " + intent.getAction());
2805f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            }
2815f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
2825f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Create a runnable to start the activity and ask the user to enter their
2835f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // credentials.
2845f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            mCallback.setOnDismissRunnable(new Runnable() {
2855f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                @Override
2865f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                public void run() {
2875f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                    mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2885f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                }
2895f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            });
2905f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            mCallback.dismiss(false);
291dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
294dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
295dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void reset() {
296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.reset(false);
297dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
298dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
299dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
300dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean needsInput() {
301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return false;
302dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
303dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
304dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
305dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onPause() {
306dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback);
307dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
308dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
310dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onResume() {
311dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
312dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
313dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
314dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
315dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSecurityCallback getCallback() {
316dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mCallback;
317dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
318dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
319dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
320