FilterShowActivity.java revision 7592704e662e49e4bbf3ba86a43d790774829bb0
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;
230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues;
240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent;
25a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroardimport android.content.res.Configuration;
260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources;
27457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.Bitmap;
28457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.BitmapFactory;
2993dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Color;
30fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.graphics.Point;
310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
3292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
333d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask;
3492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
35fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log;
370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.TypedValue;
38fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.view.Display;
390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.Menu;
409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.view.MenuItem;
410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View;
420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
4398ba1a5eb757bb358d75b2f2e5d6fc4c11d805d9nicolasroardimport android.view.WindowManager;
440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView;
450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ImageButton;
470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.LinearLayout;
480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ListView;
4992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.widget.SeekBar;
500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider;
510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
52e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroardimport android.widget.Toast;
530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
550addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
5692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
5792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter;
5892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterBorder;
5967fefdb9b77644c955e1c0c5b1fcd51e2374f212John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterBwFilter;
60ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterContrast;
61ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterExposure;
62a19830b4fd9050b48386cd904d99cfd2566cc515John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterFx;
63ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterHue;
6493dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
6592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterRS;
66ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterSaturated;
67ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterShadows;
682576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberlingimport com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
69ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
70ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterVignette;
71ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.filters.ImageFilterWBalance;
7292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageBorder;
73de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageCrop;
74de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageFlip;
75de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageRotate;
7692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
7708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallBorder;
7892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
7992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageStraighten;
80ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hofordimport com.android.gallery3d.filtershow.imageshow.ImageWithIcon;
8192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageZoom;
8292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset;
8392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
8492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.tools.SaveCopyTask;
857592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton;
865ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroardimport com.android.gallery3d.filtershow.ui.ImageButtonTitle;
8792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.ui.ImageCurves;
883992ae6cf1cbb7b57a22d8287c40451558408335nicolasroardimport com.android.gallery3d.filtershow.ui.Spline;
890addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
9092e2341248e99c691f38820503984bc5e2f18811nicolasroard
9192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
92ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
9392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
9492e2341248e99c691f38820503984bc5e2f18811nicolasroard
950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard@TargetApi(16)
960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardpublic class FilterShowActivity extends Activity implements OnItemClickListener,
970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        OnShareTargetSelectedListener {
980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9963926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk    public static final String CROP_ACTION = "com.android.camera.action.CROP";
100a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
101a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
10292e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final PanelController mPanelController = new PanelController();
1030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageLoader mImageLoader = null;
1040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
1050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageCurves mImageCurves = null;
1060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageBorder mImageBorders = null;
1070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageStraighten mImageStraighten = null;
1085448bf8095483574649afcc2add7f153670c7450nicolasroard    private ImageZoom mImageZoom = null;
10962e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk    private ImageCrop mImageCrop = null;
1108537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    private ImageRotate mImageRotate = null;
1118537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk    private ImageFlip mImageFlip = null;
1120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListFx = null;
1140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListBorders = null;
1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListGeometry = null;
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private View mListColors = null;
11792e2341248e99c691f38820503984bc5e2f18811nicolasroard    private View mListFilterButtons = null;
1180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mFxButton = null;
1200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mBorderButton = null;
1210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mGeometryButton = null;
1220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageButton mColorsButton = null;
1230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    private ImageSmallFilter mCurrentImageSmallFilter = null;
1250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
12792e2341248e99c691f38820503984bc5e2f18811nicolasroard    protected static final boolean ANIMATE_PANELS = true;
128f129cb70f4d2b43a147b399d91650414defa6dd9nicolasroard    private static int mImageBorderSize = 4; // in percent
1290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private boolean mShowingHistoryPanel = false;
131bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
132bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
13392e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
13492e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<View> mListViews = new Vector<View>();
13592e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>();
1360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1380ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1390ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1400ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1410ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
142ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
1433038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford    private static final int SEEK_BAR_MAX = 600;
14455550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
145d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private LoadBitmapTask mLoadBitmapTask;
1463d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
1470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
1480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
1490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
1500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1515448bf8095483574649afcc2add7f153670c7450nicolasroard        ImageFilterRS.setRenderScriptContext(this);
1525448bf8095483574649afcc2add7f153670c7450nicolasroard
15395404c666640177abf72ca2278585a16f30cf390nicolasroard        ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
1540a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard        ImageSmallFilter.setDefaultBackgroundColor(getResources().getColor(R.color.background_main_toolbar));
1555ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        // TODO: get those values from XML.
1567592704e662e49e4bbf3ba86a43d790774829bb0nicolasroard        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
1575ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageShow.setTextSize((int) getPixelsFromDip(12));
1585ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageShow.setTextPadding((int) getPixelsFromDip(10));
159f7403a58d17e56de6e3bebd9ac08bc77f3cd43e4nicolasroard        ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
160f7403a58d17e56de6e3bebd9ac08bc77f3cd43e4nicolasroard        ImageShow.setOriginalTextSize((int) getPixelsFromDip(18));
161f7403a58d17e56de6e3bebd9ac08bc77f3cd43e4nicolasroard        ImageShow.setOriginalText(getResources().getString(R.string.original_picture_text));
1625ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageButtonTitle.setTextSize((int) getPixelsFromDip(12));
1635ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10));
16495404c666640177abf72ca2278585a16f30cf390nicolasroard        ImageSmallFilter.setMargin((int) getPixelsFromDip(3));
1655ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        ImageSmallFilter.setTextMargin((int) getPixelsFromDip(4));
166c5590eb1a20b112e67e4c43684790587f844fc6bnicolasroard        Drawable curveHandle = getResources().getDrawable(R.drawable.camera_crop);
1673992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        int curveHandleSize = (int) getResources().getDimension(R.dimen.crop_indicator_size);
1683992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
1693992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
1705ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
1710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
1729594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
173786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
174786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
175786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
176786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.getCustomView().setOnClickListener(new OnClickListener() {
177786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
178786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
179786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
180786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
181786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
1820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
183e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        mImageLoader = new ImageLoader(this, getApplicationContext());
1840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters);
1860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders);
187ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        LinearLayout listColors = (LinearLayout) findViewById(R.id.listColorsFx);
1880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
1900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageCurves = (ImageCurves) findViewById(R.id.imageCurves);
1910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageBorders = (ImageBorder) findViewById(R.id.imageBorder);
1920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten);
1935448bf8095483574649afcc2add7f153670c7450nicolasroard        mImageZoom = (ImageZoom) findViewById(R.id.imageZoom);
19462e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop = (ImageCrop) findViewById(R.id.imageCrop);
1958537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate = (ImageRotate) findViewById(R.id.imageRotate);
1968537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip = (ImageFlip) findViewById(R.id.imageFlip);
1970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
198f46da69aefd9afe0b4326a2fcea8e33c294136bbRuben Brunk        ImageCrop.setTouchTolerance((int) getPixelsFromDip(25));
1990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
2000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageCurves);
2010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageBorders);
2020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageStraighten);
2035448bf8095483574649afcc2add7f153670c7450nicolasroard        mImageViews.add(mImageZoom);
20462e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageViews.add(mImageCrop);
2058537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageViews.add(mImageRotate);
2068537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageViews.add(mImageFlip);
2070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListFx = findViewById(R.id.fxList);
2090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListBorders = findViewById(R.id.bordersList);
21092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListGeometry = findViewById(R.id.geometryList);
21192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListFilterButtons = findViewById(R.id.filterButtonsList);
2120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListColors = findViewById(R.id.colorsFxList);
2130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListFx);
2140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListBorders);
2150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListGeometry);
21692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mListViews.add(mListFilterButtons);
2170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mListViews.add(mListColors);
2180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mFxButton = (ImageButton) findViewById(R.id.fxButton);
2200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mBorderButton = (ImageButton) findViewById(R.id.borderButton);
2210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mGeometryButton = (ImageButton) findViewById(R.id.geometryButton);
2220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mColorsButton = (ImageButton) findViewById(R.id.colorsButton);
22392e2341248e99c691f38820503984bc5e2f18811nicolasroard
22492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageShow.setImageLoader(mImageLoader);
22592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageCurves.setImageLoader(mImageLoader);
22692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageCurves.setMaster(mImageShow);
22792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageBorders.setImageLoader(mImageLoader);
22892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageBorders.setMaster(mImageShow);
22992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageStraighten.setImageLoader(mImageLoader);
23092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageStraighten.setMaster(mImageShow);
23192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageZoom.setImageLoader(mImageLoader);
23292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageZoom.setMaster(mImageShow);
23362e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop.setImageLoader(mImageLoader);
23462e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mImageCrop.setMaster(mImageShow);
2358537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate.setImageLoader(mImageLoader);
2368537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageRotate.setMaster(mImageShow);
2378537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip.setImageLoader(mImageLoader);
2388537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mImageFlip.setMaster(mImageShow);
23992e2341248e99c691f38820503984bc5e2f18811nicolasroard
24098ba1a5eb757bb358d75b2f2e5d6fc4c11d805d9nicolasroard        mPanelController.setActivity(this);
24198ba1a5eb757bb358d75b2f2e5d6fc4c11d805d9nicolasroard
24292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageShow));
24392e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageCurves));
24492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageBorder));
24592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageStraighten));
24662e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mPanelController.addImageView(findViewById(R.id.imageCrop));
2478537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.addImageView(findViewById(R.id.imageRotate));
2488537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.addImageView(findViewById(R.id.imageFlip));
24992e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addImageView(findViewById(R.id.imageZoom));
25092e2341248e99c691f38820503984bc5e2f18811nicolasroard
25192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mFxButton, mListFx, 0);
25292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mBorderButton, mListBorders, 1);
25392e2341248e99c691f38820503984bc5e2f18811nicolasroard
25492e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mGeometryButton, mListGeometry, 2);
25592e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.straightenButton));
25662e962bcb9fc03f3cfeac5ece8d3e95fc2dd0718Ruben Brunk        mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton));
25792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton));
25892e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton));
25992e2341248e99c691f38820503984bc5e2f18811nicolasroard
26092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addPanel(mColorsButton, mListColors, 3);
261ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
2620f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] recastIDs = {
2632576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                R.id.tinyplanetButton,
264ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.vignetteButton,
265ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.vibranceButton,
266ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.contrastButton,
267ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.saturationButton,
26867fefdb9b77644c955e1c0c5b1fcd51e2374f212John Hoford                R.id.bwfilterButton,
269ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.wbalanceButton,
270ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.hueButton,
271ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.exposureButton,
272ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.shadowRecoveryButton
273ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
2740f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        ImageFilter[] filters = {
2752576a29cccf1d96edeef071914e8b775c230e8e8Sascha Haeberling                new ImageFilterTinyPlanet(),
276ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterVignette(),
277ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterVibrance(),
278ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterContrast(),
279ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterSaturated(),
28067fefdb9b77644c955e1c0c5b1fcd51e2374f212John Hoford                new ImageFilterBwFilter(),
281ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterWBalance(),
282ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterHue(),
283ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterExposure(),
284ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                new ImageFilterShadows()
285ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
286ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
287ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        for (int i = 0; i < filters.length; i++) {
288ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            ImageSmallFilter fView = new ImageSmallFilter(this);
289ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            View v = listColors.findViewById(recastIDs[i]);
290ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            int pos = listColors.indexOfChild(v);
291ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            listColors.removeView(v);
292ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
2932f879102d630815df64636b8d37e3a7eea8e8b65Sascha Haeberling            filters[i].setParameter(filters[i].getPreviewParameter());
294a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard            if (v instanceof ImageButtonTitle)
29543b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                filters[i].setName(((ImageButtonTitle) v).getText());
296ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageFilter(filters[i]);
297ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setController(this);
298ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageLoader(mImageLoader);
299ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setId(recastIDs[i]);
300ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            mPanelController.addComponent(mColorsButton, fView);
3010f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            listColors.addView(fView, pos);
302ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        }
303ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
3040f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] overlayIDs = {
305ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.sharpenButton,
306ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.id.curvesButtonRGB
307ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
3080f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        int[] overlayBitmaps = {
309ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.drawable.filtershow_button_colors_sharpen,
310ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.drawable.filtershow_button_colors_curve
311ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
312a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        int[] overlayNames = {
31343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.sharpness,
314ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                R.string.curvesRGB
315ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        };
316ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
3170f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        for (int i = 0; i < overlayIDs.length; i++) {
318ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            ImageWithIcon fView = new ImageWithIcon(this);
319ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            View v = listColors.findViewById(overlayIDs[i]);
320ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            int pos = listColors.indexOfChild(v);
321ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            listColors.removeView(v);
3220f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            final int sid = overlayNames[i];
3230f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            ImageFilterExposure efilter = new ImageFilterExposure() {
324ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                {
325ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                    mName = getString(sid);
326ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford                }
327ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            };
328ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            efilter.setParameter(-300);
329ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
3300f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                    overlayBitmaps[i]);
331ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
332ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setIcon(bitmap);
333ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageFilter(efilter);
334ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setController(this);
335ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setImageLoader(mImageLoader);
336ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            fView.setId(overlayIDs[i]);
337ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford            mPanelController.addComponent(mColorsButton, fView);
3380f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk            listColors.addView(fView, pos);
339ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford        }
340ea5df36ac1cdfbb569e6ba725c2df433d614d0f5John Hoford
34192e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.addView(findViewById(R.id.applyEffect));
3423992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        mPanelController.addView(findViewById(R.id.pickCurvesChannel));
3430f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        mPanelController.addView(findViewById(R.id.aspect));
3440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        findViewById(R.id.resetOperationsButton).setOnClickListener(
3450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                createOnClickResetOperationsButton());
3460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ListView operationsList = (ListView) findViewById(R.id.operationsList);
348d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        operationsList.setAdapter(mImageShow.getHistory());
3490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        operationsList.setOnItemClickListener(this);
350bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        ListView imageStateList = (ListView) findViewById(R.id.imageStateList);
351bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        imageStateList.setAdapter(mImageShow.getImageStateAdapter());
352d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        mImageLoader.setAdapter(mImageShow.getHistory());
3530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        fillListImages(listFilters);
3550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        fillListBorders(listBorders);
3560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
35792e2341248e99c691f38820503984bc5e2f18811nicolasroard        SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar);
3583038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford        seekBar.setMax(SEEK_BAR_MAX);
3593038d014b7ade998d1820c997242b9d9d8bc7ccfJohn Hoford
36092e2341248e99c691f38820503984bc5e2f18811nicolasroard        mImageShow.setSeekBar(seekBar);
361de154778c8f94121cb2117fcf6224c40c01b6132nicolasroard        mImageZoom.setSeekBar(seekBar);
36292e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setRowPanel(findViewById(R.id.secondRowPanel));
3638537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk        mPanelController.setUtilityPanel(this, findViewById(R.id.filterButtonsList),
36433e58a68ee1d4866169d41b7d88c6eff0c70dae0nicolasroard                findViewById(R.id.applyEffect), findViewById(R.id.aspect),
36533e58a68ee1d4866169d41b7d88c6eff0c70dae0nicolasroard                findViewById(R.id.pickCurvesChannel));
36692e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setMasterImage(mImageShow);
36792e2341248e99c691f38820503984bc5e2f18811nicolasroard        mPanelController.setCurrentPanel(mFxButton);
3680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
369a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
370a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
371a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        }
372a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu
373d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (intent.getData() != null) {
374d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            startLoadBitmap(intent.getData());
3750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
3760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
3770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
37863926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk
37963926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk        String action = intent.getAction();
380a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        if (action.equalsIgnoreCase(CROP_ACTION)) {
38163926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk            mPanelController.showComponent(findViewById(R.id.cropButton));
382a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        } else if (action.equalsIgnoreCase(TINY_PLANET_ACTION)) {
383a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            mPanelController.showComponent(findViewById(R.id.tinyplanetButton));
38463926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk        }
3850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
3860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
387d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private void startLoadBitmap(Uri uri) {
388d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        View tinyPlanetView = findViewById(R.id.tinyplanetButton);
389d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (tinyPlanetView != null) {
390d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            tinyPlanetView.setVisibility(View.GONE);
391d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        }
392d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask = new LoadBitmapTask(tinyPlanetView);
393d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask.execute(uri);
394d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    }
395d49d53206a197b08ec4754d8751b6860e33d9f48John Reck
396d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private class LoadBitmapTask extends AsyncTask<Uri, Void, Boolean> {
3973d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        View mTinyPlanetButton;
398d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        int mBitmapSize;
3993d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
400d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        public LoadBitmapTask(View button) {
4013d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            mTinyPlanetButton = button;
402d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mBitmapSize = getScreenImageSize();
4033d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
4043d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4053d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
406d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        protected Boolean doInBackground(Uri... params) {
407d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mImageLoader.loadBitmap(params[0], mBitmapSize);
4083d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            return mImageLoader.queryLightCycle360();
4093d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
4103d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4113d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
4123d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        protected void onPostExecute(Boolean result) {
4133d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (isCancelled()) {
4143d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                return;
4153d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
4163d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (result) {
4173d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                mTinyPlanetButton.setVisibility(View.VISIBLE);
4183d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
419d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask = null;
4203d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            super.onPostExecute(result);
4213d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
4223d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4233d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
4243d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4253d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    @Override
4263d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    protected void onDestroy() {
427d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (mLoadBitmapTask != null) {
428d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask.cancel(false);
4293d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
4303d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        super.onDestroy();
4313d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
4323d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
4334d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard    private int translateMainPanel(View viewPanel) {
4344d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int accessoryPanelWidth = viewPanel.getWidth();
4354d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int mainViewWidth = findViewById(R.id.mainView).getWidth();
4364d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int mainPanelWidth = mImageShow.getDisplayedImageBounds().width();
4374d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int leftOver = mainViewWidth - mainPanelWidth - accessoryPanelWidth;
4384d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        if (leftOver < 0) {
4394d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard            return -accessoryPanelWidth;
4404d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        }
4414d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        return 0;
4424d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard    }
4434d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard
4440f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
4450f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        DisplayMetrics metrics = new DisplayMetrics();
446fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        Display display = getWindowManager().getDefaultDisplay();
4470f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        Point size = new Point();
448fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        display.getSize(size);
449fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        display.getMetrics(metrics);
450fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford        int msize = Math.min(size.x, size.y);
4510f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        return (133 * msize) / metrics.densityDpi;
452fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
453fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
4540addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
455ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
456ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
457ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
458ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
459ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
460ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
461ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
462ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
463ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
4640addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
4650addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
4660addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
4670addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
4680addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
4690addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
4700addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
471ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
472ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
473ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
474ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
475ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
476ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
47708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
47808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
479ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
480ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
481ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
4820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
4830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
4840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
4850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
4860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
4870ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
4880ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
4890ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
4900ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
4910ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
492ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
4930ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
4940ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
4950ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
4960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
4970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
49892e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
49992e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
5000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
5010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
5020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
5030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
5040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
5050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
5060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
5070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
5080addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
5090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
5100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
5110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
5120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
5130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
5140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
5150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
5160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
5170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
5180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri());
5190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
5200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
5210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
5220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
5230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
5240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
5259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
5269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
5279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
528bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showHistory = menu.findItem(R.id.operationsButton);
5299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        if (mShowingHistoryPanel) {
530bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showHistory.setTitle(R.string.hide_history_panel);
531bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } else {
532bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showHistory.setTitle(R.string.show_history_panel);
533bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
534bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
535bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
536bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
5379594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
538bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
5399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
5400ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
5410ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
5420ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
5430ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
54423e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard
54523e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem undoItem = menu.findItem(R.id.undoButton);
54623e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem redoItem = menu.findItem(R.id.redoButton);
54723e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
54823e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        mImageShow.getHistory().setMenuItems(undoItem, redoItem, resetItem);
5499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return true;
5509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
5519594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
55292e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
5536e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
5546e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
5556e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
5566e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
5576e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
5586e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
5596e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
5606e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
5616e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
5626e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
5636e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
5646e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
5656e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
5666e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
5676e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
5686e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
5699594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
5709594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
5719594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
572d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard                HistoryAdapter adapter = mImageShow.getHistory();
5739594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
5749594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.onItemClick(position);
5759594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.showToast("Undo");
5769594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
5779594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
5789594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
5799594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
580d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard                HistoryAdapter adapter = mImageShow.getHistory();
5819594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
5829594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.onItemClick(position);
5839594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                mImageShow.showToast("Redo");
5849594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
5859594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
5869594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
587f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
588f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
589f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
590f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
591bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
592bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
593bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
594bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
5959594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.operationsButton: {
5969594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                toggleHistoryPanel();
5979594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
5989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
5999594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
6009594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
6019594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
6029594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
6039594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
6049594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
6059594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
6069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
6070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private void fillListImages(LinearLayout listFilters) {
6080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use listview
6090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: load the filters straight from the filesystem
610a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
611a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        ImageFilterFx[] fxArray = new ImageFilterFx[18];
6120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int p = 0;
613457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
61408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int[] drawid = {
61543b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0005_punch,
616457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0000_vintage,
617457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0004_bw_contrast,
61843b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0002_bleach,
61943b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0001_instant,
620457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.drawable.filtershow_fx_0007_washout,
62143b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0003_blue_crush,
62243b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0008_washout_color,
62343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.drawable.filtershow_fx_0006_x_process
624457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        };
625457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
62608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int[] fxNameid = {
62743b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_punch,
628457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_vintage,
629457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_bw_contrast,
63043b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_bleach,
63143b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_instant,
632457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_washout,
63343b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_blue_crush,
634457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford                R.string.ffx_washout_color,
63543b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk                R.string.ffx_x_process
636457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        };
637457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
6380a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk        ImagePreset preset = new ImagePreset(getString(R.string.history_original)); // empty
639e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        preset.setImageLoader(mImageLoader);
640a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        ImageSmallFilter filter = new ImageSmallFilter(this);
641a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
642a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        filter.setSelected(true);
643a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        mCurrentImageSmallFilter = filter;
644a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
645a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        filter.setImageFilter(new ImageFilterFx(null, getString(R.string.none)));
646a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
647a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        filter.setController(this);
648a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        filter.setImageLoader(mImageLoader);
649a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        listFilters.addView(filter);
6500f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        ImageSmallFilter previousFilter = filter;
651a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
65253f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford        BitmapFactory.Options o = new BitmapFactory.Options();
65353f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford        o.inScaled = false;
65408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
655457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        for (int i = 0; i < drawid.length; i++) {
65653f24f0fbfd787a4ab2f129499d2c7ef240a517fJohn Hoford            Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o);
657a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]));
658457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford        }
659457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hoford
6600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < p; i++) {
661a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            filter = new ImageSmallFilter(this);
662a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford            filter.setImageFilter(fxArray[i]);
6630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setController(this);
6640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageLoader(mImageLoader);
6650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            listFilters.addView(filter);
66608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            previousFilter = filter;
6670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
6680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
670a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        mImageShow.setImagePreset(preset);
6710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
6720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private void fillListBorders(LinearLayout listBorders) {
6740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use listview
6750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: load the borders straight from the filesystem
6760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int p = 0;
67793dfe7a1df07a64701369b480578410efb740a27nicolasroard        ImageFilter[] borders = new ImageFilter[7];
6780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        borders[p++] = new ImageFilterBorder(null);
6790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6808e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        Drawable npd1 = getResources().getDrawable(R.drawable.filtershow_border_4x5);
6818e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        borders[p++] = new ImageFilterBorder(npd1);
6828e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_brush);
6838e1536da92f155731d5fd729ec5b2bf00709091anicolasroard        borders[p++] = new ImageFilterBorder(npd2);
6845ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 0);
6850f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize,
6860f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageBorderSize);
6875ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 0);
6880f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk        borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize,
6890f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk                mImageBorderSize);
6900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
69108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        ImageSmallFilter previousFilter = null;
6920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < p; i++) {
69308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            ImageSmallBorder filter = new ImageSmallBorder(this);
6940a32b7afc5286a5c7aa334b9338591d61a49731fRuben Brunk            borders[i].setName(getString(R.string.borders));
6950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageFilter(borders[i]);
6960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setController(this);
69793dfe7a1df07a64701369b480578410efb740a27nicolasroard            filter.setBorder(true);
6980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            filter.setImageLoader(mImageLoader);
699bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            filter.setShowTitle(false);
7000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            listBorders.addView(filter);
70108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            previousFilter = filter;
7020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
7060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
70792e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
7080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void showOriginalViews(boolean value) {
7100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
7110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.showOriginal(value);
7120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
7160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
7170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.invalidate();
7188537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
7190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideListViews() {
7230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mListViews) {
7240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
7250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
7290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.setShowControls(false); // reset
7300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
7310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
7320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void unselectBottomPanelButtons() {
7360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageButton button : mBottomPanelButtons) {
7370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            button.setSelected(false);
7380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void unselectPanelButtons(Vector<ImageButton> buttons) {
7420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageButton button : buttons) {
7430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            button.setSelected(false);
7440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
7450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
7460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
748bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
749bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
750d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public boolean isShowingHistoryPanel() {
751d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        return mShowingHistoryPanel;
752d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    }
753d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard
754bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private void toggleImageStatePanel() {
755bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        final View view = findViewById(R.id.mainPanel);
756bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        final View viewList = findViewById(R.id.imageStatePanel);
757bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
758bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingHistoryPanel) {
759bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE);
760bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingHistoryPanel = false;
761bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
762bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
7634d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int translate = translateMainPanel(viewList);
764bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (!mShowingImageStatePanel) {
765bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = true;
7664d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard            view.animate().setDuration(200).x(translate)
767bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .withLayer().withEndAction(new Runnable() {
76892e2341248e99c691f38820503984bc5e2f18811nicolasroard                        @Override
769bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                        public void run() {
770bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.setAlpha(0);
771bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.setVisibility(View.VISIBLE);
772bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                            viewList.animate().setDuration(100)
773bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                                    .alpha(1.0f).start();
774bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                        }
775bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    }).start();
776bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        } else {
777bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = false;
778bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            viewList.setVisibility(View.INVISIBLE);
779bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            view.animate().setDuration(200).x(0).withLayer()
780bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .start();
781bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
782bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        invalidateOptionsMenu();
783bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
784bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
785a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    @Override
786a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    public void onConfigurationChanged(Configuration newConfig)
787a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    {
788a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        super.onConfigurationChanged(newConfig);
789a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        if (mShowingHistoryPanel) {
790a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard            toggleHistoryPanel();
791a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        }
792a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    }
793a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard
794bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // //////////////////////////////////////////////////////////////////////////////
7950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // history panel...
7960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
797d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public void toggleHistoryPanel() {
7989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        final View view = findViewById(R.id.mainPanel);
7999594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        final View viewList = findViewById(R.id.historyPanel);
800bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
801bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
802bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE);
803bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            mShowingImageStatePanel = false;
804bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
805bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
8064d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard        int translate = translateMainPanel(viewList);
8079594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        if (!mShowingHistoryPanel) {
8089594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            mShowingHistoryPanel = true;
8094d276f338bbdc53f8a3b4806265bc26c7fe0ea7cnicolasroard            view.animate().setDuration(200).x(translate)
8109594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                    .withLayer().withEndAction(new Runnable() {
81192e2341248e99c691f38820503984bc5e2f18811nicolasroard                        @Override
8129594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                        public void run() {
8139594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.setAlpha(0);
8149594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.setVisibility(View.VISIBLE);
8159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                            viewList.animate().setDuration(100)
8169594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                                    .alpha(1.0f).start();
8179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                        }
8189594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                    }).start();
8199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
8209594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            mShowingHistoryPanel = false;
8219594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            viewList.setVisibility(View.INVISIBLE);
8229594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            view.animate().setDuration(200).x(0).withLayer()
823bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                    .start();
8249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
8259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateOptionsMenu();
8269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
8270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8289594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    private void resetHistory() {
829d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        HistoryAdapter adapter = mImageShow.getHistory();
8309594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
8319594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ImagePreset original = new ImagePreset(adapter.getItem(0));
8329594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        mImageShow.setImagePreset(original);
8333992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        mPanelController.resetParameters();
8349594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
8350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // reset button in the history panel.
8380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private OnClickListener createOnClickResetOperationsButton() {
8390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return new View.OnClickListener() {
8400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            @Override
8410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            public void onClick(View v) {
8429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                resetHistory();
8430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
8440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        };
8450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
84775608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
84875608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
84975608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        if (mPanelController.onBackPressed()) {
85055550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            saveImage();
85175608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
85275608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
853e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
854e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
855e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        CharSequence text = getString(R.string.cannot_load_image);
856e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
857e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        toast.show();
858e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
859e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
860e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
8610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
8620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
8640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
8650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
8660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
8670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
86908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) {
8700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset == null) {
8710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return;
8720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
87308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
87408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mCurrentImageSmallFilter != null) {
87508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mCurrentImageSmallFilter.setSelected(false);
87608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
87708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter = imageSmallFilter;
87808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter.setSelected(true);
87908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
8800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset copy = new ImagePreset(preset);
8810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.setImagePreset(copy);
8820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (preset.isFx()) {
8830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            // if it's an FX we rest the curve adjustment too
8840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            mImageCurves.resetCurve();
8850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
8870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
88908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter,
89008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            boolean setBorder) {
8910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (imageFilter == null) {
8920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return;
8930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
89408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
89508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mCurrentImageSmallFilter != null) {
89608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mCurrentImageSmallFilter.setSelected(false);
89708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
89808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter = imageSmallFilter;
89908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mCurrentImageSmallFilter.setSelected(true);
90008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
9010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset oldPreset = mImageShow.getImagePreset();
9020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
9030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: use a numerical constant instead.
904a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
905a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        copy.add(imageFilter);
906a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford
907bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mImageShow.setImagePreset(copy);
9080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
9090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
9120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
9130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
9140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow.onItemClick(position);
9150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
9160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
9190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
9200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
9210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
9220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
9230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
9240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
92692e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
9270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
9280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Log.v(LOGTAG, "onActivityResult");
9290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
9300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
9310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
932d49d53206a197b08ec4754d8751b6860e33d9f48John Reck                startLoadBitmap(selectedImageUri);
9330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
9340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
9350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
93855550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (mImageShow.hasModifications()) {
9390addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            // Get the name of the album, to which the image will be saved
9400addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri());
9410addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
9420addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
9430addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            showSavingProgress(albumName);
94455550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            mImageShow.saveImage(this, null);
94555550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        } else {
94655550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            finish();
94755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
9480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    static {
951e3f9f579d73af613a33ba1d0a93dc101ea671a69nicolasroard        System.loadLibrary("jni_filtershow_filters");
9520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
955