Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e010292 authored by Ivan Chiang's avatar Ivan Chiang
Browse files

Handle Intent#EXTRA_CONTENT_QUERY in DocumentsUI

Parse the query content and perform search.

Fix: 119866469
Test: atest DocumentsTest
Change-Id: Id4c816729a40daa08491821ee6c6c2fe7ff85474
parent 026ac090
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ public abstract class BaseActivity
    private RootsMonitor<BaseActivity> mRootsMonitor;

    private long mStartTime;
    private boolean mHasQueryContentFromIntent;

    private PreferencesMonitor mPreferencesMonitor;

@@ -194,7 +195,12 @@ public abstract class BaseActivity
        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 @@ public abstract class BaseActivity
        // 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);
+38 −1
Original line number Diff line number Diff line
@@ -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.DocumentStack;
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 @@ public class SearchViewManager implements
    @GuardedBy("mSearchLock")
    private @Nullable TimerTask mQueuedSearchTask;
    private @Nullable String mCurrentSearch;
    private String mQueryContentFromIntent;
    private boolean mSearchExpanded;
    private boolean mIgnoreNextClose;
    private boolean mFullBar;
@@ -122,6 +128,24 @@ public class SearchViewManager implements
        performSearch(mCurrentSearch);
    }

    /**
     * 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 @@ public class SearchViewManager implements
     * @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 @@ public class SearchViewManager implements
        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();
    }
+10 −0
Original line number Diff line number Diff line
@@ -465,6 +465,16 @@ public class ActionHandlerTest {
        assertNotNull(mActivity.startActivityForResult.getLastValue().first);
    }

    @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");
+23 −0
Original line number Diff line number Diff line
@@ -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 @@ public final class SearchViewManagerTest {
        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);