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

Commit 224e6209 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 4462748 from b0df78ba to pi-release

Change-Id: Ibae907ff5b28b4d1e1cfa7500e49f4dfb00de37b
parents 38ba7c2e b0df78ba
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -229,8 +229,8 @@
      <item quantity="one">تم نسخ ملف واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>) إلى الحافظة.</item>
    </plurals>
    <string name="file_operation_rejected" msgid="4301554203329008794">"معالجة الملف غير متوافقة."</string>
    <string name="file_operation_error" msgid="2234357335716533795">"أخفقت معالجة الملف."</string>
    <string name="rename_error" msgid="6700093173508118635">"أخفقت إعادة تسمية المستند."</string>
    <string name="file_operation_error" msgid="2234357335716533795">"تعذّرت معالجة الملف."</string>
    <string name="rename_error" msgid="6700093173508118635">"تعذّرت إعادة تسمية المستند."</string>
    <string name="menu_eject_root" msgid="9215040039374893613">"إخراج"</string>
    <string name="notification_copy_files_converted_title" msgid="6916768494891833365">"تم تحويل بعض الملفات"</string>
    <string name="open_external_dialog_request" msgid="8173558471322861268">"هل تريد منح التطبيق <xliff:g id="APPNAME"><b>^1</b></xliff:g> حق الوصول إلى الدليل <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> على <xliff:g id="STORAGE"><i>^3</i></xliff:g>؟"</string>
+1 −1
Original line number Diff line number Diff line
@@ -134,7 +134,7 @@
      <item quantity="other">Imeshindwa kufuta vipengee <xliff:g id="COUNT_1">%1$d</xliff:g></item>
      <item quantity="one">Imeshindwa kufuta kipengee <xliff:g id="COUNT_0">%1$d</xliff:g></item>
    </plurals>
    <string name="notification_touch_for_details" msgid="2385563502445129570">"Gonga ili uangalie maelezo"</string>
    <string name="notification_touch_for_details" msgid="2385563502445129570">"Gusa ili uangalie maelezo"</string>
    <string name="close" msgid="905969391788869975">"Funga"</string>
    <plurals name="copy_failure_alert_content" formatted="false" msgid="5570549471912990536">
      <item quantity="other">Haikunakili faili hizi: <xliff:g id="LIST_1">%1$s</xliff:g></item>
+79 −7
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static com.android.documentsui.base.Shared.DEBUG;

import android.annotation.Nullable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.DocumentsContract.Root;
import android.text.TextUtils;
import android.util.Log;
@@ -38,6 +40,11 @@ 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.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Manages searching UI behavior.
@@ -48,9 +55,19 @@ public class SearchViewManager implements

    private static final String TAG = "SearchManager";

    // How long we wait after the user finishes typing before kicking off a search.
    public static final int SEARCH_DELAY_MS = 750;

    private final SearchManagerListener mListener;
    private final EventHandler<String> mCommandProcessor;

    private final Timer mTimer;
    private final Handler mUiHandler;

    private final Object mSearchLock;
    @GuardedBy("mSearchLock")
    private @Nullable Runnable mQueuedSearchRunnable;
    @GuardedBy("mSearchLock")
    private @Nullable TimerTask mQueuedSearchTask;
    private @Nullable String mCurrentSearch;
    private boolean mSearchExpanded;
    private boolean mIgnoreNextClose;
@@ -64,12 +81,25 @@ public class SearchViewManager implements
            SearchManagerListener listener,
            EventHandler<String> commandProcessor,
            @Nullable Bundle savedState) {
        this(listener, commandProcessor, savedState, new Timer(),
                new Handler(Looper.getMainLooper()));
    }

    @VisibleForTesting
    protected SearchViewManager(
            SearchManagerListener listener,
            EventHandler<String> commandProcessor,
            @Nullable Bundle savedState,
            Timer timer,
            Handler handler) {
        assert (listener != null);
        assert (commandProcessor != null);

        mSearchLock = new Object();
        mListener = listener;
        mCommandProcessor = commandProcessor;
        mTimer = timer;
        mUiHandler = handler;
        mCurrentSearch = savedState != null ? savedState.getString(Shared.EXTRA_QUERY) : null;
    }

@@ -169,6 +199,7 @@ public class SearchViewManager implements
     */
    public boolean cancelSearch() {
        if (isExpanded() || isSearching()) {
            cancelQueuedSearch();
            // If the query string is not empty search view won't get iconified
            mSearchView.setQuery("", false);

@@ -183,6 +214,17 @@ public class SearchViewManager implements
        return false;
    }

    private void cancelQueuedSearch() {
        synchronized (mSearchLock) {
            if (mQueuedSearchTask != null) {
                mQueuedSearchTask.cancel();
            }
            mQueuedSearchTask = null;
            mUiHandler.removeCallbacks(mQueuedSearchRunnable);
            mQueuedSearchRunnable = null;
        }
    }

    /**
     * Sets search view into the searching state. Used to restore state after device orientation
     * change.
@@ -261,10 +303,14 @@ public class SearchViewManager implements
        if (mCommandProcessor.accept(query)) {
            mSearchView.setQuery("", false);
        } else {
            cancelQueuedSearch();
            // Don't kick off a search if we've already finished it.
            if (mCurrentSearch != query) {
                mCurrentSearch = query;
            mSearchView.clearFocus();
                mListener.onSearchChanged(mCurrentSearch);
            }
            mSearchView.clearFocus();
        }

        return true;
    }
@@ -283,9 +329,35 @@ public class SearchViewManager implements
        }
    }

    @VisibleForTesting
    protected TimerTask createSearchTask(String newText) {
        return new TimerTask() {
            @Override
            public void run() {
                // Do the actual work on the main looper.
                synchronized (mSearchLock) {
                    mQueuedSearchRunnable = () -> {
                        mCurrentSearch = newText;
                        if (mCurrentSearch != null && mCurrentSearch.isEmpty()) {
                            mCurrentSearch = null;
                        }
                        mListener.onSearchChanged(mCurrentSearch);
                    };
                    mUiHandler.post(mQueuedSearchRunnable);
                }
            }
        };
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
        cancelQueuedSearch();
        synchronized (mSearchLock) {
            mQueuedSearchTask = createSearchTask(newText);

            mTimer.schedule(mQueuedSearchTask, SEARCH_DELAY_MS);
        }
        return true;
    }

    @Override
+6 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.documentsui.testing;

import android.util.SparseArray;
import android.view.Menu;
import android.widget.SearchView;

import com.android.documentsui.R;

@@ -88,6 +89,11 @@ public abstract class TestMenu implements Menu {
        for (int id : ids) {
            TestMenuItem item = TestMenuItem.create(id);
            menu.addMenuItem(id, item);

            // Used by SearchViewManager
            if (id == R.id.option_menu_search) {
                item.setActionView(Mockito.mock(SearchView.class));
            }
        }
        return menu;
    }
+13 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertTrue;

import android.annotation.StringRes;
import android.view.MenuItem;
import android.view.View;

import org.mockito.Mockito;

@@ -37,6 +38,7 @@ public abstract class TestMenuItem implements MenuItem {

    boolean enabled;
    boolean visible;
    View actionView;
    @StringRes int title;

    public static TestMenuItem create(int id) {
@@ -83,6 +85,17 @@ public abstract class TestMenuItem implements MenuItem {
        return this.enabled;
    }

    @Override
    final public MenuItem setActionView(View actionView) {
        this.actionView = actionView;
        return this;
    }

    @Override
    final public View getActionView() {
        return this.actionView;
    }

    public void assertEnabled() {
        assertTrue(this.enabled);
    }
Loading