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

Commit 28665aa0 authored by Peter Liang's avatar Peter Liang
Browse files

Refactor the design and improve the animations of Accessibility Floating Menu(2/n).

Actions of this change:
1) Support the changes of the dark theme and configurations including display size, rotation.

Bug: 227715451
Test: atest MenuViewTest
Change-Id: I986406b5144c538d87544964e1e1d835d139025b
parent fa717b43
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -20,4 +20,7 @@
    <!-- Height of the background gradient behind the screenshot UI (taller in dark mode) -->
    <dimen name="screenshot_bg_protection_height">375dp</dimen>

    <!-- Accessibility floating menu -->
    <dimen name="accessibility_floating_menu_stroke_width">1dp</dimen>
    <dimen name="accessibility_floating_menu_stroke_inset">-2dp</dimen>
</resources>
 No newline at end of file
+2 −2
Original line number Diff line number Diff line
@@ -1323,8 +1323,8 @@

    <!-- Accessibility floating menu -->
    <dimen name="accessibility_floating_menu_elevation">3dp</dimen>
    <dimen name="accessibility_floating_menu_stroke_width">1dp</dimen>
    <dimen name="accessibility_floating_menu_stroke_inset">-2dp</dimen>
    <dimen name="accessibility_floating_menu_stroke_width">0dp</dimen>
    <dimen name="accessibility_floating_menu_stroke_inset">0dp</dimen>
    <dimen name="accessibility_floating_menu_margin">16dp</dimen>
    <dimen name="accessibility_floating_menu_small_padding">6dp</dimen>
    <dimen name="accessibility_floating_menu_small_width_height">36dp</dimen>
+7 −1
Original line number Diff line number Diff line
@@ -77,8 +77,14 @@ class MenuView extends FrameLayout {
    }

    private void onEdgeChanged() {
        final int[] insets = mMenuViewAppearance.getMenuInsets();
        getContainerViewInsetLayer().setLayerInset(INDEX_MENU_ITEM, insets[0], insets[1], insets[2],
                insets[3]);

        final GradientDrawable gradientDrawable = getContainerViewGradient();
        gradientDrawable.setCornerRadii(mMenuViewAppearance.getMenuRadii());
        gradientDrawable.setStroke(mMenuViewAppearance.getMenuStrokeWidth(),
                mMenuViewAppearance.getMenuStrokeColor());
    }

    @SuppressLint("NotifyDataSetChanged")
@@ -104,7 +110,7 @@ class MenuView extends FrameLayout {
        mMenuViewModel.unregisterContentObservers();
    }

    private void loadLayoutResources() {
    void loadLayoutResources() {
        mMenuViewAppearance.update();

        setBackground(mMenuViewAppearance.getMenuBackground());
+25 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;

import androidx.annotation.DimenRes;

import com.android.systemui.R;

/**
@@ -32,6 +34,9 @@ class MenuViewAppearance {
    private int mSmallIconSize;
    private int mSmallSingleRadius;
    private int mSmallMultipleRadius;
    private int mStrokeWidth;
    private int mStrokeColor;
    private int mInset;
    private int mElevation;
    private float[] mRadii;
    private Drawable mBackgroundDrawable;
@@ -52,6 +57,9 @@ class MenuViewAppearance {
        mSmallMultipleRadius = mRes.getDimensionPixelSize(
                R.dimen.accessibility_floating_menu_small_multiple_radius);
        mRadii = createRadii(getMenuRadius(mTargetFeaturesSize));
        mStrokeWidth = mRes.getDimensionPixelSize(R.dimen.accessibility_floating_menu_stroke_width);
        mStrokeColor = mRes.getColor(R.color.accessibility_floating_menu_stroke_dark);
        mInset = mRes.getDimensionPixelSize(R.dimen.accessibility_floating_menu_stroke_inset);
        mElevation = mRes.getDimensionPixelSize(R.dimen.accessibility_floating_menu_elevation);
        final Drawable drawable =
                mRes.getDrawable(R.drawable.accessibility_floating_menu_background);
@@ -80,11 +88,28 @@ class MenuViewAppearance {
        return mSmallPadding;
    }

    int[] getMenuInsets() {
        return new int[]{mInset, 0, 0, 0};
    }

    int getMenuStrokeWidth() {
        return mStrokeWidth;
    }

    int getMenuStrokeColor() {
        return mStrokeColor;
    }

    float[] getMenuRadii() {
        return mRadii;
    }

    private int getMenuRadius(int itemCount) {
        return getSmallSize(itemCount);
    }

    @DimenRes
    private int getSmallSize(int itemCount) {
        return itemCount > 1 ? mSmallMultipleRadius : mSmallSingleRadius;
    }

+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.accessibility.floatingmenu;

import static android.app.UiModeManager.MODE_NIGHT_YES;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

import android.app.UiModeManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import androidx.test.filters.SmallTest;

import com.android.systemui.SysuiTestCase;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

/** Tests for {@link MenuView}. */
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
public class MenuViewTest extends SysuiTestCase {
    private static final int INDEX_MENU_ITEM = 0;
    private int mNightMode;
    private UiModeManager mUiModeManager;
    private MenuView mMenuView;

    @Before
    public void setUp() throws Exception {
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
        mNightMode = mUiModeManager.getNightMode();
        mUiModeManager.setNightMode(MODE_NIGHT_YES);
        final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext);
        final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext);
        mMenuView = spy(new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance));
    }

    @Test
    public void onConfigurationChanged_updateViewModel() {
        mMenuView.onConfigurationChanged(/* newConfig= */ null);

        verify(mMenuView).loadLayoutResources();
    }

    @Test
    public void insetsOnDarkTheme_menuOnLeft_matchInsets() {
        mMenuView.onConfigurationChanged(/* newConfig= */ null);
        final InstantInsetLayerDrawable insetLayerDrawable =
                (InstantInsetLayerDrawable) mMenuView.getBackground();
        final boolean areInsetsMatched = insetLayerDrawable.getLayerInsetLeft(INDEX_MENU_ITEM) != 0
                && insetLayerDrawable.getLayerInsetRight(INDEX_MENU_ITEM) == 0;

        assertThat(areInsetsMatched).isTrue();
    }

    @After
    public void tearDown() throws Exception {
        mUiModeManager.setNightMode(mNightMode);
    }
}