blob: d8062a2a3d18cb8b104a6ae4a72ca3ecc52455eb [file] [log] [blame]
package com.bumptech.glide.samples.flickr;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.bumptech.glide.Glide;
import com.bumptech.glide.samples.flickr.api.Api;
import com.bumptech.glide.samples.flickr.api.Photo;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class FlickrSearchActivity extends SherlockFragmentActivity {
private static final String TAG = "FlickrSearchActivity";
private static final String STATE_SEARCH_STRING = "state_search_string";
private EditText searchText;
private View searching;
private TextView searchTerm;
private Set<PhotoViewer> photoViewers = new HashSet<PhotoViewer>();
private List<Photo> currentPhotos = new ArrayList<Photo>();
private View searchLoading;
private String currentSearchString;
private final SearchListener searchListener = new SearchListener();
private enum Page {
SMALL,
MEDIUM,
LIST
}
private static final Map<Page, Integer> PAGE_TO_TITLE = new HashMap<Page, Integer>() {{
put(Page.SMALL, R.string.small);
put(Page.MEDIUM, R.string.medium);
put(Page.LIST, R.string.list);
}};
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment instanceof PhotoViewer) {
PhotoViewer photoViewer = (PhotoViewer) fragment;
photoViewer.onPhotosUpdated(currentPhotos);
if (!photoViewers.contains(photoViewer)) {
photoViewers.add(photoViewer);
}
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Glide.get(this).register(Photo.class, InputStream.class, new FlickrModelLoader.Factory());
setContentView(R.layout.flickr_search_activity);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
searching = findViewById(R.id.searching);
searchLoading = findViewById(R.id.search_loading);
searchTerm = (TextView) findViewById(R.id.search_term);
searchText = (EditText) findViewById(R.id.search_text);
searchText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
executeSearch();
return true;
}
return false;
}
});
final Button search = (Button) findViewById(R.id.search);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
executeSearch();
}
});
ViewPager pager = (ViewPager) findViewById(R.id.view_pager);
pager.setPageMargin(50);
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) { }
@Override
public void onPageSelected(int position) {
getSupportActionBar().getTabAt(position).select();
}
@Override
public void onPageScrollStateChanged(int i) { }
});
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (Page page : Page.values()) {
final int textId = PAGE_TO_TITLE.get(page);
actionBar.addTab(actionBar.newTab().setText(textId).setTabListener(new TabListener(pager)));
}
pager.setAdapter(new FlickrPagerAdapter(getSupportFragmentManager()));
Api.get(Glide.get(this).getRequestQueue()).registerSearchListener(searchListener);
if (savedInstanceState != null) {
String savedSearchString = savedInstanceState.getString(STATE_SEARCH_STRING);
if (!TextUtils.isEmpty(savedSearchString)) {
executeSearch(savedSearchString);
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (!TextUtils.isEmpty(currentSearchString)) {
outState.putString(STATE_SEARCH_STRING, currentSearchString);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Api.get(Glide.get(this).getRequestQueue()).unregisterSearchListener(searchListener);
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
Glide.get(this).trimMemory(level);
}
@Override
public void onLowMemory() {
super.onLowMemory();
Glide.get(this).clearMemory();
}
private void executeSearch() {
String searchString = searchText.getText().toString();
searchText.getText().clear();
executeSearch(searchString);
}
private void executeSearch(String searchString) {
currentSearchString = searchString;
if (TextUtils.isEmpty(searchString)) {
return;
}
searching.setVisibility(View.VISIBLE);
searchLoading.setVisibility(View.VISIBLE);
searchTerm.setText(getString(R.string.searching_for, currentSearchString));
Api.get(Glide.get(this).getRequestQueue()).search(currentSearchString);
}
private static class TabListener implements ActionBar.TabListener {
private final ViewPager pager;
public TabListener(ViewPager pager) {
this.pager = pager;
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
pager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { }
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { }
}
private class SearchListener implements Api.SearchListener {
@Override
public void onSearchCompleted(String searchString, List<Photo> photos) {
if (!TextUtils.equals(currentSearchString, searchString)) {
return;
}
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Search completed, got " + photos.size() + " results");
}
searching.setVisibility(View.INVISIBLE);
for (PhotoViewer viewer : photoViewers) {
viewer.onPhotosUpdated(photos);
}
currentPhotos = photos;
}
@Override
public void onSearchFailed(String searchString, Exception e) {
if (!TextUtils.equals(currentSearchString, searchString)) {
return;
}
if (Log.isLoggable(TAG, Log.ERROR)) {
Log.e(TAG, "Search failed", e);
}
searching.setVisibility(View.VISIBLE);
searchLoading.setVisibility(View.INVISIBLE);
searchTerm.setText(getString(R.string.search_failed, currentSearchString));
}
}
private class FlickrPagerAdapter extends FragmentPagerAdapter {
public FlickrPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return pageToFragment(position);
}
@Override
public int getCount() {
return Page.values().length;
}
private Fragment pageToFragment(int position) {
Page page = Page.values()[position];
if (page == Page.SMALL) {
int pageSize = getPageSize(R.dimen.small_photo_side);
return FlickrPhotoGrid.newInstance(pageSize, 30);
} else if (page == Page.MEDIUM) {
int pageSize = getPageSize(R.dimen.medium_photo_side);
return FlickrPhotoGrid.newInstance(pageSize, 10);
} else if (page == Page.LIST) {
return FlickrPhotoList.newInstance();
} else {
throw new IllegalArgumentException("No fragment class for page=" + page);
}
}
private int getPageSize(int id) {
return getResources().getDimensionPixelSize(id);
}
}
}