Merge "Update text input layout style and fix focus bug."
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index 87438a8..6fe7b1e 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -103,6 +103,7 @@
     private RootsMonitor<BaseActivity> mRootsMonitor;
 
     private long mStartTime;
+    private boolean mHasQueryContentFromIntent;
 
     private PreferencesMonitor mPreferencesMonitor;
 
@@ -194,7 +195,12 @@
         mSearchManager = new SearchViewManager(searchListener, queryInterceptor,
                 chipGroup, icicle);
         mSearchManager.updateChips(getCurrentRoot().derivedMimeTypes);
-
+        // parse the query content from intent when launch the
+        // activity at the first time
+        if (icicle == null) {
+            mHasQueryContentFromIntent = mSearchManager.parseQueryContentFromIntent(getIntent(),
+                    mState.action);
+        }
         mSortController = SortController.create(this, mState.derivedMode, mState.sortModel);
 
         mPreferencesMonitor = new PreferencesMonitor(
@@ -440,6 +446,12 @@
         // from the saved state passed in onCreate().
         mSearchManager.cancelSearch();
 
+        // only set the query content in the first launch
+        if (mHasQueryContentFromIntent) {
+            mHasQueryContentFromIntent = false;
+            mSearchManager.setCurrentSearch(mSearchManager.getQueryContentFromIntent());
+        }
+
         mState.derivedMode = LocalPreferences.getViewMode(this, mState.stack.getRoot(), MODE_GRID);
 
         refreshDirectory(anim);
diff --git a/src/com/android/documentsui/queries/SearchViewManager.java b/src/com/android/documentsui/queries/SearchViewManager.java
index 9cabf2c..0cf9e9f 100644
--- a/src/com/android/documentsui/queries/SearchViewManager.java
+++ b/src/com/android/documentsui/queries/SearchViewManager.java
@@ -17,7 +17,11 @@
 package com.android.documentsui.queries;
 
 import static com.android.documentsui.base.SharedMinimal.DEBUG;
+import static com.android.documentsui.base.State.ACTION_GET_CONTENT;
+import static com.android.documentsui.base.State.ACTION_OPEN;
+import static com.android.documentsui.base.State.ActionType;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -44,6 +48,7 @@
 import com.android.documentsui.base.EventHandler;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.base.Shared;
+import com.android.documentsui.base.State;
 
 import com.google.android.material.chip.ChipGroup;
 
@@ -74,6 +79,7 @@
     @GuardedBy("mSearchLock")
     private @Nullable TimerTask mQueuedSearchTask;
     private @Nullable String mCurrentSearch;
+    private String mQueryContentFromIntent;
     private boolean mSearchExpanded;
     private boolean mIgnoreNextClose;
     private boolean mFullBar;
@@ -123,6 +129,24 @@
     }
 
     /**
+     * Parse the query content from Intent. If the action is not {@link State#ACTION_GET_CONTENT}
+     * or {@link State#ACTION_OPEN}, don't perform search.
+     * @param intent the intent to parse.
+     * @param action the action to check.
+     * @return True, if get the query content from the intent. Otherwise, false.
+     */
+    public boolean parseQueryContentFromIntent(Intent intent, @ActionType int action) {
+        if (action == ACTION_OPEN || action == ACTION_GET_CONTENT) {
+            final String queryString = intent.getStringExtra(Intent.EXTRA_CONTENT_QUERY);
+            if (!TextUtils.isEmpty(queryString)) {
+                mQueryContentFromIntent = queryString;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
      * Build the bundle of query arguments.
      * Example: search string and mime types
      *
@@ -256,7 +280,7 @@
      * @return True if it cancels search. False if it does not operate search currently.
      */
     public boolean cancelSearch() {
-        if (isExpanded() || isSearching()) {
+        if (mSearchView != null && (isExpanded() || isSearching())) {
             cancelQueuedSearch();
             // If the query string is not empty search view won't get iconified
             mSearchView.setQuery("", false);
@@ -449,6 +473,19 @@
         return mCurrentSearch;
     }
 
+    /**
+     * Get the query content from intent.
+     * @return If has query content, return the query content. Otherwise, return null
+     * @see #parseQueryContentFromIntent(Intent, int)
+     */
+    public String getQueryContentFromIntent() {
+        return mQueryContentFromIntent;
+    }
+
+    public void setCurrentSearch(String queryString) {
+        mCurrentSearch = queryString;
+    }
+
     public boolean isSearching() {
         return mCurrentSearch != null || mChipViewManager.hasCheckedItems();
     }
diff --git a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
index ba62e2f..73fc39f 100644
--- a/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/picker/ActionHandlerTest.java
@@ -466,6 +466,16 @@
     }
 
     @Test
+    public void testOpenAppRootWithQueryContent_matchedContent() throws Exception {
+        final String queryContent = "query";
+        mActivity.intent.putExtra(Intent.EXTRA_CONTENT_QUERY, queryContent);
+        mHandler.openRoot(TestResolveInfo.create());
+        assertEquals(queryContent,
+                mActivity.startActivityForResult.getLastValue().first.getStringExtra(
+                        Intent.EXTRA_CONTENT_QUERY));
+    }
+
+    @Test
     public void testPreviewItem() throws Exception {
         mActivity.resources.setQuickViewerPackage("corptropolis.viewer");
         mActivity.currentRoot = TestProvidersAccess.HOME;
diff --git a/tests/unit/com/android/documentsui/queries/SearchViewManagerTest.java b/tests/unit/com/android/documentsui/queries/SearchViewManagerTest.java
index 44ec387..e0e5a3a 100644
--- a/tests/unit/com/android/documentsui/queries/SearchViewManagerTest.java
+++ b/tests/unit/com/android/documentsui/queries/SearchViewManagerTest.java
@@ -16,12 +16,14 @@
 
 package com.android.documentsui.queries;
 
+import static com.android.documentsui.base.State.ACTION_GET_CONTENT;
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
 
 import static org.mockito.Mockito.mock;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 import android.provider.DocumentsContract;
@@ -114,6 +116,27 @@
         mTestHandler.dispatchAllMessages();
     }
 
+
+    @Test
+    public void testParseQueryContent_ActionIsNotMatched_NotParseQueryContent() {
+        final String queryString = "query";
+        Intent intent = new Intent();
+        intent.putExtra(Intent.EXTRA_CONTENT_QUERY, queryString);
+
+        mSearchViewManager.parseQueryContentFromIntent(intent, -1);
+        assertTrue(mSearchViewManager.getQueryContentFromIntent() == null);
+    }
+
+    @Test
+    public void testParseQueryContent_queryContentIsMatched() {
+        final String queryString = "query";
+        Intent intent = new Intent();
+        intent.putExtra(Intent.EXTRA_CONTENT_QUERY, queryString);
+
+        mSearchViewManager.parseQueryContentFromIntent(intent, ACTION_GET_CONTENT);
+        assertEquals(queryString, mSearchViewManager.getQueryContentFromIntent());
+    }
+
     @Test
     public void testIsExpanded_ExpandsOnClick() {
         mSearchViewManager.onClick(null);