15ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller/* 25ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * Copyright (C) 2012 The Android Open Source Project 35ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * 45ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 55ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * you may not use this file except in compliance with the License. 65ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * You may obtain a copy of the License at 75ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * 85ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * http://www.apache.org/licenses/LICENSE-2.0 95ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * 105ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * Unless required by applicable law or agreed to in writing, software 115ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * distributed under the License is distributed on an "AS IS" BASIS, 125ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * See the License for the specific language governing permissions and 145ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * limitations under the License. 155ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller */ 165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 17c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Millerpackage com.android.keyguard.test; 185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1925190577cc69eaa5930c6fbdc2fcca03afc84982Jim Millerimport com.android.internal.policy.IKeyguardShowCallback; 2025190577cc69eaa5930c6fbdc2fcca03afc84982Jim Millerimport com.android.internal.policy.IKeyguardExitCallback; 215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport com.android.internal.policy.IKeyguardService; 225ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 235ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.app.Activity; 245ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.app.AlertDialog; 255ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.app.admin.DevicePolicyManager; 265ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.content.ComponentName; 275ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.content.Context; 285ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.content.Intent; 295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.content.ServiceConnection; 305ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.os.Bundle; 31c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Millerimport android.os.Handler; 325ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.os.IBinder; 335ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.os.RemoteException; 345ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.os.SystemClock; 355ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.provider.Settings; 365ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.util.Log; 375ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.view.Menu; 385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.view.MenuInflater; 395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.view.MenuItem; 405ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.view.View; 415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.view.View.OnClickListener; 425ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.view.WindowManagerPolicy; 435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport com.android.internal.widget.LockPatternUtils; 455ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport com.android.internal.widget.LockPatternView.Cell; 465ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport java.util.List; 485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpublic class KeyguardTestActivity extends Activity implements OnClickListener { 505ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final String KEYGUARD_PACKAGE = "com.android.keyguard"; 515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final String KEYGUARD_CLASS = "com.android.keyguard.KeyguardService"; 525ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final String TAG = "LockScreenTestActivity"; 535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final int MODE_NONE = 0; 545ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final int MODE_PIN = 1; 555ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final int MODE_PASSWORD = 2; 565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final int MODE_PATTERN = 3; 575ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final int MODE_SIM_PIN = 4; 585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final int MODE_SIM_PUK = 5; 595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private static final String SECURITY_MODE = "security_mode"; 60c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller Handler mHandler = new Handler(); 615ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller IKeyguardService mService = null; 635ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 6425190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller KeyguardShowCallback mKeyguardShowCallback = new KeyguardShowCallback(); 6525190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller KeyguardExitCallback mKeyguardExitCallback = new KeyguardExitCallback(); 6625190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller 675ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller RemoteServiceConnection mConnection; 685ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private boolean mSentSystemReady; 695ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 7025190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller class KeyguardShowCallback extends IKeyguardShowCallback.Stub { 715ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 725ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 735ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void onShown(IBinder windowToken) throws RemoteException { 745ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "Keyguard is shown, windowToken = " + windowToken); 755ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 7625190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller } 7725190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller 7825190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller class KeyguardExitCallback extends IKeyguardExitCallback.Stub { 795ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 805ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 81c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller public void onKeyguardExitResult(final boolean success) throws RemoteException { 82c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller mHandler.post(new Runnable() { 83c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller @Override 84c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller public void run() { 85c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller new AlertDialog.Builder(KeyguardTestActivity.this) 86c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller .setMessage("Result: " + success) 87c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller .setPositiveButton("OK", null) 88c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller .show(); 89c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller } 90c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller }); 915ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 925ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller }; 935ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 945ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private class RemoteServiceConnection implements ServiceConnection { 955ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void onServiceConnected(ComponentName className, IBinder service) { 965ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "onServiceConnected()"); 975ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService = IKeyguardService.Stub.asInterface(service); 985ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 995ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.asBinder().linkToDeath(new IBinder.DeathRecipient() { 1005ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 1015ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void binderDied() { 1025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller new AlertDialog.Builder(KeyguardTestActivity.this) 1035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller .setMessage("Oops! Keygued died") 1045ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller .setPositiveButton("OK", null) 1055ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller .show(); 1065ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1075ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller }, 0); 1085ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 1095ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.w(TAG, "Couldn't linkToDeath"); 1105ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller e.printStackTrace(); 1115ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1125ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller// try { 1135ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller// mService.onSystemReady(); 1145ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller// } catch (RemoteException e) { 1155ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller// Log.v(TAG, "Remote service died trying to call onSystemReady"); 1165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller// e.printStackTrace(); 1175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller// } 1185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1205ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void onServiceDisconnected(ComponentName className) { 1215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "onServiceDisconnected()"); 1225ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService = null; 1235ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1245ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller }; 1255ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1265ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private void bindService() { 1275ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (mConnection == null) { 1285ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mConnection = new RemoteServiceConnection(); 1295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Intent intent = new Intent(); 1305ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller intent.setClassName(KEYGUARD_PACKAGE, KEYGUARD_CLASS); 1315ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "BINDING SERVICE: " + KEYGUARD_CLASS); 1325ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (!bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) { 1335ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "FAILED TO BIND TO KEYGUARD!"); 1345ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1355ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } else { 1365ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "Service already bound"); 1375ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1405ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 1415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller protected void onCreate(Bundle savedInstanceState) { 1425ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller super.onCreate(savedInstanceState); 1435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setContentView(R.layout.keyguard_test_activity); 1445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller final int[] buttons = { 1455ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller R.id.on_screen_turned_off, R.id.on_screen_turned_on, 1465ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller R.id.do_keyguard, R.id.verify_unlock 1475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller }; 1485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller for (int i = 0; i < buttons.length; i++) { 1495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller findViewById(buttons[i]).setOnClickListener(this); 1505ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.v(TAG, "Binding service..."); 1525ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller bindService(); 1535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1545ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1555ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 1565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller protected void onSaveInstanceState(Bundle outState) { 1575ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller super.onSaveInstanceState(outState); 1585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller outState.putInt(SECURITY_MODE, mSecurityMode); 1595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1615ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 1625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller protected void onRestoreInstanceState(Bundle savedInstanceState) { 1635ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller super.onRestoreInstanceState(savedInstanceState); 1645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(savedInstanceState.getInt(SECURITY_MODE)); 1655ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 1665ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 167c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// TODO: Find a secure way to inject mock into keyguard... 168c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// @Override 169c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// public boolean onCreateOptionsMenu(Menu menu) { 170c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// MenuInflater inflater = getMenuInflater(); 171c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// inflater.inflate(R.menu.optionmenu, menu); 172c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// return true; 173c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller// } 1745ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 1755ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private void setMode(int mode) { 1765ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mTestSimPin = false; 1775ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mTestSimPuk = false; 1785ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mLockPasswordEnabled = false; 1795ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mLockPatternEnabled = false; 1805ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller switch(mode) { 1815ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case MODE_NONE: 1825ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mSecurityModeMock = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 1835ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 1845ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case MODE_PIN: 1855ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mSecurityModeMock = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 1865ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mLockPasswordEnabled = true; 1875ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 1885ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case MODE_PASSWORD: 1895ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mSecurityModeMock = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC; 1905ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mLockPasswordEnabled = true; 1915ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 1925ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case MODE_PATTERN: 1935ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mSecurityModeMock = DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; 1945ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mLockPatternEnabled = true; 1955ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 1965ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case MODE_SIM_PIN: 1975ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mTestSimPin = true; 1985ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 1995ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case MODE_SIM_PUK: 2005ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mTestSimPuk = true; 2015ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mSecurityMode = mode; 2045ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2055ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 2065ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 2075ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean onOptionsItemSelected(MenuItem item) { 2085ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller // Handle item selection 2095ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller switch (item.getItemId()) { 2105ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.none_menu_item: 2115ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(MODE_NONE); 2125ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2135ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.pin_menu_item: 2145ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(MODE_PIN); 2155ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.password_menu_item: 2175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(MODE_PASSWORD); 2185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.pattern_menu_item: 2205ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(MODE_PATTERN); 2215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2225ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.sim_pin_menu_item: 2235ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(MODE_SIM_PIN); 2245ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2255ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.sim_puk_menu_item: 2265ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller setMode(MODE_SIM_PUK); 2275ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2285ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.add_widget_item: 2295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller startWidgetPicker(); 2305ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2315ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller default: 2325ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return super.onOptionsItemSelected(item); 2335ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2345ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 2355ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.doKeyguardTimeout(null); 2365ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 2375ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.e(TAG, "Remote service died"); 2385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller e.printStackTrace(); 2395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2405ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return true; 2415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2425ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 2435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private void startWidgetPicker() { 2445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller startActivity(new Intent(Settings.ACTION_SECURITY_SETTINGS)); 2455ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2465ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 2475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 2485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void onClick(View v) { 2495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 2505ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller switch (v.getId()) { 2515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.on_screen_turned_on: 25225190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller mService.onScreenTurnedOn(mKeyguardShowCallback); 2535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2545ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.on_screen_turned_off: 2555ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.onScreenTurnedOff(WindowManagerPolicy.OFF_BECAUSE_OF_USER); 2565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2575ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.do_keyguard: 2585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (!mSentSystemReady) { 2595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mSentSystemReady = true; 2605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.onSystemReady(); 2615ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.doKeyguardTimeout(null); 2635ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller case R.id.verify_unlock: 265c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller mService.doKeyguardTimeout(null); 266c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller // Wait for keyguard to lock and then try this... 267c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller mHandler.postDelayed(new Runnable() { 268c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller @Override 269c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller public void run() { 270c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller try { 271c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller mService.verifyUnlock(mKeyguardExitCallback); 272c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller } catch (RemoteException e) { 273c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller Log.e(TAG, "Failed verifyUnlock()", e); 274c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller } 275c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller } 276c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller }, 5000); 2775ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller break; 2785ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2795ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 280c0b676dcc23baedb12946c3470d9fa9b02cb39e0Jim Miller Log.e(TAG, "onClick(): Failed due to remote exeption", e); 2815ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2825ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2835ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 2845ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 2855ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller protected void onPause() { 2865ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller super.onPause(); 2875ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 2885ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (mService != null) { 2895ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.setHidden(true); 2905ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2915ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 2925ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.e(TAG, "Remote service died"); 2935ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller e.printStackTrace(); 2945ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2955ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 2965ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 2975ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller protected void onResume() { 2985ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller super.onResume(); 2995ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 3005ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (mService != null) { 3015ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mService.setHidden(false); 3025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 3045ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Log.e(TAG, "Remote service died"); 3055ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller e.printStackTrace(); 3065ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3075ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3085ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3095ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public int mSecurityModeMock; 3105ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private boolean mTestSimPin; 3115ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private boolean mTestSimPuk; 3125ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private boolean mLockPasswordEnabled; 3135ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean mLockPatternEnabled; 3145ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private int mSecurityMode; 3155ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller class LockPatternUtilsMock extends LockPatternUtils { 3175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller private long mDeadline; 3185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public LockPatternUtilsMock(Context context) { 3195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller super(context); 3205ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3225ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3235ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean checkPattern(List<Cell> pattern) { 3245ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return pattern.size() > 4; 3255ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3265ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3275ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3285ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean checkPassword(String password) { 3295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return password.length() > 4; 3305ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3315ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3325ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public long setLockoutAttemptDeadline() { 3335ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller final long deadline = SystemClock.elapsedRealtime() + FAILED_ATTEMPT_TIMEOUT_MS; 3345ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mDeadline = deadline; 3355ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return deadline; 3365ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3375ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean isLockScreenDisabled() { 3395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return false; 3405ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3425ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public long getLockoutAttemptDeadline() { 3435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return mDeadline; 3445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3455ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3465ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void reportFailedPasswordAttempt() { 3475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller // Ignored 3485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3505ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public void reportSuccessfulPasswordAttempt() { 3515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller // Ignored 3525ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3545ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean isLockPatternEnabled() { 3555ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return mLockPatternEnabled; 3565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3575ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean isLockPasswordEnabled() { 3605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return mLockPasswordEnabled; 3615ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3635ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller @Override 3645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public int getKeyguardStoredPasswordQuality() { 3655ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return mSecurityModeMock; 3665ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3675ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3685ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller public boolean isSecure() { 3695ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return mLockPatternEnabled || mLockPasswordEnabled || mTestSimPin || mTestSimPuk; 3705ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3715ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 3725ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 3735ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller} 374