FilterShowActivity.java revision 9f452e09889199a28a86d9bd8f8fdaa8508ca0c1
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
199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.app.ActionBar;
20a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunkimport android.app.AlertDialog;
21ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport android.app.ProgressDialog;
2224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.content.ComponentName;
230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues;
240c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport android.content.Context;
25a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunkimport android.content.DialogInterface;
260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent;
2724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.content.ServiceConnection;
28f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.content.pm.ActivityInfo;
29a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroardimport android.content.res.Configuration;
300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources;
31457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.Bitmap;
329c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport android.graphics.Matrix;
330c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport android.graphics.Rect;
349c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport android.graphics.RectF;
359f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroardimport android.graphics.drawable.ColorDrawable;
360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
3792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
383d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask;
3992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
409c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport android.os.CancellationSignal;
41af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.os.Handler;
4224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.os.IBinder;
43fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport android.support.v4.app.DialogFragment;
44f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.support.v4.app.Fragment;
45fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentActivity;
46fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentTransaction;
47fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
4852fa110135563740ebc27326afab4326bbb9b9f5John Hofordimport android.util.Log;
49d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport android.util.TypedValue;
50f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Menu;
51f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.MenuItem;
52860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport android.view.MotionEvent;
53f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.View;
540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
55af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.view.ViewPropertyAnimator;
56f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.WindowManager;
57be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.AdapterView;
580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
59be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.FrameLayout;
60be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.ShareActionProvider;
610ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
62f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.widget.Toast;
63d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk
6492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
6524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.app.PhotoPage;
660addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
6792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
68d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.Action;
69d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.CategoryAdapter;
709f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroardimport com.android.gallery3d.filtershow.category.CategorySelected;
719737f3a18a8c302160e213afa30a4db710e41fb6nicolasroardimport com.android.gallery3d.filtershow.category.CategoryView;
72d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.MainPanel;
73860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport com.android.gallery3d.filtershow.category.SwipableView;
74077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.data.UserPresetsManager;
75d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.BasicEditor;
76d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.Editor;
77077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorChanSat;
7849798939f1bc58eaf5842bbc8bc5424284ab7930John Hofordimport com.android.gallery3d.filtershow.editors.EditorColorBorder;
79d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorCrop;
80d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorDraw;
81077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorGrad;
82d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorManager;
83077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorMirror;
84d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorPanel;
85d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRedEye;
86d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRotate;
87d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorStraighten;
88d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
89d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
9057bd092bd5757576f07341135272ed1c3df729ffnicolasroardimport com.android.gallery3d.filtershow.filters.FilterMirrorRepresentation;
91d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterRepresentation;
9257bd092bd5757576f07341135272ed1c3df729ffnicolasroardimport com.android.gallery3d.filtershow.filters.FilterRotateRepresentation;
93077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation;
94d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FiltersManager;
95d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.ImageFilter;
965180e681e1b68eae403b2740c609792ca44f77cenicolasroardimport com.android.gallery3d.filtershow.history.HistoryItem;
97077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.history.HistoryManager;
9892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
9963a7dac01d394523799939596b960cb03321798dJohn Hofordimport com.android.gallery3d.filtershow.imageshow.MasterImage;
100368ae73ad0627dac41709b925fc02a12548ab80dnicolasroardimport com.android.gallery3d.filtershow.imageshow.Spline;
101860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport com.android.gallery3d.filtershow.info.InfoPanel;
102077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.pipeline.CachingPipeline;
103ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset;
10424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.pipeline.ProcessingService;
105fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.presets.PresetManagementDialog;
106fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.presets.UserPresetsAdapter;
10792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
108fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter;
10924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.tools.SaveImage;
110afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets;
111afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets.XMresults;
112077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.ui.ExportDialog;
1137592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton;
1140addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
1159c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport com.android.gallery3d.util.PrintJob;
116842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescuimport com.android.gallery3d.util.UsageStatistics;
117f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunkimport com.android.photos.data.GalleryBitmapPool;
11892e2341248e99c691f38820503984bc5e2f18811nicolasroard
11992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
1209c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport java.io.FileDescriptor;
1219c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport java.io.FileOutputStream;
122ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
12324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport java.util.ArrayList;
12492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
12592e2341248e99c691f38820503984bc5e2f18811nicolasroard
126fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener,
1270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        OnShareTargetSelectedListener {
1280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
129ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk    private String mAction = "";
130588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard    MasterImage mMasterImage = null;
1316416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1324dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard    private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb
1334dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
134a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
135a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
1360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
1370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
138bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    private View mSaveButton = null;
1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1405aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford    private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this);
1419f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard    private Editor mCurrentEditor = null;
1425aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
1430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
1450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1465300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford    private boolean mShowingTinyPlanet = false;
147bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
148860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mShowingVersionsPanel = false;
149860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mShowingInformationPanel = false;
150bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
15192e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
1520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1540ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1560ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1570ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
158ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
15955550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
160d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private LoadBitmapTask mLoadBitmapTask;
1613d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
162afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private Uri mOriginalImageUri = null;
163afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private ImagePreset mOriginalPreset = null;
164c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
165b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    private Uri mSelectedImageUri = null;
166b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
167fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private UserPresetsManager mUserPresetsManager = null;
168fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private UserPresetsAdapter mUserPresetsAdapter = null;
169f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryLooksAdapter = null;
170f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryBordersAdapter = null;
171f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryGeometryAdapter = null;
172f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryFiltersAdapter = null;
173860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private CategoryAdapter mCategoryVersionsAdapter = null;
174f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mCurrentPanel = MainPanel.LOOKS;
175860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private Vector<FilterUserPresetRepresentation> mVersions =
176860af325f2030a03c526e8551a85230d17df7b15nicolasroard            new Vector<FilterUserPresetRepresentation>();
177860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private int mVersionsCounter = 0;
178860af325f2030a03c526e8551a85230d17df7b15nicolasroard
179860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mHandlingSwipeButton = false;
180860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private View mHandledSwipeView = null;
181860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private float mHandledSwipeViewLastDelta = 0;
1829737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard    private float mSwipeStartX = 0;
183860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private float mSwipeStartY = 0;
1843a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
18524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ProcessingService mBoundService;
18624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private boolean mIsBound = false;
18724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
18824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public ProcessingService getProcessingService() {
18924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return mBoundService;
19024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
19124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
19224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public boolean isSimpleEditAction() {
19324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return !PhotoPage.ACTION_NEXTGEN_EDIT.equalsIgnoreCase(mAction);
19424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
19524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
19624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ServiceConnection mConnection = new ServiceConnection() {
197a08fab5958ecd50ada4b7c013af362029c61f117ztenghui        @Override
19824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        public void onServiceConnected(ComponentName className, IBinder service) {
19924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            /*
20024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * This is called when the connection with the service has been
20124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * established, giving us the service object we can use to
20224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * interact with the service.  Because we have bound to a explicit
20324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * service that we know is running in our own process, we can
20424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * cast its IBinder to a concrete class and directly access it.
20524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             */
20624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService = ((ProcessingService.LocalBinder)service).getService();
20724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService.setFiltershowActivity(FilterShowActivity.this);
20824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService.onStart();
20924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
21024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
211a08fab5958ecd50ada4b7c013af362029c61f117ztenghui        @Override
21224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        public void onServiceDisconnected(ComponentName className) {
21324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            /*
21424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * This is called when the connection with the service has been
21524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * unexpectedly disconnected -- that is, its process crashed.
21624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * Because it is running in our same process, we should never
21724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * see this happen.
21824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             */
21924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService = null;
22024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
22124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    };
22224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
22324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    void doBindService() {
22424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        /*
22524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * Establish a connection with the service.  We use an explicit
22624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * class name because we want a specific service implementation that
22724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * we know will be running in our own process (and thus won't be
22824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * supporting component replacement by other applications).
22924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         */
23024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        bindService(new Intent(FilterShowActivity.this, ProcessingService.class),
23124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard                mConnection, Context.BIND_AUTO_CREATE);
23224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mIsBound = true;
23324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
23424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
23524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    void doUnbindService() {
23624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        if (mIsBound) {
23724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            // Detach our existing connection.
23824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            unbindService(mConnection);
23924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mIsBound = false;
24024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
24124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
24224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
24324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void setupPipeline() {
24424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        doBindService();
24524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ImageFilter.setActivityForMemoryToasts(this);
246fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager = new UserPresetsManager(this);
247fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsAdapter = new UserPresetsAdapter(this);
24824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
24924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
25024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void updateUIAfterServiceStarted() {
25124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillCategories();
25224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        loadMainPanel();
25324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        setDefaultPreset();
25424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        extractXMPData();
25524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        processIntent();
25624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
25724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
2580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
2590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
2600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
2610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
262f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait);
263f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (onlyUsePortrait) {
264f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
265f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
26669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        MasterImage.setMaster(mMasterImage);
267f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
268f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        clearGalleryBitmapPool();
26924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        setupPipeline();
270f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
27163a7dac01d394523799939596b960cb03321798dJohn Hoford        setupMasterImage();
2723a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
2733a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        fillEditors();
2745448bf8095483574649afcc2add7f153670c7450nicolasroard
2753a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
276842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu        UsageStatistics.onContentViewChanged(UsageStatistics.COMPONENT_EDITOR, "Main");
277842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu        UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
278842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.CATEGORY_LIFECYCLE, UsageStatistics.LIFECYCLE_START);
2793a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
2805ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
281f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public boolean isShowingImageStatePanel() {
282f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mShowingImageStatePanel;
283f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
284f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
285f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadMainPanel() {
286f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (findViewById(R.id.main_panel_container) == null) {
287f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
288f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
289f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MainPanel panel = new MainPanel();
290f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
291f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
292f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.commit();
293f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
294f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
295f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadEditorPanel(FilterRepresentation representation,
29600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                                final Editor currentEditor) {
297f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation.getEditorId() == ImageOnlyEditor.ID) {
298f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            currentEditor.reflectCurrentFilter();
299f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
300f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
30100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        final int currentId = currentEditor.getID();
30200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Runnable showEditor = new Runnable() {
30300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            @Override
30400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            public void run() {
30500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                EditorPanel panel = new EditorPanel();
30600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                panel.setEditor(currentId);
30700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
30800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG));
30900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
31000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.commit();
31100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            }
31200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        };
31300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
31400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        boolean doAnimation = false;
31500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (mShowingImageStatePanel
31600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
31700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            doAnimation = true;
31800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
31900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (doAnimation && main != null && main instanceof MainPanel) {
32000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            MainPanel mainPanel = (MainPanel) main;
32100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View container = mainPanel.getView().findViewById(R.id.category_panel_container);
32200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
32300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            int panelHeight = container.getHeight() + bottom.getHeight();
324af59322ac944e6e17aaf718045949a3352016945nicolasroard            ViewPropertyAnimator anim = mainPanel.getView().animate();
325af59322ac944e6e17aaf718045949a3352016945nicolasroard            anim.translationY(panelHeight).start();
326af59322ac944e6e17aaf718045949a3352016945nicolasroard            final Handler handler = new Handler();
327af59322ac944e6e17aaf718045949a3352016945nicolasroard            handler.postDelayed(showEditor, anim.getDuration());
32800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        } else {
32900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            showEditor.run();
33000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
331f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
332f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
3335d1cf1f9c8c6359905988e096b50f07ce326df21John Hoford    public void hideInformationPanel() {
334860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FrameLayout infoLayout = (FrameLayout) findViewById(R.id.central_panel_container);
335860af325f2030a03c526e8551a85230d17df7b15nicolasroard        infoLayout.setVisibility(View.GONE);
336860af325f2030a03c526e8551a85230d17df7b15nicolasroard        Fragment fragment = getSupportFragmentManager().findFragmentByTag(InfoPanel.FRAGMENT_TAG);
337860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (fragment != null) {
338860af325f2030a03c526e8551a85230d17df7b15nicolasroard            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
339860af325f2030a03c526e8551a85230d17df7b15nicolasroard            transaction.remove(fragment);
340860af325f2030a03c526e8551a85230d17df7b15nicolasroard            transaction.commit();
341860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
342860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingInformationPanel = false;
343860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
344860af325f2030a03c526e8551a85230d17df7b15nicolasroard
3455d1cf1f9c8c6359905988e096b50f07ce326df21John Hoford    public void toggleInformationPanel() {
346860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingInformationPanel = !mShowingInformationPanel;
347860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (!mShowingInformationPanel) {
348860af325f2030a03c526e8551a85230d17df7b15nicolasroard            hideInformationPanel();
349860af325f2030a03c526e8551a85230d17df7b15nicolasroard            showDefaultImageView();
350860af325f2030a03c526e8551a85230d17df7b15nicolasroard            return;
351860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
352860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
353860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
354860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FrameLayout infoLayout = (FrameLayout) findViewById(R.id.central_panel_container);
355860af325f2030a03c526e8551a85230d17df7b15nicolasroard        infoLayout.setVisibility(View.VISIBLE);
356860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mEditorPlaceHolder.hide();
357860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mImageShow.setVisibility(View.GONE);
358860af325f2030a03c526e8551a85230d17df7b15nicolasroard
359860af325f2030a03c526e8551a85230d17df7b15nicolasroard        InfoPanel panel = new InfoPanel();
360860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.replace(R.id.central_panel_container, panel, InfoPanel.FRAGMENT_TAG);
361860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.commit();
362860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
363860af325f2030a03c526e8551a85230d17df7b15nicolasroard
3643a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void loadXML() {
3650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
3663a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3679594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
368786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
369786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
3709f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        actionBar.setBackgroundDrawable(new ColorDrawable(
3719f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                getResources().getColor(R.color.background_screen)));
372786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
373bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton = actionBar.getCustomView();
374bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton.setOnClickListener(new OnClickListener() {
375786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
376786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
377786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
378786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
379786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
3800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
3820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
3830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3843a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setupEditors();
3855aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
386733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        mEditorPlaceHolder.hide();
3870c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        mImageShow.bindAsImageLoadListener();
38892e2341248e99c691f38820503984bc5e2f18811nicolasroard
3896019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard        setupStatePanel();
3906019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    }
3916019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard
39224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void fillCategories() {
39324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillLooks();
394fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        loadUserPresets();
39524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillBorders();
39624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillTools();
39724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillEffects();
398860af325f2030a03c526e8551a85230d17df7b15nicolasroard        fillVersions();
39924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
40024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
4016019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    public void setupStatePanel() {
4020c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        MasterImage.getImage().setHistoryManager(mMasterImage.getHistory());
40338fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard    }
40438fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard
405860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private void fillVersions() {
406860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter = new CategoryAdapter(this);
407860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.setShowAddButton(true);
408860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
409860af325f2030a03c526e8551a85230d17df7b15nicolasroard
410860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void updateVersions() {
411860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.clear();
412860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation originalRep = new FilterUserPresetRepresentation(
413860af325f2030a03c526e8551a85230d17df7b15nicolasroard                getString(R.string.filtershow_version_original), new ImagePreset(), -1);
414860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.add(
415860af325f2030a03c526e8551a85230d17df7b15nicolasroard                new Action(this, originalRep, Action.FULL_VIEW));
416860af325f2030a03c526e8551a85230d17df7b15nicolasroard        ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
417860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation currentRep = new FilterUserPresetRepresentation(
418860af325f2030a03c526e8551a85230d17df7b15nicolasroard                getString(R.string.filtershow_version_current), current, -1);
419860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.add(
420860af325f2030a03c526e8551a85230d17df7b15nicolasroard                new Action(this, currentRep, Action.FULL_VIEW));
42155a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (mVersions.size() > 0) {
42255a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryVersionsAdapter.add(new Action(this, Action.SPACER));
42355a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
424860af325f2030a03c526e8551a85230d17df7b15nicolasroard        for (FilterUserPresetRepresentation rep : mVersions) {
425860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mCategoryVersionsAdapter.add(
42655a0279ee420c649606edd7815403d3ca1820c07nicolasroard                    new Action(this, rep, Action.FULL_VIEW, true));
427860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
428860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.notifyDataSetInvalidated();
429860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
430860af325f2030a03c526e8551a85230d17df7b15nicolasroard
431860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void addCurrentVersion() {
432860af325f2030a03c526e8551a85230d17df7b15nicolasroard        ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
433860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersionsCounter++;
434860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation rep = new FilterUserPresetRepresentation(
435860af325f2030a03c526e8551a85230d17df7b15nicolasroard                "" + mVersionsCounter, current, -1);
436860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersions.add(rep);
437860af325f2030a03c526e8551a85230d17df7b15nicolasroard        updateVersions();
438860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
439860af325f2030a03c526e8551a85230d17df7b15nicolasroard
440860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void removeVersion(Action action) {
441860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersions.remove(action.getRepresentation());
442860af325f2030a03c526e8551a85230d17df7b15nicolasroard        updateVersions();
443860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
444860af325f2030a03c526e8551a85230d17df7b15nicolasroard
4450a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard    public void removeLook(Action action) {
4465af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        FilterUserPresetRepresentation rep =
4475af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard                (FilterUserPresetRepresentation) action.getRepresentation();
4480a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        if (rep == null) {
4490a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard            return;
4500a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        }
4510a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        mUserPresetsManager.delete(rep.getId());
4525af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        updateUserPresetsFromManager();
4530a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard    }
4540a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard
45524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillEffects() {
4563a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
45724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getEffects();
458f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryFiltersAdapter = new CategoryAdapter(this);
459f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
460f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
461f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
462f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
463f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.add(new Action(this, representation));
464f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
4653a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4663a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
46724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillTools() {
46838fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
46924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTools();
470f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryGeometryAdapter = new CategoryAdapter(this);
471f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
472f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.add(new Action(this, representation));
473f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
4743a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4753a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4763a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void processIntent() {
4770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
478a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
479a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
480a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        }
481a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu
482ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk        mAction = intent.getAction();
483b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        mSelectedImageUri = intent.getData();
484b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        Uri loadUri = mSelectedImageUri;
485afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (mOriginalImageUri != null) {
486b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            loadUri = mOriginalImageUri;
487afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        }
488b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        if (loadUri != null) {
489b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            startLoadBitmap(loadUri);
4900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
4910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
4920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
4930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
4940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
4953a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setupEditors() {
4963a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer));
4973a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        EditorManager.addEditors(mEditorPlaceHolder);
4983a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setOldViews(mImageViews);
4993a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
5003a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5013a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void fillEditors() {
502bc8e077e77cf6f0dda8efd8318b8a8e7eda16f61John Hoford        mEditorPlaceHolder.addEditor(new EditorChanSat());
503e162b032fe387eabbd69d367dae6fe7003e850a1John Hoford        mEditorPlaceHolder.addEditor(new EditorGrad());
5043a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorDraw());
50549798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        mEditorPlaceHolder.addEditor(new EditorColorBorder());
5063a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new BasicEditor());
5073a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new ImageOnlyEditor());
5083a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorTinyPlanet());
5093a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRedEye());
5103a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorCrop());
511b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        mEditorPlaceHolder.addEditor(new EditorMirror());
5123a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRotate());
5133a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorStraighten());
5143a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
5153a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5163a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setDefaultValues() {
5173a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Resources res = getResources();
5183a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5193a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        // TODO: get those values from XML.
5203a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
5213a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
5223a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
5233a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5243a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
5253a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
5263a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
5273a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
5283a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
5293a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
530d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private void startLoadBitmap(Uri uri) {
53100914f56c3390caa224b1c9fc07624665de40113John Reck        final View loading = findViewById(R.id.loading);
532733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        final View imageShow = findViewById(R.id.imageShow);
533733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        imageShow.setVisibility(View.INVISIBLE);
534733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        loading.setVisibility(View.VISIBLE);
535f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingTinyPlanet = false;
536f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mLoadBitmapTask = new LoadBitmapTask();
537d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask.execute(uri);
538d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    }
539d49d53206a197b08ec4754d8751b6860e33d9f48John Reck
540f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private void fillBorders() {
54124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
54224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> borders = filtersManager.getBorders();
5434c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford
544f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        for (int i = 0; i < borders.size(); i++) {
54524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            FilterRepresentation filter = borders.get(i);
5463cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk            filter.setName(getString(R.string.borders));
547f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk            if (i == 0) {
5483cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk                filter.setName(getString(R.string.none));
5499090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
550f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
551f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
552f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryBordersAdapter = new CategoryAdapter(this);
553f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : borders) {
554f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
555f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
5569090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
55700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW));
5589090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
5599090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
5609090141f56b4e2000704d0c4a778d3a819821726nicolasroard
561fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public UserPresetsAdapter getUserPresetsAdapter() {
562fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        return mUserPresetsAdapter;
563fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
564fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
565f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryLooksAdapter() {
566f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryLooksAdapter;
567f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
568f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
569f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryBordersAdapter() {
570f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryBordersAdapter;
571f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
572f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
573f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryGeometryAdapter() {
574f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryGeometryAdapter;
575f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
576f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
577f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryFiltersAdapter() {
578f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryFiltersAdapter;
579f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
580f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
581860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public CategoryAdapter getCategoryVersionsAdapter() {
582860af325f2030a03c526e8551a85230d17df7b15nicolasroard        return mCategoryVersionsAdapter;
583860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
584860af325f2030a03c526e8551a85230d17df7b15nicolasroard
585f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
586f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
587f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
588f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
589f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
590f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
591f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        copy.removeFilter(filterRepresentation);
592ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
593f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
594f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            FilterRepresentation lastRepresentation = copy.getLastRepresentation();
595f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
596f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
597f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
598f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
599f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
600f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
601f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
602f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
60357bd092bd5757576f07341135272ed1c3df729ffnicolasroard        if (!(filterRepresentation instanceof FilterRotateRepresentation)
60457bd092bd5757576f07341135272ed1c3df729ffnicolasroard            && !(filterRepresentation instanceof FilterMirrorRepresentation)
60557bd092bd5757576f07341135272ed1c3df729ffnicolasroard            && MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
606f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
607f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
6089f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        if (filterRepresentation instanceof FilterUserPresetRepresentation
6099f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                || filterRepresentation instanceof FilterRotateRepresentation
6109f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                || filterRepresentation instanceof FilterMirrorRepresentation) {
6119f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            MasterImage.getImage().onNewLook(filterRepresentation);
6129f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        }
613f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
614f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
615f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
616f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation == null) {
6173cd6fc8e632e406628b5977ee47c191523552500nicolasroard            filterRepresentation = filterRepresentation.copy();
618f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            copy.addFilter(filterRepresentation);
619f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
620c9ca6d1eb85a71b7667f4c25d879e78cce16ac4cztenghui            if (filterRepresentation.allowsSingleInstanceOnly()) {
621d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // Don't just update the filter representation. Centralize the
622d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // logic in the addFilter(), such that we can keep "None" as
623d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // null.
62420667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                if (!representation.equals(filterRepresentation)) {
62520667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    // Only do this if the filter isn't the same
62620667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    // (state panel clicks can lead us here)
62720667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    copy.removeFilter(representation);
62820667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    copy.addFilter(filterRepresentation);
62920667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                }
6309090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
6319090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
632ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, filterRepresentation, true);
633f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
634f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
635f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
636f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showRepresentation(FilterRepresentation representation) {
637f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (representation == null) {
638f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford            return;
639f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        }
640e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard
64157bd092bd5757576f07341135272ed1c3df729ffnicolasroard        if (representation instanceof FilterRotateRepresentation) {
64257bd092bd5757576f07341135272ed1c3df729ffnicolasroard            FilterRotateRepresentation r = (FilterRotateRepresentation) representation;
64357bd092bd5757576f07341135272ed1c3df729ffnicolasroard            r.rotateCW();
64457bd092bd5757576f07341135272ed1c3df729ffnicolasroard        }
64557bd092bd5757576f07341135272ed1c3df729ffnicolasroard        if (representation instanceof FilterMirrorRepresentation) {
64657bd092bd5757576f07341135272ed1c3df729ffnicolasroard            FilterMirrorRepresentation r = (FilterMirrorRepresentation) representation;
64757bd092bd5757576f07341135272ed1c3df729ffnicolasroard            r.cycle();
64857bd092bd5757576f07341135272ed1c3df729ffnicolasroard        }
649b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        useFilterRepresentation(representation);
650f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
651f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        // show representation
6529f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        if (mCurrentEditor != null) {
6539f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            mCurrentEditor.detach();
6549f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        }
6559f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId());
656f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadEditorPanel(representation, mCurrentEditor);
657860af325f2030a03c526e8551a85230d17df7b15nicolasroard        hideInformationPanel();
658f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
659f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
660f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public Editor getEditor(int editorID) {
661f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mEditorPlaceHolder.getEditor(editorID);
662f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
663f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
664f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void setCurrentPanel(int currentPanel) {
665f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCurrentPanel = currentPanel;
666f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
667f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
668f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public int getCurrentPanel() {
669f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCurrentPanel;
6709090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
6719090141f56b4e2000704d0c4a778d3a819821726nicolasroard
672acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    public void updateCategories() {
673acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        ImagePreset preset = mMasterImage.getPreset();
674acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryLooksAdapter.reflectImagePreset(preset);
675acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryBordersAdapter.reflectImagePreset(preset);
676acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    }
677acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard
678e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard    public View getMainStatePanelContainer(int id) {
679e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard        return findViewById(id);
680e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard    }
681e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard
682be84355fddceb9690eef752707c42457ea251e77nicolasroard    private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
683be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
684be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected Boolean doInBackground(Void... params) {
6850c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            MasterImage master = MasterImage.getImage();
6860c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Rect originalBounds = master.getOriginalBounds();
6870c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (master.supportsHighRes()) {
6880c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                int highresPreviewSize = master.getOriginalBitmapLarge().getWidth() * 2;
6890c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                if (highresPreviewSize > originalBounds.width()) {
6900c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    highresPreviewSize = originalBounds.width();
6910c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                }
69247886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Rect bounds = new Rect();
69347886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(),
69447886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getActivity(), highresPreviewSize,
69547886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getOrientation(), bounds);
69647886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                master.setOriginalBounds(bounds);
6970c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.setOriginalBitmapHighres(originalHires);
698db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mBoundService.setOriginalBitmapHighres(originalHires);
6990c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.warnListeners();
7000c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            }
701be84355fddceb9690eef752707c42457ea251e77nicolasroard            return true;
702be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
703be84355fddceb9690eef752707c42457ea251e77nicolasroard
704be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
705be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected void onPostExecute(Boolean result) {
7060c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
707be84355fddceb9690eef752707c42457ea251e77nicolasroard            if (highresBitmap != null) {
7080c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                float highResPreviewScale = (float) highresBitmap.getWidth()
7090c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                        / (float) MasterImage.getImage().getOriginalBounds().width();
710db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mBoundService.setHighresPreviewScaleFactor(highResPreviewScale);
711be84355fddceb9690eef752707c42457ea251e77nicolasroard            }
712be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
713be84355fddceb9690eef752707c42457ea251e77nicolasroard    }
714be84355fddceb9690eef752707c42457ea251e77nicolasroard
7158965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
716d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        int mBitmapSize;
7173d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
718f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        public LoadBitmapTask() {
719d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mBitmapSize = getScreenImageSize();
7203d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
7213d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
7223d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
723d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        protected Boolean doInBackground(Uri... params) {
7240c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) {
7258965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return false;
7268965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
7270c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity()));
7288965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            return true;
7293d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
7303d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
7313d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
7328965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk        protected void onProgressUpdate(Boolean... values) {
73300914f56c3390caa224b1c9fc07624665de40113John Reck            super.onProgressUpdate(values);
7346416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (isCancelled()) {
7358965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return;
7366416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
7378965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (values[0]) {
7385300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford                mShowingTinyPlanet = true;
7398965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
74000914f56c3390caa224b1c9fc07624665de40113John Reck        }
74100914f56c3390caa224b1c9fc07624665de40113John Reck
74200914f56c3390caa224b1c9fc07624665de40113John Reck        @Override
7433d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        protected void onPostExecute(Boolean result) {
74469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            MasterImage.setMaster(mMasterImage);
7453d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (isCancelled()) {
7463d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                return;
7473d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
748588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard
7498965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (!result) {
750441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                if (!mOriginalImageUri.equals(mSelectedImageUri)) {
751441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    mOriginalImageUri = mSelectedImageUri;
752441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    mOriginalPreset = null;
753441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    Toast.makeText(FilterShowActivity.this,
754441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                            R.string.cannot_edit_original, Toast.LENGTH_SHORT).show();
755441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    startLoadBitmap(mOriginalImageUri);
756441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                } else {
757441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    cannotLoadImage();
758441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                }
759a08fab5958ecd50ada4b7c013af362029c61f117ztenghui                return;
7603d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
7618965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk
76252fa110135563740ebc27326afab4326bbb9b9f5John Hoford            if (null == CachingPipeline.getRenderScriptContext()){
76352fa110135563740ebc27326afab4326bbb9b9f5John Hoford                Log.v(LOGTAG,"RenderScript context destroyed during load");
76452fa110135563740ebc27326afab4326bbb9b9f5John Hoford                return;
76552fa110135563740ebc27326afab4326bbb9b9f5John Hoford            }
766733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View loading = findViewById(R.id.loading);
767733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            loading.setVisibility(View.GONE);
768733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View imageShow = findViewById(R.id.imageShow);
769733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            imageShow.setVisibility(View.VISIBLE);
770733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard
7710c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
772db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mBoundService.setOriginalBitmap(largeBitmap);
773d33fe6fd37d8c506ab0e47139ef0f77746a275b8nicolasroard            MasterImage.getImage().resetGeometryImages(true);
774db5d060e8077f70d650e1ce56618f953114551e0nicolasroard
7750c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            float previewScale = (float) largeBitmap.getWidth()
7760c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    / (float) MasterImage.getImage().getOriginalBounds().width();
777db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mBoundService.setPreviewScaleFactor(previewScale);
778f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mShowingTinyPlanet) {
779f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mCategoryFiltersAdapter.removeTinyPlanet();
780f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
781f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.imageLoaded();
782f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryBordersAdapter.imageLoaded();
783f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.imageLoaded();
784f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.imageLoaded();
785d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask = null;
786ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk
787afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            if (mOriginalPreset != null) {
788d2e9ea0ce1949e192e80ce806e702606694440acztenghui                MasterImage.getImage().setLoadedPreset(mOriginalPreset);
789ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                MasterImage.getImage().setPreset(mOriginalPreset,
790ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                        mOriginalPreset.getLastRepresentation(), true);
791afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                mOriginalPreset = null;
792afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            }
793c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
794f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (mAction == TINY_PLANET_ACTION) {
795f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
796ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk            }
797be84355fddceb9690eef752707c42457ea251e77nicolasroard            LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask();
798be84355fddceb9690eef752707c42457ea251e77nicolasroard            highresLoad.execute();
7993d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            super.onPostExecute(result);
8003d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
8013d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
8023d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
8033d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
804f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    private void clearGalleryBitmapPool() {
805f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        (new AsyncTask<Void, Void, Void>() {
806f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            @Override
807f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            protected Void doInBackground(Void... params) {
808f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                // Free memory held in Gallery's Bitmap pool.  May be O(n) for n bitmaps.
809f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                GalleryBitmapPool.getInstance().clear();
810f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                return null;
811f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            }
812f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        }).execute();
813f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    }
814f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
8153d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    @Override
8163d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    protected void onDestroy() {
817d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (mLoadBitmapTask != null) {
818d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask.cancel(false);
8193d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
820fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.close();
82124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        doUnbindService();
8223d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        super.onDestroy();
8233d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
8243d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
82547886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // TODO: find a more robust way of handling image size selection
82647886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // for high screen densities.
8270f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
82847886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        DisplayMetrics outMetrics = new DisplayMetrics();
82947886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
830a08fab5958ecd50ada4b7c013af362029c61f117ztenghui        return Math.max(outMetrics.heightPixels, outMetrics.widthPixels);
831fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
832fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
8330addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
834ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
835ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
836ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
837ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
838ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
839ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
840ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
841ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
842ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
8430addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
8440addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
8450addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
8460addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
8470addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
8480addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
8490addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
850ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
851ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
852ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
853ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
854ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
855ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
85608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
85708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
858ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
859ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
860ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
8610ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
8620ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
8630ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
8640ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
8650ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
8660ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
8670ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
8680ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
8690ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
8700ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
871ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
8720ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
8730ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
8740ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8750ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
8760ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
87792e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
87892e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
8790ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
8800ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
8810ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
8820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
8830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
8840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
8850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
8870addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
8880ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
8890ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
8900ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
8910ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8920ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
8930ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
8940ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
8950ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
8960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
89724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mSharedOutputFile = SaveImage.getNewFile(this, MasterImage.getImage().getUri());
8980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
8990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
9000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
9010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
9020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
9030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
9049594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
9059594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
9069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
907bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
908bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
909bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
9109594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
911bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
9129594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
9130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
9140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
9150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
9160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
91723e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard
91823e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem undoItem = menu.findItem(R.id.undoButton);
91923e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem redoItem = menu.findItem(R.id.redoButton);
92023e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
92163a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
9229594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return true;
9239594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
9249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
92592e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
9266e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
9276e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
9286e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
9296e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
9306e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
9316e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
9326e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
9336e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
9346e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
9356e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
9366e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
9376e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
9386e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
9396e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
9406e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
9416e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
9429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
9439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
9449594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
9456a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
9469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
94763a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
948a7a6a3a5efaf62cdd5d562a9141678671952d27dJohn Hoford                backToMain();
9499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
950842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
951842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Undo");
9529594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
9539594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
9549594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
9556a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
9569594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
95763a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
9589594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
959842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
960842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Redo");
9619594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
9629594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
963f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
964f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
965842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
966842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "ResetHistory");
967f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
968f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
969bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
970bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
971842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
972842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS,
973842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        mShowingImageStatePanel ? "ShowPanel" : "HidePanel");
974bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
975bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
976568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk            case R.id.exportFlattenButton: {
977077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk                showExportOptionsDialog();
978568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk                return true;
979568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk            }
9809594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
9819594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
9829594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
9839594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
984fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            case R.id.manageUserPresets: {
985fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                manageUserPresets();
986fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                return true;
987fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            }
988860af325f2030a03c526e8551a85230d17df7b15nicolasroard            case R.id.showInfoPanel: {
9895d1cf1f9c8c6359905988e096b50f07ce326df21John Hoford                toggleInformationPanel();
990860af325f2030a03c526e8551a85230d17df7b15nicolasroard                return true;
991860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
9929c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard            case R.id.printButton: {
9939c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard                print();
9949c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard                return true;
9959c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard            }
9969594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
9979594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
9989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
9999594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
10009c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard    public void print() {
10019c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard        Bitmap bitmap = MasterImage.getImage().getHighresImage();
10029c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard        PrintJob.printBitmap(this, "ImagePrint", bitmap);
10039c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard    }
10049c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard
100555a0279ee420c649606edd7815403d3ca1820c07nicolasroard    public void addNewPreset() {
100655a0279ee420c649606edd7815403d3ca1820c07nicolasroard        DialogFragment dialog = new PresetManagementDialog();
100755a0279ee420c649606edd7815403d3ca1820c07nicolasroard        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
100855a0279ee420c649606edd7815403d3ca1820c07nicolasroard    }
100955a0279ee420c649606edd7815403d3ca1820c07nicolasroard
1010fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void manageUserPresets() {
1011fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        DialogFragment dialog = new PresetManagementDialog();
1012fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
1013fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1014fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1015077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk    private void showExportOptionsDialog() {
1016077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk        DialogFragment dialog = new ExportDialog();
1017077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk        dialog.show(getSupportFragmentManager(), "ExportDialogFragment");
1018077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk    }
1019077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk
1020fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateUserPresetsFromAdapter(UserPresetsAdapter adapter) {
1021fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> representations =
1022fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                adapter.getDeletedRepresentations();
1023fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (FilterUserPresetRepresentation representation : representations) {
1024fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            deletePreset(representation.getId());
1025fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
1026fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> changedRepresentations =
1027fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                adapter.getChangedRepresentations();
1028fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (FilterUserPresetRepresentation representation : changedRepresentations) {
1029fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            updatePreset(representation);
1030fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
1031fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        adapter.clearDeletedRepresentations();
1032fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        adapter.clearChangedRepresentations();
1033fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        loadUserPresets();
1034fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1035fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1036fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void loadUserPresets() {
1037fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.load();
10385af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        updateUserPresetsFromManager();
1039fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1040fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1041fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateUserPresetsFromManager() {
1042fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> presets = mUserPresetsManager.getRepresentations();
1043fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        if (presets == null) {
1044fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            return;
1045fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
1046fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        if (mCategoryLooksAdapter != null) {
1047fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            fillLooks();
1048fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
104955a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (presets.size() > 0) {
105055a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryLooksAdapter.add(new Action(this, Action.SPACER));
105155a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
1052fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsAdapter.clear();
1053fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (int i = 0; i < presets.size(); i++) {
1054fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            FilterUserPresetRepresentation representation = presets.get(i);
1055fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            mCategoryLooksAdapter.add(
10560a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard                    new Action(this, representation, Action.FULL_VIEW, true));
1057fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            mUserPresetsAdapter.add(new Action(this, representation, Action.FULL_VIEW));
1058fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
105955a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (presets.size() > 0) {
106055a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
106155a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
10625af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        mCategoryLooksAdapter.notifyDataSetChanged();
1063fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mCategoryLooksAdapter.notifyDataSetInvalidated();
1064fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1065fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
10660a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard    public void saveCurrentImagePreset(String name) {
10670a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        mUserPresetsManager.save(MasterImage.getImage().getPreset(), name);
1068fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1069fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1070fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void deletePreset(int id) {
1071fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.delete(id);
1072fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1073fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1074fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void updatePreset(FilterUserPresetRepresentation representation) {
1075fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.update(representation);
1076fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1077fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1078bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    public void enableSave(boolean enable) {
1079545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        if (mSaveButton != null) {
1080bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu            mSaveButton.setEnabled(enable);
1081545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        }
1082bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    }
1083bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu
108424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillLooks() {
108524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
108624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getLooks();
1087f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
10881a1cb07982f574a59cd84b0501770da97accad89nicolasroard        mCategoryLooksAdapter = new CategoryAdapter(this);
1089f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
1090f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
1091f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
1092f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
1093f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        }
109455a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (mUserPresetsManager.getRepresentations() == null
109555a0279ee420c649606edd7815403d3ca1820c07nicolasroard            || mUserPresetsManager.getRepresentations().size() == 0) {
109655a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
109755a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
10985af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard
10995af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
11005af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        if (panel != null) {
11015af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard            if (panel instanceof MainPanel) {
11025af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard                MainPanel mainPanel = (MainPanel) panel;
11035af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard                mainPanel.loadCategoryLookPanel(true);
11045af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard            }
11055af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        }
11063a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
11070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11083a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    public void setDefaultPreset() {
11090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
1110ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset preset = new ImagePreset(); // empty
1111ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
11120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
11150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
111692e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
11170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
11190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
11208537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
11210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
11220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
11250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
11260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
11270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
11285b85b092af404effd32aa513f9c45a0232d7ae81nicolasroard        mEditorPlaceHolder.hide();
11290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
1132bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
1133bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
1134f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void toggleImageStatePanel() {
1135fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidateOptionsMenu();
1136f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingImageStatePanel = !mShowingImageStatePanel;
1137f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1138f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (panel != null) {
1139f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (panel instanceof EditorPanel) {
1140f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                EditorPanel editorPanel = (EditorPanel) panel;
1141f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                editorPanel.showImageStatePanel(mShowingImageStatePanel);
1142f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            } else if (panel instanceof MainPanel) {
1143f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                MainPanel mainPanel = (MainPanel) panel;
1144f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mainPanel.showImageStatePanel(mShowingImageStatePanel);
1145f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
1146bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
1147bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
1148bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
1149860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void toggleVersionsPanel() {
1150860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingVersionsPanel = !mShowingVersionsPanel;
1151860af325f2030a03c526e8551a85230d17df7b15nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1152860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (panel != null && panel instanceof MainPanel) {
1153860af325f2030a03c526e8551a85230d17df7b15nicolasroard            MainPanel mainPanel = (MainPanel) panel;
1154860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mainPanel.loadCategoryVersionsPanel();
1155860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1156860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
1157860af325f2030a03c526e8551a85230d17df7b15nicolasroard
1158a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    @Override
1159a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    public void onConfigurationChanged(Configuration newConfig)
1160a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    {
1161a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        super.onConfigurationChanged(newConfig);
11623a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
11633a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
1164b9b95fb792c2b0f0b1ecbbcb30713b345475b332nicolasroard        fillCategories();
1165f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
1166f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
1167f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        // mLoadBitmapTask==null implies you have looked at the intent
1168f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
1169f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.removeTinyPlanet();
11705300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford        }
11713a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        final View loading = findViewById(R.id.loading);
11723a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loading.setVisibility(View.GONE);
1173a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    }
1174a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard
117563a7dac01d394523799939596b960cb03321798dJohn Hoford    public void setupMasterImage() {
11763a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
1177ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        HistoryManager historyManager = new HistoryManager();
1178ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        StateAdapter imageStateAdapter = new StateAdapter(this, 0);
1179588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        MasterImage.reset();
1180588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        mMasterImage = MasterImage.getImage();
1181ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setHistoryManager(historyManager);
1182ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setStateAdapter(imageStateAdapter);
118363a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.setActivity(this);
11844dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
11854dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
11864dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(true);
11874dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        } else {
11884dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(false);
11894dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        }
119063a7dac01d394523799939596b960cb03321798dJohn Hoford    }
119163a7dac01d394523799939596b960cb03321798dJohn Hoford
11922e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    void resetHistory() {
11936a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        HistoryManager adapter = mMasterImage.getHistory();
11949594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
1195ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        HistoryItem historyItem = adapter.getItem(0);
1196ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset original = new ImagePreset(historyItem.getImagePreset());
1197ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(original, historyItem.getFilterRepresentation(), true);
11989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
1199be9c8105b431de765f5811bfd170c899d1c8d3b3John Reck        backToMain();
12000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1202f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showDefaultImageView() {
1203860af325f2030a03c526e8551a85230d17df7b15nicolasroard        hideInformationPanel();
1204f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mEditorPlaceHolder.hide();
1205f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mImageShow.setVisibility(View.VISIBLE);
1206f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilter(null);
1207f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(null);
1208f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
1209f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
1210f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void backToMain() {
1211f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1212f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
1213f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
1214f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
1215f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
1216f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        showDefaultImageView();
1217f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
1218f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
121975608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
122075608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
1221f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1222f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
1223f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mImageShow.hasModifications()) {
1224a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                done();
1225a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            } else {
1226a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                AlertDialog.Builder builder = new AlertDialog.Builder(this);
1227a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit);
1228a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() {
1229b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
1230a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
1231a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        saveImage();
1232a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
1233a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
1234e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
1235b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
1236a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
1237a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        done();
1238a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
1239a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
1240e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.show();
1241a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            }
1242f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
1243f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            backToMain();
124475608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
124575608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
1246e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
1247e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
1248a2c4bda1ed7b44085516b2e8f140637e4691bab1Ruben Brunk        Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
1249e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
1250e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
1251e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
12520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
12530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
12550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
12560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
12570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
12580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
12610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
12620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
126363a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.onHistoryItemClick(position);
12640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
12650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
12680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
12690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
12700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
12710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
12720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
12730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
127592e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
12760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
12770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
12780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
12790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
1280d49d53206a197b08ec4754d8751b6860e33d9f48John Reck                startLoadBitmap(selectedImageUri);
12810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
12820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
12830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12856416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
12860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
1287d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        if (mImageShow.hasModifications()) {
1288d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            // Get the name of the album, to which the image will be saved
128924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            File saveDir = SaveImage.getFinalSaveDirectory(this, mSelectedImageUri);
1290d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
1291d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
1292d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            showSavingProgress(albumName);
1293d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            mImageShow.saveImage(this, null);
1294d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        } else {
12956416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            done();
12966416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
12976416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    }
12986416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1299a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk
13006416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public void done() {
1301d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        hideSavingProgress();
130252fa110135563740ebc27326afab4326bbb9b9f5John Hoford        if (mLoadBitmapTask != null) {
130352fa110135563740ebc27326afab4326bbb9b9f5John Hoford            mLoadBitmapTask.cancel(false);
130452fa110135563740ebc27326afab4326bbb9b9f5John Hoford        }
13056416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        finish();
13060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
13070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1308afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private void extractXMPData() {
1309afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        XMresults res = XmpPresets.extractXMPData(
1310afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                getBaseContext(), mMasterImage, getIntent().getData());
1311afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (res == null)
1312afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            return;
1313afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford
1314afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalImageUri = res.originalimage;
1315afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalPreset = res.preset;
1316afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    }
1317b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1318b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    public Uri getSelectedImageUri() {
1319b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        return mSelectedImageUri;
1320b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    }
1321b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
13229737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard    public void setHandlesSwipeForView(View view, float startX, float startY) {
1323860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (view != null) {
1324860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mHandlingSwipeButton = true;
1325860af325f2030a03c526e8551a85230d17df7b15nicolasroard        } else {
1326860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mHandlingSwipeButton = false;
1327860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1328860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mHandledSwipeView = view;
1329860af325f2030a03c526e8551a85230d17df7b15nicolasroard        int[] location = new int[2];
1330860af325f2030a03c526e8551a85230d17df7b15nicolasroard        view.getLocationInWindow(location);
13319737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard        mSwipeStartX = location[0] + startX;
1332860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mSwipeStartY = location[1] + startY;
1333860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
1334860af325f2030a03c526e8551a85230d17df7b15nicolasroard
1335860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public boolean dispatchTouchEvent (MotionEvent ev) {
1336860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (mHandlingSwipeButton) {
13379737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard            int direction = CategoryView.HORIZONTAL;
13389737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard            if (mHandledSwipeView instanceof CategoryView) {
13399737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                direction = ((CategoryView) mHandledSwipeView).getOrientation();
13409737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard            }
1341860af325f2030a03c526e8551a85230d17df7b15nicolasroard            if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
1342860af325f2030a03c526e8551a85230d17df7b15nicolasroard                float delta = ev.getY() - mSwipeStartY;
13439737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                float distance = mHandledSwipeView.getHeight();
13449737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                if (direction == CategoryView.VERTICAL) {
13459737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    delta = ev.getX() - mSwipeStartX;
13469737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    mHandledSwipeView.setTranslationX(delta);
13479737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    distance = mHandledSwipeView.getWidth();
13489737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                } else {
13499737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    mHandledSwipeView.setTranslationY(delta);
13509737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                }
1351860af325f2030a03c526e8551a85230d17df7b15nicolasroard                delta = Math.abs(delta);
13529737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                float transparency = Math.min(1, delta / distance);
1353860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setAlpha(1.f - transparency);
1354860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeViewLastDelta = delta;
1355860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
1356860af325f2030a03c526e8551a85230d17df7b15nicolasroard            if (ev.getActionMasked() == MotionEvent.ACTION_CANCEL
1357860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    || ev.getActionMasked() == MotionEvent.ACTION_UP) {
13589737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                mHandledSwipeView.setTranslationX(0);
1359860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setTranslationY(0);
1360860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setAlpha(1.f);
1361860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandlingSwipeButton = false;
13629737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                float distance = mHandledSwipeView.getHeight();
13639737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                if (direction == CategoryView.VERTICAL) {
13649737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    distance = mHandledSwipeView.getWidth();
13659737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                }
13669737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                if (mHandledSwipeViewLastDelta > distance) {
1367860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    ((SwipableView) mHandledSwipeView).delete();
1368860af325f2030a03c526e8551a85230d17df7b15nicolasroard                }
1369860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
1370860af325f2030a03c526e8551a85230d17df7b15nicolasroard            return true;
1371860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1372860af325f2030a03c526e8551a85230d17df7b15nicolasroard        return super.dispatchTouchEvent(ev);
1373860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
13749f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard
13759f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard    public void startTouchAnimation(View target, float x, float y) {
13769f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        final CategorySelected hint =
13779f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                (CategorySelected) findViewById(R.id.categorySelectedIndicator);
13789f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int location[] = new int[2];
13799f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        target.getLocationOnScreen(location);
13809f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int locationHint[] = new int[2];
13819f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        ((View)hint.getParent()).getLocationOnScreen(locationHint);
13829f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int dx = (int) (x - (hint.getWidth())/2);
13839f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int dy = (int) (y - (hint.getHeight())/2);
13849f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.setTranslationX(location[0] - locationHint[0] + dx);
13859f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.setTranslationY(location[1] - locationHint[1] + dy);
13869f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.setVisibility(View.VISIBLE);
13879f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.animate().scaleX(2).scaleY(2).alpha(0).withEndAction(new Runnable() {
13889f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            @Override
13899f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            public void run() {
13909f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setVisibility(View.INVISIBLE);
13919f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setScaleX(1);
13929f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setScaleY(1);
13939f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setAlpha(1);
13949f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            }
13959f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        });
13969f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard    }
13970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
1398