KeyguardSelectorView.java revision a042ac90640c0c3fd3c5349083b86bbfd6319b64
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.internal.policy.impl.keyguard;
17
18import android.animation.ObjectAnimator;
19import android.app.SearchManager;
20import android.app.admin.DevicePolicyManager;
21import android.content.ComponentName;
22import android.content.Context;
23import android.content.Intent;
24import android.os.UserHandle;
25import android.provider.Settings;
26import android.util.AttributeSet;
27import android.util.Log;
28import android.util.Slog;
29import android.view.View;
30import android.widget.LinearLayout;
31
32import com.android.internal.telephony.IccCardConstants.State;
33import com.android.internal.widget.LockPatternUtils;
34import com.android.internal.widget.multiwaveview.GlowPadView;
35import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
36import com.android.internal.R;
37
38public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
39    private static final boolean DEBUG = KeyguardHostView.DEBUG;
40    private static final String TAG = "SecuritySelectorView";
41    private static final String ASSIST_ICON_METADATA_NAME =
42        "com.android.systemui.action_assist_icon";
43
44    private KeyguardSecurityCallback mCallback;
45    private GlowPadView mGlowPadView;
46    private ObjectAnimator mAnim;
47    private View mFadeView;
48    private boolean mCameraDisabled;
49    private boolean mSearchDisabled;
50    private LockPatternUtils mLockPatternUtils;
51
52    OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
53
54        public void onTrigger(View v, int target) {
55            final int resId = mGlowPadView.getResourceIdForTarget(target);
56            switch (resId) {
57                case com.android.internal.R.drawable.ic_action_assist_generic:
58                    Intent assistIntent =
59                            ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
60                            .getAssistIntent(mContext, UserHandle.USER_CURRENT);
61                    if (assistIntent != null) {
62                        mActivityLauncher.launchActivity(assistIntent, false, true, null, null);
63                    } else {
64                        Log.w(TAG, "Failed to get intent for assist activity");
65                    }
66                    mCallback.userActivity(0);
67                    break;
68
69                case com.android.internal.R.drawable.ic_lockscreen_camera:
70                    mActivityLauncher.launchCamera(null, null);
71                    mCallback.userActivity(0);
72                    break;
73
74                case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
75                case com.android.internal.R.drawable.ic_lockscreen_unlock:
76                    mCallback.userActivity(0);
77                    mCallback.dismiss(false);
78                break;
79            }
80        }
81
82        public void onReleased(View v, int handle) {
83            doTransition(mFadeView, 1.0f);
84        }
85
86        public void onGrabbed(View v, int handle) {
87            mCallback.userActivity(0);
88            doTransition(mFadeView, 0.0f);
89        }
90
91        public void onGrabbedStateChange(View v, int handle) {
92
93        }
94
95        public void onFinishFinalAnimation() {
96
97        }
98
99    };
100
101    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
102
103        @Override
104        public void onDevicePolicyManagerStateChanged() {
105            updateTargets();
106        }
107
108        @Override
109        public void onSimStateChanged(State simState) {
110            updateTargets();
111        }
112    };
113
114    private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() {
115
116        @Override
117        KeyguardSecurityCallback getCallback() {
118            return mCallback;
119        }
120
121        @Override
122        LockPatternUtils getLockPatternUtils() {
123            return mLockPatternUtils;
124        }
125
126        @Override
127        Context getContext() {
128            return mContext;
129        }};
130
131    public KeyguardSelectorView(Context context) {
132        this(context, null);
133    }
134
135    public KeyguardSelectorView(Context context, AttributeSet attrs) {
136        super(context, attrs);
137        mLockPatternUtils = new LockPatternUtils(getContext());
138    }
139
140    @Override
141    protected void onFinishInflate() {
142        super.onFinishInflate();
143        mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
144        mGlowPadView.setOnTriggerListener(mOnTriggerListener);
145        updateTargets();
146    }
147
148    public void setCarrierArea(View carrierArea) {
149        mFadeView = carrierArea;
150    }
151
152    public boolean isTargetPresent(int resId) {
153        return mGlowPadView.getTargetPosition(resId) != -1;
154    }
155
156    @Override
157    public void showUsabilityHint() {
158        mGlowPadView.ping();
159    }
160
161    private void updateTargets() {
162        int currentUserHandle = mLockPatternUtils.getCurrentUser();
163        DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager();
164        int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUserHandle);
165        boolean secureCameraDisabled = mLockPatternUtils.isSecure()
166                && (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
167        boolean cameraDisabledByAdmin = dpm.getCameraDisabled(null, currentUserHandle)
168                || secureCameraDisabled;
169        final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext());
170        boolean disabledBySimState = monitor.isSimLocked();
171        boolean cameraTargetPresent =
172            isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_camera);
173        boolean searchTargetPresent =
174            isTargetPresent(com.android.internal.R.drawable.ic_action_assist_generic);
175
176        if (cameraDisabledByAdmin) {
177            Log.v(TAG, "Camera disabled by Device Policy");
178        } else if (disabledBySimState) {
179            Log.v(TAG, "Camera disabled by Sim State");
180        }
181        boolean currentUserSetup = 0 != Settings.Secure.getIntForUser(
182                mContext.getContentResolver(),
183                Settings.Secure.USER_SETUP_COMPLETE,
184                0 /*default */,
185                currentUserHandle);
186        boolean searchActionAvailable =
187                ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
188                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
189        mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent
190                || !currentUserSetup;
191        mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent
192                || !currentUserSetup;
193        updateResources();
194    }
195
196    public void updateResources() {
197        // Update the search icon with drawable from the search .apk
198        if (!mSearchDisabled) {
199            Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
200                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);
201            if (intent != null) {
202                // XXX Hack. We need to substitute the icon here but haven't formalized
203                // the public API. The "_google" metadata will be going away, so
204                // DON'T USE IT!
205                ComponentName component = intent.getComponent();
206                boolean replaced = mGlowPadView.replaceTargetDrawablesIfPresent(component,
207                        ASSIST_ICON_METADATA_NAME + "_google",
208                        com.android.internal.R.drawable.ic_action_assist_generic);
209
210                if (!replaced && !mGlowPadView.replaceTargetDrawablesIfPresent(component,
211                            ASSIST_ICON_METADATA_NAME,
212                            com.android.internal.R.drawable.ic_action_assist_generic)) {
213                        Slog.w(TAG, "Couldn't grab icon from package " + component);
214                }
215            }
216        }
217
218        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
219                .ic_lockscreen_camera, !mCameraDisabled);
220        mGlowPadView.setEnableTarget(com.android.internal.R.drawable
221                .ic_action_assist_generic, !mSearchDisabled);
222    }
223
224    void doTransition(View view, float to) {
225        if (mAnim != null) {
226            mAnim.cancel();
227        }
228        mAnim = ObjectAnimator.ofFloat(view, "alpha", to);
229        mAnim.start();
230    }
231
232    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
233        mCallback = callback;
234    }
235
236    public void setLockPatternUtils(LockPatternUtils utils) {
237        mLockPatternUtils = utils;
238    }
239
240    @Override
241    public void reset() {
242        mGlowPadView.reset(false);
243    }
244
245    @Override
246    public boolean needsInput() {
247        return false;
248    }
249
250    @Override
251    public void onPause() {
252        KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mInfoCallback);
253    }
254
255    @Override
256    public void onResume(int reason) {
257        KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
258    }
259
260    @Override
261    public KeyguardSecurityCallback getCallback() {
262        return mCallback;
263    }
264
265    @Override
266    public void showBouncer(int duration) {
267    }
268
269    @Override
270    public void hideBouncer(int duration) {
271    }
272}
273