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