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