summaryrefslogtreecommitdiffstats
path: root/samples/browseable/ActivitySceneTransitionBasic/src
diff options
context:
space:
mode:
authorTrevor Johns <trevorjohns@google.com>2014-12-09 18:47:59 -0800
committerTrevor Johns <trevorjohns@google.com>2014-12-09 18:49:04 -0800
commitabededd8f7014bb4af9e0e203b71633cd72e9c20 (patch)
treeb895cb281d829774fea1bd4089729359287f428a /samples/browseable/ActivitySceneTransitionBasic/src
parent1ccf8350d52bd8d7f480c2c4d46c666356f4a220 (diff)
downloadandroid_development-abededd8f7014bb4af9e0e203b71633cd72e9c20.tar.gz
android_development-abededd8f7014bb4af9e0e203b71633cd72e9c20.tar.bz2
android_development-abededd8f7014bb4af9e0e203b71633cd72e9c20.zip
Docs: Sync browseable samples for lmp-docs
Synced to developers/samples/android commit bc036ecdf44cd03163c206096172299f3940b057. Change-Id: Ib68230d79ca300e7db906aff2ebfc2cb6c6968f7
Diffstat (limited to 'samples/browseable/ActivitySceneTransitionBasic/src')
-rw-r--r--samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/DetailActivity.java118
-rw-r--r--samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/ImageMemoryCache.java96
-rw-r--r--samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/MainActivity.java44
3 files changed, 105 insertions, 153 deletions
diff --git a/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/DetailActivity.java b/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/DetailActivity.java
index 958900890..17d1b2a7b 100644
--- a/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/DetailActivity.java
+++ b/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/DetailActivity.java
@@ -16,13 +16,14 @@
package com.example.android.activityscenetransitionbasic;
-import com.android.volley.toolbox.ImageLoader;
-import com.android.volley.toolbox.NetworkImageView;
-import com.android.volley.toolbox.Volley;
+import com.squareup.picasso.Picasso;
import android.app.Activity;
-import android.graphics.Bitmap;
+import android.os.Build;
import android.os.Bundle;
+import android.support.v4.view.ViewCompat;
+import android.transition.Transition;
+import android.widget.ImageView;
import android.widget.TextView;
/**
@@ -40,23 +41,20 @@ public class DetailActivity extends Activity {
// View name of the header title. Used for activity scene transitions
public static final String VIEW_NAME_HEADER_TITLE = "detail:header:title";
- private NetworkImageView mHeaderImageView;
+ private ImageView mHeaderImageView;
private TextView mHeaderTitle;
- private ImageLoader mImageLoader;
+ private Item mItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details);
- // Construct an ImageLoader instance so that we can load images from the network
- mImageLoader = new ImageLoader(Volley.newRequestQueue(this), ImageMemoryCache.INSTANCE);
-
// Retrieve the correct Item instance, using the ID provided in the Intent
- Item item = Item.getItem(getIntent().getIntExtra(EXTRA_PARAM_ID, 0));
+ mItem = Item.getItem(getIntent().getIntExtra(EXTRA_PARAM_ID, 0));
- mHeaderImageView = (NetworkImageView) findViewById(R.id.imageview_header);
+ mHeaderImageView = (ImageView) findViewById(R.id.imageview_header);
mHeaderTitle = (TextView) findViewById(R.id.textview_title);
// BEGIN_INCLUDE(detail_set_view_name)
@@ -65,31 +63,97 @@ public class DetailActivity extends Activity {
* This could be done in the layout XML, but exposing it via static variables allows easy
* querying from other Activities
*/
- mHeaderImageView.setTransitionName(VIEW_NAME_HEADER_IMAGE);
- mHeaderTitle.setTransitionName(VIEW_NAME_HEADER_TITLE);
+ ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE);
+ ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE);
// END_INCLUDE(detail_set_view_name)
- loadItem(item);
+ loadItem();
}
- private void loadItem(Item item) {
+ private void loadItem() {
// Set the title TextView to the item's name and author
- mHeaderTitle.setText(getString(R.string.image_header, item.getName(), item.getAuthor()));
+ mHeaderTitle.setText(getString(R.string.image_header, mItem.getName(), mItem.getAuthor()));
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && addTransitionListener()) {
+ // If we're running on Lollipop and we have added a listener to the shared element
+ // transition, load the thumbnail. The listener will load the full-size image when
+ // the transition is complete.
+ loadThumbnail();
+ } else {
+ // If all other cases we should just load the full-size image now
+ loadFullSizeImage();
+ }
+ }
- final ImageMemoryCache cache = ImageMemoryCache.INSTANCE;
- Bitmap thumbnailImage = cache.getBitmapFromUrl(item.getThumbnailUrl());
+ /**
+ * Load the item's thumbnail image into our {@link ImageView}.
+ */
+ private void loadThumbnail() {
+ Picasso.with(mHeaderImageView.getContext())
+ .load(mItem.getThumbnailUrl())
+ .noFade()
+ .into(mHeaderImageView);
+ }
+
+ /**
+ * Load the item's full-size image into our {@link ImageView}.
+ */
+ private void loadFullSizeImage() {
+ Picasso.with(mHeaderImageView.getContext())
+ .load(mItem.getPhotoUrl())
+ .noFade()
+ .noPlaceholder()
+ .into(mHeaderImageView);
+ }
- // Check to see if we already have the thumbnail sized image in the cache. If so, start
- // loading the full size image and display the thumbnail as a placeholder.
- if (thumbnailImage != null) {
- mHeaderImageView.setImageUrl(item.getPhotoUrl(), mImageLoader);
- mHeaderImageView.setImageBitmap(thumbnailImage);
- return;
+ /**
+ * Try and add a {@link Transition.TransitionListener} to the entering shared element
+ * {@link Transition}. We do this so that we can load the full-size image after the transition
+ * has completed.
+ *
+ * @return true if we were successful in adding a listener to the enter transition
+ */
+ private boolean addTransitionListener() {
+ final Transition transition = getWindow().getSharedElementEnterTransition();
+
+ if (transition != null) {
+ // There is an entering shared element transition so add a listener to it
+ transition.addListener(new Transition.TransitionListener() {
+ @Override
+ public void onTransitionEnd(Transition transition) {
+ // As the transition has ended, we can now load the full-size image
+ loadFullSizeImage();
+
+ // Make sure we remove ourselves as a listener
+ transition.removeListener(this);
+ }
+
+ @Override
+ public void onTransitionStart(Transition transition) {
+ // No-op
+ }
+
+ @Override
+ public void onTransitionCancel(Transition transition) {
+ // Make sure we remove ourselves as a listener
+ transition.removeListener(this);
+ }
+
+ @Override
+ public void onTransitionPause(Transition transition) {
+ // No-op
+ }
+
+ @Override
+ public void onTransitionResume(Transition transition) {
+ // No-op
+ }
+ });
+ return true;
}
- // If we get here then we do not have either the full size or the thumbnail in the cache.
- // Here we just load the full size and make do.
- mHeaderImageView.setImageUrl(item.getPhotoUrl(), mImageLoader);
+ // If we reach here then we have not added a listener
+ return false;
}
}
diff --git a/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/ImageMemoryCache.java b/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/ImageMemoryCache.java
deleted file mode 100644
index 53d47bae1..000000000
--- a/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/ImageMemoryCache.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.activityscenetransitionbasic;
-
-import com.android.volley.toolbox.ImageLoader;
-
-import android.graphics.Bitmap;
-import android.util.LruCache;
-
-import java.util.Map;
-
-/**
- * An image memory cache implementation for Volley which allows the retrieval of entires via a URL.
- * Volley internally inserts items with a key which is a combination of a the size of the image,
- * and the url.
- *
- * This class provide the method {@link #getBitmapFromUrl(String)} which allows the retrieval of
- * a bitmap solely on the URL.
- */
-public class ImageMemoryCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
-
- /**
- * Singleton instance which has it's maximum size set to be 1/8th of the allowed memory size.
- */
- public static final ImageMemoryCache INSTANCE = new ImageMemoryCache(
- (int) (Runtime.getRuntime().maxMemory() / 8));
-
- // Cache the last created snapshot
- private Map<String, Bitmap> mLastSnapshot;
-
- private ImageMemoryCache(int maxSize) {
- super(maxSize);
- }
-
- public Bitmap getBitmapFromUrl(String url) {
- // If we do not have a snapshot to use, generate one
- if (mLastSnapshot == null) {
- mLastSnapshot = snapshot();
- }
-
- // Iterate through the snapshot to find any entries which match our url
- for (Map.Entry<String, Bitmap> entry : mLastSnapshot.entrySet()) {
- if (url.equals(extractUrl(entry.getKey()))) {
- // We've found an entry with the same url, return the bitmap
- return entry.getValue();
- }
- }
-
- // We didn't find an entry, so return null
- return null;
- }
-
- @Override
- public Bitmap getBitmap(String key) {
- return get(key);
- }
-
- @Override
- public void putBitmap(String key, Bitmap bitmap) {
- put(key, bitmap);
-
- // An entry has been added, so invalidate the snapshot
- mLastSnapshot = null;
- }
-
- @Override
- protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
- super.entryRemoved(evicted, key, oldValue, newValue);
-
- // An entry has been removed, so invalidate the snapshot
- mLastSnapshot = null;
- }
-
- private static String extractUrl(String key) {
- return key.substring(key.indexOf("http"));
- }
-
- @Override
- protected int sizeOf(String key, Bitmap value) {
- return value.getAllocationByteCount();
- }
-}
diff --git a/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/MainActivity.java b/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/MainActivity.java
index 9c51789db..9eed44a3d 100644
--- a/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/MainActivity.java
+++ b/samples/browseable/ActivitySceneTransitionBasic/src/com.example.android.activityscenetransitionbasic/MainActivity.java
@@ -16,20 +16,20 @@
package com.example.android.activityscenetransitionbasic;
-import com.android.volley.toolbox.ImageLoader;
-import com.android.volley.toolbox.NetworkImageView;
-import com.android.volley.toolbox.Volley;
+import com.squareup.picasso.Picasso;
import android.app.Activity;
-import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
-import android.util.Pair;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v4.util.Pair;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
+import android.widget.ImageView;
import android.widget.TextView;
/**
@@ -42,16 +42,11 @@ public class MainActivity extends Activity implements AdapterView.OnItemClickLis
private GridView mGridView;
private GridAdapter mAdapter;
- private ImageLoader mImageLoader;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid);
- // Retrieve the ImageLoader we are going to use for NetworkImageView
- mImageLoader = new ImageLoader(Volley.newRequestQueue(this), ImageMemoryCache.INSTANCE);
-
// Setup the GridView and set the adapter
mGridView = (GridView) findViewById(R.id.grid);
mGridView.setOnItemClickListener(this);
@@ -74,23 +69,21 @@ public class MainActivity extends Activity implements AdapterView.OnItemClickLis
// BEGIN_INCLUDE(start_activity)
/**
* Now create an {@link android.app.ActivityOptions} instance using the
- * {@link android.app.ActivityOptions#makeSceneTransitionAnimation(android.app.Activity, android.util.Pair[])} factory method.
+ * {@link ActivityOptionsCompat#makeSceneTransitionAnimation(Activity, Pair[])} factory
+ * method.
*/
- ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(
+ ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(
this,
// Now we provide a list of Pair items which contain the view we can transitioning
// from, and the name of the view it is transitioning to, in the launched activity
- new Pair<View, String>(
- view.findViewById(R.id.imageview_item),
+ new Pair<View, String>(view.findViewById(R.id.imageview_item),
DetailActivity.VIEW_NAME_HEADER_IMAGE),
- new Pair<View, String>(
- view.findViewById(R.id.textview_name),
- DetailActivity.VIEW_NAME_HEADER_TITLE)
- );
+ new Pair<View, String>(view.findViewById(R.id.textview_name),
+ DetailActivity.VIEW_NAME_HEADER_TITLE));
// Now we can start the Activity, providing the activity options as a bundle
- startActivity(intent, activityOptions.toBundle());
+ ActivityCompat.startActivity(this, intent, activityOptions.toBundle());
// END_INCLUDE(start_activity)
}
@@ -123,22 +116,13 @@ public class MainActivity extends Activity implements AdapterView.OnItemClickLis
final Item item = getItem(position);
// Load the thumbnail image
- NetworkImageView image = (NetworkImageView) view.findViewById(R.id.imageview_item);
- image.setImageUrl(item.getThumbnailUrl(), mImageLoader);
+ ImageView image = (ImageView) view.findViewById(R.id.imageview_item);
+ Picasso.with(image.getContext()).load(item.getThumbnailUrl()).into(image);
// Set the TextView's contents
TextView name = (TextView) view.findViewById(R.id.textview_name);
name.setText(item.getName());
- // BEGIN_INCLUDE(grid_set_view_name)
- /**
- * As we're in an adapter we need to set each view's name dynamically, using the
- * item's ID so that the names are unique.
- */
- image.setTransitionName("grid:image:" + item.getId());
- name.setTransitionName("grid:name:" + item.getId());
- // END_INCLUDE(grid_set_view_name)
-
return view;
}
}