blob: 28079408d59be5d35daf421c587212c6e2fa29a5 [file] [log] [blame]
Sudheer Shanka53c23fd2016-08-17 19:34:58 -07001/*
2 * Copyright (C) 2016 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 */
16package android.multiuser;
17
18import android.app.ActivityManager;
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070019import android.app.IActivityManager;
Sudheer Shanka2c4522c2016-08-27 20:53:28 -070020import android.app.IStopUserCallback;
21import android.app.UserSwitchObserver;
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070022import android.content.BroadcastReceiver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.content.pm.UserInfo;
27import android.os.RemoteException;
28import android.os.UserHandle;
29import android.os.UserManager;
Bookatz52b12ac2019-02-28 17:29:26 -080030import android.util.Log;
KOUSHIK PANUGANTI130f0a52018-12-17 14:41:06 -080031
32import androidx.test.InstrumentationRegistry;
33import androidx.test.filters.LargeTest;
34import androidx.test.runner.AndroidJUnit4;
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070035
36import org.junit.After;
37import org.junit.Before;
38import org.junit.Rule;
39import org.junit.Test;
40import org.junit.runner.RunWith;
41
42import java.util.ArrayList;
43import java.util.concurrent.CountDownLatch;
44import java.util.concurrent.TimeUnit;
45
Sudheer Shanka2c4522c2016-08-27 20:53:28 -070046/**
47 * Perf tests for user life cycle events.
48 *
49 * Running the tests:
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -070050 *
Sudheer Shanka2c4522c2016-08-27 20:53:28 -070051 * make MultiUserPerfTests &&
52 * adb install -r \
53 * ${ANDROID_PRODUCT_OUT}/data/app/MultiUserPerfTests/MultiUserPerfTests.apk &&
Sudheer Shanka2d0278b2017-07-12 18:12:31 -070054 * adb shell am instrument -e class android.multiuser.UserLifecycleTests \
KOUSHIK PANUGANTI130f0a52018-12-17 14:41:06 -080055 * -w com.android.perftests.multiuser/androidx.test.runner.AndroidJUnitRunner
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -070056 *
57 * or
58 *
Sudheer Shanka2d0278b2017-07-12 18:12:31 -070059 * bit MultiUserPerfTests:android.multiuser.UserLifecycleTests
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -070060 *
61 * Note: If you use bit for running the tests, benchmark results won't be printed on the host side.
Sudheer Shanka2d0278b2017-07-12 18:12:31 -070062 * But in either case, results can be checked on the device side 'adb logcat -s UserLifecycleTests'
Sudheer Shanka2c4522c2016-08-27 20:53:28 -070063 */
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070064@LargeTest
65@RunWith(AndroidJUnit4.class)
Sudheer Shanka2d0278b2017-07-12 18:12:31 -070066public class UserLifecycleTests {
67 private static final String TAG = UserLifecycleTests.class.getSimpleName();
68
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -070069 private final int TIMEOUT_IN_SECOND = 30;
Tony Makec7c6962017-05-26 15:38:09 +010070 private final int CHECK_USER_REMOVED_INTERVAL_MS = 200;
Sudheer Shanka2c4522c2016-08-27 20:53:28 -070071
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070072 private UserManager mUm;
73 private ActivityManager mAm;
74 private IActivityManager mIam;
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070075 private ArrayList<Integer> mUsersToRemove;
76
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -070077 private final BenchmarkRunner mRunner = new BenchmarkRunner();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070078 @Rule
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -070079 public BenchmarkResultsReporter mReporter = new BenchmarkResultsReporter(mRunner);
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070080
81 @Before
82 public void setUp() {
83 final Context context = InstrumentationRegistry.getContext();
84 mUm = UserManager.get(context);
85 mAm = context.getSystemService(ActivityManager.class);
Sudheer Shankadc589ac2016-11-10 15:30:17 -080086 mIam = ActivityManager.getService();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070087 mUsersToRemove = new ArrayList<>();
88 }
89
90 @After
91 public void tearDown() {
92 for (int userId : mUsersToRemove) {
Sudheer Shanka2c4522c2016-08-27 20:53:28 -070093 try {
94 mUm.removeUser(userId);
95 } catch (Exception e) {
96 // Ignore
97 }
Sudheer Shanka53c23fd2016-08-17 19:34:58 -070098 }
99 }
100
101 @Test
Sudheer Shankaa319f8b2017-07-11 15:28:48 -0700102 public void createAndStartUser() throws Exception {
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700103 while (mRunner.keepRunning()) {
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700104 final UserInfo userInfo = mUm.createUser("TestUser", 0);
105
106 final CountDownLatch latch = new CountDownLatch(1);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700107 registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userInfo.id);
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700108 mIam.startUserInBackground(userInfo.id);
Tony Makec7c6962017-05-26 15:38:09 +0100109 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700110
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700111 mRunner.pauseTiming();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700112 removeUser(userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700113 mRunner.resumeTiming();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700114 }
115 }
116
117 @Test
Sudheer Shankaa319f8b2017-07-11 15:28:48 -0700118 public void switchUser() throws Exception {
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700119 while (mRunner.keepRunning()) {
120 mRunner.pauseTiming();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700121 final int startUser = mAm.getCurrentUser();
122 final UserInfo userInfo = mUm.createUser("TestUser", 0);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700123 mRunner.resumeTiming();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700124
125 switchUser(userInfo.id);
126
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700127 mRunner.pauseTiming();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700128 switchUser(startUser);
129 removeUser(userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700130 mRunner.resumeTiming();
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700131 }
132 }
133
Bookatz52b12ac2019-02-28 17:29:26 -0800134 /** Tests switching to an already-created, but no-longer-running, user. */
135 @Test
136 public void switchUser_stopped() throws Exception {
137 while (mRunner.keepRunning()) {
138 mRunner.pauseTiming();
139 final int startUser = mAm.getCurrentUser();
140 final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ true);
141 final CountDownLatch latch = new CountDownLatch(1);
142 registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, testUser);
143 mRunner.resumeTiming();
144
145 mAm.switchUser(testUser);
146 boolean success = latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
147
148 mRunner.pauseTiming();
149 attestTrue("Failed to achieve 2nd ACTION_USER_UNLOCKED for user " + testUser, success);
150 switchUser(startUser);
151 removeUser(testUser);
152 mRunner.resumeTiming();
153 }
154 }
155
156 /** Tests switching to an already-created already-running non-owner user. */
157 @Test
158 public void switchUser_running() throws Exception {
159 while (mRunner.keepRunning()) {
160 mRunner.pauseTiming();
161 final int startUser = mAm.getCurrentUser();
162 final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ false);
163 mRunner.resumeTiming();
164
165 switchUser(testUser);
166
167 mRunner.pauseTiming();
168 attestTrue("Failed to switch to user " + testUser, mAm.isUserRunning(testUser));
169 switchUser(startUser);
170 removeUser(testUser);
171 mRunner.resumeTiming();
172 }
173 }
174
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700175 @Test
Sudheer Shankaa319f8b2017-07-11 15:28:48 -0700176 public void stopUser() throws Exception {
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700177 while (mRunner.keepRunning()) {
178 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700179 final UserInfo userInfo = mUm.createUser("TestUser", 0);
180 final CountDownLatch latch = new CountDownLatch(1);
181 registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userInfo.id);
182 mIam.startUserInBackground(userInfo.id);
Tony Makec7c6962017-05-26 15:38:09 +0100183 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700184 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700185
Tony Makec7c6962017-05-26 15:38:09 +0100186 stopUser(userInfo.id, false);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700187
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700188 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700189 removeUser(userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700190 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700191 }
192 }
193
194 @Test
Sudheer Shankaa319f8b2017-07-11 15:28:48 -0700195 public void lockedBootCompleted() throws Exception {
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700196 while (mRunner.keepRunning()) {
197 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700198 final int startUser = mAm.getCurrentUser();
199 final UserInfo userInfo = mUm.createUser("TestUser", 0);
200 final CountDownLatch latch = new CountDownLatch(1);
201 registerUserSwitchObserver(null, latch, userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700202 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700203
204 mAm.switchUser(userInfo.id);
Tony Makec7c6962017-05-26 15:38:09 +0100205 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700206
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700207 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700208 switchUser(startUser);
209 removeUser(userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700210 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700211 }
212 }
213
214 @Test
Bookatz5df3c642019-04-11 09:22:49 -0700215 public void ephemeralUserStopped() throws Exception {
216 while (mRunner.keepRunning()) {
217 mRunner.pauseTiming();
218 final int startUser = mAm.getCurrentUser();
219 final UserInfo userInfo = mUm.createUser("TestUser",
220 UserInfo.FLAG_EPHEMERAL | UserInfo.FLAG_DEMO);
221 switchUser(userInfo.id);
222 final CountDownLatch latch = new CountDownLatch(1);
223 InstrumentationRegistry.getContext().registerReceiver(new BroadcastReceiver() {
224 @Override
225 public void onReceive(Context context, Intent intent) {
226 if (Intent.ACTION_USER_STOPPED.equals(intent.getAction()) && intent.getIntExtra(
227 Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userInfo.id) {
228 latch.countDown();
229 }
230 }
231 }, new IntentFilter(Intent.ACTION_USER_STOPPED));
232 final CountDownLatch switchLatch = new CountDownLatch(1);
233 registerUserSwitchObserver(switchLatch, null, startUser);
234 mRunner.resumeTiming();
235
236 mAm.switchUser(startUser);
237 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
238
239 mRunner.pauseTiming();
240 switchLatch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
241 removeUser(userInfo.id);
242 mRunner.resumeTiming();
243 }
244 }
245
246 @Test
Sudheer Shankaa319f8b2017-07-11 15:28:48 -0700247 public void managedProfileUnlock() throws Exception {
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700248 while (mRunner.keepRunning()) {
249 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700250 final UserInfo userInfo = mUm.createProfileForUser("TestUser",
251 UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
252 final CountDownLatch latch = new CountDownLatch(1);
253 registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700254 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700255
256 mIam.startUserInBackground(userInfo.id);
Tony Makec7c6962017-05-26 15:38:09 +0100257 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700258
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700259 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700260 removeUser(userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700261 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700262 }
263 }
264
Bookatz57908d92019-03-29 10:40:10 -0700265 /** Tests starting an already-created, but no-longer-running, profile. */
266 @Test
267 public void managedProfileUnlock_stopped() throws Exception {
268 while (mRunner.keepRunning()) {
269 mRunner.pauseTiming();
270 final UserInfo userInfo = mUm.createProfileForUser("TestUser",
271 UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
272 // Start the profile initially, then stop it. Similar to setQuietModeEnabled.
273 final CountDownLatch latch1 = new CountDownLatch(1);
274 registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch1, userInfo.id);
275 mIam.startUserInBackground(userInfo.id);
276 latch1.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
277 stopUser(userInfo.id, true);
278
279 // Now we restart the profile.
280 final CountDownLatch latch2 = new CountDownLatch(1);
281 registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch2, userInfo.id);
282 mRunner.resumeTiming();
283
284 mIam.startUserInBackground(userInfo.id);
285 latch2.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
286
287 mRunner.pauseTiming();
288 removeUser(userInfo.id);
289 mRunner.resumeTiming();
290 }
291 }
292
Tony Makec7c6962017-05-26 15:38:09 +0100293
294 @Test
Sudheer Shankaa319f8b2017-07-11 15:28:48 -0700295 public void managedProfileStopped() throws Exception {
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700296 while (mRunner.keepRunning()) {
297 mRunner.pauseTiming();
Tony Makec7c6962017-05-26 15:38:09 +0100298 final UserInfo userInfo = mUm.createProfileForUser("TestUser",
299 UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
300 final CountDownLatch latch = new CountDownLatch(1);
301 registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, userInfo.id);
302 mIam.startUserInBackground(userInfo.id);
303 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700304 mRunner.resumeTiming();
Tony Makec7c6962017-05-26 15:38:09 +0100305
306 stopUser(userInfo.id, true);
307
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700308 mRunner.pauseTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700309 removeUser(userInfo.id);
Sudheer Shanka5f76e1f2017-06-25 19:40:53 -0700310 mRunner.resumeTiming();
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700311 }
312 }
313
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700314 private void switchUser(int userId) throws Exception {
315 final CountDownLatch latch = new CountDownLatch(1);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700316 registerUserSwitchObserver(latch, null, userId);
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700317 mAm.switchUser(userId);
Tony Makec7c6962017-05-26 15:38:09 +0100318 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700319 }
320
Tony Makec7c6962017-05-26 15:38:09 +0100321 private void stopUser(int userId, boolean force) throws Exception {
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700322 final CountDownLatch latch = new CountDownLatch(1);
Tony Makec7c6962017-05-26 15:38:09 +0100323 mIam.stopUser(userId, force /* force */, new IStopUserCallback.Stub() {
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700324 @Override
325 public void userStopped(int userId) throws RemoteException {
326 latch.countDown();
327 }
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700328
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700329 @Override
330 public void userStopAborted(int userId) throws RemoteException {
331 }
332 });
Tony Makec7c6962017-05-26 15:38:09 +0100333 latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700334 }
335
Bookatz52b12ac2019-02-28 17:29:26 -0800336 /**
337 * Creates a user and waits for its ACTION_USER_UNLOCKED.
338 * Then switches to back to the original user and waits for its switchUser() to finish.
339 *
340 * @param stopNewUser whether to stop the new user after switching to otherUser.
341 * @return userId of the newly created user.
342 */
343 private int initializeNewUserAndSwitchBack(boolean stopNewUser) throws Exception {
344 final int origUser = mAm.getCurrentUser();
345 // First, create and switch to testUser, waiting for its ACTION_USER_UNLOCKED
346 final int testUser = mUm.createUser("TestUser", 0).id;
347 final CountDownLatch latch1 = new CountDownLatch(1);
348 registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch1, testUser);
349 mAm.switchUser(testUser);
350 attestTrue("Failed to achieve initial ACTION_USER_UNLOCKED for user " + testUser,
351 latch1.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS));
352
353 // Second, switch back to origUser, waiting merely for switchUser() to finish
354 switchUser(origUser);
355 attestTrue("Didn't switch back to user, " + origUser, origUser == mAm.getCurrentUser());
356
357 if (stopNewUser) {
358 stopUser(testUser, true);
359 attestFalse("Failed to stop user " + testUser, mAm.isUserRunning(testUser));
360 }
361
362 return testUser;
363 }
364
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700365 private void registerUserSwitchObserver(final CountDownLatch switchLatch,
366 final CountDownLatch bootCompleteLatch, final int userId) throws Exception {
Sudheer Shankadc589ac2016-11-10 15:30:17 -0800367 ActivityManager.getService().registerUserSwitchObserver(
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700368 new UserSwitchObserver() {
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700369 @Override
370 public void onUserSwitchComplete(int newUserId) throws RemoteException {
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700371 if (switchLatch != null && userId == newUserId) {
372 switchLatch.countDown();
373 }
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700374 }
375
376 @Override
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700377 public void onLockedBootComplete(int newUserId) {
378 if (bootCompleteLatch != null && userId == newUserId) {
379 bootCompleteLatch.countDown();
380 }
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700381 }
Sudheer Shanka2d0278b2017-07-12 18:12:31 -0700382 }, TAG);
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700383 }
384
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700385 private void registerBroadcastReceiver(final String action, final CountDownLatch latch,
386 final int userId) {
387 InstrumentationRegistry.getContext().registerReceiverAsUser(new BroadcastReceiver() {
388 @Override
389 public void onReceive(Context context, Intent intent) {
390 if (action.equals(intent.getAction()) && intent.getIntExtra(
391 Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userId) {
392 latch.countDown();
393 }
394 }
395 }, UserHandle.of(userId), new IntentFilter(action), null, null);
396 }
397
398 private void removeUser(int userId) {
399 try {
400 mUm.removeUser(userId);
401 final long startTime = System.currentTimeMillis();
Tony Makec7c6962017-05-26 15:38:09 +0100402 final long timeoutInMs = TIMEOUT_IN_SECOND * 1000;
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700403 while (mUm.getUserInfo(userId) != null &&
Tony Makec7c6962017-05-26 15:38:09 +0100404 System.currentTimeMillis() - startTime < timeoutInMs) {
405 TimeUnit.MILLISECONDS.sleep(CHECK_USER_REMOVED_INTERVAL_MS);
Sudheer Shanka2c4522c2016-08-27 20:53:28 -0700406 }
407 } catch (InterruptedException e) {
408 Thread.currentThread().interrupt();
409 } catch (Exception e) {
410 // Ignore
Sudheer Shanka53c23fd2016-08-17 19:34:58 -0700411 }
412 if (mUm.getUserInfo(userId) != null) {
413 mUsersToRemove.add(userId);
414 }
415 }
Bookatz52b12ac2019-02-28 17:29:26 -0800416
417 private void attestTrue(String message, boolean attestion) {
418 if (!attestion) {
419 Log.w(TAG, message);
420 }
421 }
422
423 private void attestFalse(String message, boolean attestion) {
424 attestTrue(message, !attestion);
425 }
John Reck62e5fea2016-10-12 15:27:52 -0700426}