Adjust icon spacing for text alignment

Bug: 240385199
Test: atest TextViewContextMenuTest
Test: manually verified
Change-Id: I375d4069fb0e5c6da0115574cd839045652af22c
This commit is contained in:
Seigo Nonaka
2023-02-22 15:04:13 +09:00
parent da896af691
commit 00e5b1f512
2 changed files with 112 additions and 0 deletions

View File

@@ -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

View File

@@ -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());
}
}