FilterShowActivity.java revision 6416dd59687768d4152d5d954dd0e8c3617b9d97
1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/*
2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project
3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License.
6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at
7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software
11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and
14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License.
15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */
160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow;
180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.annotation.TargetApi;
209594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.app.ActionBar;
210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.app.Activity;
22ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport android.app.ProgressDialog;
236416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunkimport android.app.WallpaperManager;
240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues;
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent;
26a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroardimport android.content.res.Configuration;
270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources;
28457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.Bitmap;
29457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.BitmapFactory;
3093dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Color;
31fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.graphics.Point;
320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
3392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
343d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask;
3592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
366416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunkimport android.provider.MediaStore;
37fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log;
390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.TypedValue;
40fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.view.Display;
410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.Menu;
429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.view.MenuItem;
430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View;
440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
4598ba1a5eb757bb358d75b2f2e5d6fc4c11d805d9nicolasroardimport android.view.WindowManager;
460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView;
470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ImageButton;
490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.LinearLayout;
500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ListView;
5192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.widget.SeekBar;
520ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider;
530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
54e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroardimport android.widget.Toast;
550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
576416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunkimport com.android.gallery3d.data.CropExtras;
580addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
5992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
6092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter;
6192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterBorder;
6267fefdb9b77644c955e1c0c5b1fcd51e2374f212John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterBwFilter;
63ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterContrast;
64ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterExposure;
65a19830b4fd9050b48386cd904d99cfd2566cc515John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterFx;
66ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterHue;
6793dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
6892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterRS;
69ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterSaturated;
70ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterShadows;
712576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberlingimport com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
72ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
73ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterVignette;
74ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterWBalance;
7592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageBorder;
76de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageCrop;
77de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageFlip;
78cc93226fc364a50de3a1479c0912e9af1854b666nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageRedEyes;
79de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageRotate;
8092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
8108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallBorder;
8292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
8392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageStraighten;
842c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageTinyPlanet;
85ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.imageshow.ImageWithIcon;
8692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageZoom;
8792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset;
8892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
8992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.tools.SaveCopyTask;
907592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton;
915ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroardimport com.android.gallery3d.filtershow.ui.ImageButtonTitle;
9292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.ui.ImageCurves;
933992ae6cf1cbb7b57a22d8287c40451558408335nicolasroardimport com.android.gallery3d.filtershow.ui.Spline;
940addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
9592e2341248e99c691f38820503984bc5e2f18811nicolasroard
9692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
976416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunkimport java.io.IOException;
98ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
9992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
10092e2341248e99c691f38820503984bc5e2f18811nicolasroard
1010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard@TargetApi(16)
1020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardpublic class FilterShowActivity extends Activity implements OnItemClickListener,
1030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        OnShareTargetSelectedListener {
1040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1056416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    // fields for supporting crop action
1065aa454b3bde8b2162eb2b91400973113e2c63070Ruben Brunk    public static final String CROP_ACTION = "com.android.camera.action.EDITOR_CROP";
1076416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    private CropExtras mCropExtras = null;
1086416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
109a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
110a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
1116416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public static final int MAX_BMAP_IN_INTENT = 990000;
11292e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final PanelController mPanelController = new PanelController();
1130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageLoader mImageLoader = null;
1140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageCurves mImageCurves = null;
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageBorder mImageBorders = null;
117cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard    private ImageRedEyes mImageRedEyes = null;
1180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageStraighten mImageStraighten = null;
1195448bf8095483574649afcc2add7f153670c7450nicolasroard    private ImageZoom mImageZoom = null;
12062e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk    private ImageCrop mImageCrop = null;
1218537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    private ImageRotate mImageRotate = null;
1228537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    private ImageFlip mImageFlip = null;
1232c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard    private ImageTinyPlanet mImageTinyPlanet = null;
1240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListFx = null;
1260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListBorders = null;
1270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListGeometry = null;
1280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListColors = null;
12992e2341248e99c691f38820503984bc5e2f18811nicolasroard    private View mListFilterButtons = null;
130bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    private View mSaveButton = null;
1310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mFxButton = null;
1330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mBorderButton = null;
1340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mGeometryButton = null;
1350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mColorsButton = null;
1360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
13708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    private ImageSmallFilter mCurrentImageSmallFilter = null;
1380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
14092e2341248e99c691f38820503984bc5e2f18811nicolasroard    protected static final boolean ANIMATE_PANELS = true;
141f129cb70f4d2b43a147b399d91650414defa6dd9nicolasroard    private static int mImageBorderSize = 4; // in percent
1420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private boolean mShowingHistoryPanel = false;
144bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
145bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
14692e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
14792e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<View> mListViews = new Vector<View>();
14892e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>();
1490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1520ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1540ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
155ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
1563038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford    private static final int SEEK_BAR_MAX = 600;
15755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
158d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private LoadBitmapTask mLoadBitmapTask;
159af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford    private ImageSmallFilter mNullFxFilter;
160af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford    private ImageSmallFilter mNullBorderFilter;
1613d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
1620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
1630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
1640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
1650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1665448bf8095483574649afcc2add7f153670c7450nicolasroard        ImageFilterRS.setRenderScriptContext(this);
1675448bf8095483574649afcc2add7f153670c7450nicolasroard
16895404c666640177abf72ca2278585a16f30cf390nicolasroard        ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
1698965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk        ImageSmallFilter.setDefaultBackgroundColor(getResources().getColor(
1708965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                R.color.background_main_toolbar));
1715ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        // TODO: get those values from XML.
1722f8301760867dc269c90bbeb338495f80e841c08nicolasroard        ImageZoom.setZoomedSize(getPixelsFromDip(256));
1737592704e662e49e4bbf3ba86a43d790774829bb0nicolasroard        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
174f675cd16e8188a8d0b3a34dbc1a74c40ed36eb1enicolasroard        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
175f675cd16e8188a8d0b3a34dbc1a74c40ed36eb1enicolasroard        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
1765ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageShow.setTextSize((int) getPixelsFromDip(12));
1775ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageShow.setTextPadding((int) getPixelsFromDip(10));
178f7403a58d17e56de6e3bebd9ac08bc77f3cd43e4nicolasroard        ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
179f7403a58d17e56de6e3bebd9ac08bc77f3cd43e4nicolasroard        ImageShow.setOriginalTextSize((int) getPixelsFromDip(18));
180f7403a58d17e56de6e3bebd9ac08bc77f3cd43e4nicolasroard        ImageShow.setOriginalText(getResources().getString(R.string.original_picture_text));
1815ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageButtonTitle.setTextSize((int) getPixelsFromDip(12));
1825ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10));
18395404c666640177abf72ca2278585a16f30cf390nicolasroard        ImageSmallFilter.setMargin((int) getPixelsFromDip(3));
1845ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageSmallFilter.setTextMargin((int) getPixelsFromDip(4));
185c5590eb1a20b112e67e4c43684790587f844fc6bnicolasroard        Drawable curveHandle = getResources().getDrawable(R.drawable.camera_crop);
1863992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        int curveHandleSize = (int) getResources().getDimension(R.dimen.crop_indicator_size);
1873992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
1883992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
1895ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
1900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
1919594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
192786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
193786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
194786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
195bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton = actionBar.getCustomView();
196bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton.setOnClickListener(new OnClickListener() {
197786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
198786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
199786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
200786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
201786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
2020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
203e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        mImageLoader = new ImageLoader(this, getApplicationContext());
2040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters);
2060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders);
207ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        LinearLayout listColors = (LinearLayout) findViewById(R.id.listColorsFx);
2080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
2100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageCurves = (ImageCurves) findViewById(R.id.imageCurves);
2110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageBorders = (ImageBorder) findViewById(R.id.imageBorder);
2120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten);
2135448bf8095483574649afcc2add7f153670c7450nicolasroard        mImageZoom = (ImageZoom) findViewById(R.id.imageZoom);
21462e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop = (ImageCrop) findViewById(R.id.imageCrop);
2158537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate = (ImageRotate) findViewById(R.id.imageRotate);
2168537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip = (ImageFlip) findViewById(R.id.imageFlip);
2172c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard        mImageTinyPlanet = (ImageTinyPlanet) findViewById(R.id.imageTinyPlanet);
218cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        mImageRedEyes = (ImageRedEyes) findViewById(R.id.imageRedEyes);
2190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2205d834ce0c65f89cf3f249f586b360c1a6d7ab99bRuben Brunk        mImageCrop.setAspectTextSize((int) getPixelsFromDip(18));
221f46da69aefd9afe0b4326a2fcea8e33c294136bbRuben Brunk        ImageCrop.setTouchTolerance((int) getPixelsFromDip(25));
2226e2dd284681a716c55e0937ef2e15a1c7507a1b2Ruben Brunk        ImageCrop.setMinCropSize((int) getPixelsFromDip(55));
2230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
2240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageCurves);
2250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageBorders);
2260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageStraighten);
2275448bf8095483574649afcc2add7f153670c7450nicolasroard        mImageViews.add(mImageZoom);
22862e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageViews.add(mImageCrop);
2298537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageViews.add(mImageRotate);
2308537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageViews.add(mImageFlip);
2312c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard        mImageViews.add(mImageTinyPlanet);
232cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        mImageViews.add(mImageRedEyes);
233cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        for (ImageShow imageShow : mImageViews) {
234cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard            mImageLoader.addCacheListener(imageShow);
235cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        }
2360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListFx = findViewById(R.id.fxList);
2380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListBorders = findViewById(R.id.bordersList);
23992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListGeometry = findViewById(R.id.geometryList);
24092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListFilterButtons = findViewById(R.id.filterButtonsList);
2410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListColors = findViewById(R.id.colorsFxList);
2420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListFx);
2430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListBorders);
2440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListGeometry);
24592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListViews.add(mListFilterButtons);
2460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListColors);
2470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mFxButton = (ImageButton) findViewById(R.id.fxButton);
2490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mBorderButton = (ImageButton) findViewById(R.id.borderButton);
2500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mGeometryButton = (ImageButton) findViewById(R.id.geometryButton);
2510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mColorsButton = (ImageButton) findViewById(R.id.colorsButton);
25292e2341248e99c691f38820503984bc5e2f18811nicolasroard
25392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageShow.setImageLoader(mImageLoader);
25492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageCurves.setImageLoader(mImageLoader);
25592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageCurves.setMaster(mImageShow);
25692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageBorders.setImageLoader(mImageLoader);
25792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageBorders.setMaster(mImageShow);
25892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageStraighten.setImageLoader(mImageLoader);
25992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageStraighten.setMaster(mImageShow);
26092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageZoom.setImageLoader(mImageLoader);
26192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageZoom.setMaster(mImageShow);
26262e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop.setImageLoader(mImageLoader);
26362e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop.setMaster(mImageShow);
2648537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate.setImageLoader(mImageLoader);
2658537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate.setMaster(mImageShow);
2668537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip.setImageLoader(mImageLoader);
2678537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip.setMaster(mImageShow);
2682c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard        mImageTinyPlanet.setImageLoader(mImageLoader);
2692c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard        mImageTinyPlanet.setMaster(mImageShow);
270cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        mImageRedEyes.setImageLoader(mImageLoader);
271cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        mImageRedEyes.setMaster(mImageShow);
27292e2341248e99c691f38820503984bc5e2f18811nicolasroard
27398ba1a5eb757bb358d75b2f2e5d6fc4c11d805d9nicolasroard        mPanelController.setActivity(this);
27498ba1a5eb757bb358d75b2f2e5d6fc4c11d805d9nicolasroard
27592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageShow));
27692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageCurves));
27792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageBorder));
27892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageStraighten));
27962e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mPanelController.addImageView(findViewById(R.id.imageCrop));
2808537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.addImageView(findViewById(R.id.imageRotate));
2818537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.addImageView(findViewById(R.id.imageFlip));
28292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageZoom));
2832c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard        mPanelController.addImageView(findViewById(R.id.imageTinyPlanet));
284cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        mPanelController.addImageView(findViewById(R.id.imageRedEyes));
28592e2341248e99c691f38820503984bc5e2f18811nicolasroard
28692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mFxButton, mListFx, 0);
28792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mBorderButton, mListBorders, 1);
28892e2341248e99c691f38820503984bc5e2f18811nicolasroard
28992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mGeometryButton, mListGeometry, 2);
29092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.straightenButton));
29162e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton));
29292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton));
29392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton));
294cc93226fc364a50de3a1479c0912e9af1854b666nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.redEyeButton));
29592e2341248e99c691f38820503984bc5e2f18811nicolasroard
29692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mColorsButton, mListColors, 3);
297ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
2980f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] recastIDs = {
2992576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                R.id.tinyplanetButton,
300ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.vignetteButton,
301ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.vibranceButton,
302ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.contrastButton,
303ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.saturationButton,
30467fefdb9b77644c955e1c0c5b1fcd51e2374f212John Hoford                R.id.bwfilterButton,
305ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.wbalanceButton,
306ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.hueButton,
307ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.exposureButton,
308ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.shadowRecoveryButton
309ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
3100f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        ImageFilter[] filters = {
3112576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                new ImageFilterTinyPlanet(),
312ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterVignette(),
313ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterVibrance(),
314ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterContrast(),
315ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterSaturated(),
31667fefdb9b77644c955e1c0c5b1fcd51e2374f212John Hoford                new ImageFilterBwFilter(),
317ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterWBalance(),
318ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterHue(),
319ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterExposure(),
320ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterShadows()
321ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
322ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
323ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        for (int i = 0; i < filters.length; i++) {
324ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            ImageSmallFilter fView = new ImageSmallFilter(this);
325ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            View v = listColors.findViewById(recastIDs[i]);
326ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            int pos = listColors.indexOfChild(v);
327ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            listColors.removeView(v);
328ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
3292f879102d630815df64636b8d37e3a7eea8e8b65Sascha Haeberling            filters[i].setParameter(filters[i].getPreviewParameter());
330a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard            if (v instanceof ImageButtonTitle)
33143b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                filters[i].setName(((ImageButtonTitle) v).getText());
332ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageFilter(filters[i]);
333ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setController(this);
334ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageLoader(mImageLoader);
335ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setId(recastIDs[i]);
336ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            mPanelController.addComponent(mColorsButton, fView);
3370f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            listColors.addView(fView, pos);
338ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        }
339ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
3400f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] overlayIDs = {
341ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.sharpenButton,
342ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.curvesButtonRGB
343ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
3440f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] overlayBitmaps = {
345ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.drawable.filtershow_button_colors_sharpen,
346ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.drawable.filtershow_button_colors_curve
347ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
348a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        int[] overlayNames = {
34943b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.sharpness,
350ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.string.curvesRGB
351ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
352ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
3530f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        for (int i = 0; i < overlayIDs.length; i++) {
354ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            ImageWithIcon fView = new ImageWithIcon(this);
355ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            View v = listColors.findViewById(overlayIDs[i]);
356ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            int pos = listColors.indexOfChild(v);
357ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            listColors.removeView(v);
3580f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            final int sid = overlayNames[i];
3590f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            ImageFilterExposure efilter = new ImageFilterExposure() {
360ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                {
361ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                    mName = getString(sid);
362ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                }
363ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            };
364ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            efilter.setParameter(-300);
365ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
3660f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                    overlayBitmaps[i]);
367ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
368ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setIcon(bitmap);
369ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageFilter(efilter);
370ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setController(this);
371ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageLoader(mImageLoader);
372ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setId(overlayIDs[i]);
373ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            mPanelController.addComponent(mColorsButton, fView);
3740f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            listColors.addView(fView, pos);
375ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        }
376ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
37792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addView(findViewById(R.id.applyEffect));
3783992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        mPanelController.addView(findViewById(R.id.pickCurvesChannel));
3790f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        mPanelController.addView(findViewById(R.id.aspect));
3800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        findViewById(R.id.resetOperationsButton).setOnClickListener(
3810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                createOnClickResetOperationsButton());
3820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ListView operationsList = (ListView) findViewById(R.id.operationsList);
384d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        operationsList.setAdapter(mImageShow.getHistory());
3850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        operationsList.setOnItemClickListener(this);
386bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        ListView imageStateList = (ListView) findViewById(R.id.imageStateList);
387bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        imageStateList.setAdapter(mImageShow.getImageStateAdapter());
388d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        mImageLoader.setAdapter(mImageShow.getHistory());
3890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        fillListImages(listFilters);
3910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        fillListBorders(listBorders);
3920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
39392e2341248e99c691f38820503984bc5e2f18811nicolasroard        SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar);
3943038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford        seekBar.setMax(SEEK_BAR_MAX);
3953038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford
39692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageShow.setSeekBar(seekBar);
397de154778c8f94121cb2117fcf6224c40c01b6132nicolasroard        mImageZoom.setSeekBar(seekBar);
3982c6ea941a80ea22317d664e329aed51f5f7417b9nicolasroard        mImageTinyPlanet.setSeekBar(seekBar);
39992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setRowPanel(findViewById(R.id.secondRowPanel));
4008537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.setUtilityPanel(this, findViewById(R.id.filterButtonsList),
40133e58a68ee1d4866169d41b7d88c6eff0c70dae0nicolasroard                findViewById(R.id.applyEffect), findViewById(R.id.aspect),
40233e58a68ee1d4866169d41b7d88c6eff0c70dae0nicolasroard                findViewById(R.id.pickCurvesChannel));
40392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setMasterImage(mImageShow);
40492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setCurrentPanel(mFxButton);
4050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
406a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
407a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
408a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        }
409a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu
410d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (intent.getData() != null) {
411d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            startLoadBitmap(intent.getData());
4120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
4130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
4140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
41563926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk
4166416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        // Handle behavior for various actions
41763926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk        String action = intent.getAction();
418a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        if (action.equalsIgnoreCase(CROP_ACTION)) {
4196416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            Bundle extras = intent.getExtras();
4206416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (extras != null) {
4216416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mCropExtras = new CropExtras(extras.getInt(CropExtras.KEY_OUTPUT_X, 0),
4226416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getInt(CropExtras.KEY_OUTPUT_Y, 0),
4236416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getBoolean(CropExtras.KEY_SCALE, true) &&
4246416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                                extras.getBoolean(CropExtras.KEY_SCALE_UP_IF_NEEDED, false),
4256416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getInt(CropExtras.KEY_ASPECT_X, 0),
4266416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getInt(CropExtras.KEY_ASPECT_Y, 0),
4276416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getBoolean(CropExtras.KEY_SET_AS_WALLPAPER, false),
4286416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getBoolean(CropExtras.KEY_RETURN_DATA, false),
4296416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        (Uri) extras.getParcelable(MediaStore.EXTRA_OUTPUT),
4306416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getString(CropExtras.KEY_OUTPUT_FORMAT),
4316416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getBoolean(CropExtras.KEY_SHOW_WHEN_LOCKED, false),
4326416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getFloat(CropExtras.KEY_SPOTLIGHT_X),
4336416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        extras.getFloat(CropExtras.KEY_SPOTLIGHT_Y));
4346416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
4356416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                if (mCropExtras.getShowWhenLocked()) {
4366416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
4376416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                }
4386416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageShow.getImagePreset().mGeoData.setCropExtras(mCropExtras);
4396416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
4406416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageCrop.setExtras(mCropExtras);
4416416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                String s = getString(R.string.Fixed);
4426416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageCrop.setAspectString(s);
4436416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageCrop.setCropActionFlag(true);
4446416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mPanelController.setFixedAspect(mCropExtras.getAspectX() > 0
4456416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                        && mCropExtras.getAspectY() > 0);
4466416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
44763926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk            mPanelController.showComponent(findViewById(R.id.cropButton));
448a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        } else if (action.equalsIgnoreCase(TINY_PLANET_ACTION)) {
449a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            mPanelController.showComponent(findViewById(R.id.tinyplanetButton));
45063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk        }
4510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
4520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
453d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private void startLoadBitmap(Uri uri) {
45400914f56c3390caa224b1c9fc07624665de40113John Reck        final View filters = findViewById(R.id.filtersPanel);
45500914f56c3390caa224b1c9fc07624665de40113John Reck        final View loading = findViewById(R.id.loading);
45600914f56c3390caa224b1c9fc07624665de40113John Reck        loading.setVisibility(View.VISIBLE);
45700914f56c3390caa224b1c9fc07624665de40113John Reck        filters.setVisibility(View.INVISIBLE);
458d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        View tinyPlanetView = findViewById(R.id.tinyplanetButton);
459d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (tinyPlanetView != null) {
460d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            tinyPlanetView.setVisibility(View.GONE);
461d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        }
462d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask = new LoadBitmapTask(tinyPlanetView);
463d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask.execute(uri);
464d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    }
465d49d53206a197b08ec4754d8751b6860e33d9f48John Reck
4668965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
4673d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        View mTinyPlanetButton;
468d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        int mBitmapSize;
4693d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
470d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        public LoadBitmapTask(View button) {
4713d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            mTinyPlanetButton = button;
472d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mBitmapSize = getScreenImageSize();
4733d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
4743d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4753d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
476d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        protected Boolean doInBackground(Uri... params) {
4778965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (!mImageLoader.loadBitmap(params[0], mBitmapSize)) {
4788965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return false;
4798965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
4808965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            publishProgress(mImageLoader.queryLightCycle360());
4818965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            return true;
4823d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
4833d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4843d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
4858965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk        protected void onProgressUpdate(Boolean... values) {
48600914f56c3390caa224b1c9fc07624665de40113John Reck            super.onProgressUpdate(values);
4876416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (isCancelled()) {
4888965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return;
4896416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
49000914f56c3390caa224b1c9fc07624665de40113John Reck            final View filters = findViewById(R.id.filtersPanel);
49100914f56c3390caa224b1c9fc07624665de40113John Reck            final View loading = findViewById(R.id.loading);
49200914f56c3390caa224b1c9fc07624665de40113John Reck            loading.setVisibility(View.GONE);
49300914f56c3390caa224b1c9fc07624665de40113John Reck            filters.setVisibility(View.VISIBLE);
4948965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (values[0]) {
4958965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                mTinyPlanetButton.setVisibility(View.VISIBLE);
4968965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
49700914f56c3390caa224b1c9fc07624665de40113John Reck        }
49800914f56c3390caa224b1c9fc07624665de40113John Reck
49900914f56c3390caa224b1c9fc07624665de40113John Reck        @Override
5003d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        protected void onPostExecute(Boolean result) {
5013d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (isCancelled()) {
5023d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                return;
5033d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
5048965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (!result) {
5058965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                cannotLoadImage();
5063d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
5078965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk
508d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask = null;
5093d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            super.onPostExecute(result);
5103d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
5113d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
5123d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
5133d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
5143d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    @Override
5153d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    protected void onDestroy() {
516d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (mLoadBitmapTask != null) {
517d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask.cancel(false);
5183d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
5193d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        super.onDestroy();
5203d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
5213d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
5224d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard    private int translateMainPanel(View viewPanel) {
5234d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int accessoryPanelWidth = viewPanel.getWidth();
5244d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int mainViewWidth = findViewById(R.id.mainView).getWidth();
5254d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int mainPanelWidth = mImageShow.getDisplayedImageBounds().width();
526f0eb72eab7be3183417deff6dadb4937b90b9e59nicolasroard        if (mainPanelWidth == 0) {
527f0eb72eab7be3183417deff6dadb4937b90b9e59nicolasroard            mainPanelWidth = mainViewWidth;
528f0eb72eab7be3183417deff6dadb4937b90b9e59nicolasroard        }
529cd84d67629075795d4c5c28d980f77ff8d75c593nicolasroard        int filtersPanelWidth = findViewById(R.id.filtersPanel).getWidth();
530cd84d67629075795d4c5c28d980f77ff8d75c593nicolasroard        if (mainPanelWidth < filtersPanelWidth) {
531cd84d67629075795d4c5c28d980f77ff8d75c593nicolasroard            mainPanelWidth = filtersPanelWidth;
532cd84d67629075795d4c5c28d980f77ff8d75c593nicolasroard        }
5334d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int leftOver = mainViewWidth - mainPanelWidth - accessoryPanelWidth;
5344d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        if (leftOver < 0) {
5354d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard            return -accessoryPanelWidth;
5364d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        }
5374d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        return 0;
5384d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard    }
5394d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard
5400f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
5410f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        DisplayMetrics metrics = new DisplayMetrics();
542fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        Display display = getWindowManager().getDefaultDisplay();
5430f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        Point size = new Point();
544fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        display.getSize(size);
545fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        display.getMetrics(metrics);
546fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        int msize = Math.min(size.x, size.y);
5470f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        return (133 * msize) / metrics.densityDpi;
548fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
549fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
5500addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
551ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
552ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
553ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
554ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
555ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
556ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
557ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
558ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
559ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
5600addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
5610addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
5620addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
5630addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
5640addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
5650addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
5660addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
567ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
568ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
569ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
570ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
571ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
572ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
57308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
57408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
575ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
576ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
577ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
5780ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
5790ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
5800ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
5810ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
5820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
5830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
5840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
5850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
5860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
5870ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
588ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
5890ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
5900ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
5910ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
5920ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
5930ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
59492e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
59592e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
5960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
5970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
5980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
5990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
6000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
6010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
6020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
6030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
6040addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
6050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
6060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
6070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
6080ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
6090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
6100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
6110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
6120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
6130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
6140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri());
6150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
6160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
6170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
6180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
6190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
6200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
6219594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
6229594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
6239594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
624bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showHistory = menu.findItem(R.id.operationsButton);
6259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        if (mShowingHistoryPanel) {
626bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showHistory.setTitle(R.string.hide_history_panel);
627bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } else {
628bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showHistory.setTitle(R.string.show_history_panel);
629bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
630bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
631bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
632bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
6339594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
634bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
6359594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
6360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
6370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
6380ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
6390ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
64023e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard
64123e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem undoItem = menu.findItem(R.id.undoButton);
64223e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem redoItem = menu.findItem(R.id.redoButton);
64323e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
64423e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        mImageShow.getHistory().setMenuItems(undoItem, redoItem, resetItem);
6459594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return true;
6469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
6479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
64892e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
6496e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
6506e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
6516e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
6526e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
6536e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
6546e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
6556e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
6566e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
6576e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
6586e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
6596e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
6606e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
6616e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
6626e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
6636e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
6646e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
6659594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
6669594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
6679594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
668d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard                HistoryAdapter adapter = mImageShow.getHistory();
6699594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
6709594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.onItemClick(position);
6719594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.showToast("Undo");
6729594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
6739594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
6749594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
6759594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
676d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard                HistoryAdapter adapter = mImageShow.getHistory();
6779594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
6789594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.onItemClick(position);
6799594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.showToast("Redo");
6809594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
6819594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
6829594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
683f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
684f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
685f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
686f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
687bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
688bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
689bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
690bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
6919594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.operationsButton: {
6929594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                toggleHistoryPanel();
6939594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
6949594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
6959594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
6969594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
6979594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
6989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
6999594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
7009594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
7019594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
7029594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
703bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    public void enableSave(boolean enable) {
704bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        if (mSaveButton != null)
705bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu            mSaveButton.setEnabled(enable);
706bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    }
707bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu
7080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private void fillListImages(LinearLayout listFilters) {
7090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use listview
7100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: load the filters straight from the filesystem
711a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
712a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        ImageFilterFx[] fxArray = new ImageFilterFx[18];
7130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int p = 0;
714457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
71508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int[] drawid = {
71643b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0005_punch,
717457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0000_vintage,
718457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0004_bw_contrast,
71943b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0002_bleach,
72043b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0001_instant,
721457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0007_washout,
72243b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0003_blue_crush,
72343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0008_washout_color,
72443b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0006_x_process
725457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        };
726457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
72708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int[] fxNameid = {
72843b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_punch,
729457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_vintage,
730457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_bw_contrast,
73143b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_bleach,
73243b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_instant,
733457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_washout,
73443b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_blue_crush,
735457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_washout_color,
73643b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_x_process
737457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        };
738457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
7390a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk        ImagePreset preset = new ImagePreset(getString(R.string.history_original)); // empty
740e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        preset.setImageLoader(mImageLoader);
741af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFxFilter = new ImageSmallFilter(this);
742a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
743af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFxFilter.setSelected(true);
744af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mCurrentImageSmallFilter = mNullFxFilter;
745a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
746af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFxFilter.setImageFilter(new ImageFilterFx(null, getString(R.string.none)));
747a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
748af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFxFilter.setController(this);
749af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFxFilter.setImageLoader(mImageLoader);
750af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        listFilters.addView(mNullFxFilter);
751af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        ImageSmallFilter previousFilter = mNullFxFilter;
752a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
75353f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford        BitmapFactory.Options o = new BitmapFactory.Options();
75453f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford        o.inScaled = false;
75508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
756457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        for (int i = 0; i < drawid.length; i++) {
75753f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford            Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o);
758a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]));
759457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        }
760af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        ImageSmallFilter filter;
7610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < p; i++) {
762a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            filter = new ImageSmallFilter(this);
763a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            filter.setImageFilter(fxArray[i]);
7640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setController(this);
765af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford            filter.setNulfilter(mNullFxFilter);
7660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageLoader(mImageLoader);
7670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            listFilters.addView(filter);
76808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            previousFilter = filter;
7690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
772a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        mImageShow.setImagePreset(preset);
7730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private void fillListBorders(LinearLayout listBorders) {
7760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use listview
7770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: load the borders straight from the filesystem
7780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int p = 0;
77948b29c82472006102911f981be7025d21f5fc805nicolasroard        ImageFilter[] borders = new ImageFilter[12];
7800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        borders[p++] = new ImageFilterBorder(null);
7810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7828e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        Drawable npd1 = getResources().getDrawable(R.drawable.filtershow_border_4x5);
7838e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        borders[p++] = new ImageFilterBorder(npd1);
7848e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_brush);
7858e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        borders[p++] = new ImageFilterBorder(npd2);
78648b29c82472006102911f981be7025d21f5fc805nicolasroard        Drawable npd3 = getResources().getDrawable(R.drawable.filtershow_border_grunge);
78748b29c82472006102911f981be7025d21f5fc805nicolasroard        borders[p++] = new ImageFilterBorder(npd3);
78848b29c82472006102911f981be7025d21f5fc805nicolasroard        Drawable npd4 = getResources().getDrawable(R.drawable.filtershow_border_sumi_e);
78948b29c82472006102911f981be7025d21f5fc805nicolasroard        borders[p++] = new ImageFilterBorder(npd4);
79048b29c82472006102911f981be7025d21f5fc805nicolasroard        Drawable npd5 = getResources().getDrawable(R.drawable.filtershow_border_tape);
79148b29c82472006102911f981be7025d21f5fc805nicolasroard        borders[p++] = new ImageFilterBorder(npd5);
7925ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 0);
7930f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize,
7940f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageBorderSize);
7955ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 0);
7960f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize,
7970f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageBorderSize);
79848b29c82472006102911f981be7025d21f5fc805nicolasroard        int creamColor = Color.argb(255, 237, 237, 227);
79948b29c82472006102911f981be7025d21f5fc805nicolasroard        borders[p++] = new ImageFilterParametricBorder(creamColor, mImageBorderSize, 0);
80048b29c82472006102911f981be7025d21f5fc805nicolasroard        borders[p++] = new ImageFilterParametricBorder(creamColor, mImageBorderSize,
80148b29c82472006102911f981be7025d21f5fc805nicolasroard                mImageBorderSize);
8020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
80308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        ImageSmallFilter previousFilter = null;
8040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < p; i++) {
80508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            ImageSmallBorder filter = new ImageSmallBorder(this);
806af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford            if (i == 0) { // save the first to reset it
807af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                mNullBorderFilter = filter;
808af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford            } else {
809af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                filter.setNulfilter(mNullBorderFilter);
810af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford            }
8110a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk            borders[i].setName(getString(R.string.borders));
8120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageFilter(borders[i]);
8130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setController(this);
81493dfe7a1df07a64701369b480578410efb740a27nicolasroard            filter.setBorder(true);
8150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageLoader(mImageLoader);
816bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            filter.setShowTitle(false);
8170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            listBorders.addView(filter);
81808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            previousFilter = filter;
8190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
8230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
82492e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
8250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void showOriginalViews(boolean value) {
8270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
8280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.showOriginal(value);
8290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
8330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
8340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.invalidate();
8358537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
8360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideListViews() {
8400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mListViews) {
8410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
8420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
8460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.setShowControls(false); // reset
8470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
8480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
8490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void unselectBottomPanelButtons() {
8530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageButton button : mBottomPanelButtons) {
8540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            button.setSelected(false);
8550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void unselectPanelButtons(Vector<ImageButton> buttons) {
8590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageButton button : buttons) {
8600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            button.setSelected(false);
8610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
865bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
866bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
867d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public boolean isShowingHistoryPanel() {
868d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        return mShowingHistoryPanel;
869d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    }
870d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard
871bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private void toggleImageStatePanel() {
872bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        final View view = findViewById(R.id.mainPanel);
873bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        final View viewList = findViewById(R.id.imageStatePanel);
874bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
875bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingHistoryPanel) {
876bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE);
877bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingHistoryPanel = false;
878bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
879bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
8804d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int translate = translateMainPanel(viewList);
881bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (!mShowingImageStatePanel) {
882bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = true;
8834d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard            view.animate().setDuration(200).x(translate)
884bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .withLayer().withEndAction(new Runnable() {
88592e2341248e99c691f38820503984bc5e2f18811nicolasroard                        @Override
886bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                        public void run() {
887bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.setAlpha(0);
888bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.setVisibility(View.VISIBLE);
889bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.animate().setDuration(100)
890bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                                    .alpha(1.0f).start();
891bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                        }
892bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    }).start();
893bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } else {
894bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = false;
895bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            viewList.setVisibility(View.INVISIBLE);
896bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            view.animate().setDuration(200).x(0).withLayer()
897bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .start();
898bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
899bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        invalidateOptionsMenu();
900bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
901bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
902a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    @Override
903a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    public void onConfigurationChanged(Configuration newConfig)
904a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    {
905a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        super.onConfigurationChanged(newConfig);
906a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        if (mShowingHistoryPanel) {
907a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard            toggleHistoryPanel();
908a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        }
909a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    }
910a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard
911bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // //////////////////////////////////////////////////////////////////////////////
9120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // history panel...
9130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
914d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public void toggleHistoryPanel() {
9159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        final View view = findViewById(R.id.mainPanel);
9169594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        final View viewList = findViewById(R.id.historyPanel);
917bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
918bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
919bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE);
920bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = false;
921bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
922bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
9234d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int translate = translateMainPanel(viewList);
9249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        if (!mShowingHistoryPanel) {
9259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            mShowingHistoryPanel = true;
9264d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard            view.animate().setDuration(200).x(translate)
9279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                    .withLayer().withEndAction(new Runnable() {
92892e2341248e99c691f38820503984bc5e2f18811nicolasroard                        @Override
9299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                        public void run() {
9309594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.setAlpha(0);
9319594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.setVisibility(View.VISIBLE);
9329594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.animate().setDuration(100)
9339594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                                    .alpha(1.0f).start();
9349594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                        }
9359594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                    }).start();
9369594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
9379594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            mShowingHistoryPanel = false;
9389594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            viewList.setVisibility(View.INVISIBLE);
9399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            view.animate().setDuration(200).x(0).withLayer()
940bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .start();
9419594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
9429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateOptionsMenu();
9439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
9440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9459594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    private void resetHistory() {
946af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFxFilter.onClick(mNullFxFilter);
947af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullBorderFilter.onClick(mNullBorderFilter);
948af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford
949d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        HistoryAdapter adapter = mImageShow.getHistory();
9509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
9519594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ImagePreset original = new ImagePreset(adapter.getItem(0));
9529594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        mImageShow.setImagePreset(original);
9533992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        mPanelController.resetParameters();
9549594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
9550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // reset button in the history panel.
9580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private OnClickListener createOnClickResetOperationsButton() {
9590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return new View.OnClickListener() {
9600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            @Override
9610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            public void onClick(View v) {
962af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford
9639594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                resetHistory();
9640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
9650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        };
9660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
96875608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
96975608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
97075608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        if (mPanelController.onBackPressed()) {
97155550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            saveImage();
97275608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
97375608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
974e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
975e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
976e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        CharSequence text = getString(R.string.cannot_load_image);
977e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
978e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        toast.show();
979e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
980e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
981e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
9820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
9830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
9850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
9860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
9870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
9880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
99008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) {
9910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset == null) {
9920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return;
9930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
99408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
99508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mCurrentImageSmallFilter != null) {
99608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mCurrentImageSmallFilter.setSelected(false);
99708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
99808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter = imageSmallFilter;
99908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter.setSelected(true);
100008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
10010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset copy = new ImagePreset(preset);
10020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.setImagePreset(copy);
10030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset.isFx()) {
10040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            // if it's an FX we rest the curve adjustment too
10050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            mImageCurves.resetCurve();
10060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
10070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
10080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
101008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter,
101108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            boolean setBorder) {
10120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (imageFilter == null) {
10130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return;
10140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
101508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
101608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mCurrentImageSmallFilter != null) {
101708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mCurrentImageSmallFilter.setSelected(false);
101808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
101908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter = imageSmallFilter;
102008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter.setSelected(true);
102108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
10220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset oldPreset = mImageShow.getImagePreset();
10230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
10240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use a numerical constant instead.
1025a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
1026a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        copy.add(imageFilter);
1027a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
1028bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mImageShow.setImagePreset(copy);
10290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
10300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
10330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
10340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
10350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.onItemClick(position);
10360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
10370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
10400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
10410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
10420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
10430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
10440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
10450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
104792e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
10480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
10490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Log.v(LOGTAG, "onActivityResult");
10500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
10510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
10520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
1053d49d53206a197b08ec4754d8751b6860e33d9f48John Reck                startLoadBitmap(selectedImageUri);
10540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
10550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
10560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10586416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    private boolean mSaveToExtraUri = false;
10596416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    private boolean mSaveAsWallpaper = false;
10606416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    private boolean mReturnAsExtra = false;
10616416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    private boolean outputted = false;
10626416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
10630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
10646416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        // boolean outputted = false;
10656416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (mCropExtras != null) {
10666416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (mCropExtras.getExtraOutput() != null) {
10676416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mSaveToExtraUri = true;
10686416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                outputted = true;
10696416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
10706416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (mCropExtras.getSetAsWallpaper()) {
10716416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mSaveAsWallpaper = true;
10726416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                outputted = true;
10736416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
10746416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (mCropExtras.getReturnData()) {
10756416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
10766416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mReturnAsExtra = true;
10776416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                outputted = true;
10786416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
10796416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
10806416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (outputted) {
10816416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageShow.getImagePreset().mGeoData.setUseCropExtrasFlag(true);
10826416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                showSavingProgress(null);
10836416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageShow.returnFilteredResult(this);
10846416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
10856416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
10866416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (!outputted) {
10876416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (mImageShow.hasModifications()) {
10886416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                // Get the name of the album, to which the image will be saved
10896416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri());
10906416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
10916416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
10926416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                showSavingProgress(albumName);
10936416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                mImageShow.saveImage(this, null);
10946416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            } else {
10956416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                done();
10966416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
10976416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
10986416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    }
10996416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
11006416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public void onFilteredResult(Bitmap filtered) {
11016416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        Intent intent = new Intent();
11026416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        intent.putExtra(CropExtras.KEY_CROPPED_RECT, mImageShow.getImageCropBounds());
11036416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (mSaveToExtraUri) {
11046416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            mImageShow.saveToUri(filtered, mCropExtras.getExtraOutput(),
11056416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                    mCropExtras.getOutputFormat(), this);
11066416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
11076416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (mSaveAsWallpaper) {
11086416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            try {
11096416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                WallpaperManager.getInstance(this).setBitmap(filtered);
11106416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            } catch (IOException e) {
11116416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                Log.w(LOGTAG, "fail to set wall paper", e);
11126416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
111355550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
11146416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (mReturnAsExtra) {
11156416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (filtered != null) {
11166416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                int bmapSize = filtered.getRowBytes() * filtered.getHeight();
11176416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                /*
11186416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                 * Max size of Binder transaction buffer is 1Mb, so constrain
11196416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                 * Bitmap to be somewhat less than this, otherwise we get
11206416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                 * TransactionTooLargeExceptions.
11216416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                 */
11226416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                if (bmapSize > MAX_BMAP_IN_INTENT) {
11236416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                    Log.w(LOGTAG, "Bitmap too large to be returned via intent");
11246416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                } else {
11256416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                    intent.putExtra(CropExtras.KEY_DATA, filtered);
11266416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk                }
11276416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
11286416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
11296416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        setResult(RESULT_OK, intent);
11306416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (!mSaveToExtraUri) {
11316416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            done();
11326416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
11336416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    }
11346416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
11356416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public void done() {
11366416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        if (outputted) {
11376416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            hideSavingProgress();
11386416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
11396416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        finish();
11400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    static {
1143e3f9f579d73af613a33ba1d0a93dc101ea671a69nicolasroard        System.loadLibrary("jni_filtershow_filters");
11440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
1147