diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java index 604551607a5..2035f669063 100644 --- a/src/com/android/settings/users/EditUserInfoController.java +++ b/src/com/android/settings/users/EditUserInfoController.java @@ -41,6 +41,7 @@ import com.android.settingslib.drawable.CircleFramedDrawable; import java.io.File; import androidx.appcompat.app.AlertDialog; +import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; /** @@ -103,9 +104,8 @@ public class EditUserInfoController { public void onActivityResult(int requestCode, int resultCode, Intent data) { mWaitingForActivityResult = false; - if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing() - && mEditUserPhotoController.onActivityResult(requestCode, resultCode, data)) { - return; + if (mEditUserInfoDialog != null) { + mEditUserPhotoController.onActivityResult(requestCode, resultCode, data); } } @@ -115,7 +115,7 @@ public class EditUserInfoController { Activity activity = fragment.getActivity(); mUser = user; if (mUserManager == null) { - mUserManager = UserManager.get(activity); + mUserManager = activity.getSystemService(UserManager.class); } LayoutInflater inflater = activity.getLayoutInflater(); View content = inflater.inflate(R.layout.edit_user_info_dialog_content, null); @@ -136,8 +136,7 @@ public class EditUserInfoController { } } userPhotoView.setImageDrawable(drawable); - mEditUserPhotoController = new EditUserPhotoController(fragment, userPhotoView, - mSavedPhoto, drawable, mWaitingForActivityResult); + mEditUserPhotoController = createEditUserPhotoController(fragment, userPhotoView, drawable); mEditUserInfoDialog = new AlertDialog.Builder(activity) .setTitle(R.string.profile_info_settings_title) .setView(content) @@ -195,4 +194,11 @@ public class EditUserInfoController { return mEditUserInfoDialog; } + + @VisibleForTesting + EditUserPhotoController createEditUserPhotoController(Fragment fragment, + ImageView userPhotoView, Drawable drawable) { + return new EditUserPhotoController(fragment, userPhotoView, + mSavedPhoto, drawable, mWaitingForActivityResult); + } } diff --git a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java new file mode 100644 index 00000000000..2e205f86a96 --- /dev/null +++ b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.users; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.UserInfo; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; + +import com.android.settings.R; +import com.android.settings.testutils.Robolectric; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowUserManager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowUserManager.class}) +public class EditUserInfoControllerTest { + @Mock + private Fragment mFragment; + @Mock + private LayoutInflater mInflater; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private UserInfo mUserInfo; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private View mDialogContent; + @Mock + private EditText mUserName; + @Mock + private ImageView mPhotoView; + @Mock + private Drawable mCurrentIcon; + + private ShadowUserManager mUserManager; + private FragmentActivity mActivity; + private TestEditUserInfoController mController; + + public class TestEditUserInfoController extends EditUserInfoController { + private EditUserPhotoController mPhotoController; + + public EditUserPhotoController getPhotoController() { + return mPhotoController; + } + + @Override + protected EditUserPhotoController createEditUserPhotoController(Fragment fragment, + ImageView userPhotoView, Drawable drawable) { + mPhotoController = mock(EditUserPhotoController.class, Answers.RETURNS_DEEP_STUBS); + return mPhotoController; + } + } + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mUserManager = ShadowUserManager.getShadow(); + mUserManager.setUserInfo(0, mUserInfo); + mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).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(); + } + + @After + public void tearDown() { + mUserManager.reset(); + } + + @Test + public void photoControllerOnActivityResult_whenWaiting_isCalled() { + mController.createDialog(mFragment, mCurrentIcon, "test user", + R.string.profile_info_settings_title, null, android.os.Process.myUserHandle()); + mController.startingActivityForResult(); + Intent resultData = new Intent(); + mController.onActivityResult(0, 0, resultData); + EditUserPhotoController photoController = mController.getPhotoController(); + assertThat(photoController).isNotNull(); + verify(photoController).onActivityResult(eq(0), eq(0), same(resultData)); + } +}