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

Commit 01577dbb authored by Sukesh Ram's avatar Sukesh Ram
Browse files

Add navigation bar button logs

Add a historical log for when navigation bar buttons (recents, back, home, ime switch, accessibility) are pressed using log buffers to capture and dump this data. When phone starts and the buttons mentioned above are clicked, a historical log is maintained. To access the history of button clicks, run "adb shell dumpsys activity service SystemUIAuxiliaryDumpService" in the terminal.

Flag: NONE
Test: Manually tested in pixel 7 by pressing home, back, & recent
buttons in 3-button mode and checking for output.
Bug: 319682924
Change-Id: I423a8da101ebb7c28aff89e56f5050b3071f3972

Change-Id: I8f4c5f4aa3295900c88ce924fa7750974c7a7952
parent 65fc6629
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -618,4 +618,13 @@ public class LogModule {
    public static LogBuffer providePackageChangeRepoLogBuffer(LogBufferFactory factory) {
        return factory.create("PackageChangeRepo", 50);
    }

    /** Provides a {@link LogBuffer} for NavBarButtonClicks. */
    @Provides
    @SysUISingleton
    @NavBarButtonClickLog
    public static LogBuffer provideNavBarButtonClickLogBuffer(LogBufferFactory factory) {
        return factory.create("NavBarButtonClick", 50);
    }

}
+34 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.systemui.log.dagger;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import com.android.systemui.log.LogBuffer;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;

import javax.inject.Qualifier;

/** A {@link LogBuffer} for {@link com.android.systemui.navigationbar.NavigationBar}. */
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface NavBarButtonClickLog {
}
+48 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.systemui.navigationbar

import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.dagger.NavBarButtonClickLog
import javax.inject.Inject

class NavBarButtonClickLogger
@Inject
constructor(@NavBarButtonClickLog private val buffer: LogBuffer) {
    fun logHomeButtonClick() {
        buffer.log(TAG, LogLevel.DEBUG, {}, { "Home Button Triggered" })
    }

    fun logBackButtonClick() {
        buffer.log(TAG, LogLevel.DEBUG, {}, { "Back Button Triggered" })
    }

    fun logRecentsButtonClick() {
        buffer.log(TAG, LogLevel.DEBUG, {}, { "Recents Button Triggered" })
    }

    fun logImeSwitcherClick() {
        buffer.log(TAG, LogLevel.DEBUG, {}, { "Ime Switcher Triggered" })
    }

    fun logAccessibilityButtonClick() {
        buffer.log(TAG, LogLevel.DEBUG, {}, { "Accessibility Button Triggered" })
    }
}

private const val TAG = "NavBarButtonClick"
+12 −5
Original line number Diff line number Diff line
@@ -84,11 +84,7 @@ import android.view.InsetsFrameProvider;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.View;
import android.view.ViewRootImpl;
import android.view.ViewRootImpl.SurfaceChangedCallback;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.InternalInsetsInfo;
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
@@ -285,6 +281,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
    private boolean mImeVisible;
    private final Rect mSamplingBounds = new Rect();
    private final Binder mInsetsSourceOwner = new Binder();
    private final NavBarButtonClickLogger mNavBarButtonClickLogger;

    /**
     * When quickswitching between apps of different orientations, we draw a secondary home handle
@@ -559,7 +556,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
            UserContextProvider userContextProvider,
            WakefulnessLifecycle wakefulnessLifecycle,
            TaskStackChangeListeners taskStackChangeListeners,
            DisplayTracker displayTracker) {
            DisplayTracker displayTracker,
            NavBarButtonClickLogger navBarButtonClickLogger) {
        super(navigationBarView);
        mFrame = navigationBarFrame;
        mContext = context;
@@ -601,6 +599,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        mTaskStackChangeListeners = taskStackChangeListeners;
        mDisplayTracker = displayTracker;
        mEdgeBackGestureHandler = navBarHelper.getEdgeBackGestureHandler();
        mNavBarButtonClickLogger = navBarButtonClickLogger;

        mNavColorSampleMargin = getResources()
                .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
@@ -1276,6 +1275,10 @@ public class NavigationBar extends ViewController<NavigationBarView> implements

        ButtonDispatcher homeButton = mView.getHomeButton();
        homeButton.setOnTouchListener(this::onHomeTouch);
        homeButton.setNavBarButtonClickLogger(mNavBarButtonClickLogger);

        ButtonDispatcher backButton = mView.getBackButton();
        backButton.setNavBarButtonClickLogger(mNavBarButtonClickLogger);

        reconfigureHomeLongClick();

@@ -1388,6 +1391,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
    }

    private void onRecentsClick(View v) {
        mNavBarButtonClickLogger.logRecentsButtonClick();

        if (LatencyTracker.isEnabled(mContext)) {
            LatencyTracker.getInstance(mContext).onActionStart(
                    LatencyTracker.ACTION_TOGGLE_RECENTS);
@@ -1397,6 +1402,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
    }

    private void onImeSwitcherClick(View v) {
        mNavBarButtonClickLogger.logImeSwitcherClick();
        mInputMethodManager.showInputMethodPickerFromSystem(
                true /* showAuxiliarySubtypes */, mDisplayId);
        mUiEventLogger.log(KeyButtonView.NavBarButtonEvent.NAVBAR_IME_SWITCHER_BUTTON_TAP);
@@ -1486,6 +1492,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
    }

    private void onAccessibilityClick(View v) {
        mNavBarButtonClickLogger.logAccessibilityButtonClick();
        final Display display = v.getDisplay();
        mAccessibilityManager.notifyAccessibilityButtonClicked(
                display != null ? display.getDisplayId() : mDisplayTracker.getDefaultDisplayId());
+36 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.view.View;
import android.view.View.AccessibilityDelegate;
import android.view.ViewGroup;

import com.android.systemui.navigationbar.NavBarButtonClickLogger;

import java.util.ArrayList;

@@ -52,6 +55,7 @@ public class ButtonDispatcher {
    private boolean mVertical;
    private ValueAnimator mFadeAnimator;
    private AccessibilityDelegate mAccessibilityDelegate;
    private NavBarButtonClickLogger mNavBarButtonClickLogger;

    private final ValueAnimator.AnimatorUpdateListener mAlphaListener = animation ->
            setAlpha(
@@ -341,4 +345,36 @@ public class ButtonDispatcher {
     */
    public void onDestroy() {
    }

    /**
     * Sets the NavBarButtonClickLogger for all the KeyButtonViews respectively.
     */
    public void setNavBarButtonClickLogger(NavBarButtonClickLogger navBarButtonClickLogger) {
        if (navBarButtonClickLogger != null) {
            mNavBarButtonClickLogger = navBarButtonClickLogger;
            final int size = mViews.size();
            for (int i = 0; i < size; i++) {
                final View v = mViews.get(i);
                setNavBarButtonClickLoggerForViewChildren(v);
            }
        }
    }

    /**
     * Recursively explores view hierarchy until the children of provided view are of type
     * KeyButtonView, so the NavBarButtonClickLogger can be set on them.
     */
    private void setNavBarButtonClickLoggerForViewChildren(View v) {
        if (v instanceof KeyButtonView) {
            ((KeyButtonView) v).setNavBarButtonClickLogger(mNavBarButtonClickLogger);
            return;
        }

        if (v instanceof ViewGroup viewGroup) {
            final int childrenCount = viewGroup.getChildCount();
            for (int i = 0; i < childrenCount; i++) {
                setNavBarButtonClickLoggerForViewChildren(viewGroup.getChildAt(i));
            }
        }
    }
}
Loading