KeyguardSelectorView.java revision 5f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2
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;
21dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.ActivityNotFoundException;
22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.ComponentName;
23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context;
24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Intent;
25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException;
26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.UserHandle;
27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.provider.MediaStore;
28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log;
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Slog;
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.Button;
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.LinearLayout;
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.telephony.IccCardConstants;
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";
46dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardSecurityCallback mCallback;
47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private GlowPadView mGlowPadView;
48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private Button mEmergencyCallButton;
49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private ObjectAnimator mAnim;
50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean mCameraDisabled;
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean mSearchDisabled;
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onTrigger(View v, int target) {
57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int resId = mGlowPadView.getResourceIdForTarget(target);
58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            switch (resId) {
59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_action_assist_generic:
60dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    Intent assistIntent =
61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
62dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            .getAssistIntent(mContext, UserHandle.USER_CURRENT);
63dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    if (assistIntent != null) {
645f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                        launchActivity(assistIntent, false);
65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    } else {
66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        Log.w(TAG, "Failed to get intent for assist activity");
67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.userActivity(0);
69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    break;
70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_camera:
725f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                    launchCamera();
73dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.userActivity(0);
74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    break;
75dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                case com.android.internal.R.drawable.ic_lockscreen_unlock:
78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.dismiss(false);
79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                break;
80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onReleased(View v, int handle) {
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            doTransition(mEmergencyCallButton, 1.0f);
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbed(View v, int handle) {
88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            doTransition(mEmergencyCallButton, 0.0f);
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbedStateChange(View v, int handle) {
92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
95dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onFinishFinalAnimation() {
96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        private boolean mEmergencyDialerDisableBecauseSimLocked;
104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onDevicePolicyManagerStateChanged() {
107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onSimStateChanged(IccCardConstants.State simState) {
112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // Some carriers aren't capable of handling emergency calls while the SIM is locked
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mEmergencyDialerDisableBecauseSimLocked = KeyguardUpdateMonitor.isSimLocked(simState)
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    && !mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        void onPhoneStateChanged(int phoneState) {
119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (mEmergencyCallButton != null) {
120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        phoneState, !mEmergencyDialerDisableBecauseSimLocked);
123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        };
125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context) {
128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
130dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1315f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    protected void launchCamera() {
1325f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (mLockPatternUtils.isSecure()) {
1335f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the secure version of the camera
1345f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE), true);
1355f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
1365f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the normal camera
1375f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false);
1385f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        }
1395f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    }
1405f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller
141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context, AttributeSet attrs) {
142dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
143dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = new LockPatternUtils(getContext());
144dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
146dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
147dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onFinishInflate() {
148dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onFinishInflate();
149dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
150dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setOnTriggerListener(mOnTriggerListener);
151dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mEmergencyCallButton = (Button) findViewById(R.id.emergency_call_button);
152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateTargets();
154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean isTargetPresent(int resId) {
157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mGlowPadView.getTargetPosition(resId) != -1;
158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private void updateTargets() {
161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean disabledByAdmin = mLockPatternUtils.getDevicePolicyManager()
162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .getCameraDisabled(null);
163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean disabledBySimState = monitor.isSimLocked();
165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean cameraTargetPresent =
166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera);
167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean searchTargetPresent =
168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic);
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (disabledByAdmin) {
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Log.v(TAG, "Camera disabled by Device Policy");
172dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        } else if (disabledBySimState) {
173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Log.v(TAG, "Camera disabled by Sim State");
174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean searchActionAvailable =
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent;
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent;
180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateResources();
181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void updateResources() {
184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // Update the search icon with drawable from the search .apk
185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (!mSearchDisabled) {
186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (intent != null) {
189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // XXX Hack. We need to substitute the icon here but haven't formalized
190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // the public API. The "_google" metadata will be going away, so
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // DON'T USE IT!
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                ComponentName component = intent.getComponent();
193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        ASSIST_ICON_METADATA_NAME + "_google",
195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        com.android.internal.R.drawable.ic_action_assist_generic);
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            ASSIST_ICON_METADATA_NAME,
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                            com.android.internal.R.drawable.ic_action_assist_generic)) {
200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        Slog.w(TAG, "Couldn't grab icon from package " + component);
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                }
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .ic_lockscreen_camera, !mCameraDisabled);
207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .ic_action_assist_generic, !mSearchDisabled);
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    void doTransition(Object v, float to) {
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mAnim != null) {
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mAnim.cancel();
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAnim = ObjectAnimator.ofFloat(mEmergencyCallButton, "alpha", to);
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAnim.start();
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mCallback = callback;
221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setLockPatternUtils(LockPatternUtils utils) {
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = utils;
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Launches the said intent for the current foreground user.
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * @param intent
2305f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * @param showsWhileLocked true if the activity can be run on top of keyguard.
2315f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller     * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED}
232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
2335f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    private void launchActivity(final Intent intent, boolean showsWhileLocked) {
234dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        intent.setFlags(
235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                Intent.FLAG_ACTIVITY_NEW_TASK
236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                | Intent.FLAG_ACTIVITY_SINGLE_TOP
237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
2385f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        boolean isSecure = mLockPatternUtils.isSecure();
2395f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (!isSecure || showsWhileLocked) {
2405f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            if (!isSecure) try {
2415f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
2425f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            } catch (RemoteException e) {
2435f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                Log.w(TAG, "can't dismiss keyguard on launch");
2445f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            }
2455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            try {
2465f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2475f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            } catch (ActivityNotFoundException e) {
2485f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                Log.w(TAG, "Activity not found for intent + " + intent.getAction());
2495f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            }
2505f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
2515f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Create a runnable to start the activity and ask the user to enter their
2525f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // credentials.
2535f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            mCallback.setOnDismissRunnable(new Runnable() {
2545f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                @Override
2555f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                public void run() {
2565f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                    mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
2575f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller                }
2585f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            });
2595f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            mCallback.dismiss(false);
260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
263dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void reset() {
265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.reset(false);
266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
269dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean needsInput() {
270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return false;
271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onPause() {
275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback);
276dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
277dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
278dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onResume() {
280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
281dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
282dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
284dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSecurityCallback getCallback() {
285dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mCallback;
286dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
287dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
288dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
289