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

Commit 1dc1132b authored by Daniel Norman's avatar Daniel Norman Committed by Android (Google) Code Review
Browse files

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

parents 3bb1be05 28794324
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;
@@ -460,9 +474,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,