FilterShowActivity.java revision a680a0c32ae3321c632288b36083f2782af2c55b
10d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
20d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow;
30d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
40d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.annotation.TargetApi;
59594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.app.ActionBar;
60d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.app.Activity;
7ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport android.app.ProgressDialog;
80ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues;
90addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport android.content.Context;
100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent;
110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources;
12457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.Bitmap;
13457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.BitmapFactory;
1493dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Color;
15fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.graphics.Point;
160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
1792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
1892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
19fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log;
210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.TypedValue;
22fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.view.Display;
230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.Menu;
249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.view.MenuItem;
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View;
260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView;
280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ImageButton;
300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.LinearLayout;
310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ListView;
3292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.widget.SeekBar;
330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider;
340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
35e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroardimport android.widget.Toast;
360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
380addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
3992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
4092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter;
4192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterBorder;
42ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterContrast;
43ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterExposure;
44a19830b4fd9050b48386cd904d99cfd2566cc515John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterFx;
45ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterHue;
4693dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
4792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterRS;
48ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterSaturated;
49ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterShadows;
502576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberlingimport com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
51ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
52ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterVignette;
53ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterWBalance;
5492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageBorder;
55de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageCrop;
56de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageFlip;
57de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageRotate;
5892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
5908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallBorder;
6092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
6192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageStraighten;
62ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.imageshow.ImageWithIcon;
6392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageZoom;
6492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset;
6592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
6692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.tools.SaveCopyTask;
675ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroardimport com.android.gallery3d.filtershow.ui.ImageButtonTitle;
6892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.ui.ImageCurves;
693992ae6cf1cbb7b57a22d8287c40451558408335nicolasroardimport com.android.gallery3d.filtershow.ui.Spline;
700addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
7192e2341248e99c691f38820503984bc5e2f18811nicolasroard
7292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
73ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
7492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
7592e2341248e99c691f38820503984bc5e2f18811nicolasroard
760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard@TargetApi(16)
770ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardpublic class FilterShowActivity extends Activity implements OnItemClickListener,
780ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        OnShareTargetSelectedListener {
790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk    public static final String CROP_ACTION = "com.android.camera.action.CROP";
81a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
8292e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final PanelController mPanelController = new PanelController();
830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageLoader mImageLoader = null;
840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageCurves mImageCurves = null;
860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageBorder mImageBorders = null;
870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageStraighten mImageStraighten = null;
885448bf8095483574649afcc2add7f153670c7450nicolasroard    private ImageZoom mImageZoom = null;
8962e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk    private ImageCrop mImageCrop = null;
908537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    private ImageRotate mImageRotate = null;
918537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    private ImageFlip mImageFlip = null;
920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListFx = null;
940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListBorders = null;
950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListGeometry = null;
960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListColors = null;
9792e2341248e99c691f38820503984bc5e2f18811nicolasroard    private View mListFilterButtons = null;
980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mFxButton = null;
1000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mBorderButton = null;
1010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mGeometryButton = null;
1020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mColorsButton = null;
1030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    private ImageSmallFilter mCurrentImageSmallFilter = null;
1050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
10792e2341248e99c691f38820503984bc5e2f18811nicolasroard    protected static final boolean ANIMATE_PANELS = true;
1085ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    private static int mImageBorderSize = 40;
1090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private boolean mShowingHistoryPanel = false;
111bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
112bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
11392e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
11492e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<View> mListViews = new Vector<View>();
11592e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>();
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
122ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
1233038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford    private static final int SEEK_BAR_MAX = 600;
12455550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
1250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
1260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
1270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
1280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1295448bf8095483574649afcc2add7f153670c7450nicolasroard        ImageFilterRS.setRenderScriptContext(this);
1305448bf8095483574649afcc2add7f153670c7450nicolasroard
13195404c666640177abf72ca2278585a16f30cf390nicolasroard        ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
1325ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        // TODO: get those values from XML.
1335ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageShow.setTextSize((int) getPixelsFromDip(12));
1345ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageShow.setTextPadding((int) getPixelsFromDip(10));
1355ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageButtonTitle.setTextSize((int) getPixelsFromDip(12));
1365ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10));
13795404c666640177abf72ca2278585a16f30cf390nicolasroard        ImageSmallFilter.setMargin((int) getPixelsFromDip(3));
1385ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageSmallFilter.setTextMargin((int) getPixelsFromDip(4));
1395ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        mImageBorderSize = (int) getPixelsFromDip(20);
1403992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Drawable curveHandle = getResources().getDrawable(R.drawable.camera_crop_holo);
1413992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        int curveHandleSize = (int) getResources().getDimension(R.dimen.crop_indicator_size);
1423992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
1433992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
1445ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
1450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
1469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
147786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
148786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
149786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
150786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.getCustomView().setOnClickListener(new OnClickListener() {
151786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
152786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
153786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
154786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
155786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
1560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
157e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        mImageLoader = new ImageLoader(this, getApplicationContext());
1580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters);
1600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders);
161ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        LinearLayout listColors = (LinearLayout) findViewById(R.id.listColorsFx);
1620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
1640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageCurves = (ImageCurves) findViewById(R.id.imageCurves);
1650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageBorders = (ImageBorder) findViewById(R.id.imageBorder);
1660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten);
1675448bf8095483574649afcc2add7f153670c7450nicolasroard        mImageZoom = (ImageZoom) findViewById(R.id.imageZoom);
16862e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop = (ImageCrop) findViewById(R.id.imageCrop);
1698537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate = (ImageRotate) findViewById(R.id.imageRotate);
1708537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip = (ImageFlip) findViewById(R.id.imageFlip);
1710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
1730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageCurves);
1740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageBorders);
1750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageStraighten);
1765448bf8095483574649afcc2add7f153670c7450nicolasroard        mImageViews.add(mImageZoom);
17762e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageViews.add(mImageCrop);
1788537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageViews.add(mImageRotate);
1798537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageViews.add(mImageFlip);
1800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListFx = findViewById(R.id.fxList);
1820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListBorders = findViewById(R.id.bordersList);
18392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListGeometry = findViewById(R.id.geometryList);
18492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListFilterButtons = findViewById(R.id.filterButtonsList);
1850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListColors = findViewById(R.id.colorsFxList);
1860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListFx);
1870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListBorders);
1880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListGeometry);
18992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListViews.add(mListFilterButtons);
1900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListColors);
1910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mFxButton = (ImageButton) findViewById(R.id.fxButton);
1930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mBorderButton = (ImageButton) findViewById(R.id.borderButton);
1940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mGeometryButton = (ImageButton) findViewById(R.id.geometryButton);
1950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mColorsButton = (ImageButton) findViewById(R.id.colorsButton);
19692e2341248e99c691f38820503984bc5e2f18811nicolasroard
19792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageShow.setImageLoader(mImageLoader);
19892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageCurves.setImageLoader(mImageLoader);
19992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageCurves.setMaster(mImageShow);
20092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageBorders.setImageLoader(mImageLoader);
20192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageBorders.setMaster(mImageShow);
20292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageStraighten.setImageLoader(mImageLoader);
20392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageStraighten.setMaster(mImageShow);
20492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageZoom.setImageLoader(mImageLoader);
20592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageZoom.setMaster(mImageShow);
20662e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop.setImageLoader(mImageLoader);
20762e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop.setMaster(mImageShow);
2088537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate.setImageLoader(mImageLoader);
2098537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate.setMaster(mImageShow);
2108537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip.setImageLoader(mImageLoader);
2118537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip.setMaster(mImageShow);
21292e2341248e99c691f38820503984bc5e2f18811nicolasroard
21392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageShow));
21492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageCurves));
21592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageBorder));
21692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageStraighten));
21762e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mPanelController.addImageView(findViewById(R.id.imageCrop));
2188537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.addImageView(findViewById(R.id.imageRotate));
2198537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.addImageView(findViewById(R.id.imageFlip));
22092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageZoom));
22192e2341248e99c691f38820503984bc5e2f18811nicolasroard
22292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mFxButton, mListFx, 0);
22392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mBorderButton, mListBorders, 1);
22492e2341248e99c691f38820503984bc5e2f18811nicolasroard
22592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mGeometryButton, mListGeometry, 2);
22692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.straightenButton));
22762e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton));
22892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton));
22992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton));
23092e2341248e99c691f38820503984bc5e2f18811nicolasroard
23192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mColorsButton, mListColors, 3);
232ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
2330f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] recastIDs = {
2342576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                R.id.tinyplanetButton,
235ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.vignetteButton,
236ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.vibranceButton,
237ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.contrastButton,
238ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.saturationButton,
2392576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                R.id.shadowRecoveryButton,
240ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.wbalanceButton,
241ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.hueButton,
242ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.exposureButton,
243ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.shadowRecoveryButton
244ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
2450f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        ImageFilter[] filters = {
2462576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                new ImageFilterTinyPlanet(),
247ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterVignette(),
248ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterVibrance(),
249ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterContrast(),
250ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterSaturated(),
251ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterWBalance(),
252ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterHue(),
253ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterExposure(),
254ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterShadows()
255ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
256ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
257ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        for (int i = 0; i < filters.length; i++) {
258ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
259ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            ImageSmallFilter fView = new ImageSmallFilter(this);
260ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            View v = listColors.findViewById(recastIDs[i]);
261ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            int pos = listColors.indexOfChild(v);
262ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            listColors.removeView(v);
263ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
264ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            filters[i].setParameter(100);
26543b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk            if(v instanceof ImageButtonTitle)
26643b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                filters[i].setName(((ImageButtonTitle) v).getText());
267ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageFilter(filters[i]);
268ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setController(this);
269ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageLoader(mImageLoader);
270ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setId(recastIDs[i]);
271ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            mPanelController.addComponent(mColorsButton, fView);
2720f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            listColors.addView(fView, pos);
273ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        }
274ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
2750f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] overlayIDs = {
276ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.sharpenButton,
277ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.curvesButtonRGB
278ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
2790f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] overlayBitmaps = {
280ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.drawable.filtershow_button_colors_sharpen,
281ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.drawable.filtershow_button_colors_curve
282ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
28343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk        int []overlayNames = {
28443b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.sharpness,
285ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.string.curvesRGB
286ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
287ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
2880f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        for (int i = 0; i < overlayIDs.length; i++) {
289ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            ImageWithIcon fView = new ImageWithIcon(this);
290ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            View v = listColors.findViewById(overlayIDs[i]);
291ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            int pos = listColors.indexOfChild(v);
292ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            listColors.removeView(v);
2930f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            final int sid = overlayNames[i];
2940f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            ImageFilterExposure efilter = new ImageFilterExposure() {
295ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                {
296ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                    mName = getString(sid);
297ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                }
298ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            };
299ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            efilter.setParameter(-300);
300ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
3010f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                    overlayBitmaps[i]);
302ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
303ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setIcon(bitmap);
304ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageFilter(efilter);
305ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setController(this);
306ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageLoader(mImageLoader);
307ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setId(overlayIDs[i]);
308ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            mPanelController.addComponent(mColorsButton, fView);
3090f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            listColors.addView(fView, pos);
310ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        }
311ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
31292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addView(findViewById(R.id.applyEffect));
3133992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        mPanelController.addView(findViewById(R.id.pickCurvesChannel));
3140f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        mPanelController.addView(findViewById(R.id.aspect));
3150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        findViewById(R.id.resetOperationsButton).setOnClickListener(
3160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                createOnClickResetOperationsButton());
3170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ListView operationsList = (ListView) findViewById(R.id.operationsList);
319d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        operationsList.setAdapter(mImageShow.getHistory());
3200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        operationsList.setOnItemClickListener(this);
321bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        ListView imageStateList = (ListView) findViewById(R.id.imageStateList);
322bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        imageStateList.setAdapter(mImageShow.getImageStateAdapter());
323d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        mImageLoader.setAdapter(mImageShow.getHistory());
3240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        fillListImages(listFilters);
3260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        fillListBorders(listBorders);
3270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
32892e2341248e99c691f38820503984bc5e2f18811nicolasroard        SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar);
3293038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford        seekBar.setMax(SEEK_BAR_MAX);
3303038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford
33192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageShow.setSeekBar(seekBar);
332de154778c8f94121cb2117fcf6224c40c01b6132nicolasroard        mImageZoom.setSeekBar(seekBar);
33392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setRowPanel(findViewById(R.id.secondRowPanel));
3348537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.setUtilityPanel(this, findViewById(R.id.filterButtonsList),
33533e58a68ee1d4866169d41b7d88c6eff0c70dae0nicolasroard                findViewById(R.id.applyEffect), findViewById(R.id.aspect),
33633e58a68ee1d4866169d41b7d88c6eff0c70dae0nicolasroard                findViewById(R.id.pickCurvesChannel));
33792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setMasterImage(mImageShow);
33892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setCurrentPanel(mFxButton);
3390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
3400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        String data = intent.getDataString();
3410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (data != null) {
3420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            Uri uri = Uri.parse(data);
3430f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            mImageLoader.loadBitmap(uri, getScreenImageSize());
3440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
3450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
3460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
34763926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk
34863926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk        String action = intent.getAction();
349a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        if (action.equalsIgnoreCase(CROP_ACTION)){
35063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk            mPanelController.showComponent(findViewById(R.id.cropButton));
351a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        } else if (action.equalsIgnoreCase(TINY_PLANET_ACTION)) {
352a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            mPanelController.showComponent(findViewById(R.id.tinyplanetButton));
35363926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk        }
35463926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk
3550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
3560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3570f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
3580f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        DisplayMetrics metrics = new DisplayMetrics();
359fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        Display display = getWindowManager().getDefaultDisplay();
3600f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        Point size = new Point();
361fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        display.getSize(size);
362fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        display.getMetrics(metrics);
363fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        int msize = Math.min(size.x, size.y);
3640f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        return (133 * msize) / metrics.densityDpi;
365fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
366fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
3670addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
368ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
369ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
370ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
371ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
372ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
373ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
374ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
375ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
376ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
3770addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
3780addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
3790addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
3800addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
3810addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
3820addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
3830addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
384ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
385ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
386ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
387ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
388ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
389ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
39008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
39108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
392ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
393ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
394ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
3950ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
3960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
3970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
3980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
3990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
4000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
4010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
4020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
4030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
4040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
405ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
4060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
4070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
4080ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
4090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
4100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
41192e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
41292e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
4130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
4140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
4150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
4160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
4170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
4180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
4190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
4200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
4210addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
4220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
4230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
4240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
4250ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
4260ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
4270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
4280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
4290ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
4300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
4310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri());
4320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
4330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
4340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
4350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
4360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
4370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
4389594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
4399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
4409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
441bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showHistory = menu.findItem(R.id.operationsButton);
4429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        if (mShowingHistoryPanel) {
443bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showHistory.setTitle(R.string.hide_history_panel);
444bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } else {
445bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showHistory.setTitle(R.string.show_history_panel);
446bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
447bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
448bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
449bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
4509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
451bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
4529594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
4530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
4540ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
4550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
4560ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
4579594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return true;
4589594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
4599594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
46092e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
4616e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
4626e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
4636e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
4646e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
4656e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
4666e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
4676e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
4686e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
4696e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
4706e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
4716e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
4726e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
4736e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
4746e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
4756e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
4766e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
4779594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
4789594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
4799594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
480d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard                HistoryAdapter adapter = mImageShow.getHistory();
4819594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
4829594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.onItemClick(position);
4839594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.showToast("Undo");
4849594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
4859594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
4869594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
4879594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
488d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard                HistoryAdapter adapter = mImageShow.getHistory();
4899594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
4909594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.onItemClick(position);
4919594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.showToast("Redo");
4929594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
4939594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
4949594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
495f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
496f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
497f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
498f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
499bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
500bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
501bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
502bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
5039594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.operationsButton: {
5049594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                toggleHistoryPanel();
5059594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
5069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
5079594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
5089594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
5099594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
5109594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
5119594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
5129594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
5139594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
5149594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
5150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private void fillListImages(LinearLayout listFilters) {
5160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use listview
5170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: load the filters straight from the filesystem
518a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
519a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        ImageFilterFx[] fxArray = new ImageFilterFx[18];
5200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int p = 0;
521457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
52208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int[] drawid = {
52343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0005_punch,
524457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0000_vintage,
525457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0004_bw_contrast,
52643b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0002_bleach,
52743b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0001_instant,
528457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0007_washout,
52943b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0003_blue_crush,
53043b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0008_washout_color,
53143b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0006_x_process
532457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        };
533457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
53408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int[] fxNameid = {
53543b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_punch,
536457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_vintage,
537457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_bw_contrast,
53843b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_bleach,
53943b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_instant,
540457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_washout,
54143b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_blue_crush,
542457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_washout_color,
54343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_x_process
544457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        };
545457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
546a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        ImagePreset preset = new ImagePreset(); // empty
547a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        ImageSmallFilter filter = new ImageSmallFilter(this);
548a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
549a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        filter.setSelected(true);
550a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        mCurrentImageSmallFilter = filter;
551a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
55243b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk        filter.setImageFilter(new ImageFilterFx(null,getString(R.string.none)));
553a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
554a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        filter.setController(this);
555a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        filter.setImageLoader(mImageLoader);
556a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        listFilters.addView(filter);
5570f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        ImageSmallFilter previousFilter = filter;
558a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
55953f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford        BitmapFactory.Options o = new BitmapFactory.Options();
56053f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford        o.inScaled = false;
56108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
562457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        for (int i = 0; i < drawid.length; i++) {
56353f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford            Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o);
564a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]));
565457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        }
566457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
5670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < p; i++) {
568a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            filter = new ImageSmallFilter(this);
569a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            filter.setImageFilter(fxArray[i]);
5700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setController(this);
5710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageLoader(mImageLoader);
5720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            listFilters.addView(filter);
57308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            previousFilter = filter;
5740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
5750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
577a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        mImageShow.setImagePreset(preset);
5780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
5790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private void fillListBorders(LinearLayout listBorders) {
5810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use listview
5820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: load the borders straight from the filesystem
5830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int p = 0;
58493dfe7a1df07a64701369b480578410efb740a27nicolasroard        ImageFilter[] borders = new ImageFilter[7];
5850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        borders[p++] = new ImageFilterBorder(null);
5860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5878e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        Drawable npd1 = getResources().getDrawable(R.drawable.filtershow_border_4x5);
5888e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        borders[p++] = new ImageFilterBorder(npd1);
5898e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_brush);
5908e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        borders[p++] = new ImageFilterBorder(npd2);
5915ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 0);
5920f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize,
5930f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageBorderSize);
5945ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 0);
5950f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize,
5960f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageBorderSize);
5970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
59808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        ImageSmallFilter previousFilter = null;
5990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < p; i++) {
60008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            ImageSmallBorder filter = new ImageSmallBorder(this);
6010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageFilter(borders[i]);
6020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setController(this);
60393dfe7a1df07a64701369b480578410efb740a27nicolasroard            filter.setBorder(true);
6040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageLoader(mImageLoader);
605bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            filter.setShowTitle(false);
6060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            listBorders.addView(filter);
60708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            previousFilter = filter;
6080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
6120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
61392e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
6140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void showOriginalViews(boolean value) {
6160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
6170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.showOriginal(value);
6180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
6220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
6230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.invalidate();
6248537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
6250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideListViews() {
6290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mListViews) {
6300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
6310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
6350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.setShowControls(false); // reset
6360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
6370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
6380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void unselectBottomPanelButtons() {
6420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageButton button : mBottomPanelButtons) {
6430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            button.setSelected(false);
6440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void unselectPanelButtons(Vector<ImageButton> buttons) {
6480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageButton button : buttons) {
6490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            button.setSelected(false);
6500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
654bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
655bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
656d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public boolean isShowingHistoryPanel() {
657d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        return mShowingHistoryPanel;
658d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    }
659d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard
660bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private void toggleImageStatePanel() {
661bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        final View view = findViewById(R.id.mainPanel);
662bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        final View viewList = findViewById(R.id.imageStatePanel);
663bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
664bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingHistoryPanel) {
665bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE);
666bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingHistoryPanel = false;
667bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
668bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
669bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (!mShowingImageStatePanel) {
670bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = true;
671bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            view.animate().setDuration(200).x(-viewList.getWidth())
672bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .withLayer().withEndAction(new Runnable() {
67392e2341248e99c691f38820503984bc5e2f18811nicolasroard                        @Override
674bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                        public void run() {
675bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.setAlpha(0);
676bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.setVisibility(View.VISIBLE);
677bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.animate().setDuration(100)
678bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                                    .alpha(1.0f).start();
679bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                        }
680bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    }).start();
681bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } else {
682bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = false;
683bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            viewList.setVisibility(View.INVISIBLE);
684bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            view.animate().setDuration(200).x(0).withLayer()
685bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .start();
686bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
687bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        invalidateOptionsMenu();
688bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
689bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
690bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // //////////////////////////////////////////////////////////////////////////////
6910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // history panel...
6920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
693d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public void toggleHistoryPanel() {
6949594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        final View view = findViewById(R.id.mainPanel);
6959594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        final View viewList = findViewById(R.id.historyPanel);
696bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
697bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
698bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE);
699bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = false;
700bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
701bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
7029594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        if (!mShowingHistoryPanel) {
7039594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            mShowingHistoryPanel = true;
7049594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            view.animate().setDuration(200).x(-viewList.getWidth())
7059594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                    .withLayer().withEndAction(new Runnable() {
70692e2341248e99c691f38820503984bc5e2f18811nicolasroard                        @Override
7079594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                        public void run() {
7089594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.setAlpha(0);
7099594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.setVisibility(View.VISIBLE);
7109594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.animate().setDuration(100)
7119594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                                    .alpha(1.0f).start();
7129594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                        }
7139594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                    }).start();
7149594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
7159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            mShowingHistoryPanel = false;
7169594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            viewList.setVisibility(View.INVISIBLE);
7179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            view.animate().setDuration(200).x(0).withLayer()
718bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .start();
7199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
7209594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateOptionsMenu();
7219594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
7220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7239594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    private void resetHistory() {
724d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        HistoryAdapter adapter = mImageShow.getHistory();
7259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
7269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ImagePreset original = new ImagePreset(adapter.getItem(0));
7279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        mImageShow.setImagePreset(original);
7283992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        mPanelController.resetParameters();
7299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
7300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // reset button in the history panel.
7330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private OnClickListener createOnClickResetOperationsButton() {
7340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return new View.OnClickListener() {
7350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            @Override
7360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            public void onClick(View v) {
7379594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                resetHistory();
7380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
7390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        };
7400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
74275608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
74375608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
74475608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        if (mPanelController.onBackPressed()) {
74555550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            saveImage();
74675608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
74775608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
748e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
749e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
750e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        CharSequence text = getString(R.string.cannot_load_image);
751e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
752e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        toast.show();
753e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
754e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
755e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
7560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
7570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
7590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
7600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
7610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
7620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
76408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) {
7650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset == null) {
7660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return;
7670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
76808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
76908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mCurrentImageSmallFilter != null) {
77008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mCurrentImageSmallFilter.setSelected(false);
77108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
77208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter = imageSmallFilter;
77308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter.setSelected(true);
77408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
7750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset copy = new ImagePreset(preset);
7760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.setImagePreset(copy);
7770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset.isFx()) {
7780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            // if it's an FX we rest the curve adjustment too
7790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            mImageCurves.resetCurve();
7800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
7820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
78408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter,
78508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            boolean setBorder) {
7860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (imageFilter == null) {
7870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return;
7880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
78908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
79008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mCurrentImageSmallFilter != null) {
79108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mCurrentImageSmallFilter.setSelected(false);
79208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
79308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter = imageSmallFilter;
79408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter.setSelected(true);
79508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
7960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset oldPreset = mImageShow.getImagePreset();
7970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
7980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use a numerical constant instead.
799a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
800a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        copy.add(imageFilter);
801a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
802bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mImageShow.setImagePreset(copy);
8030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
8040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
8070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
8080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
8090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.onItemClick(position);
8100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
8110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
8140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
8150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
8160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
8170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
8180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
8190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
82192e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
8220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
8230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Log.v(LOGTAG, "onActivityResult");
8240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
8250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
8260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
8270f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageLoader.loadBitmap(selectedImageUri, getScreenImageSize());
8280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
8290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
83355550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (mImageShow.hasModifications()) {
8340addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            // Get the name of the album, to which the image will be saved
8350addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri());
8360addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
8370addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
8380addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            showSavingProgress(albumName);
83955550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            mImageShow.saveImage(this, null);
84055550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        } else {
84155550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            finish();
84255550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
8430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    static {
846e3f9f579d73af613a33ba1d0a93dc101ea671a69nicolasroard        System.loadLibrary("jni_filtershow_filters");
8470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
850