/*
* Copyright (C) 2015 Naman Dwivedi
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package com.naman14.timber.activities;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import com.naman14.timber.R;
import com.naman14.timber.adapters.SearchAdapter;
import com.naman14.timber.dataloaders.AlbumLoader;
import com.naman14.timber.dataloaders.ArtistLoader;
import com.naman14.timber.dataloaders.SongLoader;
import com.naman14.timber.models.Album;
import com.naman14.timber.models.Artist;
import com.naman14.timber.models.Song;
import com.naman14.timber.provider.SearchHistory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class SearchActivity extends BaseThemedActivity implements SearchView.OnQueryTextListener, View.OnTouchListener {
private final Executor mSearchExecutor = Executors.newSingleThreadExecutor();
@Nullable
private AsyncTask mSearchTask = null;
private SearchView mSearchView;
private InputMethodManager mImm;
private String queryString;
private SearchAdapter adapter;
private RecyclerView recyclerView;
private List<Object> searchResults = Collections.emptyList();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new SearchAdapter(this);
recyclerView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);
mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
mSearchView.setOnQueryTextListener(this);
mSearchView.setQueryHint(getString(R.string.search_library));
mSearchView.setIconifiedByDefault(false);
mSearchView.setIconified(false);
MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.menu_search), new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
finish();
return false;
}
});
menu.findItem(R.id.menu_search).expandActionView();
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onQueryTextSubmit(final String query) {
onQueryTextChange(query);
hideInputManager();
return true;
}
@Override
public boolean onQueryTextChange(final String newText) {
if (newText.equals(queryString)) {
return true;
}
if (mSearchTask != null) {
mSearchTask.cancel(false);
mSearchTask = null;
}
queryString = newText;
if (queryString.trim().equals("")) {
searchResults.clear();
adapter.updateSearchResults(searchResults);
adapter.notifyDataSetChanged();
} else {
mSearchTask = new SearchTask().executeOnExecutor(mSearchExecutor, queryString);
}
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
hideInputManager();
return false;
}
@Override
protected void onDestroy() {
if (mSearchTask != null && mSearchTask.getStatus() != AsyncTask.Status.FINISHED) {
mSearchTask.cancel(false);
}
super.onDestroy();
}
public void hideInputManager() {
if (mSearchView != null) {
if (mImm != null) {
mImm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
}
mSearchView.clearFocus();
SearchHistory.getInstance(this).addSearchString(queryString);
}
}
private class SearchTask extends AsyncTask<String,Void,ArrayList<Object>> {
@Override
protected ArrayList<Object> doInBackground(String... params) {
ArrayList<Object> results = new ArrayList<>(27);
List<Song> songList = SongLoader.searchSongs(SearchActivity.this, params[0], 10);
if (!songList.isEmpty()) {
results.add(getString(R.string.songs));
results.addAll(songList);
}
if (isCancelled()) {
return null;
}
List<Album> albumList = AlbumLoader.getAlbums(SearchActivity.this, params[0], 7);
if (!albumList.isEmpty()) {
results.add(getString(R.string.albums));
results.addAll(albumList);
}
if (isCancelled()) {
return null;
}
List<Artist> artistList = ArtistLoader.getArtists(SearchActivity.this, params[0], 7);
if (!artistList.isEmpty()) {
results.add(getString(R.string.artists));
results.addAll(artistList);
}
if (results.size() == 0) {
results.add(getString(R.string.nothing_found));
}
return results;
}
@Override
protected void onPostExecute(ArrayList<Object> objects) {
super.onPostExecute(objects);
mSearchTask = null;
if (objects != null) {
adapter.updateSearchResults(objects);
adapter.notifyDataSetChanged();
}
}
}
}