KeyguardSelectorView.java revision 47df44aad773fb2a46d4c07e20278c7d8c0b16be
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;
2847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Millerimport android.telephony.TelephonyManager;
29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log;
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Slog;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View;
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.Button;
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.LinearLayout;
35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.telephony.IccCardConstants;
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
43dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final boolean DEBUG = KeyguardHostView.DEBUG;
45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final String TAG = "SecuritySelectorView";
46dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private static final String ASSIST_ICON_METADATA_NAME =
47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        "com.android.systemui.action_assist_icon";
4847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    private static final int EMERGENCY_CALL_TIMEOUT = 10000; // screen timeout after starting e.d.
4947df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL";
5047df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardSecurityCallback mCallback;
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private GlowPadView mGlowPadView;
53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private Button mEmergencyCallButton;
54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private ObjectAnimator mAnim;
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:
83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mCallback.dismiss(false);
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                break;
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onReleased(View v, int handle) {
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            doTransition(mEmergencyCallButton, 1.0f);
90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbed(View v, int handle) {
93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            doTransition(mEmergencyCallButton, 0.0f);
94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
95dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onGrabbedStateChange(View v, int handle) {
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onFinishFinalAnimation() {
101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
10647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    private void updateEmergencyCallButton(State simState, int phoneState) {
10747df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        if (mEmergencyCallButton != null) {
10847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            boolean en = mLockPatternUtils.isEmergencyCallCapable()
10947df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller                || (phoneState == TelephonyManager.CALL_STATE_OFFHOOK); // voice call in progress
11047df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            if (en && KeyguardUpdateMonitor.isSimLocked(simState)) {
11147df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller                // Some countries can't handle emergency calls while SIM is locked.
11247df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller                en = mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
11347df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            }
11447df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, phoneState, en);
11547df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        }
11647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    }
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
11847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void onDevicePolicyManagerStateChanged() {
122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
12647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        public void onSimStateChanged(State simState) {
12747df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            int phoneState = KeyguardUpdateMonitor.getInstance(mContext).getPhoneState();
12847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            updateEmergencyCallButton(simState, phoneState);
129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            updateTargets();
130dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
131dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
132dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        void onPhoneStateChanged(int phoneState) {
13347df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            State simState = KeyguardUpdateMonitor.getInstance(mContext).getSimState();
13447df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            updateEmergencyCallButton(simState, phoneState);
135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        };
136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    };
137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context) {
139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
140dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1425f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    protected void launchCamera() {
1435f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        if (mLockPatternUtils.isSecure()) {
1445f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the secure version of the camera
1455f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE), true);
1465f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        } else {
1475f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            // Launch the normal camera
1485f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false);
1495f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller        }
1505f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller    }
1515f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2Jim Miller
152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSelectorView(Context context, AttributeSet attrs) {
153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = new LockPatternUtils(getContext());
155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onFinishInflate() {
159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onFinishInflate();
160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mGlowPadView.setOnTriggerListener(mOnTriggerListener);
162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mEmergencyCallButton = (Button) findViewById(R.id.emergency_call_button);
16347df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        mEmergencyCallButton.setOnClickListener(new OnClickListener() {
16447df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            public void onClick(View v) {
16547df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller                takeEmergencyCallAction();
16647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            }
16747df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        });
168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        updateTargets();
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
17147df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    /**
17247df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller     * Shows the emergency dialer or returns the user to the existing call.
17347df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller     */
17447df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    public void takeEmergencyCallAction() {
17547df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        mCallback.userActivity(EMERGENCY_CALL_TIMEOUT);
17647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        if (TelephonyManager.getDefault().getCallState()
17747df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller                == TelephonyManager.CALL_STATE_OFFHOOK) {
17847df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            mLockPatternUtils.resumeCall();
17947df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        } else {
18047df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            Intent intent = new Intent(ACTION_EMERGENCY_DIAL);
18147df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
18247df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller                    | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
18347df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller            getContext().startActivity(intent);
18447df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller        }
18547df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller    }
18647df44aad773fb2a46d4c07e20278c7d8c0b16beJim Miller
187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean isTargetPresent(int resId) {
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mGlowPadView.getTargetPosition(resId) != -1;
189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private void updateTargets() {
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean disabledByAdmin = mLockPatternUtils.getDevicePolicyManager()
193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                .getCameraDisabled(null);
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
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (disabledByAdmin) {
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;
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mCameraDisabled = disabledByAdmin || 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
242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    void doTransition(Object v, float to) {
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mAnim != null) {
244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mAnim.cancel();
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mAnim = ObjectAnimator.ofFloat(mEmergencyCallButton, "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) {
265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        intent.setFlags(
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