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