aboutsummaryrefslogtreecommitdiff
path: root/samples/flickr
diff options
context:
space:
mode:
authorSam Judd <judds@google.com>2014-06-17 08:05:01 -0700
committerSam Judd <judds@google.com>2014-06-17 17:20:41 -0700
commitc2a82e501afef1ef9876db0337d60ea599e73119 (patch)
treed1457b8e2533a494c4c2fc8c7744deab507e1f47 /samples/flickr
parent8a6067fbe2a670d2e893c79c9c0ec17817da6568 (diff)
downloadglide-c2a82e501afef1ef9876db0337d60ea599e73119.tar.gz
Allow rotation in Flickr sample.
Diffstat (limited to 'samples/flickr')
-rw-r--r--samples/flickr/AndroidManifest.xml2
-rw-r--r--samples/flickr/res/layout/flickr_search_activity.xml1
-rw-r--r--samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoGrid.java22
-rw-r--r--samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrPhotoList.java24
-rw-r--r--samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/FlickrSearchActivity.java105
-rw-r--r--samples/flickr/src/main/java/com/bumptech/glide/samples/flickr/api/Api.java87
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;
+ }
+
+ }
}