package org.bookdash.android.presentation.search;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.bookdash.android.Injection;
import org.bookdash.android.R;
import org.bookdash.android.domain.model.firebase.FireBookDetails;
import org.bookdash.android.presentation.activity.BaseAppCompatActivity;
import org.bookdash.android.presentation.bookinfo.BookInfoActivity;
import org.bookdash.android.presentation.listbooks.BookAdapter;
import org.bookdash.android.presentation.listbooks.BookViewHolder;
import java.util.List;
import fr.castorflex.android.circularprogressbar.CircularProgressBar;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;
/**
* @author rebeccafranks
* @since 2016/12/11
*/
public class SearchActivity extends BaseAppCompatActivity implements SearchContract.View {
SearchContract.Presenter searchPresenter;
private Toolbar toolbar;
private String searchQuery;
private RecyclerView recyclerViewBooks;
private BookAdapter bookAdapter;
private CircularProgressBar circularProgressBar;
private View.OnClickListener bookClickListener = new View.OnClickListener() {
@Override
public void onClick(final View view) {
BookViewHolder viewHolder = (BookViewHolder) view.getTag();
FireBookDetails bookDetail = viewHolder.bookDetail;
BookInfoActivity.startBookInfo(SearchActivity.this, bookDetail);
}
};
private View errorLayout;
private TextView errorText;
private Button errorRetryButton;
public static void start(final Activity activity) {
Intent intent = new Intent(activity, SearchActivity.class);
activity.startActivity(intent);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.search_query_hint));
toolbar.setNavigationIcon(R.drawable.ic_arrow_back);
ActionBar actionBar = getSupportActionBar();
setSupportActionBar(toolbar);
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowHomeEnabled(true);
}
searchPresenter = new SearchPresenter(Injection.provideBookService(), Injection.provideAnalytics(),
AndroidSchedulers.mainThread(), Schedulers.io());
searchPresenter.attachView(this);
recyclerViewBooks = (RecyclerView) findViewById(R.id.recycler_view_books);
recyclerViewBooks.setLayoutManager(new GridLayoutManager(this, getResources().getInteger(R.integer.book_span)));
circularProgressBar = (CircularProgressBar) findViewById(R.id.progress_bar_search);
errorLayout = findViewById(R.id.linear_layout_error);
errorText = (TextView) findViewById(R.id.text_view_error_screen);
errorRetryButton = (Button) findViewById(R.id.button_retry);
errorRetryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
searchPresenter.search(searchQuery);
}
});
hideLoading();
}
@Override
protected String getScreenName() {
return "SearchActivity";
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_menu_search);
final SearchView searchView = (SearchView) item.getActionView();
toolbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
item.expandActionView();
searchView.setQuery(searchQuery, false);
}
});
if (searchView != null) {
item.expandActionView();
if (searchQuery != null) {
toolbar.setTitle(searchQuery);
searchView.setQuery(searchQuery, false);
}
searchView.setQueryHint(getString(R.string.search_query_hint));
searchView.setIconified(false);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Timber.d("Search submitted with query:" + query);
if (TextUtils.isEmpty(query)) {
return true;
}
item.collapseActionView();
searchPresenter.search(query);
toolbar.setTitle(query);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
Timber.d("Search query:" + query);
if (TextUtils.isEmpty(query)) {
return true;
}
searchPresenter.search(query);
toolbar.setTitle(query);
return true;
}
});
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void showSearchResults(final List<FireBookDetails> bookList) {
recyclerViewBooks.setVisibility(View.VISIBLE);
bookAdapter = new BookAdapter(bookList, this, bookClickListener);
recyclerViewBooks.setAdapter(bookAdapter);
}
@Override
public void showErrorMessage(final String errorMsg) {
recyclerViewBooks.setVisibility(View.GONE);
errorLayout.setVisibility(View.VISIBLE);
errorText.setText(errorMsg);
}
@Override
public void showLoading() {
circularProgressBar.setVisibility(View.VISIBLE);
recyclerViewBooks.setVisibility(View.GONE);
errorLayout.setVisibility(View.GONE);
}
@Override
public void hideLoading() {
circularProgressBar.setVisibility(View.GONE);
}
@Override
public void showNoInternetMessage() {
recyclerViewBooks.setVisibility(View.GONE);
errorLayout.setVisibility(View.VISIBLE);
errorText.setText(getText(R.string.search_no_internet_text));
}
@Override
public void showNoResultsMessage() {
recyclerViewBooks.setVisibility(View.GONE);
errorLayout.setVisibility(View.VISIBLE);
errorText.setText(getText(R.string.search_no_results_found));
}
@Override
public void showRetryButton() {
errorRetryButton.setVisibility(View.VISIBLE);
}
@Override
public void hideRetryButton() {
errorRetryButton.setVisibility(View.INVISIBLE);
}
}