• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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