15642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner/*
25642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * Copyright (C) 2012 The Android Open Source Project
35642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner *
45642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
55642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * you may not use this file except in compliance with the License.
65642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * You may obtain a copy of the License at
75642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner *
85642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
95642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner *
105642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * Unless required by applicable law or agreed to in writing, software
115642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
125642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * See the License for the specific language governing permissions and
145642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner * limitations under the License.
155642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner */
165642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
175642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerpackage com.android.server.wm;
185642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
19599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasaniimport android.app.ActivityManagerNative;
205642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.app.admin.DevicePolicyManager;
215642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.content.Context;
225642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.os.Handler;
235642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.os.IBinder;
245642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.os.Message;
25599dd7ce9adf8ca067cefb0b191a5ac20ec35a79Amith Yamasaniimport android.os.RemoteException;
265642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.os.TokenWatcher;
275642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.util.Log;
285642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.util.Pair;
295642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerimport android.view.WindowManagerPolicy;
305642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
315642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautnerpublic class KeyguardDisableHandler extends Handler {
325642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    private static final String TAG = "KeyguardDisableHandler";
335642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
345642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    private static final int ALLOW_DISABLE_YES = 1;
355642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    private static final int ALLOW_DISABLE_NO = 0;
365642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager
375642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher
385642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
395642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    // Message.what constants
405642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    static final int KEYGUARD_DISABLE = 1;
415642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    static final int KEYGUARD_REENABLE = 2;
425642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    static final int KEYGUARD_POLICY_CHANGED = 3;
435642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
445642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    final Context mContext;
455642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    final WindowManagerPolicy mPolicy;
465642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    KeyguardTokenWatcher mKeyguardTokenWatcher;
475642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
485642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    public KeyguardDisableHandler(final Context context, final WindowManagerPolicy policy) {
495642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        mContext = context;
505642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        mPolicy = policy;
515642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    }
525642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
535642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    @SuppressWarnings("unchecked")
545642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    @Override
555642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    public void handleMessage(Message msg) {
565642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        if (mKeyguardTokenWatcher == null) {
575642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            mKeyguardTokenWatcher = new KeyguardTokenWatcher(this);
585642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        }
595642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
605642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        switch (msg.what) {
615642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            case KEYGUARD_DISABLE:
625642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                final Pair<IBinder, String> pair = (Pair<IBinder, String>)msg.obj;
635642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                mKeyguardTokenWatcher.acquire(pair.first, pair.second);
645642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                break;
655642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
665642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            case KEYGUARD_REENABLE:
675642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                mKeyguardTokenWatcher.release((IBinder)msg.obj);
685642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                break;
695642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
705642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            case KEYGUARD_POLICY_CHANGED:
715642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN;
724a3daac72b327e3f400581541f4044311ce103dcJason Monk                if (mKeyguardTokenWatcher.isAcquired()) {
734a3daac72b327e3f400581541f4044311ce103dcJason Monk                    // If we are currently disabled we need to know if the keyguard
744a3daac72b327e3f400581541f4044311ce103dcJason Monk                    // should be re-enabled, so determine the allow state immediately.
754a3daac72b327e3f400581541f4044311ce103dcJason Monk                    mKeyguardTokenWatcher.updateAllowState();
764a3daac72b327e3f400581541f4044311ce103dcJason Monk                    if (mAllowDisableKeyguard != ALLOW_DISABLE_YES) {
774a3daac72b327e3f400581541f4044311ce103dcJason Monk                        mPolicy.enableKeyguard(true);
784a3daac72b327e3f400581541f4044311ce103dcJason Monk                    }
794a3daac72b327e3f400581541f4044311ce103dcJason Monk                } else {
804a3daac72b327e3f400581541f4044311ce103dcJason Monk                    // lazily evaluate this next time we're asked to disable keyguard
814a3daac72b327e3f400581541f4044311ce103dcJason Monk                    mPolicy.enableKeyguard(true);
824a3daac72b327e3f400581541f4044311ce103dcJason Monk                }
835642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                break;
845642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        }
855642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    }
865642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
875642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    class KeyguardTokenWatcher extends TokenWatcher {
885642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
895642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        public KeyguardTokenWatcher(final Handler handler) {
905642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            super(handler, TAG);
915642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        }
925642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
934a3daac72b327e3f400581541f4044311ce103dcJason Monk        public void updateAllowState() {
945642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            // We fail safe and prevent disabling keyguard in the unlikely event this gets
955642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            // called before DevicePolicyManagerService has started.
964a3daac72b327e3f400581541f4044311ce103dcJason Monk            DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
974a3daac72b327e3f400581541f4044311ce103dcJason Monk                    Context.DEVICE_POLICY_SERVICE);
984a3daac72b327e3f400581541f4044311ce103dcJason Monk            if (dpm != null) {
994a3daac72b327e3f400581541f4044311ce103dcJason Monk                try {
1004a3daac72b327e3f400581541f4044311ce103dcJason Monk                    mAllowDisableKeyguard = dpm.getPasswordQuality(null,
1014a3daac72b327e3f400581541f4044311ce103dcJason Monk                            ActivityManagerNative.getDefault().getCurrentUser().id)
1024a3daac72b327e3f400581541f4044311ce103dcJason Monk                            == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ?
1034a3daac72b327e3f400581541f4044311ce103dcJason Monk                                    ALLOW_DISABLE_YES : ALLOW_DISABLE_NO;
1044a3daac72b327e3f400581541f4044311ce103dcJason Monk                } catch (RemoteException re) {
1054a3daac72b327e3f400581541f4044311ce103dcJason Monk                    // Nothing much we can do
1065642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                }
1075642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            }
1084a3daac72b327e3f400581541f4044311ce103dcJason Monk        }
1094a3daac72b327e3f400581541f4044311ce103dcJason Monk
1104a3daac72b327e3f400581541f4044311ce103dcJason Monk        @Override
1114a3daac72b327e3f400581541f4044311ce103dcJason Monk        public void acquired() {
1124a3daac72b327e3f400581541f4044311ce103dcJason Monk            if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) {
1134a3daac72b327e3f400581541f4044311ce103dcJason Monk                updateAllowState();
1144a3daac72b327e3f400581541f4044311ce103dcJason Monk            }
1155642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            if (mAllowDisableKeyguard == ALLOW_DISABLE_YES) {
1165642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                mPolicy.enableKeyguard(false);
1175642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            } else {
1185642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner                Log.v(TAG, "Not disabling keyguard since device policy is enforced");
1195642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            }
1205642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        }
1215642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner
1225642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        @Override
1235642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        public void released() {
1245642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner            mPolicy.enableKeyguard(true);
1255642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner        }
1265642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner    }
1275642a48fbba84cc0b646aea1b9f407f046b70be9Craig Mautner}
128