Be miserly with metered data.

Bug: 7337804
Change-Id: I64d078396b112381b2971259c784ee6fdf5e5ca3
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b721312..412c0f7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2,8 +2,9 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.dreams.phototable"
     >
-  <uses-permission android:name="android.permission.WAKE_LOCK" />
+  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+  <uses-permission android:name="android.permission.WAKE_LOCK" />
   <uses-permission android:name="com.google.android.gallery3d.permission.PICASA_STORE" />
 
   <application
diff --git a/res/values/config.xml b/res/values/config.xml
index e5dd458..db2b65e 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -79,5 +79,8 @@
 
   <!-- Number of unloadable images to skip before giving up. -->
   <integer name="bad_image_skip_limit">10</integer>
+
+  <!-- Size of image recycling pool when on metered data.  -->
+  <integer name="recycle_image_pool_size">20</integer>
 </resources>
 
diff --git a/src/com/android/dreams/phototable/PhotoCarousel.java b/src/com/android/dreams/phototable/PhotoCarousel.java
index d03dde0..0c957ab 100644
--- a/src/com/android/dreams/phototable/PhotoCarousel.java
+++ b/src/com/android/dreams/phototable/PhotoCarousel.java
@@ -232,7 +232,6 @@
             mPanel[1] = findViewById(R.id.back);
 
             new PhotoLoadTask(mPanel[0]).execute();
-            new PhotoLoadTask(mPanel[1]).execute();
 
             scheduleNext(mDropPeriod);
         }
diff --git a/src/com/android/dreams/phototable/PicasaSource.java b/src/com/android/dreams/phototable/PicasaSource.java
index 8a3c751..3a7ca23 100644
--- a/src/com/android/dreams/phototable/PicasaSource.java
+++ b/src/com/android/dreams/phototable/PicasaSource.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.database.Cursor;
+import android.net.ConnectivityManager;
 import android.net.Uri;
 import android.util.Log;
 
@@ -67,6 +68,9 @@
     private final String mPostsAlbumName;
     private final String mUploadsAlbumName;
     private final String mUnknownAlbumName;
+    private final LinkedList<ImageData> mRecycleBin;
+    private final ConnectivityManager mConnectivityManager;
+    private final int mMaxRecycleSize;
 
     private Set<String> mFoundAlbumIds;
     private int mNextPosition;
@@ -79,6 +83,10 @@
         mPostsAlbumName = mResources.getString(R.string.posts_album_name, "Posts");
         mUploadsAlbumName = mResources.getString(R.string.uploads_album_name, "Instant Uploads");
         mUnknownAlbumName = mResources.getString(R.string.unknown_album_name, "Unknown");
+        mMaxRecycleSize = mResources.getInteger(R.integer.recycle_image_pool_size);
+        mConnectivityManager =
+                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        mRecycleBin = new LinkedList<ImageData>();
         fillQueue();
     }
 
@@ -86,6 +94,16 @@
     protected Collection<ImageData> findImages(int howMany) {
         log(TAG, "finding images");
         LinkedList<ImageData> foundImages = new LinkedList<ImageData>();
+        if (mConnectivityManager.isActiveNetworkMetered()) {
+            howMany = Math.min(howMany, mMaxRecycleSize);
+            log(TAG, "METERED: " + howMany);
+            if (!mRecycleBin.isEmpty()) {
+                foundImages.addAll(mRecycleBin);
+                log(TAG, "recycled " + foundImages.size() + " items.");
+                return foundImages;
+            }
+        }
+
         String[] projection = {PICASA_ID, PICASA_URL, PICASA_ROTATION, PICASA_ALBUM_ID};
         boolean usePosts = false;
         LinkedList<String> albumIds = new LinkedList<String>();
@@ -359,8 +377,12 @@
                     .scheme("content")
                     .authority(PICASA_AUTHORITY)
                     .appendPath(PICASA_PHOTO_PATH)
-                    .appendPath(data.id)
-                    .appendQueryParameter(PICASA_TYPE_KEY, PICASA_TYPE_FULL_VALUE);
+                    .appendPath(data.id);
+            if (mConnectivityManager.isActiveNetworkMetered()) {
+                photoUriBuilder.appendQueryParameter(PICASA_TYPE_KEY, PICASA_TYPE_SCREEN_VALUE);
+            } else {
+                photoUriBuilder.appendQueryParameter(PICASA_TYPE_KEY, PICASA_TYPE_FULL_VALUE);
+            }
             if (data.url != null) {
                 photoUriBuilder.appendQueryParameter(PICASA_URL_KEY, data.url);
             }
@@ -373,6 +395,13 @@
             is = null;
         }
 
+        if (is != null) {
+            mRecycleBin.offer(data);
+            log(TAG, "RECYCLED");
+            while (mRecycleBin.size() > mMaxRecycleSize) {
+                mRecycleBin.poll();
+            }
+        }
         return is;
     }
 }