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:
@@ -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>
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user