2 * Copyright (C) 2016 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings.search2;
19 import android.app.Activity;
20 import android.content.Loader;
21 import android.os.Bundle;
22 import android.app.LoaderManager;
23 import android.support.v7.widget.LinearLayoutManager;
24 import android.support.v7.widget.RecyclerView;
25 import android.view.LayoutInflater;
26 import android.view.MenuItem;
27 import android.view.View;
28 import android.view.ViewGroup;
29 import android.view.Menu;
30 import android.view.MenuInflater;
31 import android.widget.SearchView;
33 import com.android.internal.logging.nano.MetricsProto;
34 import com.android.settings.R;
35 import com.android.settings.core.InstrumentedFragment;
37 import java.util.List;
39 public class SearchFragment extends InstrumentedFragment implements
40 SearchView.OnQueryTextListener, MenuItem.OnActionExpandListener,
41 LoaderManager.LoaderCallbacks<List<SearchResult>> {
43 private static final int DATABASE_LOADER_ID = 0;
45 private SearchResultsAdapter mSearchAdapter;
47 private DatabaseResultLoader mSearchLoader;
49 private RecyclerView mResultsRecyclerView;
50 private SearchView mSearchView;
51 private MenuItem mSearchMenuItem;
53 private String mQuery;
56 public void onCreate(Bundle savedInstanceState) {
57 super.onCreate(savedInstanceState);
58 setHasOptionsMenu(true);
60 mSearchAdapter = new SearchResultsAdapter();
62 final LoaderManager loaderManager = getLoaderManager();
63 loaderManager.initLoader(DATABASE_LOADER_ID, null, this);
67 public View onCreateView(LayoutInflater inflater, ViewGroup container,
68 Bundle savedInstanceState) {
69 final View view = inflater.inflate(R.layout.search_panel_2, container, false);
70 mResultsRecyclerView = (RecyclerView) view.findViewById(R.id.list_results);
72 mResultsRecyclerView.setAdapter(mSearchAdapter);
73 mResultsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
78 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
79 super.onCreateOptionsMenu(menu, inflater);
80 inflater.inflate(R.menu.search_options_menu, menu);
83 mSearchMenuItem = menu.findItem(R.id.search);
85 mSearchView = (SearchView) mSearchMenuItem.getActionView();
86 mSearchView.setOnQueryTextListener(this);
87 mSearchView.setMaxWidth(Integer.MAX_VALUE);
88 mSearchMenuItem.expandActionView();
92 public boolean onMenuItemActionExpand(MenuItem item) {
97 public boolean onMenuItemActionCollapse(MenuItem item) {
98 // Return false to prevent the search box from collapsing.
103 public boolean onQueryTextChange(String query) {
104 if (query == null || query.equals(mQuery)) {
111 final LoaderManager loaderManager = getLoaderManager();
112 loaderManager.restartLoader(DATABASE_LOADER_ID, null, this);
118 public boolean onQueryTextSubmit(String query) {
123 public Loader<List<SearchResult>> onCreateLoader(int id, Bundle args) {
124 final Activity activity = getActivity();
127 case DATABASE_LOADER_ID:
128 mSearchLoader = new DatabaseResultLoader(activity, mQuery);
129 return mSearchLoader;
136 public void onLoadFinished(Loader<List<SearchResult>> loader, List<SearchResult> data) {
141 mSearchAdapter.mergeResults(data, loader.getClass().getName());
145 public void onLoaderReset(Loader<List<SearchResult>> loader) { }
148 public int getMetricsCategory() {
149 return MetricsProto.MetricsEvent.DASHBOARD_SEARCH_RESULTS;
152 private void clearLoaders() {
153 if (mSearchLoader != null) {
154 mSearchLoader.cancelLoad();
155 mSearchLoader = null;