Merge "interruptible renderer" into gb-ub-photos-bryce
diff --git a/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java b/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java
index 566d161..e3c7700 100644
--- a/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java
+++ b/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java
@@ -96,6 +96,10 @@
         sResources = null;
     }
 
+    public void stop() {
+        mEnvironment.setStop(true);
+    }
+
     public synchronized void reset() {
         synchronized (CachingPipeline.class) {
             if (getRenderScriptContext() == null) {
@@ -170,6 +174,7 @@
         }
         mEnvironment.setQuality(ImagePreset.QUALITY_PREVIEW);
         mEnvironment.setImagePreset(preset);
+        mEnvironment.setStop(false);
     }
 
     public void setOriginal(Bitmap bitmap) {
@@ -294,7 +299,9 @@
                 }
 
                 Bitmap bmp = preset.apply(bitmap, mEnvironment);
-                request.setBitmap(bmp);
+                if (!mEnvironment.needsStop()) {
+                    request.setBitmap(bmp);
+                }
                 mFiltersManager.freeFilterResources(preset);
             }
         }
diff --git a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
index 8202d71..a0b2897 100644
--- a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
+++ b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
@@ -117,9 +117,11 @@
                 } else {
                     mAccessoryPipeline.render(request);
                 }
-                Message uimsg = mUIHandler.obtainMessage(NEW_RENDERING_REQUEST);
-                uimsg.obj = request;
-                mUIHandler.sendMessage(uimsg);
+                if (request.getBitmap() != null) {
+                    Message uimsg = mUIHandler.obtainMessage(NEW_RENDERING_REQUEST);
+                    uimsg.obj = request;
+                    mUIHandler.sendMessage(uimsg);
+                }
                 break;
             }
         }
@@ -185,6 +187,7 @@
             return;
         }
         mHasUnhandledPreviewRequest = true;
+        mHighresPreviewPipeline.stop();
         if (mProcessingHandler.hasMessages(COMPUTE_PRESET)) {
             return;
         }
diff --git a/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java b/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java
index 3c53227..c454c1a 100644
--- a/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java
+++ b/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java
@@ -35,6 +35,16 @@
     private int mQuality;
     private FiltersManager mFiltersManager;
     private CachingPipeline mCachingPipeline;
+    private volatile boolean mStop = false;
+
+    public synchronized boolean needsStop() {
+        return mStop;
+    }
+
+    public synchronized void setStop(boolean stop) {
+        this.mStop = stop;
+    }
+
     private HashMap<Long, WeakReference<Bitmap>>
             bitmapCach = new HashMap<Long, WeakReference<Bitmap>>();
 
diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
index bd2f494..ca97761 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -472,6 +472,9 @@
                     representation.synchronizeRepresentation();
                 }
                 bitmap = environment.applyRepresentation(representation, bitmap);
+                if (environment.needsStop()) {
+                    return bitmap;
+                }
             }
         }