diff options
author | Sam Judd <judds@google.com> | 2014-06-17 08:05:01 -0700 |
---|---|---|
committer | Sam Judd <judds@google.com> | 2014-06-17 17:20:41 -0700 |
commit | c2a82e501afef1ef9876db0337d60ea599e73119 (patch) | |
tree | d1457b8e2533a494c4c2fc8c7744deab507e1f47 /samples/flickr | |
parent | 8a6067fbe2a670d2e893c79c9c0ec17817da6568 (diff) | |
download | glide-c2a82e501afef1ef9876db0337d60ea599e73119.tar.gz |
Allow rotation in Flickr sample.
Diffstat (limited to 'samples/flickr')
6 files changed, 178 insertions, 63 deletions
diff --git a/samples/flickr/AndroidManifest.xml b/samples/flickr/AndroidManifest.xml index 5fbd3dc5..49fce328 100644 --- a/samples/flickr/AndroidManifest.xml +++ b/samples/flickr/AndroidManifest.xml @@ -15,7 +15,7 @@ <activity android:name=".FlickrSearchActivity" android:label="@string/app_name" android:launchMode="singleTask" - android:screenOrientation="portrait"> + android:windowSoftInputMode="stateHidden|adjustResize" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> diff --git a/samples/flickr/res/layout/flickr_search_activity.xml b/samples/flickr/res/layout/flickr_search_activity.xml index fe172fdd..df9d5f19 100644 --- a/samples/flickr/res/layout/flickr_search_activity.xml +++ b/samples/flickr/res/layout/flickr_search_activity.xml @@ -21,7 +21,6 @@ android:singleLine="true" android:inputType="text" android:imeOptions="actionSearch" /> - <!-- android:background="@drawable/stretch_field_comments" /> --> <Button android:id="@+id/search" android:layout_width="wrap_content" diff --git a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java index e50970fd..3d5e30eb 100644 --- a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java +++ b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java @@ -18,12 +18,15 @@ import java.util.ArrayList; import java.util.List; public class FlickrPhotoGrid extends SherlockFragment implements PhotoViewer { + private static final String STATE_POSITION_INDEX = "state_position_index"; + private static final String IMAGE_SIZE_KEY = "image_size"; private static final String PRELOAD_KEY = "preload"; private PhotoAdapter adapter; private List<Photo> currentPhotos; private int photoSize; + private GridView grid; public static FlickrPhotoGrid newInstance(int size, int preloadCount) { FlickrPhotoGrid photoGrid = new FlickrPhotoGrid(); @@ -40,19 +43,34 @@ public class FlickrPhotoGrid extends SherlockFragment implements PhotoViewer { photoSize = args.getInt(IMAGE_SIZE_KEY); final View result = inflater.inflate(R.layout.flickr_photo_grid, container, false); - final GridView grid = (GridView) result.findViewById(R.id.images); + grid = (GridView) result.findViewById(R.id.images); grid.setColumnWidth(photoSize); final FlickrPreloader preloader = new FlickrPreloader(getActivity(), args.getInt(PRELOAD_KEY)); grid.setOnScrollListener(preloader); adapter = new PhotoAdapter(); grid.setAdapter(adapter); - if (currentPhotos != null) + if (currentPhotos != null) { adapter.setPhotos(currentPhotos); + } + + if (savedInstanceState != null) { + int index = savedInstanceState.getInt(STATE_POSITION_INDEX); + grid.setSelection(index); + } return result; } @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (grid != null) { + int index = grid.getFirstVisiblePosition(); + outState.putInt(STATE_POSITION_INDEX, index); + } + } + + @Override public void onPhotosUpdated(List<Photo> photos) { currentPhotos = photos; if (adapter != null) diff --git a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java index 7a8dedce..102e9b05 100644 --- a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java +++ b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java @@ -19,9 +19,12 @@ import java.util.ArrayList; import java.util.List; public class FlickrPhotoList extends SherlockFragment implements PhotoViewer { + private static final String STATE_POSITION_INDEX = "state_position_index"; + private static final String STATE_POSITION_OFFSET = "state_position_offset"; private FlickrPhotoListAdapter adapter; private List<Photo> currentPhotos; private FlickrListPreloader preloader; + private ListView list; public static FlickrPhotoList newInstance() { return new FlickrPhotoList(); @@ -38,7 +41,7 @@ public class FlickrPhotoList extends SherlockFragment implements PhotoViewer { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View result = inflater.inflate(R.layout.flickr_photo_list, container, false); - ListView list = (ListView) result.findViewById(R.id.flickr_photo_list); + list = (ListView) result.findViewById(R.id.flickr_photo_list); adapter = new FlickrPhotoListAdapter(); list.setAdapter(adapter); preloader = new FlickrListPreloader(getActivity(), 5); @@ -46,9 +49,28 @@ public class FlickrPhotoList extends SherlockFragment implements PhotoViewer { if (currentPhotos != null) { adapter.setPhotos(currentPhotos); } + + if (savedInstanceState != null) { + int index = savedInstanceState.getInt(STATE_POSITION_INDEX); + int offset = savedInstanceState.getInt(STATE_POSITION_OFFSET); + list.setSelectionFromTop(index, offset); + } + return result; } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (list != null) { + int index = list.getFirstVisiblePosition(); + View topView = list.getChildAt(0); + int offset = topView != null ? topView.getTop() : 0; + outState.putInt(STATE_POSITION_INDEX, index); + outState.putInt(STATE_POSITION_OFFSET, offset); + } + } + private static class ViewHolder { private final TextView titleText; private final ImageView imageView; diff --git a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrSearchActivity.java b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrSearchActivity.java index 919fb966..d8062a2a 100644 --- a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrSearchActivity.java +++ b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrSearchActivity.java @@ -7,6 +7,7 @@ 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; @@ -30,14 +31,17 @@ 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 int searchCount = 0; 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, @@ -122,6 +126,28 @@ public class FlickrSearchActivity extends SherlockFragmentActivity { } 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 @@ -137,46 +163,23 @@ public class FlickrSearchActivity extends SherlockFragmentActivity { } private void executeSearch() { - final String searchString = searchText.getText().toString(); + String searchString = searchText.getText().toString(); searchText.getText().clear(); + executeSearch(searchString); + } - if ("".equals(searchString.trim())) return; + private void executeSearch(String searchString) { + currentSearchString = searchString; - final int currentSearch = ++searchCount; + if (TextUtils.isEmpty(searchString)) { + return; + } searching.setVisibility(View.VISIBLE); searchLoading.setVisibility(View.VISIBLE); - searchTerm.setText(getString(R.string.searching_for, searchString)); - - Api.get(Glide.get(this).getRequestQueue()).search(searchString, new Api.SearchCallback() { - @Override - public void onSearchCompleted(List<Photo> photos) { - if (currentSearch != searchCount) 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; - } + searchTerm.setText(getString(R.string.searching_for, currentSearchString)); - @Override - public void onSearchFailed(Exception e) { - if (currentSearch != searchCount) 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, searchString)); - } - }); + Api.get(Glide.get(this).getRequestQueue()).search(currentSearchString); } private static class TabListener implements ActionBar.TabListener { @@ -198,6 +201,40 @@ public class FlickrSearchActivity extends SherlockFragmentActivity { 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) { diff --git a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/api/Api.java b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/api/Api.java index 2fb95c9f..908deaaa 100644 --- a/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/api/Api.java +++ b/samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/api/Api.java @@ -1,5 +1,6 @@ package com.bumptech.glide.samples.flickr.api; +import android.text.TextUtils; import android.util.Log; import com.android.volley.DefaultRetryPolicy; import com.android.volley.Request; @@ -14,8 +15,10 @@ import org.json.JSONObject; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class Api { private static Api API; @@ -41,8 +44,6 @@ public class Api { Collections.sort(SORTED_SIZE_KEYS); } - private final RequestQueue requestQueue; - private static String getSizeKey(int width, int height) { final int largestEdge = Math.max(width, height); @@ -56,30 +57,14 @@ public class Api { return result; } - public interface SearchCallback { - public void onSearchCompleted(List<Photo> photos); - public void onSearchFailed(Exception e); - } - - public static Api get(RequestQueue requestQueue) { - if (API == null) { - API = new Api(requestQueue); - } - return API; - } - - protected Api(RequestQueue requestQueue) { - this.requestQueue = requestQueue; + public static String getCacheableUrl(Photo photo) { + return String.format(CACHEABLE_PHOTO_URL, photo.farm, photo.server, photo.id, photo.secret); } public static String getPhotoURL(Photo photo, int width, int height) { return getPhotoUrl(photo, getSizeKey(width, height)); } - public static String getCacheableUrl(Photo photo) { - return String.format(CACHEABLE_PHOTO_URL, photo.farm, photo.server, photo.id, photo.secret); - } - private static String getUrlForMethod(String method) { return String.format(SIGNED_API_URL, method); } @@ -92,7 +77,42 @@ public class Api { return photo.getPartialUrl() + sizeKey + ".jpg"; } - public void search(String text, final SearchCallback cb) { + public interface SearchListener { + public void onSearchCompleted(String searchString, List<Photo> photos); + public void onSearchFailed(String searchString, Exception e); + } + + public static Api get(RequestQueue requestQueue) { + if (API == null) { + API = new Api(requestQueue); + } + return API; + } + + private final RequestQueue requestQueue; + private final Set<SearchListener> searchListeners = new HashSet<SearchListener>(); + private SearchResult lastSearchResult; + + protected Api(RequestQueue requestQueue) { + this.requestQueue = requestQueue; + } + + public void registerSearchListener(SearchListener searchListener) { + searchListeners.add(searchListener); + } + + public void unregisterSearchListener(SearchListener searchListener) { + searchListeners.remove(searchListener); + } + + public void search(final String text) { + if (lastSearchResult != null && TextUtils.equals(lastSearchResult.searchString, text)) { + for (SearchListener listener : searchListeners) { + listener.onSearchCompleted(lastSearchResult.searchString, lastSearchResult.results); + } + return; + } + StringRequest request = new StringRequest(Request.Method.GET, getSearchUrl(text), new Response.Listener<String>() { @Override @@ -105,9 +125,14 @@ public class Api { for (int i = 0; i < photos.length(); i++) { results.add(new Photo(photos.getJSONObject(i))); } - cb.onSearchCompleted(results); + lastSearchResult = new SearchResult(text, results); + for (SearchListener listener : searchListeners) { + listener.onSearchCompleted(text, results); + } } catch (JSONException e) { - cb.onSearchFailed(e); + for (SearchListener listener : searchListeners) { + listener.onSearchFailed(text, e); + } if (Log.isLoggable(TAG, Log.ERROR)) { Log.e(TAG, "Search failed response=" + response, e); } @@ -116,11 +141,25 @@ public class Api { }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - cb.onSearchFailed(error); + for (SearchListener listener : searchListeners) { + listener.onSearchFailed(text, error); + } } }); request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, 3, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); requestQueue.add(request); } + + private static class SearchResult { + public final String searchString; + public final List<Photo> results; + + public SearchResult(String searchString, List<Photo> results) { + + this.searchString = searchString; + this.results = results; + } + + } } |