Merge "Adjust icon spacing for text alignment" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4687a546e1
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user