package io.hefuyi.listener.ui.fragment;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
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.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.inputmethod.InputMethodManager;
import com.afollestad.appthemeengine.ATE;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.hefuyi.listener.ListenerApp;
import io.hefuyi.listener.R;
import io.hefuyi.listener.RxBus;
import io.hefuyi.listener.event.MediaUpdateEvent;
import io.hefuyi.listener.injector.component.ApplicationComponent;
import io.hefuyi.listener.injector.component.DaggerSearchComponent;
import io.hefuyi.listener.injector.component.SearchComponent;
import io.hefuyi.listener.injector.module.SearchModule;
import io.hefuyi.listener.mvp.contract.SearchContract;
import io.hefuyi.listener.provider.SearchHistory;
import io.hefuyi.listener.ui.adapter.SearchAdapter;
import io.hefuyi.listener.util.ATEUtil;
import io.hefuyi.listener.util.DensityUtil;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
/**
* A simple {@link Fragment} subclass.
*/
public class SearchFragment extends Fragment implements SearchView.OnQueryTextListener, View.OnTouchListener,SearchContract.View{
@Inject
SearchContract.Presenter mPresenter;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.status_bar)
View statusBar;
@BindView(R.id.recyclerview)
RecyclerView recyclerView;
@BindView(R.id.view_empty)
ViewStub emptyView;
private SearchView mSearchView;
private InputMethodManager mImm;
private String queryString;
private SearchAdapter adapter;
private List<Object> searchResults = Collections.emptyList();
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
injectDependences();
mPresenter.attachView(this);
mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
adapter = new SearchAdapter(getActivity());
}
private void injectDependences() {
ApplicationComponent applicationComponent = ((ListenerApp) getActivity().getApplication()).getApplicationComponent();
SearchComponent searchComponent = DaggerSearchComponent.builder()
.applicationComponent(applicationComponent)
.searchModule(new SearchModule())
.build();
searchComponent.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_list_layout, container, false);
ButterKnife.bind(this, rootView);
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ATE.apply(this, ATEUtil.getATEKey(getActivity()));
if (Build.VERSION.SDK_INT < 21 && view.findViewById(R.id.status_bar) != null) {
view.findViewById(R.id.status_bar).setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= 19) {
int statusBarHeight = DensityUtil.getStatusBarHeight(getContext());
view.findViewById(R.id.toolbar).setPadding(0, statusBarHeight, 0, 0);
}
}
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
final ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(true);
getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC);
recyclerView.setOnTouchListener(this);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(adapter);
subscribeMediaUpdateEvent();
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onDestroyView() {
super.onDestroyView();
hideInputManager();
mPresenter.unsubscribe();
RxBus.getInstance().unSubscribe(this);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.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) {
Activity activity = getActivity();
activity.onBackPressed();
return true;
}
});
menu.findItem(R.id.menu_search).expandActionView();
}
@Override
public boolean onQueryTextSubmit(String query) {
onQueryTextChange(query);
hideInputManager();
return true;
}
@Override
public boolean onQueryTextChange(final String newText) {
if (newText.equals(queryString)) {
return true;
}
queryString = newText;
if (queryString.trim().equals("")) {
searchResults.clear();
adapter.updateSearchResults(searchResults);
adapter.notifyDataSetChanged();
} else {
mPresenter.search(newText);
}
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
if (mImm != null) {
mImm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
mSearchView.clearFocus();
}
}
return false;
}
private void hideInputManager() {
if (mSearchView != null) {
if (mImm != null) {
mImm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
}
mSearchView.clearFocus();
SearchHistory.getInstance(getContext()).addSearchString(queryString);
}
}
@Override
public void showSearchResult(List<Object> list) {
emptyView.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
adapter.updateSearchResults(list);
}
@Override
public void showEmptyView() {
emptyView.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.INVISIBLE);
}
private void subscribeMediaUpdateEvent() {
Subscription subscription = RxBus.getInstance()
.toObservable(MediaUpdateEvent.class)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.debounce(1, TimeUnit.SECONDS)
.subscribe(new Action1<MediaUpdateEvent>() {
@Override
public void call(MediaUpdateEvent event) {
mPresenter.search(queryString);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
});
RxBus.getInstance().addSubscription(this, subscription);
}
}