1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.intelligence.search.savedqueries;
18 
19 import android.app.LoaderManager;
20 import android.content.Context;
21 import android.content.Loader;
22 import android.os.Bundle;
23 import android.util.Log;
24 import android.view.Menu;
25 import android.view.MenuItem;
26 
27 import com.android.settings.intelligence.R;
28 import com.android.settings.intelligence.overlay.FeatureFactory;
29 import com.android.settings.intelligence.search.SearchFeatureProvider;
30 import com.android.settings.intelligence.search.SearchFragment;
31 import com.android.settings.intelligence.search.SearchResult;
32 import com.android.settings.intelligence.search.SearchResultsAdapter;
33 
34 import java.util.List;
35 
36 public class SavedQueryController implements LoaderManager.LoaderCallbacks,
37         MenuItem.OnMenuItemClickListener {
38 
39     // TODO: make a generic background task manager to handle one-off tasks like this one.
40     private static final String ARG_QUERY = "remove_query";
41     private static final String TAG = "SearchSavedQueryCtrl";
42 
43     private static final int MENU_SEARCH_HISTORY = 1000;
44 
45     private final Context mContext;
46     private final LoaderManager mLoaderManager;
47     private final SearchFeatureProvider mSearchFeatureProvider;
48     private final SearchResultsAdapter mResultAdapter;
49 
SavedQueryController(Context context, LoaderManager loaderManager, SearchResultsAdapter resultsAdapter)50     public SavedQueryController(Context context, LoaderManager loaderManager,
51             SearchResultsAdapter resultsAdapter) {
52         mContext = context;
53         mLoaderManager = loaderManager;
54         mResultAdapter = resultsAdapter;
55         mSearchFeatureProvider = FeatureFactory.get(context)
56                 .searchFeatureProvider();
57     }
58 
59     @Override
onCreateLoader(int id, Bundle args)60     public Loader onCreateLoader(int id, Bundle args) {
61         switch (id) {
62             case SearchFragment.SearchLoaderId.SAVE_QUERY_TASK:
63                 return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY));
64             case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
65                 return new SavedQueryRemover(mContext);
66             case SearchFragment.SearchLoaderId.SAVED_QUERIES:
67                 return mSearchFeatureProvider.getSavedQueryLoader(mContext);
68         }
69         return null;
70     }
71 
72     @Override
onLoadFinished(Loader loader, Object data)73     public void onLoadFinished(Loader loader, Object data) {
74         switch (loader.getId()) {
75             case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
76                 mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES,
77                         null /* args */, this /* callback */);
78                 break;
79             case SearchFragment.SearchLoaderId.SAVED_QUERIES:
80                 if (SearchFeatureProvider.DEBUG) {
81                     Log.d(TAG, "Saved queries loaded");
82                 }
83                 mResultAdapter.displaySavedQuery((List<SearchResult>) data);
84                 break;
85         }
86     }
87 
88     @Override
onLoaderReset(Loader loader)89     public void onLoaderReset(Loader loader) {
90     }
91 
92     @Override
onMenuItemClick(MenuItem item)93     public boolean onMenuItemClick(MenuItem item) {
94         if (item.getItemId() != MENU_SEARCH_HISTORY) {
95             return false;
96         }
97         removeQueries();
98         return true;
99     }
100 
buildMenuItem(Menu menu)101     public void buildMenuItem(Menu menu) {
102         final MenuItem item =
103                 menu.add(Menu.NONE, MENU_SEARCH_HISTORY, Menu.NONE, R.string.search_clear_history);
104         item.setOnMenuItemClickListener(this);
105     }
106 
saveQuery(String query)107     public void saveQuery(String query) {
108         final Bundle args = new Bundle();
109         args.putString(ARG_QUERY, query);
110         mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVE_QUERY_TASK, args,
111                 this /* callback */);
112     }
113 
114     /**
115      * Remove all saved queries from DB
116      */
removeQueries()117     public void removeQueries() {
118         final Bundle args = new Bundle();
119         mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK, args,
120                 this /* callback */);
121     }
122 
loadSavedQueries()123     public void loadSavedQueries() {
124         if (SearchFeatureProvider.DEBUG) {
125             Log.d(TAG, "loading saved queries");
126         }
127         mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES, null /* args */,
128                 this /* callback */);
129     }
130 }
131