package com.photo.photogallery.search; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import com.photo.photogallery.PhotoGalleryApp; import com.photo.photogallery.R; import com.photo.photogallery.api.entities.Photo; import com.photo.photogallery.api.entities.RecentPhotos; import com.photo.photogallery.network.AppImageLoader; import com.photo.photogallery.other.CustomSearchView; import com.photo.photogallery.other.SpacesItemDecoration; import com.photo.photogallery.photodetail.PhotoDetailActivity; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import rx.Subscription; import static android.view.View.GONE; import static android.view.View.VISIBLE; public class SearchFragment extends Fragment implements SearchView, CustomSearchView.OnQueryTextListener, CustomSearchView.SearchViewListener, SearchAdapter.Listener { @BindView(R.id.photos_loading_ui) View loadingUiView; @BindView(R.id.photos_loading_error_try_again_button) Button errorUiView; @BindView(R.id.photos_content_ui) RecyclerView contentUiRecyclerView; @BindView(R.id.search_view) CustomSearchView searchView; SearchAdapter searchAdapter; @Inject AppImageLoader imageLoader; @Inject SearchPresenter searchPresenter; @NonNull private Unbinder unbinder; private Subscription subscription; public static String CURRENT_QUERY = "current_query"; private static String currentQuery; public SearchFragment() { } public static SearchFragment newInstance() { return new SearchFragment(); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); PhotoGalleryApp.get(getContext()).applicationComponent().plus(new SearchModule(this)).inject(this); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_search, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { unbinder = ButterKnife.bind(this, view); contentUiRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3)); SpacesItemDecoration decoration = new SpacesItemDecoration(4); contentUiRecyclerView.addItemDecoration(decoration); searchAdapter = new SearchAdapter(this, getActivity().getLayoutInflater(), contentUiRecyclerView, imageLoader); contentUiRecyclerView.setAdapter(searchAdapter); setupSearchView(); } @Override public void setPresenter(SearchPresenter searchPresenter) { this.searchPresenter = searchPresenter; } @Override public void onResume() { super.onResume(); searchPresenter.subscribe(); } @Override public void onPause() { super.onPause(); searchPresenter.unsubscribe(); } @Override public void showLoadingUi() { errorUiView.setVisibility(GONE); loadingUiView.setVisibility(VISIBLE); contentUiRecyclerView.setVisibility(GONE); } @Override public void showErrorUi(@NonNull Throwable error) { loadingUiView.setVisibility(GONE); errorUiView.setVisibility(VISIBLE); contentUiRecyclerView.setVisibility(GONE); } @Override public void showContentUi(@NonNull RecentPhotos recentPhotos) { loadingUiView.setVisibility(GONE); errorUiView.setVisibility(GONE); contentUiRecyclerView.setVisibility(VISIBLE); if (searchAdapter != null) { searchAdapter.setData(recentPhotos.photosCollection().photos()); } } @Override public void OnPhotoSelected(@NonNull Photo photo) { Intent photoDetailIntent = PhotoDetailActivity.getIntent(getContext()); photoDetailIntent.putExtra(PhotoDetailActivity.ARGUMENT_PHOTO, photo); startActivity(photoDetailIntent); } @Override public void onDestroyView() { if (unbinder != null) { unbinder.unbind(); } super.onDestroyView(); } private void setupSearchView() { searchView.setCursorDrawable(R.drawable.custom_cursor); searchView.setOnQueryTextListener(this); searchView.setOnSearchViewListener(this); subscription = searchView.getSubscription(); searchView.showSearch(false); searchView.showKeyboard(getActivity()); } @Override public boolean onQueryTextSubmit(String query) { doSearch(query); return true; } @Override public boolean onQueryTextChange(String newText) { doSearch(newText); return true; } @Override public void onSearchViewShown() { } @Override public void onSearchViewClosed() { } @Override public void onBackButtonPressed() { searchView.hideKeyboard(getActivity()); getActivity().onBackPressed(); } private void doSearch(String query) { currentQuery = query; searchPresenter.search(query, null); } }