Merge "Import translations. DO NOT MERGE"
diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java
index 052d80e..e1e1db3 100644
--- a/src/com/android/documentsui/files/ActionHandler.java
+++ b/src/com/android/documentsui/files/ActionHandler.java
@@ -66,7 +66,6 @@
 import com.android.documentsui.clipping.DocumentClipper;
 import com.android.documentsui.clipping.UrisSupplier;
 import com.android.documentsui.dirlist.AnimationView;
-import com.android.documentsui.files.ActionHandler.Addons;
 import com.android.documentsui.inspector.InspectorActivity;
 import com.android.documentsui.queries.SearchViewManager;
 import com.android.documentsui.roots.ProvidersAccess;
@@ -83,8 +82,11 @@
 
 /**
  * Provides {@link FilesActivity} action specializations to fragments.
+ * @param <T> activity which extends {@link FragmentActivity} and implements
+ *              {@link AbstractActionHandler.CommonAddons}.
  */
-public class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionHandler<T> {
+public class ActionHandler<T extends FragmentActivity & AbstractActionHandler.CommonAddons>
+        extends AbstractActionHandler<T> {
 
     private static final String TAG = "ManagerActionHandler";
     private static final int SHARE_FILES_COUNT_LIMIT = 100;
@@ -769,7 +771,4 @@
         }
         mActivity.startActivity(intent);
     }
-
-    public interface Addons extends CommonAddons {
-    }
 }
diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java
index 7308272..ac2c513 100644
--- a/src/com/android/documentsui/files/FilesActivity.java
+++ b/src/com/android/documentsui/files/FilesActivity.java
@@ -32,6 +32,7 @@
 import androidx.annotation.CallSuper;
 import androidx.fragment.app.FragmentManager;
 
+import com.android.documentsui.AbstractActionHandler;
 import com.android.documentsui.ActionModeController;
 import com.android.documentsui.BaseActivity;
 import com.android.documentsui.DocsSelectionHelper;
@@ -65,7 +66,7 @@
 /**
  * Standalone file management activity.
  */
-public class FilesActivity extends BaseActivity implements ActionHandler.Addons {
+public class FilesActivity extends BaseActivity implements AbstractActionHandler.CommonAddons {
 
     private static final String TAG = "FilesActivity";
     static final String PREFERENCES_SCOPE = "files";
diff --git a/tests/common/com/android/documentsui/DocumentsProviderHelper.java b/tests/common/com/android/documentsui/DocumentsProviderHelper.java
index e7a590e..45bc5c0 100644
--- a/tests/common/com/android/documentsui/DocumentsProviderHelper.java
+++ b/tests/common/com/android/documentsui/DocumentsProviderHelper.java
@@ -20,8 +20,11 @@
 import static android.provider.DocumentsContract.buildChildDocumentsUri;
 import static android.provider.DocumentsContract.buildDocumentUri;
 import static android.provider.DocumentsContract.buildRootsUri;
-import static com.android.documentsui.base.DocumentInfo.getCursorString;
+
 import static androidx.core.util.Preconditions.checkArgument;
+
+import static com.android.documentsui.base.DocumentInfo.getCursorString;
+
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.fail;
@@ -30,6 +33,7 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.AutoCloseInputStream;
 import android.os.ParcelFileDescriptor.AutoCloseOutputStream;
@@ -37,23 +41,22 @@
 import android.provider.DocumentsContract;
 import android.provider.DocumentsContract.Document;
 import android.provider.DocumentsContract.Root;
-import androidx.annotation.Nullable;
 import android.test.MoreAsserts;
 import android.text.TextUtils;
 
+import androidx.annotation.Nullable;
+
 import com.android.documentsui.base.DocumentInfo;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.roots.RootCursorWrapper;
 
-import android.os.FileUtils;
-import libcore.io.Streams;
-
 import com.google.common.collect.Lists;
 
+import libcore.io.Streams;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -147,11 +150,11 @@
         waitForWrite();
     }
 
-    public void writeAppendDocument(Uri documentUri, byte[] contents)
+    public void writeAppendDocument(Uri documentUri, byte[] contents, int length)
             throws RemoteException, IOException {
         ParcelFileDescriptor file = mClient.openFile(documentUri, "wa", null);
         try (AutoCloseOutputStream out = new AutoCloseOutputStream(file)) {
-            out.write(contents);
+            out.write(contents, 0, length);
         }
         waitForWrite();
     }
diff --git a/tests/common/com/android/documentsui/StubProvider.java b/tests/common/com/android/documentsui/StubProvider.java
index 4366d31..521df53 100644
--- a/tests/common/com/android/documentsui/StubProvider.java
+++ b/tests/common/com/android/documentsui/StubProvider.java
@@ -26,16 +26,20 @@
 import android.database.MatrixCursor.RowBuilder;
 import android.graphics.Point;
 import android.net.Uri;
-import android.os.*;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.FileUtils;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.ParcelFileDescriptor;
 import android.provider.DocumentsContract;
 import android.provider.DocumentsContract.Document;
 import android.provider.DocumentsContract.Root;
 import android.provider.DocumentsProvider;
-import androidx.annotation.VisibleForTesting;
 import android.text.TextUtils;
 import android.util.Log;
 
-import android.os.FileUtils;
+import androidx.annotation.VisibleForTesting;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -183,7 +187,23 @@
     public boolean isChildDocument(String parentDocId, String docId) {
         final StubDocument parentDocument = mStorage.get(parentDocId);
         final StubDocument childDocument = mStorage.get(docId);
-        return FileUtils.contains(parentDocument.file, childDocument.file);
+
+        if (parentDocument.file == null || childDocument.file == null) {
+            return false;
+        }
+
+        return contains(
+                parentDocument.file.getAbsolutePath(), childDocument.file.getAbsolutePath());
+    }
+
+    private static boolean contains(String dirPath, String filePath) {
+        if (dirPath.equals(filePath)) {
+            return true;
+        }
+        if (!dirPath.endsWith("/")) {
+            dirPath += "/";
+        }
+        return filePath.startsWith(dirPath);
     }
 
     @Override
diff --git a/tests/common/com/android/documentsui/bots/UiBot.java b/tests/common/com/android/documentsui/bots/UiBot.java
index 0043bf7..4885b6d 100644
--- a/tests/common/com/android/documentsui/bots/UiBot.java
+++ b/tests/common/com/android/documentsui/bots/UiBot.java
@@ -273,18 +273,19 @@
     }
 
     UiObject2 findMenuWithName(String label) {
-        List<UiObject2> menuItems = mDevice.findObjects(By.clazz("android.widget.LinearLayout"));
+        UiObject2 list = mDevice.findObject(By.clazz("android.widget.ListView"));
+        List<UiObject2> menuItems = list.getChildren();
         Iterator<UiObject2> it = menuItems.iterator();
 
         UiObject2 menuItem = null;
         while (it.hasNext()) {
             menuItem = it.next();
             UiObject2 text = menuItem.findObject(By.text(label));
-            if (text != null && menuItem.isClickable()) {
-                break;
+            if (text != null) {
+                return menuItem;
             }
         }
-        return menuItem;
+        return null;
     }
 
     boolean hasMenuWithName(String label) {
diff --git a/tests/functional/com/android/documentsui/CancelFromNotificationUiTest.java b/tests/functional/com/android/documentsui/CancelFromNotificationUiTest.java
index 5deb6b7..1c125c9 100644
--- a/tests/functional/com/android/documentsui/CancelFromNotificationUiTest.java
+++ b/tests/functional/com/android/documentsui/CancelFromNotificationUiTest.java
@@ -138,7 +138,7 @@
         for (int i = 0; i < 49; i++) {
             dummyByte = null;
             dummyByte = new byte[BUFFER_SIZE];
-            mDocsHelper.writeAppendDocument(uri, dummyByte);
+            mDocsHelper.writeAppendDocument(uri, dummyByte, dummyByte.length);
         }
     }
 
diff --git a/tests/functional/com/android/documentsui/FileCopyUiTest.java b/tests/functional/com/android/documentsui/FileCopyUiTest.java
index 2113ef7..5b43905 100644
--- a/tests/functional/com/android/documentsui/FileCopyUiTest.java
+++ b/tests/functional/com/android/documentsui/FileCopyUiTest.java
@@ -64,7 +64,7 @@
 
     private static final String TARGET_FOLDER = "test_folder";
 
-    private static final int TARGET_COUNT = 1000;
+    private static final int TARGET_COUNT = 100;
 
     private static final int WAIT_TIME_SECONDS = 180;
 
@@ -275,7 +275,7 @@
                 Uri uri = helper.createDocument(root, "image/png", fileName);
                 byte[] buff = new byte[1024];
                 while ((read = in.read(buff)) > 0) {
-                    helper.writeAppendDocument(uri, buff);
+                    helper.writeAppendDocument(uri, buff, read);
                 }
                 buff = null;
             }
diff --git a/tests/functional/com/android/documentsui/RenameDocumentUiTest.java b/tests/functional/com/android/documentsui/RenameDocumentUiTest.java
index 863cdd0..2e66117 100644
--- a/tests/functional/com/android/documentsui/RenameDocumentUiTest.java
+++ b/tests/functional/com/android/documentsui/RenameDocumentUiTest.java
@@ -38,43 +38,43 @@
         bots.roots.closeDrawer();
     }
 
-//    public void testRenameEnabled_SingleSelection() throws Exception {
-//        bots.directory.selectDocument(fileName1, 1);
-//        bots.main.openOverflowMenu();
-//        bots.main.assertMenuEnabled(R.string.menu_rename, true);
-//
-//        // Dismiss more options window
-//        device.pressBack();
-//    }
-//
-//    public void testNoRenameSupport_SingleSelection() throws Exception {
-//        bots.directory.selectDocument(fileNameNoRename, 1);
-//        bots.main.openOverflowMenu();
-//        bots.main.assertMenuEnabled(R.string.menu_rename, false);
-//
-//        // Dismiss more options window
-//        device.pressBack();
-//    }
-//
-//    public void testOneHasRenameSupport_MultipleSelection() throws Exception {
-//        bots.directory.selectDocument(fileName1, 1);
-//        bots.directory.selectDocument(fileNameNoRename, 2);
-//        bots.main.openOverflowMenu();
-//        bots.main.assertMenuEnabled(R.string.menu_rename, false);
-//
-//        // Dismiss more options window
-//        device.pressBack();
-//    }
-//
-//    public void testRenameDisabled_MultipleSelection() throws Exception {
-//        bots.directory.selectDocument(fileName1, 1);
-//        bots.directory.selectDocument(fileName2, 2);
-//        bots.main.openOverflowMenu();
-//        bots.main.assertMenuEnabled(R.string.menu_rename, false);
-//
-//        // Dismiss more options window
-//        device.pressBack();
-//    }
+    public void testRenameEnabled_SingleSelection() throws Exception {
+        bots.directory.selectDocument(fileName1, 1);
+        bots.main.openOverflowMenu();
+        bots.main.assertMenuEnabled(R.string.menu_rename, true);
+
+        // Dismiss more options window
+        device.pressBack();
+    }
+
+    public void testNoRenameSupport_SingleSelection() throws Exception {
+        bots.directory.selectDocument(fileNameNoRename, 1);
+        bots.main.openOverflowMenu();
+        bots.main.assertMenuEnabled(R.string.menu_rename, false);
+
+        // Dismiss more options window
+        device.pressBack();
+    }
+
+    public void testOneHasRenameSupport_MultipleSelection() throws Exception {
+        bots.directory.selectDocument(fileName1, 1);
+        bots.directory.selectDocument(fileNameNoRename, 2);
+        bots.main.openOverflowMenu();
+        bots.main.assertMenuEnabled(R.string.menu_rename, false);
+
+        // Dismiss more options window
+        device.pressBack();
+    }
+
+    public void testRenameDisabled_MultipleSelection() throws Exception {
+        bots.directory.selectDocument(fileName1, 1);
+        bots.directory.selectDocument(fileName2, 2);
+        bots.main.openOverflowMenu();
+        bots.main.assertMenuEnabled(R.string.menu_rename, false);
+
+        // Dismiss more options window
+        device.pressBack();
+    }
 
     public void testRenameFile_OkButton() throws Exception {
         bots.directory.selectDocument(fileName1, 1);
diff --git a/tests/res/raw/uitest_images.zip b/tests/res/raw/uitest_images.zip
index 33186e4..1a1331d 100644
--- a/tests/res/raw/uitest_images.zip
+++ b/tests/res/raw/uitest_images.zip
Binary files differ
diff --git a/tests/unit/com/android/documentsui/files/TestActivity.java b/tests/unit/com/android/documentsui/files/TestActivity.java
index 4d49649..d69b9b8 100644
--- a/tests/unit/com/android/documentsui/files/TestActivity.java
+++ b/tests/unit/com/android/documentsui/files/TestActivity.java
@@ -16,7 +16,7 @@
 
 package com.android.documentsui.files;
 
-import com.android.documentsui.files.ActionHandler;
+import com.android.documentsui.AbstractActionHandler;
 import com.android.documentsui.testing.TestEnv;
 
 import org.mockito.Mockito;
@@ -33,4 +33,4 @@
 // Trick Mockito into finding our Addons methods correctly. W/o this
 // hack, Mockito thinks Addons methods are not implemented.
 abstract class AbstractBase extends com.android.documentsui.TestActivity
-        implements ActionHandler.Addons {}
+        implements AbstractActionHandler.CommonAddons {}
diff --git a/tests/unit/com/android/documentsui/queries/SearchHistoryManagerTest.java b/tests/unit/com/android/documentsui/queries/SearchHistoryManagerTest.java
index 1f2a974..3c216c7 100644
--- a/tests/unit/com/android/documentsui/queries/SearchHistoryManagerTest.java
+++ b/tests/unit/com/android/documentsui/queries/SearchHistoryManagerTest.java
@@ -19,21 +19,21 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
+
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.MediumTest;
 import androidx.test.runner.AndroidJUnit4;
 
-import com.android.documentsui.queries.SearchHistoryManager;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.List;
-
-import org.junit.Before;
 import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 @RunWith(AndroidJUnit4.class)
 @MediumTest
 public final class SearchHistoryManagerTest {
@@ -49,7 +49,7 @@
     public void setUp() throws Exception {
         mContext = InstrumentationRegistry.getTargetContext();
         mManager = SearchHistoryManager.getInstance(mContext);
-        clearData();
+        //clearData();
         mIntResult = -1;
         mLongResult = -1;
     }
@@ -57,7 +57,7 @@
     @After
     public void tearDown() {
         mListener = null;
-        clearData();
+        //clearData();
     }
 
     private void clearData() {
@@ -68,6 +68,7 @@
     }
 
     @Test
+    @Ignore
     public void testAddHistory() throws Exception {
         mLatch = new CountDownLatch(2);
         mListener = new SearchHistoryManager.DatabaseChangedListener() {
@@ -90,6 +91,7 @@
     }
 
     @Test
+    @Ignore
     public void testDeleteHistory() throws Exception {
         mLatch = new CountDownLatch(2);
         mListener = new SearchHistoryManager.DatabaseChangedListener() {
@@ -125,6 +127,7 @@
     }
 
     @Test
+    @Ignore
     public void testGetHistoryList() throws Exception {
         mLatch = new CountDownLatch(2);
         mListener = new SearchHistoryManager.DatabaseChangedListener() {