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
Merged-In: Ica17297588fc6b84ef111ef00017afb27360acd3
(cherry picked from commit ca2bbc06858e44e294d523b58fc3edeb77c0991f)
diff --git a/res/layout/edit_user_info_dialog_content.xml b/res/layout/edit_user_info_dialog_content.xml
index 4d76e13..30ae1d8 100644
--- a/res/layout/edit_user_info_dialog_content.xml
+++ b/res/layout/edit_user_info_dialog_content.xml
@@ -44,6 +44,7 @@
         android:labelFor="@id/user_photo"
         android:inputType="text|textCapWords"
         android:selectAllOnFocus="true"
-        android:hint="@string/user_nickname"/>
+        android:hint="@string/user_nickname"
+        android:maxLength="100"/>
 
 </LinearLayout>
diff --git a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
index b9dfbbb..a6a76f8 100644
--- a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
@@ -18,7 +18,6 @@
 
 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.same;
 import static org.mockito.Mockito.mock;
@@ -26,18 +25,20 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
-import android.view.LayoutInflater;
-import android.view.View;
 import android.widget.EditText;
 import android.widget.ImageView;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 
 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.Test;
@@ -47,20 +48,15 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
 public class EditUserInfoControllerTest {
+    private static final int MAX_USER_NAME_LENGTH = 100;
+
     @Mock
     private Fragment mFragment;
     @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 FragmentActivity mActivity;
@@ -86,12 +82,6 @@
         MockitoAnnotations.initMocks(this);
         mActivity = spy(ActivityController.of(new FragmentActivity()).get());
         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();
     }
 
@@ -106,4 +96,21 @@
         assertThat(photoController).isNotNull();
         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);
+    }
 }