package com.ambergleam.android.photogallery.controller; import android.app.SearchManager; import android.app.SearchableInfo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.GridView; import android.widget.ImageView; import com.ambergleam.android.photogallery.BaseActivity; import com.ambergleam.android.photogallery.BaseFragment; import com.ambergleam.android.photogallery.R; import com.ambergleam.android.photogallery.manager.DataManager; import com.ambergleam.android.photogallery.model.Photo; import com.ambergleam.android.photogallery.util.PreferenceUtils; import com.ambergleam.android.photogallery.web.FlickrFetchr; import com.squareup.picasso.Picasso; import java.util.ArrayList; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.Bind; import timber.log.Timber; public class GalleryFragment extends BaseFragment { @Inject DataManager mDataManager; @Bind(R.id.fragment_gallery_refresh) SwipeRefreshLayout mSwipeRefreshLayout; @Bind(R.id.fragment_gallery_grid) GridView mGridView; private ArrayList<Photo> mPhotos; private String mSearch; public static GalleryFragment newInstance() { return new GalleryFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_gallery, container, false); ButterKnife.bind(this, view); setupAdapter(); setupListeners(); return view; } @Override public void onResume() { super.onResume(); mSwipeRefreshLayout.requestFocus(); } @Override public void onPause() { super.onPause(); mSwipeRefreshLayout.requestFocus(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_gallery, menu); MenuItem menuItemSearch = menu.findItem(R.id.menu_item_gallery_search); SearchView searchView = (SearchView) menuItemSearch.getActionView(); searchView.setOnSearchClickListener(v -> { ActionBar actionBar = ((BaseActivity) getActivity()).getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(false); } }); searchView.setOnCloseListener(() -> { ActionBar actionBar = ((BaseActivity) getActivity()).getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(true); } PreferenceUtils.setSearchQuery(getActivity(), null); return false; }); if (mSearch != null && !mSearch.isEmpty()) { searchView.setIconified(false); searchView.setQuery(mSearch, false); searchView.clearFocus(); } else { searchView.setIconified(true); } SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); ComponentName name = getActivity().getComponentName(); SearchableInfo searchInfo = searchManager.getSearchableInfo(name); searchView.setSearchableInfo(searchInfo); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_gallery_favorites: Intent intentFavorites = new Intent(getActivity(), FavoritesActivity.class); startActivity(intentFavorites); return true; case R.id.menu_item_gallery_history: Intent intentHistory = new Intent(getActivity(), HistoryActivity.class); startActivity(intentHistory); return true; case R.id.menu_item_gallery_settings: Intent intentSettings = new Intent(getActivity(), SettingsActivity.class); startActivity(intentSettings); return true; default: return super.onOptionsItemSelected(item); } } private void setupAdapter() { if (getActivity() == null || mGridView == null) { return; } if (mPhotos != null) { mGridView.setAdapter(new PhotoGridViewAdapter(mPhotos)); } else { mGridView.setAdapter(null); } } private void setupListeners() { mGridView.setOnItemClickListener((gridView, gridItem, position, id) -> { Intent intent = new Intent(getActivity(), PhotoActivity.class); intent.putExtra(PhotoFragment.ARGS_PHOTO, mPhotos.get(position)); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( getActivity(), gridItem, getString(R.string.transition_photo) ); ActivityCompat.startActivity(getActivity(), intent, options.toBundle()); }); mSwipeRefreshLayout.setOnRefreshListener(this::search); mSwipeRefreshLayout.setColorSchemeResources(R.color.primary, R.color.accent); } public void search() { mSearch = PreferenceUtils.getSearchQuery(getActivity()); search(mSearch); } public void search(String query) { mSearch = query; PreferenceUtils.setSearchQuery(getActivity(), mSearch); mDataManager.saveSearch(mSearch); new SearchAsyncTask(mSearch).execute(); } private class SearchAsyncTask extends AsyncTask<String, Void, ArrayList<Photo>> { private String mQuery; public SearchAsyncTask(String query) { Timber.i("Search Query: " + mQuery); mQuery = query; } @Override protected void onPreExecute() { super.onPreExecute(); getActivity().invalidateOptionsMenu(); } @Override protected ArrayList<Photo> doInBackground(String... params) { if (getActivity() == null) { return new ArrayList<>(); } if (mQuery != null) { return new FlickrFetchr().getPhotos(mQuery); } else { return new FlickrFetchr().getPhotos(); } } @Override protected void onPostExecute(ArrayList<Photo> items) { mPhotos = items; setupAdapter(); mSwipeRefreshLayout.setRefreshing(false); } } private class PhotoGridViewAdapter extends ArrayAdapter<Photo> { public PhotoGridViewAdapter(ArrayList<Photo> items) { super(getActivity(), 0, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = getActivity().getLayoutInflater().inflate(R.layout.grid_item_gallery, parent, false); } Photo item = getItem(position); ImageView imageView = (ImageView) convertView.findViewById(R.id.grid_item_gallery_image); Picasso.with(getActivity()) .load(item.getSmallUrl()) .into(imageView); int size = item.getSmallestSide(); Picasso.with(getActivity()) .load(item.getLargeUrl()) .resize(size, size) .centerCrop() .fetch(); return convertView; } } }