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