KeyguardSelectorView.java revision 3dc524bc31a1578693ca958ef442dfa092b7aa7f
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;
26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException;
27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.UserHandle;
28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.provider.MediaStore;
29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log;
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Slog;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View;
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.LinearLayout;
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3547df44aad773fb2a46d4c07e20278c7d8c0b16beJim Millerimport com.android.internal.telephony.IccCardConstants.State;
36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils;
37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.multiwaveview.GlowPadView;
38dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.R;
40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final boolean DEBUG = KeyguardHostView.DEBUG;
43dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final String TAG = "SecuritySelectorView";
44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final String ASSIST_ICON_METADATA_NAME =
45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        "com.android.systemui.action_assist_icon";
4647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller
47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardSecurityCallback mCallback;
48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private GlowPadView mGlowPadView;
49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private ObjectAnimator mAnim;
50109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    private View mFadeView;
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean mCameraDisabled;
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean mSearchDisabled;
53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onTrigger(View v, int target) {
58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int resId = mGlowPadView.getResourceIdForTarget(target);
59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            switch (resId) {
60dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_action_assist_generic:
61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    Intent assistIntent =
62dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
63dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            .getAssistIntent(mContext, UserHandle.USER_CURRENT);
64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    if (assistIntent != null) {
655f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                        launchActivity(assistIntent, false);
66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    } else {
67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        Log.w(TAG, "Failed to get intent for assist activity");
68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.userActivity(0);
70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    break;
71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_camera:
735f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                    launchCamera();
74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.userActivity(0);
75dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    break;
76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock:
793dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown                    mCallback.userActivity(0);
80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.dismiss(false);
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                break;
82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onReleased(View v, int handle) {
86109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            doTransition(mFadeView, 1.0f);
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbed(View v, int handle) {
903dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown            mCallback.userActivity(0);
91109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            doTransition(mFadeView, 0.0f);
92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbedStateChange(View v, int handle) {
95dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onFinishFinalAnimation() {
99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
10447df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onDevicePolicyManagerStateChanged() {
108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
11247df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        public void onSimStateChanged(State simState) {
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context) {
118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1215f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    protected void launchCamera() {
1225f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (mLockPatternUtils.isSecure()) {
1235f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the secure version of the camera
1242ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li            Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
1252ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
1262ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li            launchActivity(intent, true);
1275f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
1285f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the normal camera
1295f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false);
1305f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        }
1315f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    }
1325f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller
133dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context, AttributeSet attrs) {
134dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = new LockPatternUtils(getContext());
136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onFinishInflate() {
140dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onFinishInflate();
141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
142dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setOnTriggerListener(mOnTriggerListener);
143109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mFadeView = (View) findViewById(R.id.keyguard_selector_fade_container);
144dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateTargets();
145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
146dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
147dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean isTargetPresent(int resId) {
148dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mGlowPadView.getTargetPosition(resId) != -1;
149dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
150dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
151dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private void updateTargets() {
152599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasani        int currentUserHandle = mLockPatternUtils.getCurrentUser();
15348b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
15448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
15548b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        boolean secureCameraDisabled = mLockPatternUtils.isSecure()
15648b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
15748b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
15848b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller                || secureCameraDisabled;
159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean disabledBySimState = monitor.isSimLocked();
161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean cameraTargetPresent =
162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera);
163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean searchTargetPresent =
164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic);
165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
16648b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        if (cameraDisabledByAdmin) {
167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Log.v(TAG, "Camera disabled by Device Policy");
168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else if (disabledBySimState) {
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Log.v(TAG, "Camera disabled by Sim State");
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean searchActionAvailable =
172dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
17448b9b0d068844af9eb37c215484831c4d6b831b0Jim Miller        mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent;
175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent;
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateResources();
177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void updateResources() {
180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // Update the search icon with drawable from the search .apk
181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (!mSearchDisabled) {
182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);
184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (intent != null) {
185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // XXX Hack. We need to substitute the icon here but haven't formalized
186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // the public API. The "_google" metadata will be going away, so
187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // DON'T USE IT!
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                ComponentName component = intent.getComponent();
189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        ASSIST_ICON_METADATA_NAME + "_google",
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        com.android.internal.R.drawable.ic_action_assist_generic);
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            ASSIST_ICON_METADATA_NAME,
195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            com.android.internal.R.drawable.ic_action_assist_generic)) {
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        Slog.w(TAG, "Couldn't grab icon from package " + component);
197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                }
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .ic_lockscreen_camera, !mCameraDisabled);
203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .ic_action_assist_generic, !mSearchDisabled);
205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
207109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    void doTransition(View view, float to) {
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mAnim != null) {
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mAnim.cancel();
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
211109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAnim.start();
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mCallback = callback;
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setLockPatternUtils(LockPatternUtils utils) {
220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = utils;
221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Launches the said intent for the current foreground user.
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * @param intent
2265f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * @param showsWhileLocked true if the activity can be run on top of keyguard.
2275f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED}
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
2295f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    private void launchActivity(final Intent intent, boolean showsWhileLocked) {
2302ab0113b1ec34c96b84e8be9aac1a3f1e9d3ccb8Wu-cheng Li        intent.addFlags(
231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                Intent.FLAG_ACTIVITY_NEW_TASK
232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                | Intent.FLAG_ACTIVITY_SINGLE_TOP
233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2345f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        boolean isSecure = mLockPatternUtils.isSecure();
2355f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (!isSecure || showsWhileLocked) {
2365f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            if (!isSecure) try {
2375f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
2385f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            } catch (RemoteException e) {
2395f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                Log.w(TAG, "can't dismiss keyguard on launch");
2405f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            }
2415f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            try {
2425f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2435f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            } catch (ActivityNotFoundException e) {
2445f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                Log.w(TAG, "Activity not found for intent + " + intent.getAction());
2455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            }
2465f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
2475f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Create a runnable to start the activity and ask the user to enter their
2485f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // credentials.
2495f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            mCallback.setOnDismissRunnable(new Runnable() {
2505f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                @Override
2515f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                public void run() {
2525f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                    mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2535f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                }
2545f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            });
2555f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            mCallback.dismiss(false);
256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
257dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
258dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void reset() {
261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.reset(false);
262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
263dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean needsInput() {
266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return false;
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
269dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onPause() {
271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback);
272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onResume() {
276dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
277dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
278dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSecurityCallback getCallback() {
281dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mCallback;
282dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
284dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
285