/* * Copyright (C) 2014 Pedro Vicente Gómez Sánchez. * * 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.github.pedrovgs.tuentitv.ui.fragment; import android.os.Bundle; import android.os.Handler; import android.support.v17.leanback.widget.ArrayObjectAdapter; import android.support.v17.leanback.widget.HeaderItem; import android.support.v17.leanback.widget.ListRow; import android.support.v17.leanback.widget.ListRowPresenter; import android.support.v17.leanback.widget.ObjectAdapter; import android.support.v17.leanback.widget.OnItemClickedListener; import android.support.v17.leanback.widget.Row; import android.text.TextUtils; import android.util.Log; import com.github.pedrovgs.tuentitv.R; import com.github.pedrovgs.tuentitv.model.Contact; import com.github.pedrovgs.tuentitv.presenter.SearchPresenter; import com.github.pedrovgs.tuentitv.ui.viewpresenter.CardPresenter; import java.util.List; import javax.inject.Inject; /** * Search fragment and SearchFragment extension created to support search functionality for * contacts. * * @author Pedro Vicente Gómez Sánchez. */ public class SearchFragment extends SearchBaseFragment implements android.support.v17.leanback.app.SearchFragment.SearchResultProvider, SearchPresenter.View { private static final String TAG = "SearchFragment"; private static final int SEARCH_DELAY_MS = 300; @Inject SearchPresenter searchPresenter; private ArrayObjectAdapter rowsAdapter; private Handler handler = new Handler(); private SearchRunnable delayedLoad; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); setSearchResultProvider(this); setOnItemClickedListener(getDefaultItemClickedListener()); delayedLoad = new SearchRunnable(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); searchPresenter.setView(this); loadAllContacts(); } @Override public ObjectAdapter getResultsAdapter() { return rowsAdapter; } @Override public boolean onQueryTextChange(String newQuery) { Log.d(TAG, String.format("Search Query Text Change %s", newQuery)); queryByWords(newQuery); return true; } @Override public boolean onQueryTextSubmit(String query) { Log.d(TAG, String.format("Search Query Text Submit %s", query)); queryByWords(query); return true; } @Override public void showAllContacts(List<Contact> contacts) { ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(new CardPresenter()); for (Contact contact : contacts) { arrayObjectAdapter.add(contact); } HeaderItem headerItem = new HeaderItem(getString(R.string.contacts_item_title), ""); rowsAdapter.add(new ListRow(headerItem, arrayObjectAdapter)); } @Override public void showSearchResultContacts(String query, List<Contact> contacts) { ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(new CardPresenter()); for (Contact contact : contacts) { arrayObjectAdapter.add(contact); } String resultSearchTitle = getString(R.string.search_result, query); HeaderItem headerItem = new HeaderItem(resultSearchTitle, ""); rowsAdapter.add(new ListRow(headerItem, arrayObjectAdapter)); } @Override public void finish() { getActivity().finish(); } protected OnItemClickedListener getDefaultItemClickedListener() { return new OnItemClickedListener() { @Override public void onItemClicked(Object item, Row row) { searchPresenter.onContactClicked((Contact) item); } }; } private void loadRows(String query) { loadContactsMatchingQuery(query); loadAllContacts(); } private void loadAllContacts() { searchPresenter.loadContacts(); } private void loadContactsMatchingQuery(String query) { searchPresenter.searchContacts(query); } private void queryByWords(String words) { rowsAdapter.clear(); if (!TextUtils.isEmpty(words)) { delayedLoad.setSearchQuery(words); handler.removeCallbacks(delayedLoad); handler.postDelayed(delayedLoad, SEARCH_DELAY_MS); } else { loadAllContacts(); } } private class SearchRunnable implements Runnable { private volatile String searchQuery; public SearchRunnable() { } public void run() { loadRows(searchQuery); } public void setSearchQuery(String value) { this.searchQuery = value; } } }