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