Set the max length of user name field in Profile info

Settings may crash when entering a very long user name.

Fixes: 136005061
Test: manual, robotest
Change-Id: Ica17297588fc6b84ef111ef00017afb27360acd3
This commit is contained in:
Jason Chiu
2019-07-09 16:49:36 +08:00
parent c29bf8d9cc
commit ca2bbc0685
2 changed files with 27 additions and 19 deletions

View File

@@ -44,6 +44,7 @@
android:labelFor="@id/user_photo" android:labelFor="@id/user_photo"
android:inputType="text|textCapWords" android:inputType="text|textCapWords"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
android:hint="@string/user_nickname"/> android:hint="@string/user_nickname"
android:maxLength="100"/>
</LinearLayout> </LinearLayout>

View File

@@ -18,7 +18,6 @@ package com.android.settings.users;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.same; import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -26,18 +25,20 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -47,20 +48,15 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController; import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class EditUserInfoControllerTest { public class EditUserInfoControllerTest {
private static final int MAX_USER_NAME_LENGTH = 100;
@Mock @Mock
private Fragment mFragment; private Fragment mFragment;
@Mock @Mock
private LayoutInflater mInflater;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private View mDialogContent;
@Mock
private EditText mUserName;
@Mock
private ImageView mPhotoView;
@Mock
private Drawable mCurrentIcon; private Drawable mCurrentIcon;
private FragmentActivity mActivity; private FragmentActivity mActivity;
@@ -86,12 +82,6 @@ public class EditUserInfoControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mActivity = spy(ActivityController.of(new FragmentActivity()).get()); mActivity = spy(ActivityController.of(new FragmentActivity()).get());
when(mFragment.getActivity()).thenReturn(mActivity); when(mFragment.getActivity()).thenReturn(mActivity);
when(mActivity.getLayoutInflater()).thenReturn(mInflater);
when(mInflater.inflate(eq(R.layout.edit_user_info_dialog_content), any())).thenReturn(
mDialogContent);
when(mDialogContent.findViewById(eq(R.id.user_name))).thenReturn(mUserName);
when(mDialogContent.findViewById(eq(R.id.user_photo))).thenReturn(mPhotoView);
when(mPhotoView.getContext()).thenReturn((Context) mActivity);
mController = new TestEditUserInfoController(); mController = new TestEditUserInfoController();
} }
@@ -106,4 +96,21 @@ public class EditUserInfoControllerTest {
assertThat(photoController).isNotNull(); assertThat(photoController).isNotNull();
verify(photoController).onActivityResult(eq(0), eq(0), same(resultData)); verify(photoController).onActivityResult(eq(0), eq(0), same(resultData));
} }
@Test
@Config(shadows = ShadowAlertDialogCompat.class)
public void userNameView_inputLongName_shouldBeConstrained() {
// generate a string of 200 'A's
final String longName = Stream.generate(
() -> String.valueOf('A')).limit(200).collect(Collectors.joining());
final AlertDialog dialog = (AlertDialog) mController.createDialog(mFragment, mCurrentIcon,
"test user", R.string.profile_info_settings_title, null,
android.os.Process.myUserHandle());
final EditText userName = ShadowAlertDialogCompat.shadowOf(dialog).getView()
.findViewById(R.id.user_name);
userName.setText(longName);
assertThat(userName.getText().length()).isEqualTo(MAX_USER_NAME_LENGTH);
}
} }