1a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono/* 2a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * Copyright (C) 2017 The Android Open Source Project 3a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * 4a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * Licensed under the Apache License, Version 2.0 (the "License"); 5a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * you may not use this file except in compliance with the License. 6a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * You may obtain a copy of the License at 7a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * 8a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * http://www.apache.org/licenses/LICENSE-2.0 9a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * 10a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * Unless required by applicable law or agreed to in writing, software 11a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * distributed under the License is distributed on an "AS IS" BASIS, 12a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * See the License for the specific language governing permissions and 14a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono * limitations under the License. 15a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono */ 16a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 17a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onopackage com.android.documentsui; 18a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 19a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport static com.android.documentsui.StubProvider.ROOT_0_ID; 20a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport static com.android.documentsui.StubProvider.ROOT_1_ID; 21a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 22a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.content.Context; 23a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.content.ContentResolver; 24a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.content.Intent; 25a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.content.IntentFilter; 26a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.content.BroadcastReceiver; 27a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.net.Uri; 288cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Onoimport android.os.Bundle; 29a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.os.RemoteException; 30a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.provider.Settings; 31a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.support.test.filters.LargeTest; 32a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.support.test.filters.Suppress; 33a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.support.test.uiautomator.Configurator; 34a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.text.TextUtils; 35a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.view.KeyEvent; 36a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport android.view.MotionEvent; 37a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 38a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport com.android.documentsui.base.DocumentInfo; 39a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport com.android.documentsui.files.FilesActivity; 40a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport com.android.documentsui.services.TestNotificationService; 41a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 42a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.concurrent.ArrayBlockingQueue; 43a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.concurrent.CountDownLatch; 44a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.concurrent.RejectedExecutionException; 45a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.concurrent.ThreadPoolExecutor; 46a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.concurrent.TimeUnit; 47a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.List; 48a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onoimport java.util.ArrayList; 49a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 50a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono/** 51a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono* This class test the below points 52a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono* - Copy large number of files 53a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono*/ 54a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono@LargeTest 55a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Onopublic class FileCopyUiTest extends ActivityTest<FilesActivity> { 56a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String PACKAGE_NAME = "com.android.documentsui.tests"; 57a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 58a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String ACCESS_APP_NAME = "DocumentsUI Tests"; 59a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 60a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String ALLOW = "ALLOW"; 61a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 62a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String TURN_OFF = "TURN OFF"; 63a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 64a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String COPY = "Copy to…"; 65a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 66a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String MOVE = "Move to…"; 67a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 68a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final String SELECT_ALL = "Select all"; 69a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 70a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private static final int DUMMY_FILE_COUNT = 1000; 71a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 72a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private final List<String> mCopyFileList = new ArrayList<String>(); 73a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 74a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 75a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono @Override 76a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public void onReceive(Context context, Intent intent) { 77a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono String action = intent.getAction(); 78a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono if (TestNotificationService.ACTION_OPERATION_RESULT.equals(action)) { 79a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mOperationExecuted = intent.getBooleanExtra( 80a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono TestNotificationService.EXTRA_RESULT, false); 81a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono if (!mOperationExecuted) { 82a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mErrorReason = intent.getStringExtra( 83a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono TestNotificationService.EXTRA_ERROR_REASON); 84a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 85a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mCountDownLatch.countDown(); 86a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 87a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 88a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono }; 89a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 90a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private CountDownLatch mCountDownLatch; 91a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 92a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private boolean mOperationExecuted; 93a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 94a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private String mErrorReason; 95a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 96a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public FileCopyUiTest() { 97a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono super(FilesActivity.class); 98a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 99a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 100a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono @Override 101a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public void setUp() throws Exception { 102a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono super.setUp(); 1038cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono 1048cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono // Set a flag to prevent many refreshes. 1058cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono Bundle bundle = new Bundle(); 1068cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono bundle.putBoolean(StubProvider.EXTRA_ENABLE_ROOT_NOTIFICATION, false); 1078cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono mDocsHelper.configure(null, bundle); 1088cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono 109a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono initTestFiles(); 110a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 111a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono IntentFilter filter = new IntentFilter(); 112a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono filter.addAction(TestNotificationService.ACTION_OPERATION_RESULT); 113a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono context.registerReceiver(mReceiver, filter); 114a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono context.sendBroadcast(new Intent( 115a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono TestNotificationService.ACTION_CHANGE_EXECUTION_MODE)); 116a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 117a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mOperationExecuted = false; 118a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mErrorReason = "No response from Notification"; 119a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mCountDownLatch = new CountDownLatch(1); 120a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 121a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 122a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono @Override 123a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public void tearDown() throws Exception { 124a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mCountDownLatch.countDown(); 125a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mCountDownLatch = null; 126a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 127a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono context.unregisterReceiver(mReceiver); 128a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono try { 129a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono if (isEnableAccessNotification()) { 130a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono disallowNotificationAccess(); 131a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 132a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } catch (Exception e) { 133a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono // ignore 134a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 135a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono super.tearDown(); 136a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 137a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 138a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono @Override 139a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public void initTestFiles() throws RemoteException { 140a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono try { 141a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono if (!isEnableAccessNotification()) { 142a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono allowNotificationAccess(); 143a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 144a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono createDummyFiles(); 145a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } catch (Exception e) { 146a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono fail("Initialization failed"); 147a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 148a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 149a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 150a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private void createDummyFiles() throws Exception { 151a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono final ThreadPoolExecutor exec = new ThreadPoolExecutor( 152a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 5, 5, 1000L, TimeUnit.MILLISECONDS, 1538cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono new ArrayBlockingQueue<Runnable>(100, true)); 154a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono for (int i = 0; i < DUMMY_FILE_COUNT; i++) { 155a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono final String fileName = "file" + String.format("%04d", i) + ".log"; 1568cf0f00ab2d5756fa6ac1f58305ae70b73e7acffJun Ono if (exec.getQueue().size() >= 80) { 157a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono Thread.sleep(50); 158a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 159a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono exec.submit(new Runnable() { 160a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono @Override 161a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public void run() { 162a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono Uri uri = mDocsHelper.createDocument(rootDir0, "text/plain", fileName); 163a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono try { 164a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mDocsHelper.writeDocument(uri, new byte[1]); 165a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } catch (Exception e) { 166a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono // ignore 167a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 168a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 169a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono }); 170a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mCopyFileList.add(fileName); 171a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 172a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono exec.shutdown(); 173a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 174a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 175a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private void allowNotificationAccess() throws Exception { 176a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono Intent intent = new Intent(); 177a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS); 178a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono getActivity().startActivity(intent); 179a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 180a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 181a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.findMenuLabelWithName(ACCESS_APP_NAME).click(); 182a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 183a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 184a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.findMenuLabelWithName(ALLOW).click(); 185a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.keyboard.pressKey(KeyEvent.KEYCODE_BACK); 186a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 187a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 188a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private void disallowNotificationAccess() throws Exception { 189a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono Intent intent = new Intent(); 190a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono intent.setAction(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS); 191a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono getActivity().startActivity(intent); 192a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 193a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 194a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.findMenuLabelWithName(ACCESS_APP_NAME).click(); 195a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 196a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 197a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.findMenuLabelWithName(TURN_OFF).click(); 198a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.keyboard.pressKey(KeyEvent.KEYCODE_BACK); 199a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 200a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 201a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono private boolean isEnableAccessNotification() { 202a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono ContentResolver resolver = getActivity().getContentResolver(); 203a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono String listeners = Settings.Secure.getString( 204a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono resolver,"enabled_notification_listeners"); 205a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono if (!TextUtils.isEmpty(listeners)) { 206a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono String[] list = listeners.split(":"); 207a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono for(String item : list) { 208a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono if(item.startsWith(PACKAGE_NAME)) { 209a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono return true; 210a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 211a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 212a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 213a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono return false; 214a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 215a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 216a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono public void testCopyAllDocument() throws Exception { 217a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.roots.openRoot(ROOT_0_ID); 218a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.clickToolbarOverflowItem(SELECT_ALL); 219a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 220a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 221a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.clickToolbarOverflowItem(COPY); 222a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 223a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 224a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.roots.openRoot(ROOT_1_ID); 225a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.main.clickDialogOkButton(); 226a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 227a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 228a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono try { 229a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono mCountDownLatch.await(60, TimeUnit.SECONDS); 230a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } catch (Exception e) { 231a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono fail("Cannot wait because of error." + e.toString()); 232a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 233a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 234a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono assertTrue(mErrorReason, mOperationExecuted); 235a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 236a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono bots.roots.openRoot(ROOT_1_ID); 237a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono device.waitForIdle(); 238a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 239a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono List<DocumentInfo> root1 = mDocsHelper.listChildren(rootDir1.documentId, 1000); 240a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono List<String> copiedFileList = new ArrayList<String>(); 241a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono for (DocumentInfo info : root1) { 242a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono copiedFileList.add(info.displayName); 243a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 244a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono 245a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono for (String name : mCopyFileList) { 246a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono assertTrue("Not found " + name, copiedFileList.contains(name)); 247a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 248a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono } 249a46c3d2be2127e4ea55b18c7b272e1c171013a6fJun Ono} 250