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

Commit 28794324 authored by Daniel Norman's avatar Daniel Norman
Browse files

Logs TEX metrics for the two FAB Drag-to-X actions: dismiss & edit.

Includes the UID of the shortcut features so that logs include which
features were acted upon. (For system features this is SysUI's UID.)

Built with:
  m framework-minus-apex SystemUIGoogle

Metric manually observed with:
  m statsd_testdrive
  statsd_testdrive -d 10000 644
  # Observe UIDs align with UIDs from dumpsys package.
  # Note, 644 comes from TEX atom ExpressUidEventReported

Bug: 324968169
Test: atest MenuViewLayerTest
Flag: ACONFIG com.android.systemui.floating_menu_drag_to_edit TRUNKFOOD
Change-Id: I7bc68caac56385b4429dbcdb38a2517117c71c2b
parent 59e8043a
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.android.internal.accessibility.dialog.AccessibilityTarget;
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.expresslog.Counter;
import com.android.systemui.Flags;
import com.android.systemui.util.settings.SecureSettings;

@@ -436,6 +438,20 @@ class MenuView extends FrameLayout implements
        mContext.startActivity(getIntentForEditScreen());
    }

    void incrementTexMetricForAllTargets(String metric) {
        if (!Flags.floatingMenuDragToEdit()) {
            return;
        }
        for (AccessibilityTarget target : mTargetFeatures) {
            incrementTexMetric(metric, target.getUid());
        }
    }

    @VisibleForTesting
    void incrementTexMetric(String metric, int uid) {
        Counter.logIncrementWithUid(metric, uid);
    }

    Intent getIntentForEditScreen() {
        List<String> targets = new SettingsStringUtil.ColonDelimitedSet.OfStrings(
                mSecureSettings.getStringForUser(
+16 −0
Original line number Diff line number Diff line
@@ -92,6 +92,20 @@ class MenuViewLayer extends FrameLayout implements
        MenuView.OnMoveToTuckedListener {
    private static final int SHOW_MESSAGE_DELAY_MS = 3000;

    /**
     * Counter indicating the FAB was dragged to the Dismiss action button.
     *
     * <p>Defined in frameworks/proto_logging/stats/express/catalog/accessibility.cfg.
     */
    static final String TEX_METRIC_DISMISS = "accessibility.value_fab_shortcut_action_dismiss";

    /**
     * Counter indicating the FAB was dragged to the Edit action button.
     *
     * <p>Defined in frameworks/proto_logging/stats/express/catalog/accessibility.cfg.
     */
    static final String TEX_METRIC_EDIT = "accessibility.value_fab_shortcut_action_edit";

    private final WindowManager mWindowManager;
    private final MenuView mMenuView;
    private final MenuListViewTouchHandler mMenuListViewTouchHandler;
@@ -457,9 +471,11 @@ class MenuViewLayer extends FrameLayout implements
            } else {
                hideMenuAndShowMessage();
            }
            mMenuView.incrementTexMetricForAllTargets(TEX_METRIC_DISMISS);
        } else if (id == R.id.action_edit
                && Flags.floatingMenuDragToEdit()) {
            mMenuView.gotoEditScreen();
            mMenuView.incrementTexMetricForAllTargets(TEX_METRIC_EDIT);
        }
        mDismissView.hide();
        mDragToInteractView.hide();
+50 −3
Original line number Diff line number Diff line
@@ -31,10 +31,12 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@@ -69,6 +71,7 @@ import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.SpringAnimation;
import androidx.test.filters.SmallTest;

import com.android.internal.accessibility.dialog.AccessibilityTarget;
import com.android.internal.messages.nano.SystemMessageProto;
import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
@@ -116,6 +119,7 @@ public class MenuViewLayerTest extends SysuiTestCase {
    private String mLastAccessibilityButtonTargets;
    private String mLastEnabledAccessibilityServices;
    private WindowMetrics mWindowMetrics;
    private MenuViewModel mMenuViewModel;
    private MenuView mMenuView;
    private MenuAnimationController mMenuAnimationController;

@@ -148,15 +152,17 @@ public class MenuViewLayerTest extends SysuiTestCase {
                new WindowMetrics(mDisplayBounds, fakeDisplayInsets(), /* density = */ 0.0f));
        doReturn(mWindowMetrics).when(mStubWindowManager).getCurrentWindowMetrics();

        MenuViewModel menuViewModel = new MenuViewModel(
        mMenuViewModel = new MenuViewModel(
                mSpyContext, mStubAccessibilityManager, mSecureSettings);
        MenuViewAppearance menuViewAppearance = new MenuViewAppearance(
                mSpyContext, mStubWindowManager);
        mMenuView = spy(
                new MenuView(mSpyContext, menuViewModel, menuViewAppearance, mSecureSettings));
                new MenuView(mSpyContext, mMenuViewModel, menuViewAppearance, mSecureSettings));
        // Ensure tests don't actually update metrics.
        doNothing().when(mMenuView).incrementTexMetric(any(), anyInt());

        mMenuViewLayer = spy(new MenuViewLayer(mSpyContext, mStubWindowManager,
                mStubAccessibilityManager, menuViewModel, menuViewAppearance, mMenuView,
                mStubAccessibilityManager, mMenuViewModel, menuViewAppearance, mMenuView,
                mFloatingMenu, mSecureSettings));
        mMenuView = (MenuView) mMenuViewLayer.getChildAt(LayerIndex.MENU_VIEW);
        mMenuAnimationController = mMenuView.getMenuAnimationController();
@@ -382,6 +388,47 @@ public class MenuViewLayerTest extends SysuiTestCase {
        verify(mFloatingMenu).hide();
    }

    @Test
    @EnableFlags(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT)
    public void onDismissAction_incrementsTexMetricDismiss() {
        int uid1 = 1234, uid2 = 5678;
        mMenuViewModel.onTargetFeaturesChanged(
                List.of(new TestAccessibilityTarget(mSpyContext, uid1),
                        new TestAccessibilityTarget(mSpyContext, uid2)));

        mMenuViewLayer.dispatchAccessibilityAction(R.id.action_remove_menu);

        ArgumentCaptor<Integer> uidCaptor = ArgumentCaptor.forClass(Integer.class);
        verify(mMenuView, times(2)).incrementTexMetric(eq(MenuViewLayer.TEX_METRIC_DISMISS),
                uidCaptor.capture());
        assertThat(uidCaptor.getAllValues()).containsExactly(uid1, uid2);
    }

    @Test
    @EnableFlags(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT)
    public void onEditAction_incrementsTexMetricEdit() {
        int uid1 = 1234, uid2 = 5678;
        mMenuViewModel.onTargetFeaturesChanged(
                List.of(new TestAccessibilityTarget(mSpyContext, uid1),
                        new TestAccessibilityTarget(mSpyContext, uid2)));

        mMenuViewLayer.dispatchAccessibilityAction(R.id.action_edit);

        ArgumentCaptor<Integer> uidCaptor = ArgumentCaptor.forClass(Integer.class);
        verify(mMenuView, times(2)).incrementTexMetric(eq(MenuViewLayer.TEX_METRIC_EDIT),
                uidCaptor.capture());
        assertThat(uidCaptor.getAllValues()).containsExactly(uid1, uid2);
    }

    /** Simplified AccessibilityTarget for testing MenuViewLayer. */
    private static class TestAccessibilityTarget extends AccessibilityTarget {
        TestAccessibilityTarget(Context context, int uid) {
            // Set fields unused by tests to defaults that allow test compilation.
            super(context, AccessibilityManager.ACCESSIBILITY_BUTTON, 0, false,
                    TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString(), uid, null, null, null);
        }
    }

    private void setupEnabledAccessibilityServiceList() {
        Settings.Secure.putString(mSpyContext.getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,