Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d136f43 authored by Asmita Poddar's avatar Asmita Poddar Committed by Automerger Merge Worker
Browse files

Merge "Keycode logging logic for KeyboardSystemsEventReported atom" into udc-qpr-dev am: 9b56b45b

parents 59f84ead 9b56b45b
Loading
Loading
Loading
Loading
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.input;

import android.view.InputDevice;

import com.android.internal.util.FrameworkStatsLog;

/**
 * Collect Keyboard metrics
 */
public final class KeyboardMetricsCollector {
    private static final String TAG = "KeyboardMetricCollector";

    /**
     * Log keyboard system shortcuts for the proto
     * {@link com.android.os.input.KeyboardSystemsEventReported}
     * defined in "stats/atoms/input/input_extension_atoms.proto"
     */
    public static void logKeyboardSystemsEventReportedAtom(InputDevice inputDevice,
            int keyboardSystemEvent, int[] keyCode, int modifierState) {
        int vendor_id = inputDevice.getVendorId();
        int product_id = inputDevice.getProductId();
        FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED,
                vendor_id, product_id, keyboardSystemEvent, keyCode, modifierState);
    }
}
+35 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ import android.hardware.hdmi.HdmiAudioSystemClient;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPlaybackClient;
import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
import android.hardware.input.InputManager;
import android.media.AudioManager;
import android.media.AudioManagerInternal;
import android.media.AudioSystem;
@@ -205,6 +206,7 @@ import com.android.internal.policy.PhoneWindow;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.AccessibilityManagerInternal;
import com.android.server.ExtconStateObserver;
@@ -215,6 +217,7 @@ import com.android.server.SystemServiceManager;
import com.android.server.UiThread;
import com.android.server.display.BrightnessUtils;
import com.android.server.input.InputManagerInternal;
import com.android.server.input.KeyboardMetricsCollector;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.pm.UserManagerInternal;
import com.android.server.policy.KeyCombinationManager.TwoKeysCombinationRule;
@@ -678,6 +681,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private static final int MSG_LAUNCH_ASSIST = 23;
    private static final int MSG_RINGER_TOGGLE_CHORD = 24;
    private static final int MSG_SWITCH_KEYBOARD_LAYOUT = 25;
    private static final int MSG_LOG_KEYBOARD_SYSTEM_EVENT = 26;

    private class PolicyHandler extends Handler {
        @Override
@@ -751,6 +755,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                case MSG_SWITCH_KEYBOARD_LAYOUT:
                    handleSwitchKeyboardLayout(msg.arg1, msg.arg2);
                    break;
                case MSG_LOG_KEYBOARD_SYSTEM_EVENT:
                    handleKeyboardSystemEvent(msg.arg2, (KeyEvent) msg.obj);
                    break;
            }
        }
    }
@@ -2288,6 +2295,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                            cancelPendingScreenshotChordAction();
                        }
                    });

            if (mHasFeatureWatch) {
                mKeyCombinationManager.addRule(
                        new TwoKeysCombinationRule(KEYCODE_POWER, KEYCODE_STEM_PRIMARY) {
@@ -2907,7 +2915,30 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
        };

    /**
     * Log the keyboard shortcuts without blocking the current thread.
     *
     * We won't log keyboard events when the input device is null
     * or when it is virtual.
     */
    private void handleKeyboardSystemEvent(int keyboardSystemEvent, KeyEvent event) {
        final InputManager inputManager = mContext.getSystemService(InputManager.class);
        final InputDevice inputDevice = inputManager != null
                ? inputManager.getInputDevice(event.getDeviceId()) : null;
        if (inputDevice != null && !inputDevice.isVirtual()) {
            KeyboardMetricsCollector.logKeyboardSystemsEventReportedAtom(
                    inputDevice, keyboardSystemEvent,
                    new int[]{event.getKeyCode()}, event.getMetaState());
        }
    }

    private void logKeyboardSystemsEvent(KeyEvent event, int keyboardSystemEvent) {
        mHandler.obtainMessage(MSG_LOG_KEYBOARD_SYSTEM_EVENT, 0, keyboardSystemEvent, event)
                .sendToTarget();
    }

    // TODO(b/117479243): handle it in InputPolicy
    // TODO (b/283241997): Add the remaining keyboard shortcut logging after refactoring
    /** {@inheritDoc} */
    @Override
    public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,
@@ -2961,6 +2992,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {

        switch(keyCode) {
            case KeyEvent.KEYCODE_HOME:
                logKeyboardSystemsEvent(event, FrameworkStatsLog
                        .KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__HOME);
                return handleHomeShortcuts(displayId, focusedToken, event);
            case KeyEvent.KEYCODE_MENU:
                // Hijack modified menu keys for debugging features
@@ -2978,6 +3011,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            case KeyEvent.KEYCODE_RECENT_APPS:
                if (down && repeatCount == 0) {
                    showRecentApps(false /* triggeredFromAltTab */);
                    logKeyboardSystemsEvent(event, FrameworkStatsLog
                            .KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__RECENT_APPS);
                }
                return key_consumed;
            case KeyEvent.KEYCODE_APP_SWITCH: