Loading core/java/android/widget/Editor.java +39 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading core/tests/coretests/src/android/widget/TextViewContextMenuTest.java +73 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); } } Loading
core/java/android/widget/Editor.java +39 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
core/tests/coretests/src/android/widget/TextViewContextMenuTest.java +73 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); } }