1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.car.userpicker; 18 19 import static android.view.Display.INVALID_DISPLAY; 20 21 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; 22 23 import static com.google.common.truth.Truth.assertThat; 24 25 import android.content.pm.UserInfo; 26 import android.os.UserManager; 27 import android.testing.AndroidTestingRunner; 28 import android.testing.TestableLooper; 29 import android.view.View; 30 import android.view.ViewGroup; 31 import android.widget.TextView; 32 33 import androidx.test.ext.junit.rules.ActivityScenarioRule; 34 import androidx.test.filters.SmallTest; 35 36 import com.android.systemui.R; 37 import com.android.systemui.car.CarSystemUiTest; 38 import com.android.systemui.car.userswitcher.UserIconProvider; 39 import com.android.systemui.settings.UserTracker; 40 import com.android.systemui.tuner.TunerService; 41 42 import org.junit.Before; 43 import org.junit.Ignore; 44 import org.junit.Rule; 45 import org.junit.Test; 46 import org.junit.runner.RunWith; 47 import org.mockito.Mock; 48 import org.mockito.MockitoAnnotations; 49 50 import java.util.List; 51 52 /** Test for the RecyclerView contained in the UserPickerActivity (not a separate class) */ 53 @CarSystemUiTest 54 @RunWith(AndroidTestingRunner.class) 55 @TestableLooper.RunWithLooper 56 @SmallTest 57 public class UserPickerRecyclerViewTest extends UserPickerTestCase { 58 @Rule 59 public ActivityScenarioRule<UserPickerRecyclerViewTestActivity> mActivityRule = 60 new ActivityScenarioRule(UserPickerRecyclerViewTestActivity.class); 61 62 @Mock 63 private UserIconProvider mMockUserIconProvider; 64 @Mock 65 private UserManager mMockUserManager; 66 67 private UserRecord mDriver; 68 private UserRecord mFront; 69 private UserRecord mRear; 70 private List<UserRecord> mUserList = null; 71 72 class OnClickListenerCreator extends UserRecord.OnClickListenerCreatorBase { 73 @Override createOnClickListenerWithUserRecord()74 View.OnClickListener createOnClickListenerWithUserRecord() { 75 return holderView -> {}; 76 } 77 } 78 79 @Before setUp()80 public void setUp() { 81 MockitoAnnotations.initMocks(this); 82 83 mDependency.injectMockDependency(TunerService.class); 84 mDependency.injectMockDependency(UserTracker.class); 85 86 doReturn(mDriverUserInfo).when(mMockUserManager).getUserInfo(USER_ID_DRIVER); 87 doReturn(mFrontUserInfo).when(mMockUserManager).getUserInfo(USER_ID_FRONT); 88 doReturn(mRearUserInfo).when(mMockUserManager).getUserInfo(USER_ID_REAR); 89 mContext.addMockSystemService(UserManager.class, mMockUserManager); 90 doReturn(FRONT_PASSENGER_DISPLAY_ID).when(mContext).getDisplayId(); 91 92 mDriver = UserRecord.create(mDriverUserInfo, /* mName= */ mDriverUserInfo.name, 93 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 94 /* mIsForeground= */ true, 95 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_DRIVER), 96 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 97 /* mIsLoggedIn= */ true, /* mLoggedInDisplay= */ MAIN_DISPLAY_ID, 98 /* mSeatLocationName= */ USER_NAME_DRIVER, /* mIsStopping= */ false); 99 mFront = UserRecord.create(mFrontUserInfo, /* mName= */ mFrontUserInfo.name, 100 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 101 /* mIsForeground= */ false, 102 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_FRONT), 103 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 104 /* mIsLoggedIn= */ true, /* mLoggedInDisplay= */ FRONT_PASSENGER_DISPLAY_ID, 105 /* mSeatLocationName= */ USER_NAME_FRONT, /* mIsStopping= */ false); 106 mRear = UserRecord.create(mRearUserInfo, /* mName= */ mRearUserInfo.name, 107 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 108 /* mIsForeground= */ false, 109 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_REAR), 110 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 111 /* mIsLoggedIn= */ false, /* mLoggedInDisplay= */ INVALID_DISPLAY, 112 /* mSeatLocationName= */ "", /* mIsStopping= */ false); 113 } 114 updateUsers_refreshView(UserPickerAdapter adapter, List<UserRecord> mUserList)115 void updateUsers_refreshView(UserPickerAdapter adapter, List<UserRecord> mUserList) { 116 adapter.updateUsers(mUserList); 117 adapter.notifyDataSetChanged(); 118 } 119 getPositionOnPrimaryGrid(String name)120 int getPositionOnPrimaryGrid(String name) { 121 if (name == null || mUserList == null) { 122 return -1; 123 } else if (name.equals(mGuestLabel)) { 124 return mUserList.size() - 2; 125 } else if (name.equals(mAddLabel)) { 126 return mUserList.size() - 1; 127 } else { 128 for (int i = 0; i < mUserList.size(); i++) { 129 if (name.equals(mUserList.get(i).mName)) { 130 return i; 131 } 132 } 133 return -1; 134 } 135 } 136 isHighlightingfromUserPod(ViewGroup vg)137 Boolean isHighlightingfromUserPod(ViewGroup vg) { 138 ViewGroup avatar = (ViewGroup) vg.getChildAt(0); 139 View v = (View) avatar.getChildAt(1); 140 return v.getVisibility() == View.VISIBLE; 141 } 142 getUserNamefromUserPod(ViewGroup vg)143 String getUserNamefromUserPod(ViewGroup vg) { 144 TextView t = (TextView) vg.getChildAt(1); 145 return t.getText().toString(); 146 } 147 getUserDescfromUserPod(ViewGroup vg)148 String getUserDescfromUserPod(ViewGroup vg) { 149 TextView t = (TextView) vg.getChildAt(2); 150 return t.getText().toString(); 151 } 152 153 @Test 154 @Ignore("b/281125325") checkUserList_changeUserState_frontUserLoggedIn()155 public void checkUserList_changeUserState_frontUserLoggedIn() { 156 UserRecord mGuest = UserRecord.create(/* mInfo= */ null, /* mName= */ mGuestLabel, 157 /* mIsStartGuestSession= */ true, /* mIsAddUser= */ false, 158 /* mIsForeground= */ false, 159 mMockUserIconProvider.getRoundedGuestDefaultIcon(), 160 /* OnClickListenerMaker */ new OnClickListenerCreator(), false, false, 161 INVALID_DISPLAY, /* mSeatLocationName= */"", /* mIsStopping= */ false); 162 UserRecord mAddUser = UserRecord.create(/* mInfo= */ null, /* mName= */ mAddLabel, 163 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ true, 164 /* mIsForeground= */ false, 165 /* mIcon= */ mContext.getDrawable(R.drawable.car_add_circle_round), 166 /* OnClickListenerMaker */ new OnClickListenerCreator()); 167 mUserList = List.of(mDriver, mFront, mRear, mGuest, mAddUser); 168 mActivityRule.getScenario().onActivity(activity -> { 169 updateUsers_refreshView(activity.mAdapter, mUserList); 170 171 View userIcon = activity.mUserPickerView.getRecyclerViewChildAt( 172 getPositionOnPrimaryGrid(USER_NAME_DRIVER)); 173 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))) 174 .isEqualTo(mContext.getString(R.string.prefix_logged_in_info_for_other_seat, 175 USER_NAME_DRIVER)); 176 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 177 userIcon = activity.mUserPickerView.getRecyclerViewChildAt( 178 getPositionOnPrimaryGrid(USER_NAME_FRONT)); 179 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))).isEqualTo(mLoggedinLabel); 180 181 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isTrue(); 182 userIcon = activity.mUserPickerView 183 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(USER_NAME_REAR)); 184 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))).isEqualTo(""); 185 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 186 userIcon = activity.mUserPickerView 187 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(mGuestLabel)); 188 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))).isEqualTo(""); 189 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 190 userIcon = activity.mUserPickerView 191 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(mAddLabel)); 192 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))).isEqualTo(""); 193 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 194 }); 195 } 196 197 @Test 198 @Ignore("b/281125325") checkUserList_logoutState_frontUserLoggedOut()199 public void checkUserList_logoutState_frontUserLoggedOut() { 200 mFront = UserRecord.create(mFrontUserInfo, /* mName= */ mFrontUserInfo.name, 201 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 202 /* mIsForeground= */ false, 203 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_FRONT), 204 /* OnClickListenerMaker */ new OnClickListenerCreator(), 205 /* mIsSecure= */ false, /* mIsLoggedIn= */ false, 206 /* mLoggedInDisplay= */ -1, 207 /* mSeatLocationName= */ "Test", /* mIsStopping= */ false); 208 UserRecord mGuest = UserRecord.create(/* mInfo= */ null, /* mName= */ mGuestLabel, 209 /* mIsStartGuestSession= */ true, /* mIsAddUser= */ false, 210 /* mIsForeground= */ false, 211 mMockUserIconProvider.getRoundedGuestDefaultIcon(), 212 /* OnClickListenerMaker */ new OnClickListenerCreator(), false, false, 213 INVALID_DISPLAY, /* mSeatLocationName= */"", /* mIsStopping= */ false); 214 UserRecord mAddUser = UserRecord.create(/* mInfo= */ null, /* mName= */ mAddLabel, 215 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ true, 216 /* mIsForeground= */ false, 217 /* mIcon= */ mContext.getDrawable(R.drawable.car_add_circle_round), 218 /* OnClickListenerMaker */ new OnClickListenerCreator()); 219 mUserList = List.of(mDriver, mFront, mRear, mGuest, mAddUser); 220 mActivityRule.getScenario().onActivity(activity -> { 221 updateUsers_refreshView(activity.mAdapter, mUserList); 222 223 View userIcon = activity.mUserPickerView 224 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(USER_NAME_DRIVER)); 225 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))) 226 .isEqualTo(mContext.getString(R.string.prefix_logged_in_info_for_other_seat, 227 USER_NAME_DRIVER)); 228 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 229 userIcon = activity.mUserPickerView 230 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(USER_NAME_FRONT)); 231 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))).isEqualTo(""); 232 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 233 userIcon = activity.mUserPickerView 234 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(USER_NAME_REAR)); 235 assertThat(getUserDescfromUserPod(((ViewGroup) userIcon))).isEqualTo(""); 236 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 237 userIcon = activity.mUserPickerView 238 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(mGuestLabel)); 239 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 240 userIcon = activity.mUserPickerView 241 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(mAddLabel)); 242 assertThat(isHighlightingfromUserPod(((ViewGroup) userIcon))).isFalse(); 243 }); 244 } 245 246 @Test updateUserList_addUser_increaseUserCount()247 public void updateUserList_addUser_increaseUserCount() { 248 mUserList = List.of(mDriver, mFront, mRear); 249 mActivityRule.getScenario().onActivity(activity -> { 250 updateUsers_refreshView(activity.mAdapter, mUserList); 251 int prevRecordCount = activity.mAdapter.getItemCount(); 252 253 String newUsername = "New"; 254 UserInfo newUserInfo = new UserInfo(USER_ID_REAR + 1, newUsername, UserInfo.FLAG_FULL); 255 UserRecord mNew = UserRecord.create(newUserInfo, /* mName= */ newUserInfo.name, 256 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 257 /* mIsForeground= */ false, 258 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(newUserInfo.id), 259 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 260 /* mIsLoggedIn= */ false, 261 /* mLoggedInDisplay= */ INVALID_DISPLAY, 262 /* mSeatLocationName= */ "", /* mIsStopping= */ false); 263 mUserList = List.of(mDriver, mFront, mNew, mRear); 264 updateUsers_refreshView(activity.mAdapter, mUserList); 265 266 assertThat(activity.mAdapter.getItemCount()).isEqualTo(prevRecordCount + 1); 267 assertThat(getPositionOnPrimaryGrid(newUsername)) 268 .isEqualTo(getPositionOnPrimaryGrid(USER_NAME_FRONT) + 1); 269 assertThat(getPositionOnPrimaryGrid(newUsername)) 270 .isEqualTo(getPositionOnPrimaryGrid(USER_NAME_REAR) - 1); 271 }); 272 } 273 274 @Test updateUserList_removeUser_decreaseUserCount()275 public void updateUserList_removeUser_decreaseUserCount() { 276 mUserList = List.of(mDriver, mFront, mRear); 277 mActivityRule.getScenario().onActivity(activity -> { 278 updateUsers_refreshView(activity.mAdapter, mUserList); 279 int prevRecordCount = activity.mAdapter.getItemCount(); 280 281 mUserList = List.of(mDriver, mRear); 282 updateUsers_refreshView(activity.mAdapter, mUserList); 283 284 assertThat(activity.mAdapter.getItemCount()).isEqualTo(prevRecordCount - 1); 285 assertThat(getPositionOnPrimaryGrid(USER_NAME_REAR)) 286 .isEqualTo(getPositionOnPrimaryGrid(USER_NAME_DRIVER) + 1); 287 }); 288 } 289 290 @Test 291 @Ignore("b/281125325") updateUserList_loginUser_changedRearPassengerDesc()292 public void updateUserList_loginUser_changedRearPassengerDesc() { 293 mUserList = List.of(mDriver, mFront, mRear); 294 mActivityRule.getScenario().onActivity(activity -> { 295 updateUsers_refreshView(activity.mAdapter, mUserList); 296 297 View RearButton = activity.mUserPickerView.getRecyclerViewChildAt( 298 getPositionOnPrimaryGrid(USER_NAME_REAR)); 299 assertThat(getUserNamefromUserPod(((ViewGroup) RearButton))).isEqualTo(USER_NAME_REAR); 300 assertThat(getUserDescfromUserPod(((ViewGroup) RearButton))).isEqualTo(""); 301 mRear = UserRecord.create(mRearUserInfo, /* mName= */ mRearUserInfo.name, 302 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 303 /* mIsForeground= */ false, 304 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_REAR), 305 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 306 /* mIsLoggedIn= */ true, 307 /* mLoggedInDisplay= */ REAR_PASSENGER_DISPLAY_ID, 308 /* mSeatLocationName= */ USER_NAME_REAR, /* mIsStopping= */ false); 309 mUserList = List.of(mDriver, mFront, mRear); 310 updateUsers_refreshView(activity.mAdapter, mUserList); 311 312 RearButton = activity.mUserPickerView.getRecyclerViewChildAt( 313 getPositionOnPrimaryGrid(USER_NAME_REAR)); 314 assertThat(getUserDescfromUserPod(((ViewGroup) RearButton))) 315 .isEqualTo(mContext.getString(R.string.prefix_logged_in_info_for_other_seat, 316 USER_NAME_REAR)); 317 }); 318 } 319 320 @Test 321 @Ignore("b/281125325") updateUserList_logoutUser_changedRearPassengerDesc()322 public void updateUserList_logoutUser_changedRearPassengerDesc() { 323 mRear = UserRecord.create(mRearUserInfo, /* mName= */ mRearUserInfo.name, 324 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 325 /* mIsForeground= */ false, 326 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_REAR), 327 /* OnClickListenerMaker */ new OnClickListenerCreator(), 328 /* mIsSecure= */ false, /* mIsLoggedIn= */ true, 329 /* mLoggedInDisplay= */ REAR_PASSENGER_DISPLAY_ID, 330 /* mSeatLocationName= */ USER_NAME_REAR, /* mIsStopping= */ false); 331 mUserList = List.of(mDriver, mFront, mRear); 332 mActivityRule.getScenario().onActivity(activity -> { 333 updateUsers_refreshView(activity.mAdapter, mUserList); 334 335 View rearPassengerUserIcon = activity.mUserPickerView 336 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(USER_NAME_REAR)); 337 assertThat(getUserDescfromUserPod(((ViewGroup) rearPassengerUserIcon))) 338 .isEqualTo(mContext.getString(R.string.prefix_logged_in_info_for_other_seat, 339 USER_NAME_REAR)); 340 mRear = UserRecord.create(mRearUserInfo, /* mName= */ mRearUserInfo.name, 341 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 342 /* mIsForeground= */ false, 343 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_REAR), 344 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 345 /* mIsLoggedIn= */ false, 346 /* mLoggedInDisplay= */ INVALID_DISPLAY, 347 /* mSeatLocationName= */ "", /* mIsStopping= */ false); 348 mUserList = List.of(mDriver, mFront, mRear); 349 updateUsers_refreshView(activity.mAdapter, mUserList); 350 351 rearPassengerUserIcon = activity.mUserPickerView 352 .getRecyclerViewChildAt(getPositionOnPrimaryGrid(USER_NAME_REAR)); 353 assertThat(getUserDescfromUserPod(((ViewGroup) rearPassengerUserIcon))).isEqualTo(""); 354 }); 355 } 356 357 @Test 358 @Ignore("b/281125325") updateUserList_changeName_changedUserName()359 public void updateUserList_changeName_changedUserName() { 360 String changeName = "Test"; 361 mUserList = List.of(mDriver, mFront, mRear); 362 mActivityRule.getScenario().onActivity(activity -> { 363 updateUsers_refreshView(activity.mAdapter, mUserList); 364 View rearPassengerUserIcon = activity.mUserPickerView 365 .getRecyclerViewChildAt(mUserList.size() - 1); 366 assertThat(getUserNamefromUserPod(((ViewGroup) rearPassengerUserIcon))) 367 .isEqualTo(USER_NAME_REAR); 368 369 mRearUserInfo.name = changeName; 370 mRear = UserRecord.create(mRearUserInfo, /* mName= */ mRearUserInfo.name, 371 /* mIsStartGuestSession= */ false, /* mIsAddUser= */ false, 372 /* mIsForeground= */ false, 373 /* mIcon= */ mMockUserIconProvider.getRoundedUserIcon(USER_ID_REAR), 374 /* OnClickListenerMaker */ new OnClickListenerCreator(), /* mIsSecure= */ false, 375 /* mIsLoggedIn= */ false, 376 /* mLoggedInDisplay= */ INVALID_DISPLAY, 377 /* mSeatLocationName= */ "", /* mIsStopping= */ false); 378 mUserList = List.of(mDriver, mFront, mRear); 379 updateUsers_refreshView(activity.mAdapter, mUserList); 380 381 rearPassengerUserIcon = activity.mUserPickerView 382 .getRecyclerViewChildAt(mUserList.size() - 1); 383 assertThat(getUserNamefromUserPod(((ViewGroup) rearPassengerUserIcon))) 384 .isEqualTo(changeName); 385 }); 386 } 387 } 388