1c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi/* 2c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * Copyright (C) 2016 The Android Open Source Project 3c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * 4c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * you may not use this file except in compliance with the License. 6c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * You may obtain a copy of the License at 7c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * 8c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * 10c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * Unless required by applicable law or agreed to in writing, software 11c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * See the License for the specific language governing permissions and 14c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * limitations under the License 15c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi */ 16c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 17c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggipackage com.android.systemui; 18c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 19c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.content.BroadcastReceiver; 20c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.content.Context; 21c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.content.Intent; 22c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.content.IntentFilter; 23c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.os.Build; 24c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.os.PowerManager; 25c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport android.os.SystemClock; 26c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 27c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport com.android.keyguard.KeyguardUpdateMonitor; 28c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport com.android.keyguard.LatencyTracker; 29c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggiimport com.android.systemui.statusbar.phone.FingerprintUnlockController; 302a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monkimport com.android.systemui.statusbar.phone.StatusBar; 31c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 32c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi/** 33c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * Class that only runs on debuggable builds that listens to broadcasts that simulate actions in the 34c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi * system that are used for testing the latency. 35c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi */ 36c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggipublic class LatencyTester extends SystemUI { 37c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 38c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi private static final String ACTION_FINGERPRINT_WAKE = 39c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi "com.android.systemui.latency.ACTION_FINGERPRINT_WAKE"; 40c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi private static final String ACTION_TURN_ON_SCREEN = 41c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi "com.android.systemui.latency.ACTION_TURN_ON_SCREEN"; 42c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 43c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi @Override 44c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi public void start() { 45c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi if (!Build.IS_DEBUGGABLE) { 46c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi return; 47c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 48c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 49c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi IntentFilter filter = new IntentFilter(); 50c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi filter.addAction(ACTION_FINGERPRINT_WAKE); 51c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi filter.addAction(ACTION_TURN_ON_SCREEN); 52c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi mContext.registerReceiver(new BroadcastReceiver() { 53c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi @Override 54c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi public void onReceive(Context context, Intent intent) { 55c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi String action = intent.getAction(); 56c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi if (ACTION_FINGERPRINT_WAKE.equals(action)) { 57c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi fakeWakeAndUnlock(); 58c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } else if (ACTION_TURN_ON_SCREEN.equals(action)) { 59c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi fakeTurnOnScreen(); 60c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 61c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 62c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi }, filter); 63c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 64c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 65c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi private void fakeTurnOnScreen() { 66c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi PowerManager powerManager = mContext.getSystemService(PowerManager.class); 67c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi if (LatencyTracker.isEnabled(mContext)) { 68c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi LatencyTracker.getInstance(mContext).onActionStart( 69c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi LatencyTracker.ACTION_TURN_ON_SCREEN); 70c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 71c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi powerManager.wakeUp(SystemClock.uptimeMillis(), "android.policy:LATENCY_TESTS"); 72c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 73c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi 74c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi private void fakeWakeAndUnlock() { 752a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk FingerprintUnlockController fingerprintUnlockController = getComponent(StatusBar.class) 76c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi .getFingerprintUnlockController(); 77c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi fingerprintUnlockController.onFingerprintAcquired(); 78c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi fingerprintUnlockController.onFingerprintAuthenticated( 79c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi KeyguardUpdateMonitor.getCurrentUser()); 80c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi } 81c3fe204780fb99b1d2563a9e4bb6c082b7517aedJorim Jaggi} 82