OSDN Git Service

refactoring imageshow
authorJohn Hoford <hoford@google.com>
Mon, 14 Jan 2013 22:48:39 +0000 (14:48 -0800)
committerJohn Hoford <hoford@google.com>
Tue, 15 Jan 2013 22:54:05 +0000 (14:54 -0800)
Change-Id: I6d0872250b31a427ea6a3e46bd1c9ca5f3ba92ee

16 files changed:
src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/HistoryAdapter.java
src/com/android/gallery3d/filtershow/PanelController.java
src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java
src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java
src/com/android/gallery3d/filtershow/imageshow/ImageDraw.java
src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java
src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java
src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java [deleted file]
src/com/android/gallery3d/filtershow/imageshow/ImageTinyPlanet.java
src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java
src/com/android/gallery3d/filtershow/imageshow/MasterImage.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/presets/ImagePreset.java
src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
src/com/android/gallery3d/filtershow/ui/ImageCurves.java

index b89ab81..e8e629a 100644 (file)
@@ -54,7 +54,6 @@ import android.widget.SeekBar;
 import android.widget.ShareActionProvider;
 import android.widget.ShareActionProvider.OnShareTargetSelectedListener;
 import android.widget.Toast;
-import android.text.TextUtils;
 
 import com.android.gallery3d.R;
 import com.android.gallery3d.data.LocalAlbum;
@@ -75,11 +74,11 @@ import com.android.gallery3d.filtershow.imageshow.ImageShow;
 import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
 import com.android.gallery3d.filtershow.imageshow.ImageTinyPlanet;
 import com.android.gallery3d.filtershow.imageshow.ImageZoom;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 import com.android.gallery3d.filtershow.provider.SharedImageProvider;
 import com.android.gallery3d.filtershow.tools.SaveCopyTask;
 import com.android.gallery3d.filtershow.ui.FilterIconButton;
-import com.android.gallery3d.filtershow.ui.IconButton;
 import com.android.gallery3d.filtershow.ui.FramedTextButton;
 import com.android.gallery3d.filtershow.ui.ImageCurves;
 import com.android.gallery3d.filtershow.ui.Spline;
@@ -97,6 +96,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     // fields for supporting crop action
     public static final String CROP_ACTION = "com.android.camera.action.CROP";
     private CropExtras mCropExtras = null;
+    MasterImage mMasterImage = MasterImage.getImage();
 
     public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
     public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
@@ -130,8 +130,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private LinearLayout listFilters = null;
     private LinearLayout listBorders = null;
 
-    private ImageFilter mCurrentFilter = null;
-
     private static final int SELECT_PICTURE = 1;
     private static final String LOGTAG = "FilterShowActivity";
     protected static final boolean ANIMATE_PANELS = true;
@@ -161,6 +159,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        setupMasterImage();
         ImageFilterRS.setRenderScriptContext(this);
 
         ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
@@ -250,24 +249,14 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
         mImageShow.setImageLoader(mImageLoader);
         mImageCurves.setImageLoader(mImageLoader);
-        mImageCurves.setMaster(mImageShow);
         mImageStraighten.setImageLoader(mImageLoader);
-        mImageStraighten.setMaster(mImageShow);
         mImageZoom.setImageLoader(mImageLoader);
-        mImageZoom.setMaster(mImageShow);
         mImageCrop.setImageLoader(mImageLoader);
-        mImageCrop.setMaster(mImageShow);
         mImageRotate.setImageLoader(mImageLoader);
-        mImageRotate.setMaster(mImageShow);
         mImageFlip.setImageLoader(mImageLoader);
-        mImageFlip.setMaster(mImageShow);
         mImageTinyPlanet.setImageLoader(mImageLoader);
-        mImageTinyPlanet.setMaster(mImageShow);
         mImageRedEyes.setImageLoader(mImageLoader);
-        mImageRedEyes.setMaster(mImageShow);
-
         mImageDraw.setImageLoader(mImageLoader);
-        mImageDraw.setMaster(mImageShow);
 
         mPanelController.setActivity(this);
 
@@ -309,11 +298,11 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
                 createOnClickResetOperationsButton());
 
         ListView operationsList = (ListView) findViewById(R.id.operationsList);
-        operationsList.setAdapter(mImageShow.getHistory());
+        operationsList.setAdapter(mMasterImage.getHistory());
         operationsList.setOnItemClickListener(this);
         ListView imageStateList = (ListView) findViewById(R.id.imageStateList);
-        imageStateList.setAdapter(mImageShow.getImageStateAdapter());
-        mImageLoader.setAdapter(mImageShow.getHistory());
+        imageStateList.setAdapter(mMasterImage.getState());
+        mImageLoader.setAdapter(mMasterImage.getHistory());
 
         fillListImages(listFilters);
         fillListBorders(listBorders);
@@ -328,7 +317,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         mPanelController.setUtilityPanel(this, findViewById(R.id.filterButtonsList),
                 findViewById(R.id.panelAccessoryViewList),
                 findViewById(R.id.applyEffect));
-        mPanelController.setMasterImage(mImageShow);
+
         mPanelController.setCurrentPanel(mFxButton);
         Intent intent = getIntent();
         if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
@@ -433,7 +422,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
                 cannotLoadImage();
             }
 
-            mImageShow.requestFilteredImages();
             Bitmap bmap = mImageShow.getFilteredImage();
             if (bmap != null && bmap.getWidth() > 0 && bmap.getHeight() > 0) {
                 float w = bmap.getWidth();
@@ -599,7 +587,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         MenuItem undoItem = menu.findItem(R.id.undoButton);
         MenuItem redoItem = menu.findItem(R.id.redoButton);
         MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
-        mImageShow.getHistory().setMenuItems(undoItem, redoItem, resetItem);
+        mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
         return true;
     }
 
@@ -623,17 +611,17 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.undoButton: {
-                HistoryAdapter adapter = mImageShow.getHistory();
+                HistoryAdapter adapter = mMasterImage.getHistory();
                 int position = adapter.undo();
-                mImageShow.onItemClick(position);
+                mMasterImage.onHistoryItemClick(position);
                 mImageShow.showToast("Undo");
                 invalidateViews();
                 return true;
             }
             case R.id.redoButton: {
-                HistoryAdapter adapter = mImageShow.getHistory();
+                HistoryAdapter adapter = mMasterImage.getHistory();
                 int position = adapter.redo();
-                mImageShow.onItemClick(position);
+                mMasterImage.onHistoryItemClick(position);
                 mImageShow.showToast("Redo");
                 invalidateViews();
                 return true;
@@ -731,7 +719,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         }
 
         // Default preset (original)
-        mImageShow.setImagePreset(preset);
+        mMasterImage.setPreset(preset, true);
     }
 
     private void fillListBorders(LinearLayout listBorders) {
@@ -877,6 +865,18 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         }
     }
 
+    public void setupMasterImage() {
+        HistoryAdapter mHistoryAdapter = new HistoryAdapter(
+                this, R.layout.filtershow_history_operation_row,
+                R.id.rowTextView);
+        ImageStateAdapter mImageStateAdapter = new ImageStateAdapter(this,
+                R.layout.filtershow_imagestate_row);
+
+        mMasterImage.setHistoryAdapter(mHistoryAdapter);
+        mMasterImage.setStateAdapter(mImageStateAdapter);
+        mMasterImage.setActivity(this);
+    }
+
     // //////////////////////////////////////////////////////////////////////////////
     // history panel...
 
@@ -918,10 +918,10 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
     void resetHistory() {
         dispatchNullFilterClick();
-        HistoryAdapter adapter = mImageShow.getHistory();
+        HistoryAdapter adapter = mMasterImage.getHistory();
         adapter.reset();
         ImagePreset original = new ImagePreset(adapter.getItem(0));
-        mImageShow.setImagePreset(original);
+        mMasterImage.setPreset(original, true);
         mPanelController.resetParameters();
         invalidateViews();
     }
@@ -931,7 +931,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         return new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-
                 resetHistory();
             }
         };
@@ -960,24 +959,24 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     }
 
     public void useFilter(ImageFilter filter) {
-        if (mCurrentFilter == filter) {
+        if (mMasterImage.getCurrentFilter() == filter) {
             return;
         }
-        mCurrentFilter = filter;
+        mMasterImage.setCurrentFilter(filter);
         ImagePreset oldPreset = mImageShow.getImagePreset();
         ImagePreset copy = new ImagePreset(oldPreset);
         // TODO: use a numerical constant instead.
 
         copy.add(filter);
 
-        mImageShow.setImagePreset(copy);
+        mMasterImage.setPreset(copy, true);
         invalidateViews();
     }
 
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position,
             long id) {
-        mImageShow.onItemClick(position);
+        mMasterImage.onHistoryItemClick(position);
         invalidateViews();
     }
 
@@ -991,7 +990,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        Log.v(LOGTAG, "onActivityResult");
         if (resultCode == RESULT_OK) {
             if (requestCode == SELECT_PICTURE) {
                 Uri selectedImageUri = data.getData();
index 4719992..057ab38 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.gallery3d.filtershow;
 
 import android.content.Context;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
@@ -115,6 +116,10 @@ public class HistoryAdapter extends ArrayAdapter<ImagePreset> {
         return getItem(0);
     }
 
+    public ImagePreset getCurrent() {
+        return getItem(mCurrentPresetPosition);
+    }
+
     public void addHistoryItem(ImagePreset preset) {
         if (canAddHistoryItem(preset)) {
             insert(preset, 0);
@@ -123,7 +128,7 @@ public class HistoryAdapter extends ArrayAdapter<ImagePreset> {
     }
 
     public boolean canAddHistoryItem(ImagePreset preset) {
-        if (getCount() > 0 && getLast().same(preset)) {
+        if (getCount() > 0 && getCurrent().same(preset)) {
             // we may still want to insert if the previous
             // history element isn't the same
             if (getLast().historyName().equalsIgnoreCase(preset.historyName())) {
index 12fe5fa..9f49e89 100644 (file)
@@ -18,6 +18,7 @@ package com.android.gallery3d.filtershow;
 
 import android.content.Context;
 import android.text.Html;
+import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewPropertyAnimator;
@@ -29,6 +30,7 @@ import com.android.gallery3d.filtershow.filters.ImageFilter;
 import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
 import com.android.gallery3d.filtershow.imageshow.ImageCrop;
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 import com.android.gallery3d.filtershow.ui.FilterIconButton;
 import com.android.gallery3d.filtershow.ui.FramedTextButton;
@@ -230,7 +232,7 @@ public class PanelController implements OnClickListener {
     private View mCurrentPanel = null;
     private View mRowPanel = null;
     private UtilityPanel mUtilityPanel = null;
-    private ImageShow mMasterImage = null;
+    private MasterImage mMasterImage = MasterImage.getImage();
     private ImageShow mCurrentImage = null;
     private FilterShowActivity mActivity = null;
 
@@ -287,7 +289,7 @@ public class PanelController implements OnClickListener {
         }
         HistoryAdapter adapter = mMasterImage.getHistory();
         int position = adapter.undo();
-        mMasterImage.onItemClick(position);
+        mMasterImage.onHistoryItemClick(position);
         showPanel(mCurrentPanel);
         mCurrentImage.select();
         if (mDisableFilterButtons) {
@@ -320,10 +322,6 @@ public class PanelController implements OnClickListener {
                 accessoryViewList, textView);
     }
 
-    public void setMasterImage(ImageShow imageShow) {
-        mMasterImage = imageShow;
-    }
-
     @Override
     public void onClick(View view) {
         ViewType type = mViews.get(view);
@@ -392,7 +390,7 @@ public class PanelController implements OnClickListener {
     }
 
     public ImagePreset getImagePreset() {
-        return mMasterImage.getImagePreset();
+        return mMasterImage.getPreset();
     }
 
     public ImageFilter setImagePreset(ImageFilter filter, String name) {
@@ -400,7 +398,7 @@ public class PanelController implements OnClickListener {
         copy.add(filter);
         copy.setHistoryName(name);
         copy.setIsFx(false);
-        mMasterImage.setImagePreset(copy);
+        mMasterImage.setPreset(copy, true);
         return filter;
     }
 
@@ -413,7 +411,7 @@ public class PanelController implements OnClickListener {
             // to push it onto the history stack.
             ImagePreset copy = new ImagePreset(getImagePreset());
             copy.setHistoryName(name);
-            mMasterImage.setImagePreset(copy);
+            mMasterImage.setPreset(copy, true);
             filter = copy.getFilter(name);
         }
 
@@ -469,9 +467,7 @@ public class PanelController implements OnClickListener {
                     mCurrentImage.openUtilityPanel(mUtilityPanel.mAccessoryViewList);
                 }
                 mUtilityPanel.setShowParameter(filter.showParameterValue());
-                if (filter != null) {
-                    mMasterImage.setCurrentFilter(filter);
-                }
+                mMasterImage.setCurrentFilter(filter);
                 mCurrentImage.select();
             }
             return;
index adbb5da..d58e953 100644 (file)
@@ -19,6 +19,7 @@ package com.android.gallery3d.filtershow.cache;
 import android.graphics.Bitmap;
 
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 
 import java.util.Vector;
@@ -69,8 +70,13 @@ public class DirectPresetCache implements Cache {
         public void run() {
             for (int i = 0; i < mObservers.size(); i++) {
                 ImageShow imageShow = mObservers.elementAt(i);
-                imageShow.invalidate();
-                imageShow.updateImage();
+                // FIXME: need to replace the observer from ImageShow to
+                // MasterImage
+                if (imageShow != null) {
+                    imageShow.invalidate();
+                    imageShow.updateImage();
+                }
+                MasterImage.getImage().updatedCache();
             }
         }
     };
@@ -94,13 +100,10 @@ public class DirectPresetCache implements Cache {
 
     @Override
     public Bitmap get(ImagePreset preset) {
-        // Log.v(LOGTAG, "get preset " + preset.name() + " : " + preset);
         CachedPreset cache = getCachedPreset(preset);
         if (cache != null && !cache.mBusy) {
             return cache.mBitmap;
         }
-        // Log.v(LOGTAG, "didn't find preset " + preset.name() + " : " + preset
-        // + " we have " + mCache.size() + " elts / " + mCacheSize);
         return null;
     }
 
@@ -159,7 +162,6 @@ public class DirectPresetCache implements Cache {
 
     @Override
     public void prepare(ImagePreset preset) {
-        // Log.v(LOGTAG, "prepare preset " + preset.name() + " : " + preset);
         CachedPreset cache = getCachedPreset(preset);
         if (cache == null || (cache.mBitmap == null && !cache.mBusy)) {
             if (cache == null) {
index cb2bae7..6f7c36e 100644 (file)
@@ -31,6 +31,12 @@ public class ImageFilterRS extends ImageFilter {
     private static android.content.res.Resources mResources = null;
 
     public void prepare(Bitmap bitmap) {
+        if (mInPixelsAllocation != null) {
+            mInPixelsAllocation.destroy();
+        }
+        if (mOutPixelsAllocation != null) {
+            mOutPixelsAllocation.destroy();
+        }
         mInPixelsAllocation = Allocation.createFromBitmap(mRS, bitmap,
                 Allocation.MipmapControl.MIPMAP_NONE,
                 Allocation.USAGE_SCRIPT);
index b43cc1d..cca06e4 100644 (file)
@@ -15,7 +15,7 @@ import android.view.MotionEvent;
 import com.android.gallery3d.filtershow.filters.ImageFilterDraw;
 import com.android.gallery3d.filtershow.filters.RedEyeCandidate;
 
-public class ImageDraw extends ImageSlave {
+public class ImageDraw extends ImageShow {
 
     private static final String LOGTAG = "ImageDraw";
 
index c8ae444..588fa9a 100644 (file)
@@ -32,7 +32,7 @@ import android.view.View;
 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata.FLIP;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 
-public abstract class ImageGeometry extends ImageSlave {
+public abstract class ImageGeometry extends ImageShow {
     protected boolean mVisibilityGained = false;
     private boolean mHasDrawn = false;
 
@@ -138,7 +138,7 @@ public abstract class ImageGeometry extends ImageSlave {
 
     // Overwrites local with master
     protected void syncLocalToMasterGeometry() {
-        mLocalGeometry = getMaster().getGeometry();
+        mLocalGeometry = getGeometry();
         calculateLocalScalingFactorAndOffset();
     }
 
@@ -326,7 +326,7 @@ public abstract class ImageGeometry extends ImageSlave {
     }
 
     public void saveAndSetPreset() {
-        ImagePreset lastHistoryItem = getHistory().getLast();
+        ImagePreset lastHistoryItem = mMasterImage.getHistory().getLast();
         if (lastHistoryItem != null && lastHistoryItem.historyName().equalsIgnoreCase(getName())) {
             getImagePreset().setGeometry(mLocalGeometry);
             resetImageCaches(this);
@@ -336,7 +336,7 @@ public abstract class ImageGeometry extends ImageSlave {
                 copy.setGeometry(mLocalGeometry);
                 copy.setHistoryName(getName());
                 copy.setIsFx(false);
-                setImagePreset(copy, true);
+                mMasterImage.setPreset(copy, true);
             }
         }
         invalidate();
@@ -416,7 +416,7 @@ public abstract class ImageGeometry extends ImageSlave {
             clearDirtyGeometryFlag();
         }
         requestFilteredImages();
-        Bitmap image = getMaster().getFiltersOnlyImage();
+        Bitmap image = getFiltersOnlyImage();
         if (image == null) {
             invalidate();
             return;
index 5119dff..c012ff1 100644 (file)
@@ -14,7 +14,7 @@ import android.view.MotionEvent;
 import com.android.gallery3d.filtershow.filters.ImageFilterRedEye;
 import com.android.gallery3d.filtershow.filters.RedEyeCandidate;
 
-public class ImageRedEyes extends ImageSlave {
+public class ImageRedEyes extends ImageShow {
 
     private static final String LOGTAG = "ImageRedEyes";
     private RectF mCurrentRect = null;
index 69214bd..55bdb6e 100644 (file)
@@ -31,20 +31,15 @@ import android.view.GestureDetector.OnDoubleTapListener;
 import android.view.GestureDetector.OnGestureListener;
 import android.view.MotionEvent;
 import android.view.View;
-import android.widget.ArrayAdapter;
 import android.widget.LinearLayout;
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
 
-import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.FilterShowActivity;
-import com.android.gallery3d.filtershow.HistoryAdapter;
-import com.android.gallery3d.filtershow.ImageStateAdapter;
 import com.android.gallery3d.filtershow.PanelController;
 import com.android.gallery3d.filtershow.cache.ImageLoader;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
-import com.android.gallery3d.filtershow.ui.SliderController;
 import com.android.gallery3d.filtershow.ui.SliderListener;
 
 import java.io.File;
@@ -54,33 +49,22 @@ public class ImageShow extends View implements OnGestureListener,
         SliderListener,
         OnSeekBarChangeListener {
 
+    protected MasterImage mMasterImage = MasterImage.getImage();
     private static final String LOGTAG = "ImageShow";
 
     protected Paint mPaint = new Paint();
     protected static int mTextSize = 24;
     protected static int mTextPadding = 20;
 
-    protected ImagePreset mImagePreset = null;
-    protected ImagePreset mImageGeometryOnlyPreset = null;
-    protected ImagePreset mImageFiltersOnlyPreset = null;
-
     protected ImageLoader mImageLoader = null;
-    private ImageFilter mCurrentFilter = null;
     private boolean mDirtyGeometry = false;
 
     private Bitmap mBackgroundImage = null;
     private final boolean USE_BACKGROUND_IMAGE = false;
     private static int mBackgroundColor = Color.RED;
 
-    private Bitmap mGeometryOnlyImage = null;
-    private Bitmap mFiltersOnlyImage = null;
-    private Bitmap mFilteredImage = null;
-
     private GestureDetector mGestureDetector = null;
 
-    private HistoryAdapter mHistoryAdapter = null;
-    private ImageStateAdapter mImageStateAdapter = null;
-
     protected Rect mImageBounds = new Rect();
 
     private boolean mTouchShowOriginal = false;
@@ -109,7 +93,6 @@ public class ImageShow extends View implements OnGestureListener,
     }
 
     private boolean mShowControls = false;
-    private boolean mShowOriginal = false;
     private String mToast = null;
     private boolean mShowToast = false;
     private boolean mImportantToast = false;
@@ -220,7 +203,7 @@ public class ImageShow extends View implements OnGestureListener,
         }
         if (getImagePreset() != null) {
             mImageLoader.resetImageForPreset(getImagePreset(), this);
-            getImagePreset().fillImageStateAdapter(mImageStateAdapter);
+            getImagePreset().fillImageStateAdapter(mMasterImage.getState());
         }
         if (getPanelController() != null) {
             getPanelController().onNewValue(parameter);
@@ -242,20 +225,18 @@ public class ImageShow extends View implements OnGestureListener,
 
     public ImageShow(Context context, AttributeSet attrs) {
         super(context, attrs);
-        mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row,
-                R.id.rowTextView);
-        mImageStateAdapter = new ImageStateAdapter(context,
-                R.layout.filtershow_imagestate_row);
+
         setupGestureDetector(context);
         mActivity = (FilterShowActivity) context;
+        mMasterImage.addObserver(this);
     }
 
     public ImageShow(Context context) {
         super(context);
-        mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row,
-                R.id.rowTextView);
+
         setupGestureDetector(context);
         mActivity = (FilterShowActivity) context;
+        mMasterImage.addObserver(this);
     }
 
     public void setupGestureDetector(Context context) {
@@ -274,15 +255,11 @@ public class ImageShow extends View implements OnGestureListener,
     }
 
     public void setCurrentFilter(ImageFilter filter) {
-        mCurrentFilter = filter;
+        mMasterImage.setCurrentFilter(filter);
     }
 
     public ImageFilter getCurrentFilter() {
-        return mCurrentFilter;
-    }
-
-    public void setAdapter(HistoryAdapter adapter) {
-        mHistoryAdapter = adapter;
+        return mMasterImage.getCurrentFilter();
     }
 
     public void showToast(String text) {
@@ -319,7 +296,7 @@ public class ImageShow extends View implements OnGestureListener,
     }
 
     public ImagePreset getImagePreset() {
-        return mImagePreset;
+        return mMasterImage.getPreset();
     }
 
     public void drawToast(Canvas canvas) {
@@ -354,7 +331,6 @@ public class ImageShow extends View implements OnGestureListener,
     @Override
     public void onDraw(Canvas canvas) {
         drawBackground(canvas);
-        requestFilteredImages();
         defaultDrawImage(canvas);
 
         if (showTitle() && getImagePreset() != null) {
@@ -375,83 +351,27 @@ public class ImageShow extends View implements OnGestureListener,
         if (mImageLoader == null) {
             return;
         }
-        updateImagePresets(true);
+        mMasterImage.updatePresets(true);
     }
 
     public void updateImagePresets(boolean force) {
-        ImagePreset preset = getImagePreset();
-        if (preset == null) {
-            mActivity.enableSave(false);
-            return;
-        }
-        if (force) {
-            mImageLoader.resetImageForPreset(getImagePreset(), this);
-        }
-        if (force || mImageGeometryOnlyPreset == null) {
-            ImagePreset newPreset = new ImagePreset(preset);
-            newPreset.setDoApplyFilters(false);
-            if (mImageGeometryOnlyPreset == null
-                    || !newPreset.same(mImageGeometryOnlyPreset)) {
-                mImageGeometryOnlyPreset = newPreset;
-                mGeometryOnlyImage = null;
-            }
-        }
-        if (force || mImageFiltersOnlyPreset == null) {
-            ImagePreset newPreset = new ImagePreset(preset);
-            newPreset.setDoApplyGeometry(false);
-            if (mImageFiltersOnlyPreset == null
-                    || !newPreset.same(mImageFiltersOnlyPreset)) {
-                mImageFiltersOnlyPreset = newPreset;
-                mFiltersOnlyImage = null;
-            }
-        }
-        mActivity.enableSave(hasModifications());
+        mMasterImage.updatePresets(force);
     }
 
     public void requestFilteredImages() {
-        if (mImageLoader != null) {
-            Bitmap bitmap = mImageLoader.getImageForPreset(this,
-                    getImagePreset(), showHires());
-
-            if (bitmap != null) {
-                if (mFilteredImage == null) {
-                    invalidate();
-                }
-                mFilteredImage = bitmap;
-            }
-
-            updateImagePresets(false);
-            if (mImageGeometryOnlyPreset != null) {
-                bitmap = mImageLoader.getImageForPreset(this, mImageGeometryOnlyPreset,
-                        showHires());
-                if (bitmap != null) {
-                    mGeometryOnlyImage = bitmap;
-                }
-            }
-            if (mImageFiltersOnlyPreset != null) {
-                bitmap = mImageLoader.getImageForPreset(this, mImageFiltersOnlyPreset,
-                        showHires());
-                if (bitmap != null) {
-                    mFiltersOnlyImage = bitmap;
-                }
-            }
-        }
-
-        if (mShowOriginal) {
-            mFilteredImage = mGeometryOnlyImage;
-        }
+        mMasterImage.requestImages();
     }
 
     public Bitmap getFiltersOnlyImage() {
-        return mFiltersOnlyImage;
+        return mMasterImage.getFiltersOnlyImage();
     }
 
     public Bitmap getGeometryOnlyImage() {
-        return mGeometryOnlyImage;
+        return mMasterImage.getGeometryOnlyImage();
     }
 
     public Bitmap getFilteredImage() {
-        return mFilteredImage;
+        return mMasterImage.getFilteredImage();
     }
 
     public void drawImage(Canvas canvas, Bitmap image) {
@@ -567,33 +487,13 @@ public class ImageShow extends View implements OnGestureListener,
         return false;
     }
 
-    public void setImagePreset(ImagePreset preset) {
-        setImagePreset(preset, true);
-    }
 
-    public void setImagePreset(ImagePreset preset, boolean addToHistory) {
-        if (preset == null) {
-            return;
-        }
-        mImagePreset = preset;
-        getImagePreset().setImageLoader(mImageLoader);
-        updateImagePresets(true);
-        if (addToHistory) {
-            mHistoryAdapter.addHistoryItem(getImagePreset());
-        }
-        getImagePreset().setEndpoint(this);
-        updateImage();
-        mImagePreset.fillImageStateAdapter(mImageStateAdapter);
-        invalidate();
-    }
 
     public void setImageLoader(ImageLoader loader) {
         mImageLoader = loader;
         if (mImageLoader != null) {
             mImageLoader.addListener(this);
-            if (mImagePreset != null) {
-                mImagePreset.setImageLoader(mImageLoader);
-            }
+            mMasterImage.setImageLoader(mImageLoader);
         }
     }
 
@@ -622,7 +522,7 @@ public class ImageShow extends View implements OnGestureListener,
         RectF r = new RectF(0, 0, w, h);
         getImagePreset().mGeoData.setPhotoBounds(r);
         getImagePreset().mGeoData.setCropBounds(r);
-        setDirtyGeometryFlag();
+
     }
 
     public boolean updateGeometryFlags() {
@@ -645,10 +545,6 @@ public class ImageShow extends View implements OnGestureListener,
         invalidate();
     }
 
-    public void updateFilteredImage(Bitmap bitmap) {
-        mFilteredImage = bitmap;
-    }
-
     public void saveImage(FilterShowActivity filterShowActivity, File file) {
         mImageLoader.saveImage(getImagePreset(), filterShowActivity, file);
     }
@@ -680,7 +576,7 @@ public class ImageShow extends View implements OnGestureListener,
             mTouchY = ey;
             if (!mActivity.isShowingHistoryPanel()
                     && (System.currentTimeMillis() - mTouchShowOriginalDate
-                    > mTouchShowOriginalDelayMin)) {
+                            > mTouchShowOriginalDelayMin)) {
                 mTouchShowOriginal = true;
             }
         }
@@ -696,23 +592,7 @@ public class ImageShow extends View implements OnGestureListener,
     }
 
     // listview stuff
-
-    public HistoryAdapter getHistory() {
-        return mHistoryAdapter;
-    }
-
-    public ArrayAdapter getImageStateAdapter() {
-        return mImageStateAdapter;
-    }
-
-    public void onItemClick(int position) {
-        setImagePreset(new ImagePreset(mHistoryAdapter.getItem(position)), false);
-        // we need a copy from the history
-        mHistoryAdapter.setCurrentPreset(position);
-    }
-
     public void showOriginal(boolean show) {
-        mShowOriginal = show;
         invalidate();
     }
 
@@ -757,13 +637,11 @@ public class ImageShow extends View implements OnGestureListener,
     @Override
     public void onStartTrackingTouch(SeekBar arg0) {
         // TODO Auto-generated method stub
-
     }
 
     @Override
     public void onStopTrackingTouch(SeekBar arg0) {
         // TODO Auto-generated method stub
-
     }
 
     @Override
@@ -796,8 +674,8 @@ public class ImageShow extends View implements OnGestureListener,
                 || (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())) {
             if (!mTouchShowOriginal
                     || (mTouchShowOriginal &&
-                    (System.currentTimeMillis() - mTouchShowOriginalDate
-                    < mTouchShowOriginalDelayMax))) {
+                            (System.currentTimeMillis() - mTouchShowOriginalDate
+                            < mTouchShowOriginalDelayMax))) {
                 mActivity.toggleHistoryPanel();
             }
         }
@@ -807,7 +685,6 @@ public class ImageShow extends View implements OnGestureListener,
     @Override
     public void onLongPress(MotionEvent arg0) {
         // TODO Auto-generated method stub
-
     }
 
     @Override
@@ -819,7 +696,6 @@ public class ImageShow extends View implements OnGestureListener,
     @Override
     public void onShowPress(MotionEvent arg0) {
         // TODO Auto-generated method stub
-
     }
 
     @Override
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java
deleted file mode 100644 (file)
index 3d79ae0..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2012 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.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-
-import com.android.gallery3d.filtershow.HistoryAdapter;
-import com.android.gallery3d.filtershow.PanelController;
-import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-
-public class ImageSlave extends ImageShow {
-    private ImageShow mMasterImageShow = null;
-
-    public ImageSlave(Context context) {
-        super(context);
-    }
-
-    public ImageSlave(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public ImageShow getMaster() {
-        return mMasterImageShow;
-    }
-
-    public void setMaster(ImageShow master) {
-        mMasterImageShow = master;
-    }
-
-    @Override
-    public HistoryAdapter getHistory() {
-        return mMasterImageShow.getHistory();
-    }
-
-    @Override
-    public void resetImageCaches(ImageShow caller) {
-        mMasterImageShow.resetImageCaches(caller);
-    }
-
-    @Override
-    public ImagePreset getImagePreset() {
-        return mMasterImageShow.getImagePreset();
-    }
-
-    @Override
-    public Rect getDisplayedImageBounds() {
-        return mMasterImageShow.getDisplayedImageBounds();
-    }
-
-    @Override
-    public void setImagePreset(ImagePreset preset, boolean addToHistory) {
-        mMasterImageShow.setImagePreset(preset, addToHistory);
-    }
-
-    @Override
-    public void setCurrentFilter(ImageFilter filter) {
-        mMasterImageShow.setCurrentFilter(filter);
-    }
-
-    @Override
-    public ImageFilter getCurrentFilter() {
-        return mMasterImageShow.getCurrentFilter();
-    }
-
-    @Override
-    public Bitmap getFilteredImage() {
-        return mMasterImageShow.getFilteredImage();
-    }
-
-    @Override
-    public void updateImage() {
-        mMasterImageShow.updateImage();
-    }
-
-    @Override
-    public void updateImagePresets(boolean force) {
-        mMasterImageShow.updateImagePresets(force);
-    }
-
-    @Override
-    public void requestFilteredImages() {
-        mMasterImageShow.requestFilteredImages();
-    }
-
-    @Override
-    public boolean showTitle() {
-        return false;
-    }
-
-    @Override
-    public float getImageRotation() {
-        return mMasterImageShow.getImageRotation();
-    }
-
-    @Override
-    public float getImageRotationZoomFactor() {
-        return mMasterImageShow.getImageRotationZoomFactor();
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-    }
-
-    @Override
-    public void setPanelController(PanelController controller) {
-        mMasterImageShow.setPanelController(controller);
-    }
-
-    @Override
-    public PanelController getPanelController() {
-        return mMasterImageShow.getPanelController();
-    }
-
-}
index 31bfe43..82d8721 100644 (file)
@@ -22,7 +22,7 @@ import android.view.MotionEvent;
 
 import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
 
-public class ImageTinyPlanet extends ImageSlave {
+public class ImageTinyPlanet extends ImageShow {
 
     private float mTouchCenterX = 0;
     private float mTouchCenterY = 0;
index b66da01..e45b7b4 100644 (file)
@@ -27,7 +27,7 @@ import android.view.MotionEvent;
 
 import com.android.gallery3d.filtershow.cache.ImageLoader;
 
-public class ImageZoom extends ImageSlave {
+public class ImageZoom extends ImageShow {
     private static final String LOGTAG = "ImageZoom";
     private boolean mTouchDown = false;
     private boolean mZoomedIn = false;
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
new file mode 100644 (file)
index 0000000..5dc7b17
--- /dev/null
@@ -0,0 +1,207 @@
+package com.android.gallery3d.filtershow.imageshow;
+
+import android.graphics.Bitmap;
+import android.graphics.RectF;
+import android.util.Log;
+import android.widget.ArrayAdapter;
+
+import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.HistoryAdapter;
+import com.android.gallery3d.filtershow.ImageStateAdapter;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+
+import java.util.Vector;
+
+public class MasterImage {
+
+    private static final String LOGTAG = "MasterImage";
+
+    private static MasterImage sMasterImage = new MasterImage();
+
+    private ImageFilter mCurrentFilter = null;
+    private ImagePreset mPreset = null;
+    private ImagePreset mGeometryOnlyPreset = null;
+    private ImagePreset mFiltersOnlyPreset = null;
+
+    private Bitmap mGeometryOnlyImage = null;
+    private Bitmap mFiltersOnlyImage = null;
+    private Bitmap mFilteredImage = null;
+
+    private ImageLoader mLoader = null;
+    private HistoryAdapter mHistory = null;
+    private ImageStateAdapter mState = null;
+
+    private FilterShowActivity mActivity = null;
+
+    private Vector<ImageShow> mObservers = new Vector<ImageShow>();
+
+    private MasterImage() {
+    }
+
+    public static MasterImage getImage() {
+        return sMasterImage;
+    }
+
+    public void addObserver(ImageShow observer) {
+        mObservers.add(observer);
+    }
+
+    public void setActivity(FilterShowActivity activity) {
+        mActivity = activity;
+    }
+
+    public ImagePreset getPreset() {
+        return mPreset;
+    }
+
+    public void setPreset(ImagePreset preset, boolean addToHistory) {
+        mPreset = preset;
+        mPreset.setImageLoader(mLoader);
+        setGeometry();
+        mPreset.fillImageStateAdapter(mState);
+        if (addToHistory) {
+            mHistory.addHistoryItem(mPreset);
+        }
+        updatePresets(true);
+        requestImages();
+    }
+
+    private void setGeometry() {
+        Bitmap image = mLoader.getOriginalBitmapLarge();
+        if (image == null) {
+            return;
+        }
+        float w = image.getWidth();
+        float h = image.getHeight();
+        GeometryMetadata geo = mPreset.mGeoData;
+        RectF pb = geo.getPhotoBounds();
+        if (w == pb.width() && h == pb.height()) {
+            return;
+        }
+        RectF r = new RectF(0, 0, w, h);
+        geo.setPhotoBounds(r);
+        geo.setCropBounds(r);
+    }
+
+    public void onHistoryItemClick(int position) {
+        setPreset(new ImagePreset(mHistory.getItem(position)), false);
+        // We need a copy from the history
+        mHistory.setCurrentPreset(position);
+    }
+    public HistoryAdapter getHistory() {
+        return mHistory;
+    }
+
+    public ImageStateAdapter getState() {
+        return mState;
+    }
+
+    public void setHistoryAdapter(HistoryAdapter adapter) {
+        mHistory = adapter;
+    }
+
+    public void setStateAdapter(ImageStateAdapter adapter) {
+        mState = adapter;
+    }
+
+    public void setImageLoader(ImageLoader loader) {
+        mLoader = loader;
+    }
+
+    public void setCurrentFilter(ImageFilter filter) {
+        mCurrentFilter = filter;
+    }
+
+    public ImageFilter getCurrentFilter() {
+        return mCurrentFilter;
+    }
+
+    public boolean hasModifications() {
+        if (mPreset == null) {
+            return false;
+        }
+        return mPreset.hasModifications();
+    }
+
+    public Bitmap getFilteredImage() {
+        requestImages();
+        return mFilteredImage;
+    }
+
+    public Bitmap getFiltersOnlyImage() {
+        requestImages();
+        return mFiltersOnlyImage;
+    }
+
+    public Bitmap getGeometryOnlyImage() {
+        requestImages();
+        return mGeometryOnlyImage;
+    }
+
+    private void notifyObservers() {
+        for (ImageShow observer : mObservers) {
+            observer.invalidate();
+        }
+    }
+
+    public void updatedCache() {
+        requestImages();
+        notifyObservers();
+    }
+
+    public void updatePresets(boolean force) {
+        if (force) {
+            mLoader.resetImageForPreset(mPreset, null);
+        }
+        if (force || mGeometryOnlyPreset == null) {
+            ImagePreset newPreset = new ImagePreset(mPreset);
+            newPreset.setDoApplyFilters(false);
+            if (mGeometryOnlyPreset == null
+                    || !newPreset.same(mGeometryOnlyPreset)) {
+                mGeometryOnlyPreset = newPreset;
+                mGeometryOnlyImage = null;
+            }
+        }
+        if (force || mFiltersOnlyPreset == null) {
+            ImagePreset newPreset = new ImagePreset(mPreset);
+            newPreset.setDoApplyGeometry(false);
+            if (mFiltersOnlyPreset == null
+                    || !newPreset.same(mFiltersOnlyPreset)) {
+                mFiltersOnlyPreset = newPreset;
+                mFiltersOnlyImage = null;
+            }
+        }
+        mActivity.enableSave(hasModifications());
+    }
+
+    public void requestImages() {
+        if (mLoader == null) {
+            return;
+        }
+
+        // FIXME getImageForPreset caller
+        Bitmap bitmap = mLoader.getImageForPreset(null, mPreset, true);
+
+        if (bitmap != null) {
+            mFilteredImage = bitmap;
+            notifyObservers();
+        }
+        updatePresets(false);
+        if (mGeometryOnlyPreset != null) {
+            bitmap = mLoader.getImageForPreset(null, mGeometryOnlyPreset,
+                    true);
+            if (bitmap != null) {
+                mGeometryOnlyImage = bitmap;
+            }
+        }
+        if (mFiltersOnlyPreset != null) {
+            bitmap = mLoader.getImageForPreset(null, mFiltersOnlyPreset,
+                    true);
+            if (bitmap != null) {
+                mFiltersOnlyImage = bitmap;
+            }
+        }
+    }
+}
index 2522c89..8f39384 100644 (file)
@@ -296,10 +296,6 @@ public class ImagePreset {
             bitmap = mImageBorder.apply(bitmap, mScaleFactor, mIsHighQuality);
         }
 
-        if (mEndPoint != null) {
-            mEndPoint.updateFilteredImage(bitmap);
-        }
-
         return bitmap;
     }
 
index c2be858..089b241 100644 (file)
 
 package com.android.gallery3d.filtershow.ui;
 
-import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Color;
 import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.View;
 import android.widget.LinearLayout;
 
-import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.FilterShowActivity;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.filters.ImageFilterBorder;
-import com.android.gallery3d.filtershow.filters.ImageFilterDownsample;
-import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
 
 public class FilterIconButton extends IconButton implements View.OnClickListener {
     private Bitmap mOverlayBitmap = null;
@@ -89,11 +80,9 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
     @Override
     public void onClick(View v) {
         if (mController != null && mImageFilter != null) {
-            if (!isSelected()) {
-                mController.useFilter(mImageFilter);
-                mParentContainer.dispatchSetSelected(false);
-                setSelected(true);
-            }
+            mController.useFilter(mImageFilter);
+            mParentContainer.dispatchSetSelected(false);
+            setSelected(true);
         }
         if (mListener != null && mListener != this) {
             mListener.onClick(v);
index 5fbfc90..80c8935 100644 (file)
@@ -36,10 +36,10 @@ import android.widget.PopupMenu;
 
 import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.filters.ImageFilterCurves;
-import com.android.gallery3d.filtershow.imageshow.ImageSlave;
+import com.android.gallery3d.filtershow.imageshow.ImageShow;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 
-public class ImageCurves extends ImageSlave {
+public class ImageCurves extends ImageShow {
 
     private static final String LOGTAG = "ImageCurves";
     Paint gPaint = new Paint();
@@ -124,9 +124,10 @@ public class ImageCurves extends ImageSlave {
     }
 
     private ImageFilterCurves curves() {
-        if (getMaster() != null) {
-            String filterName = getFilterName();
-            return (ImageFilterCurves) getImagePreset().getFilter(filterName);
+        String filterName = getFilterName();
+        ImagePreset p = getImagePreset();
+        if (p != null) {
+            return (ImageFilterCurves) p.getFilter(filterName);
         }
         return null;
     }
@@ -144,7 +145,7 @@ public class ImageCurves extends ImageSlave {
     }
 
     public void resetCurve() {
-        if (getMaster() != null && curves() != null) {
+        if (curves() != null) {
             curves().reset();
             updateCachedImage();
         }