Add button to remove saved search query

TODO: move all saved query related logic into its own manager instead of
leaving them in SearchFragment.

Change-Id: I9635140eb507331246f9035a23138421cfa4b50a
Fix: 27391895
Test: make RunSettingsRoboTests
This commit is contained in:
Fan Zhang
2017-03-14 17:14:05 -07:00
parent 5fa4df348b
commit fe44549626
8 changed files with 135 additions and 29 deletions

View File

@@ -0,0 +1,67 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.search2;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;
import com.android.settings.search.IndexDatabaseHelper;
import com.android.settings.utils.AsyncLoader;
import static com.android.settings.search.IndexDatabaseHelper.Tables.TABLE_SAVED_QUERIES;
public class SavedQueryRemover extends AsyncLoader<Void> {
private static final String LOG_TAG = "SavedQueryRemover";
private final String mQuery;
public SavedQueryRemover(Context context, String query) {
super(context);
mQuery = query;
}
@Override
public Void loadInBackground() {
final SQLiteDatabase database = getWritableDatabase();
try {
// First, delete all saved queries that are the same
database.delete(TABLE_SAVED_QUERIES,
IndexDatabaseHelper.SavedQueriesColumns.QUERY + " = ?",
new String[]{mQuery});
} catch (Exception e) {
Log.d(LOG_TAG, "Cannot update saved Search queries", e);
}
return null;
}
@Override
protected void onDiscardResult(Void result) {
}
private SQLiteDatabase getWritableDatabase() {
try {
return IndexDatabaseHelper.getInstance(getContext()).getWritableDatabase();
} catch (SQLiteException e) {
Log.e(LOG_TAG, "Cannot open writable database", e);
return null;
}
}
}

View File

@@ -22,17 +22,18 @@ import android.widget.TextView;
public class SavedQueryViewHolder extends SearchViewHolder {
public final TextView titleView;
public final View removeButton;
public SavedQueryViewHolder(View view) {
super(view);
titleView = view.findViewById(android.R.id.title);
removeButton = view.findViewById(android.R.id.icon);
}
@Override
public void onBind(SearchFragment fragment, SearchResult result) {
titleView.setText(result.title);
itemView.setOnClickListener(v -> {
fragment.onSavedQueryClicked(result.title);
});
titleView.setOnClickListener(v -> fragment.onSavedQueryClicked(result.title));
removeButton.setOnClickListener(v -> fragment.onRemoveSavedQueryClicked(result.title));
}
}

View File

@@ -74,8 +74,8 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
@VisibleForTesting
String mQuery;
private final SaveQueryRecorderCallback mSaveQueryRecorderCallback =
new SaveQueryRecorderCallback();
private final SaveQueryCallback mSaveQueryCallback =
new SaveQueryCallback();
private boolean mNeverEnteredQuery = true;
private int mResultClickCount;
@@ -218,8 +218,8 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
@Override
public boolean onQueryTextSubmit(String query) {
// Save submitted query.
getLoaderManager().restartLoader(SaveQueryRecorderCallback.LOADER_ID_SAVE_QUERY_TASK, null,
mSaveQueryRecorderCallback);
getLoaderManager().restartLoader(SaveQueryCallback.LOADER_ID_SAVE_QUERY_TASK, null,
mSaveQueryCallback);
hideKeyboard();
return true;
}
@@ -264,6 +264,8 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
}
public void onSearchResultClicked() {
getLoaderManager().restartLoader(SaveQueryCallback.LOADER_ID_SAVE_QUERY_TASK, null,
mSaveQueryCallback);
mResultClickCount++;
}
@@ -275,6 +277,13 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
onQueryTextChange(queryString);
}
public void onRemoveSavedQueryClicked(CharSequence title) {
final Bundle args = new Bundle();
args.putString(SaveQueryCallback.ARG_REMOVE_QUERY, title.toString());
getLoaderManager().restartLoader(SaveQueryCallback.LOADER_ID_REMOVE_QUERY_TASK,
args, mSaveQueryCallback);
}
private void restartLoaders() {
final LoaderManager loaderManager = getLoaderManager();
mUnfinishedLoadersCount.set(NUM_QUERY_LOADERS);
@@ -317,19 +326,31 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
}
}
private class SaveQueryRecorderCallback implements LoaderManager.LoaderCallbacks<Void> {
private class SaveQueryCallback implements LoaderManager.LoaderCallbacks<Void> {
// TODO: make a generic background task manager to handle one-off tasks like this one.
private static final int LOADER_ID_SAVE_QUERY_TASK = 0;
private static final int LOADER_ID_REMOVE_QUERY_TASK = 1;
private static final String ARG_REMOVE_QUERY = "remove_query";
@Override
public Loader<Void> onCreateLoader(int id, Bundle args) {
return new SavedQueryRecorder(getActivity(), mQuery);
switch (id) {
case LOADER_ID_SAVE_QUERY_TASK:
return new SavedQueryRecorder(getActivity(), mQuery);
case LOADER_ID_REMOVE_QUERY_TASK:
return new SavedQueryRemover(getActivity(), args.getString(ARG_REMOVE_QUERY));
}
return null;
}
@Override
public void onLoadFinished(Loader<Void> loader, Void data) {
switch (loader.getId()) {
case LOADER_ID_REMOVE_QUERY_TASK:
getLoaderManager().restartLoader(LOADER_ID_RECENTS, null, SearchFragment.this);
break;
}
}
@Override