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

Commit 4687a546 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Adjust icon spacing for text alignment" into udc-dev

parents 9184971e 00e5b1f5
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.graphics.RectF;
import android.graphics.RenderNode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.LocaleList;
@@ -3238,6 +3239,44 @@ public class Editor {
                .setOnMenuItemClickListener(mOnContextMenuItemClickListener);

        mPreserveSelection = true;

        // No-op for the old context menu because it doesn't have icons.
        adjustIconSpacing(menu);
    }

    /**
     * Adjust icon spacing to align the texts.
     * @hide
     */
    @VisibleForTesting
    public void adjustIconSpacing(ContextMenu menu) {
        int width = -1;
        int height = -1;
        for (int i = 0; i < menu.size(); ++i) {
            final MenuItem item = menu.getItem(i);
            final Drawable d = item.getIcon();
            if (d == null) {
                continue;
            }

            width = Math.max(width, d.getIntrinsicWidth());
            height = Math.max(height, d.getIntrinsicHeight());
        }

        if (width < 0 || height < 0) {
            return;  // No menu has icon drawable.
        }

        GradientDrawable paddingDrawable = new GradientDrawable();
        paddingDrawable.setSize(width, height);

        for (int i = 0; i < menu.size(); ++i) {
            final MenuItem item = menu.getItem(i);
            final Drawable d = item.getIcon();
            if (d == null) {
                item.setIcon(paddingDrawable);
            }
        }
    }

    @Nullable
+73 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ import android.app.Activity;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.Icon;
import android.view.ContextMenu;
import android.view.MenuItem;
@@ -167,4 +169,75 @@ public class TextViewContextMenuTest {
        assertThat(idCaptor.getValue()).isEqualTo(TextView.ID_ASSIST);
        assertThat(titleCaptor.getValue().toString()).isEqualTo(ACTION_TITLE);
    }

    @UiThreadTest
    @Test
    public void testAdjustIconSpaces() {
        GradientDrawable gd = new GradientDrawable();
        gd.setSize(128, 256);

        // Setup mocks
        ContextMenu menu = mock(ContextMenu.class);

        MenuItem mockIconMenu = newMockMenuItem();
        when(mockIconMenu.getIcon()).thenReturn(gd);

        MenuItem mockNoIconMenu = newMockMenuItem();
        when(mockNoIconMenu.getIcon()).thenReturn(null);

        MenuItem mockNoIconMenu2 = newMockMenuItem();
        when(mockNoIconMenu2.getIcon()).thenReturn(null);

        when(menu.size()).thenReturn(3);
        when(menu.getItem(0)).thenReturn(mockIconMenu);
        when(menu.getItem(1)).thenReturn(mockNoIconMenu);
        when(menu.getItem(2)).thenReturn(mockNoIconMenu2);


        // Execute the test method
        EditText et = mActivity.findViewById(R.id.editText);
        Editor editor = et.getEditorForTesting();
        editor.adjustIconSpacing(menu);

        // Verify
        ArgumentCaptor<Drawable> drawableCaptor = ArgumentCaptor.forClass(Drawable.class);
        verify(mockNoIconMenu).setIcon(drawableCaptor.capture());

        Drawable paddingDrawable = drawableCaptor.getValue();
        assertThat(paddingDrawable).isNotNull();
        assertThat(paddingDrawable.getIntrinsicWidth()).isEqualTo(128);
        assertThat(paddingDrawable.getIntrinsicHeight()).isEqualTo(256);

        ArgumentCaptor<Drawable> drawableCaptor2 = ArgumentCaptor.forClass(Drawable.class);
        verify(mockNoIconMenu2).setIcon(drawableCaptor2.capture());

        Drawable paddingDrawable2 = drawableCaptor2.getValue();
        assertThat(paddingDrawable2).isSameInstanceAs(paddingDrawable);
    }

    @UiThreadTest
    @Test
    public void testAdjustIconSpacesNoIconCase() {
        // Setup mocks
        ContextMenu menu = mock(ContextMenu.class);

        MenuItem mockNoIconMenu = newMockMenuItem();
        when(mockNoIconMenu.getIcon()).thenReturn(null);

        MenuItem mockNoIconMenu2 = newMockMenuItem();
        when(mockNoIconMenu2.getIcon()).thenReturn(null);

        when(menu.size()).thenReturn(2);
        when(menu.getItem(0)).thenReturn(mockNoIconMenu);
        when(menu.getItem(1)).thenReturn(mockNoIconMenu2);

        // Execute the test method
        EditText et = mActivity.findViewById(R.id.editText);
        Editor editor = et.getEditorForTesting();
        editor.adjustIconSpacing(menu);

        // Verify
        verify(mockNoIconMenu, times(0)).setIcon(any());
        verify(mockNoIconMenu2, times(0)).setIcon(any());
    }
}