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;
323759b2d6670df1e645f630d18b2387c458fdfcc1John Hofordimport android.graphics.Color;
339c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport android.graphics.Matrix;
3432cc4dd751569721aa19218b4d947145577060d0nicolasroardimport android.graphics.Point;
350c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport android.graphics.Rect;
369c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport android.graphics.RectF;
379f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroardimport android.graphics.drawable.ColorDrawable;
380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
3992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
403d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask;
4192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
429c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport android.os.CancellationSignal;
43af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.os.Handler;
4424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.os.IBinder;
45fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport android.support.v4.app.DialogFragment;
46f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.support.v4.app.Fragment;
47fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentActivity;
48fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentTransaction;
49391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganovimport android.support.v4.print.PrintHelper;
50fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
5152fa110135563740ebc27326afab4326bbb9b9f5John Hofordimport android.util.Log;
52d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport android.util.TypedValue;
53f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Menu;
54f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.MenuItem;
55860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport android.view.MotionEvent;
56f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.View;
570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
58af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.view.ViewPropertyAnimator;
59f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.WindowManager;
60be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.AdapterView;
610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
62be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.FrameLayout;
6364fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hofordimport android.widget.PopupMenu;
64be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.ShareActionProvider;
650ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
663759b2d6670df1e645f630d18b2387c458fdfcc1John Hofordimport android.widget.Spinner;
67f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.widget.Toast;
68d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk
6992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
7024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.app.PhotoPage;
710addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
7292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
73d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.Action;
74d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.CategoryAdapter;
759f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroardimport com.android.gallery3d.filtershow.category.CategorySelected;
769737f3a18a8c302160e213afa30a4db710e41fb6nicolasroardimport com.android.gallery3d.filtershow.category.CategoryView;
77d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.MainPanel;
78860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport com.android.gallery3d.filtershow.category.SwipableView;
79077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.data.UserPresetsManager;
80d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.BasicEditor;
81d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.Editor;
82077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorChanSat;
8349798939f1bc58eaf5842bbc8bc5424284ab7930John Hofordimport com.android.gallery3d.filtershow.editors.EditorColorBorder;
84d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorCrop;
85d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorDraw;
86077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorGrad;
87d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorManager;
88077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorMirror;
89d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorPanel;
90d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRedEye;
91d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRotate;
92d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorStraighten;
93d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
94d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
95edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroardimport com.android.gallery3d.filtershow.filters.FilterDrawRepresentation;
9657bd092bd5757576f07341135272ed1c3df729ffnicolasroardimport com.android.gallery3d.filtershow.filters.FilterMirrorRepresentation;
97d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterRepresentation;
9857bd092bd5757576f07341135272ed1c3df729ffnicolasroardimport com.android.gallery3d.filtershow.filters.FilterRotateRepresentation;
993bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroardimport com.android.gallery3d.filtershow.filters.FilterStraightenRepresentation;
100077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation;
101d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FiltersManager;
102d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.ImageFilter;
1035180e681e1b68eae403b2740c609792ca44f77cenicolasroardimport com.android.gallery3d.filtershow.history.HistoryItem;
104077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.history.HistoryManager;
10592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
10663a7dac01d394523799939596b960cb03321798dJohn Hofordimport com.android.gallery3d.filtershow.imageshow.MasterImage;
107368ae73ad0627dac41709b925fc02a12548ab80dnicolasroardimport com.android.gallery3d.filtershow.imageshow.Spline;
108860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport com.android.gallery3d.filtershow.info.InfoPanel;
109077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.pipeline.CachingPipeline;
110ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset;
11124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.pipeline.ProcessingService;
112fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.presets.PresetManagementDialog;
113fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.presets.UserPresetsAdapter;
11492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
115fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter;
11624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.tools.SaveImage;
117afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets;
118afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets.XMresults;
119077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.ui.ExportDialog;
1207592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton;
1210addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
122f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunkimport com.android.photos.data.GalleryBitmapPool;
12392e2341248e99c691f38820503984bc5e2f18811nicolasroard
12492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
1259c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport java.io.FileDescriptor;
1269c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroardimport java.io.FileOutputStream;
127ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
12824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport java.util.ArrayList;
12992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
13092e2341248e99c691f38820503984bc5e2f18811nicolasroard
131fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener,
1326125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford        OnShareTargetSelectedListener, DialogInterface.OnShowListener,
13364fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        DialogInterface.OnDismissListener, PopupMenu.OnDismissListener{
1340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
135ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk    private String mAction = "";
136588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard    MasterImage mMasterImage = null;
1376416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1384dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard    private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb
1394dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
140a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
141a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
14232646aabd8228e1494ba090a02ffb8adaa369127nicolasroard    public static final boolean RESET_TO_LOADED = false;
1430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
1440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
145bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    private View mSaveButton = null;
1460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1475aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford    private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this);
1489f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard    private Editor mCurrentEditor = null;
1495aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
1500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
1520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1535300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford    private boolean mShowingTinyPlanet = false;
154bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
155860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mShowingVersionsPanel = false;
156bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
15792e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
1580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1590ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1600ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1610ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1620ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1630ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
164ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
16555550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
166d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private LoadBitmapTask mLoadBitmapTask;
1673d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
168afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private Uri mOriginalImageUri = null;
169afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private ImagePreset mOriginalPreset = null;
170c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
171b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    private Uri mSelectedImageUri = null;
172b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
17332cc4dd751569721aa19218b4d947145577060d0nicolasroard    private ArrayList<Action> mActions = new ArrayList<Action>();
174fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private UserPresetsManager mUserPresetsManager = null;
175fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private UserPresetsAdapter mUserPresetsAdapter = null;
176f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryLooksAdapter = null;
177f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryBordersAdapter = null;
178f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryGeometryAdapter = null;
179f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryFiltersAdapter = null;
180860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private CategoryAdapter mCategoryVersionsAdapter = null;
181f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mCurrentPanel = MainPanel.LOOKS;
182860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private Vector<FilterUserPresetRepresentation> mVersions =
183860af325f2030a03c526e8551a85230d17df7b15nicolasroard            new Vector<FilterUserPresetRepresentation>();
184860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private int mVersionsCounter = 0;
185860af325f2030a03c526e8551a85230d17df7b15nicolasroard
186860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mHandlingSwipeButton = false;
187860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private View mHandledSwipeView = null;
188860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private float mHandledSwipeViewLastDelta = 0;
1899737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard    private float mSwipeStartX = 0;
190860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private float mSwipeStartY = 0;
1913a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
19224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ProcessingService mBoundService;
19324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private boolean mIsBound = false;
1943759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford    private Menu mMenu;
1956125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    private DialogInterface mCurrentDialog = null;
19664fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    private PopupMenu mCurrentMenu = null;
197f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford    private boolean mLoadingVisible = true;
19824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
19924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public ProcessingService getProcessingService() {
20024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return mBoundService;
20124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
20224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
20324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public boolean isSimpleEditAction() {
20424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return !PhotoPage.ACTION_NEXTGEN_EDIT.equalsIgnoreCase(mAction);
20524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
20624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
20724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ServiceConnection mConnection = new ServiceConnection() {
208a08fab5958ecd50ada4b7c013af362029c61f117ztenghui        @Override
20924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        public void onServiceConnected(ComponentName className, IBinder service) {
21024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            /*
21124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * This is called when the connection with the service has been
21224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * established, giving us the service object we can use to
21324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * interact with the service.  Because we have bound to a explicit
21424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * service that we know is running in our own process, we can
21524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * cast its IBinder to a concrete class and directly access it.
21624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             */
21724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService = ((ProcessingService.LocalBinder)service).getService();
21824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService.setFiltershowActivity(FilterShowActivity.this);
21924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService.onStart();
22024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
22124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
222a08fab5958ecd50ada4b7c013af362029c61f117ztenghui        @Override
22324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        public void onServiceDisconnected(ComponentName className) {
22424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            /*
22524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * This is called when the connection with the service has been
22624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * unexpectedly disconnected -- that is, its process crashed.
22724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * Because it is running in our same process, we should never
22824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * see this happen.
22924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             */
23024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService = null;
23124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
23224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    };
23324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
23424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    void doBindService() {
23524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        /*
23624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * Establish a connection with the service.  We use an explicit
23724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * class name because we want a specific service implementation that
23824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * we know will be running in our own process (and thus won't be
23924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * supporting component replacement by other applications).
24024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         */
24124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        bindService(new Intent(FilterShowActivity.this, ProcessingService.class),
24224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard                mConnection, Context.BIND_AUTO_CREATE);
24324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mIsBound = true;
24424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
24524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
24624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    void doUnbindService() {
24724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        if (mIsBound) {
24824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            // Detach our existing connection.
24924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            unbindService(mConnection);
25024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mIsBound = false;
25124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
25224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
25324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
2543759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford    public void updateUIAfterServiceStarted() {
2553759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        MasterImage.setMaster(mMasterImage);
25624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ImageFilter.setActivityForMemoryToasts(this);
257fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager = new UserPresetsManager(this);
258fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsAdapter = new UserPresetsAdapter(this);
25924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
2603759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        setupMasterImage();
2613759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        setupMenu();
2623759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        setDefaultValues();
2633759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        fillEditors();
2643759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        getWindow().setBackgroundDrawable(new ColorDrawable(0));
2653759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        loadXML();
2663759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford
26724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillCategories();
26824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        loadMainPanel();
26924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        extractXMPData();
27024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        processIntent();
27124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
27224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
2730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
2740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
2750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
2760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
277f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait);
278f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (onlyUsePortrait) {
279f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
280f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
281f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
282f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        clearGalleryBitmapPool();
2833759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        doBindService();
2843759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        getWindow().setBackgroundDrawable(new ColorDrawable(Color.GRAY));
2853759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        setContentView(R.layout.filtershow_splashscreen);
2863a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
2875ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
288f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public boolean isShowingImageStatePanel() {
289f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mShowingImageStatePanel;
290f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
291f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
292f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadMainPanel() {
293f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (findViewById(R.id.main_panel_container) == null) {
294f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
295f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
296f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MainPanel panel = new MainPanel();
297f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
298f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
299d1a098ea5116fbc47e815631bd9bc5d442bbbd0dnicolasroard        transaction.commitAllowingStateLoss();
300f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
301f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
302f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadEditorPanel(FilterRepresentation representation,
30300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                                final Editor currentEditor) {
304f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation.getEditorId() == ImageOnlyEditor.ID) {
305f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            currentEditor.reflectCurrentFilter();
306f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
307f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
30800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        final int currentId = currentEditor.getID();
30900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Runnable showEditor = new Runnable() {
31000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            @Override
31100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            public void run() {
31200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                EditorPanel panel = new EditorPanel();
31300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                panel.setEditor(currentId);
31400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
31500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG));
31600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
31700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.commit();
31800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            }
31900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        };
32000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
32100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        boolean doAnimation = false;
32200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (mShowingImageStatePanel
32300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
32400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            doAnimation = true;
32500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
32600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (doAnimation && main != null && main instanceof MainPanel) {
32700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            MainPanel mainPanel = (MainPanel) main;
32800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View container = mainPanel.getView().findViewById(R.id.category_panel_container);
32900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
33000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            int panelHeight = container.getHeight() + bottom.getHeight();
331af59322ac944e6e17aaf718045949a3352016945nicolasroard            ViewPropertyAnimator anim = mainPanel.getView().animate();
332af59322ac944e6e17aaf718045949a3352016945nicolasroard            anim.translationY(panelHeight).start();
333af59322ac944e6e17aaf718045949a3352016945nicolasroard            final Handler handler = new Handler();
334af59322ac944e6e17aaf718045949a3352016945nicolasroard            handler.postDelayed(showEditor, anim.getDuration());
33500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        } else {
33600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            showEditor.run();
33700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
338f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
339f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
3405d1cf1f9c8c6359905988e096b50f07ce326df21John Hoford    public void toggleInformationPanel() {
341860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
342860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
343860af325f2030a03c526e8551a85230d17df7b15nicolasroard
344860af325f2030a03c526e8551a85230d17df7b15nicolasroard        InfoPanel panel = new InfoPanel();
345b203968cc53015d9c51b790a56cca638be77818dnicolasroard        panel.show(transaction, InfoPanel.FRAGMENT_TAG);
346860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
347860af325f2030a03c526e8551a85230d17df7b15nicolasroard
3483a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void loadXML() {
3490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
3503a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3519594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
352786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
353786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
3549f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        actionBar.setBackgroundDrawable(new ColorDrawable(
3559f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                getResources().getColor(R.color.background_screen)));
356786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
357bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton = actionBar.getCustomView();
358bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton.setOnClickListener(new OnClickListener() {
359786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
360786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
361786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
362786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
363786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
3640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
3660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
3670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3683a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setupEditors();
3695aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
370733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        mEditorPlaceHolder.hide();
37132cc4dd751569721aa19218b4d947145577060d0nicolasroard        mImageShow.attach();
37292e2341248e99c691f38820503984bc5e2f18811nicolasroard
3736019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard        setupStatePanel();
3746019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    }
3756019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard
37624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void fillCategories() {
37724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillLooks();
378fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        loadUserPresets();
37924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillBorders();
38024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillTools();
38124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillEffects();
382860af325f2030a03c526e8551a85230d17df7b15nicolasroard        fillVersions();
38324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
38424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
3856019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    public void setupStatePanel() {
3860c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        MasterImage.getImage().setHistoryManager(mMasterImage.getHistory());
38738fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard    }
38838fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard
389860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private void fillVersions() {
39032cc4dd751569721aa19218b4d947145577060d0nicolasroard        if (mCategoryVersionsAdapter != null) {
39132cc4dd751569721aa19218b4d947145577060d0nicolasroard            mCategoryVersionsAdapter.clear();
39232cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
393860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter = new CategoryAdapter(this);
394860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.setShowAddButton(true);
395860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
396860af325f2030a03c526e8551a85230d17df7b15nicolasroard
39732cc4dd751569721aa19218b4d947145577060d0nicolasroard    public void registerAction(Action action) {
39832cc4dd751569721aa19218b4d947145577060d0nicolasroard        if (mActions.contains(action)) {
39932cc4dd751569721aa19218b4d947145577060d0nicolasroard            return;
40032cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
40132cc4dd751569721aa19218b4d947145577060d0nicolasroard        mActions.add(action);
40232cc4dd751569721aa19218b4d947145577060d0nicolasroard    }
40332cc4dd751569721aa19218b4d947145577060d0nicolasroard
40432cc4dd751569721aa19218b4d947145577060d0nicolasroard    private void loadActions() {
40532cc4dd751569721aa19218b4d947145577060d0nicolasroard        for (int i = 0; i < mActions.size(); i++) {
40632cc4dd751569721aa19218b4d947145577060d0nicolasroard            Action action = mActions.get(i);
40732cc4dd751569721aa19218b4d947145577060d0nicolasroard            action.setImageFrame(new Rect(0, 0, 96, 96), 0);
40832cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
40932cc4dd751569721aa19218b4d947145577060d0nicolasroard    }
41032cc4dd751569721aa19218b4d947145577060d0nicolasroard
411860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void updateVersions() {
412860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.clear();
413860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation originalRep = new FilterUserPresetRepresentation(
414860af325f2030a03c526e8551a85230d17df7b15nicolasroard                getString(R.string.filtershow_version_original), new ImagePreset(), -1);
415860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.add(
416860af325f2030a03c526e8551a85230d17df7b15nicolasroard                new Action(this, originalRep, Action.FULL_VIEW));
417860af325f2030a03c526e8551a85230d17df7b15nicolasroard        ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
418860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation currentRep = new FilterUserPresetRepresentation(
419860af325f2030a03c526e8551a85230d17df7b15nicolasroard                getString(R.string.filtershow_version_current), current, -1);
420860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.add(
421860af325f2030a03c526e8551a85230d17df7b15nicolasroard                new Action(this, currentRep, Action.FULL_VIEW));
42255a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (mVersions.size() > 0) {
42355a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryVersionsAdapter.add(new Action(this, Action.SPACER));
42455a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
425860af325f2030a03c526e8551a85230d17df7b15nicolasroard        for (FilterUserPresetRepresentation rep : mVersions) {
426860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mCategoryVersionsAdapter.add(
42755a0279ee420c649606edd7815403d3ca1820c07nicolasroard                    new Action(this, rep, Action.FULL_VIEW, true));
428860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
429860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.notifyDataSetInvalidated();
430860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
431860af325f2030a03c526e8551a85230d17df7b15nicolasroard
432860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void addCurrentVersion() {
433860af325f2030a03c526e8551a85230d17df7b15nicolasroard        ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
434860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersionsCounter++;
435860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation rep = new FilterUserPresetRepresentation(
436860af325f2030a03c526e8551a85230d17df7b15nicolasroard                "" + mVersionsCounter, current, -1);
437860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersions.add(rep);
438860af325f2030a03c526e8551a85230d17df7b15nicolasroard        updateVersions();
439860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
440860af325f2030a03c526e8551a85230d17df7b15nicolasroard
441860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void removeVersion(Action action) {
442860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersions.remove(action.getRepresentation());
443860af325f2030a03c526e8551a85230d17df7b15nicolasroard        updateVersions();
444860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
445860af325f2030a03c526e8551a85230d17df7b15nicolasroard
4460a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard    public void removeLook(Action action) {
4475af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        FilterUserPresetRepresentation rep =
4485af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard                (FilterUserPresetRepresentation) action.getRepresentation();
4490a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        if (rep == null) {
4500a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard            return;
4510a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        }
4520a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        mUserPresetsManager.delete(rep.getId());
4535af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        updateUserPresetsFromManager();
4540a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard    }
4550a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard
45624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillEffects() {
4573a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
45824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getEffects();
45932cc4dd751569721aa19218b4d947145577060d0nicolasroard        if (mCategoryFiltersAdapter != null) {
46032cc4dd751569721aa19218b4d947145577060d0nicolasroard            mCategoryFiltersAdapter.clear();
46132cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
462f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryFiltersAdapter = new CategoryAdapter(this);
463f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
464f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
465f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
466f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
467f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.add(new Action(this, representation));
468f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
4693a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4703a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
47124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillTools() {
47238fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
47324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTools();
47432cc4dd751569721aa19218b4d947145577060d0nicolasroard        if (mCategoryGeometryAdapter != null) {
47532cc4dd751569721aa19218b4d947145577060d0nicolasroard            mCategoryGeometryAdapter.clear();
47632cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
477f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryGeometryAdapter = new CategoryAdapter(this);
478edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        boolean found = false;
479f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
480f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.add(new Action(this, representation));
481edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            if (representation instanceof FilterDrawRepresentation) {
482edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                found = true;
483edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            }
484edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        }
485edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        if (!found) {
486edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            FilterRepresentation representation = new FilterDrawRepresentation();
487edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            Action action = new Action(this, representation);
488edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            action.setIsDoubleAction(true);
489edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            mCategoryGeometryAdapter.add(action);
490f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
4913a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4923a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4933a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void processIntent() {
4940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
495a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
496a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
497a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        }
498a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu
499ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk        mAction = intent.getAction();
500b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        mSelectedImageUri = intent.getData();
501b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        Uri loadUri = mSelectedImageUri;
502afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (mOriginalImageUri != null) {
503b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            loadUri = mOriginalImageUri;
504afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        }
505b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        if (loadUri != null) {
506b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            startLoadBitmap(loadUri);
5070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
5080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
5090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
5100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
5110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5123a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setupEditors() {
5133a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer));
5143a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        EditorManager.addEditors(mEditorPlaceHolder);
5153a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setOldViews(mImageViews);
5163a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
5173a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5183a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void fillEditors() {
519bc8e077e77cf6f0dda8efd8318b8a8e7eda16f61John Hoford        mEditorPlaceHolder.addEditor(new EditorChanSat());
520e162b032fe387eabbd69d367dae6fe7003e850a1John Hoford        mEditorPlaceHolder.addEditor(new EditorGrad());
5213a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorDraw());
52249798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        mEditorPlaceHolder.addEditor(new EditorColorBorder());
5233a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new BasicEditor());
5243a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new ImageOnlyEditor());
5253a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorTinyPlanet());
5263a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRedEye());
5273a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorCrop());
528b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        mEditorPlaceHolder.addEditor(new EditorMirror());
5293a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRotate());
5303a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorStraighten());
5313a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
5323a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5333a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setDefaultValues() {
5343a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Resources res = getResources();
5353a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5363a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        // TODO: get those values from XML.
5373a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
5383a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
5393a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
5403a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
5413a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
5423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
5433a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
5443a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
5453759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford
5463759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        mOriginalImageUri = null;
5473a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
5483a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
549d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private void startLoadBitmap(Uri uri) {
550733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        final View imageShow = findViewById(R.id.imageShow);
551733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        imageShow.setVisibility(View.INVISIBLE);
552f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        startLoadingIndicator();
553f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingTinyPlanet = false;
554f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mLoadBitmapTask = new LoadBitmapTask();
555d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask.execute(uri);
556d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    }
557d49d53206a197b08ec4754d8751b6860e33d9f48John Reck
558f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private void fillBorders() {
55924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
56024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> borders = filtersManager.getBorders();
5614c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford
562f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        for (int i = 0; i < borders.size(); i++) {
56324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            FilterRepresentation filter = borders.get(i);
5643cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk            filter.setName(getString(R.string.borders));
565f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk            if (i == 0) {
5663cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk                filter.setName(getString(R.string.none));
5679090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
568f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
569f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
57032cc4dd751569721aa19218b4d947145577060d0nicolasroard        if (mCategoryBordersAdapter != null) {
57132cc4dd751569721aa19218b4d947145577060d0nicolasroard            mCategoryBordersAdapter.clear();
57232cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
573f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryBordersAdapter = new CategoryAdapter(this);
574f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : borders) {
575f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
576f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
5779090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
57800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW));
5799090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
5809090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
5819090141f56b4e2000704d0c4a778d3a819821726nicolasroard
582fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public UserPresetsAdapter getUserPresetsAdapter() {
583fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        return mUserPresetsAdapter;
584fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
585fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
586f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryLooksAdapter() {
587f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryLooksAdapter;
588f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
589f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
590f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryBordersAdapter() {
591f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryBordersAdapter;
592f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
593f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
594f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryGeometryAdapter() {
595f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryGeometryAdapter;
596f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
597f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
598f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryFiltersAdapter() {
599f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryFiltersAdapter;
600f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
601f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
602860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public CategoryAdapter getCategoryVersionsAdapter() {
603860af325f2030a03c526e8551a85230d17df7b15nicolasroard        return mCategoryVersionsAdapter;
604860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
605860af325f2030a03c526e8551a85230d17df7b15nicolasroard
606f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
607f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
608f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
609f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
610f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
611f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
612f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        copy.removeFilter(filterRepresentation);
613ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
614f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
615f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            FilterRepresentation lastRepresentation = copy.getLastRepresentation();
616f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
617f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
618f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
619f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
620f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
621f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
622f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
623f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
62457bd092bd5757576f07341135272ed1c3df729ffnicolasroard        if (!(filterRepresentation instanceof FilterRotateRepresentation)
62557bd092bd5757576f07341135272ed1c3df729ffnicolasroard            && !(filterRepresentation instanceof FilterMirrorRepresentation)
62657bd092bd5757576f07341135272ed1c3df729ffnicolasroard            && MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
627f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
628f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
6299f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        if (filterRepresentation instanceof FilterUserPresetRepresentation
6309f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                || filterRepresentation instanceof FilterRotateRepresentation
6319f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                || filterRepresentation instanceof FilterMirrorRepresentation) {
6329f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            MasterImage.getImage().onNewLook(filterRepresentation);
6339f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        }
634f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
635f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
636f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
637f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation == null) {
6383cd6fc8e632e406628b5977ee47c191523552500nicolasroard            filterRepresentation = filterRepresentation.copy();
639f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            copy.addFilter(filterRepresentation);
640f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
641c9ca6d1eb85a71b7667f4c25d879e78cce16ac4cztenghui            if (filterRepresentation.allowsSingleInstanceOnly()) {
642d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // Don't just update the filter representation. Centralize the
643d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // logic in the addFilter(), such that we can keep "None" as
644d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // null.
64520667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                if (!representation.equals(filterRepresentation)) {
64620667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    // Only do this if the filter isn't the same
64720667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    // (state panel clicks can lead us here)
64820667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    copy.removeFilter(representation);
64920667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                    copy.addFilter(filterRepresentation);
65020667d21eac2074b0e265d8839539bd9cfec9f92nicolasroard                }
6519090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
6529090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
653ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, filterRepresentation, true);
654f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
655f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
656f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
657f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showRepresentation(FilterRepresentation representation) {
658f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (representation == null) {
659f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford            return;
660f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        }
661e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard
66257bd092bd5757576f07341135272ed1c3df729ffnicolasroard        if (representation instanceof FilterRotateRepresentation) {
66357bd092bd5757576f07341135272ed1c3df729ffnicolasroard            FilterRotateRepresentation r = (FilterRotateRepresentation) representation;
66457bd092bd5757576f07341135272ed1c3df729ffnicolasroard            r.rotateCW();
66557bd092bd5757576f07341135272ed1c3df729ffnicolasroard        }
66657bd092bd5757576f07341135272ed1c3df729ffnicolasroard        if (representation instanceof FilterMirrorRepresentation) {
66757bd092bd5757576f07341135272ed1c3df729ffnicolasroard            FilterMirrorRepresentation r = (FilterMirrorRepresentation) representation;
66857bd092bd5757576f07341135272ed1c3df729ffnicolasroard            r.cycle();
66957bd092bd5757576f07341135272ed1c3df729ffnicolasroard        }
670edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        if (representation.isBooleanFilter()) {
671edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            ImagePreset preset = MasterImage.getImage().getPreset();
672edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            if (preset.getRepresentation(representation) != null) {
673edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                // remove
674edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                ImagePreset copy = new ImagePreset(preset);
675edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                copy.removeFilter(representation);
676edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                FilterRepresentation filterRepresentation = representation.copy();
677edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                MasterImage.getImage().setPreset(copy, filterRepresentation, true);
678edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                MasterImage.getImage().setCurrentFilterRepresentation(null);
679edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard                return;
680edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard            }
681edf4b095a1d904df6c02d49e3ec575c5c3c9c749nicolasroard        }
682b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        useFilterRepresentation(representation);
683f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
684f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        // show representation
6859f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        if (mCurrentEditor != null) {
6869f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            mCurrentEditor.detach();
6879f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        }
6889f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId());
689f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadEditorPanel(representation, mCurrentEditor);
690f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
691f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
692f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public Editor getEditor(int editorID) {
693f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mEditorPlaceHolder.getEditor(editorID);
694f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
695f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
696f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void setCurrentPanel(int currentPanel) {
697f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCurrentPanel = currentPanel;
698f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
699f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
700f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public int getCurrentPanel() {
701f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCurrentPanel;
7029090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
7039090141f56b4e2000704d0c4a778d3a819821726nicolasroard
704acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    public void updateCategories() {
70526f23e62096eb50344815e1b066e9a1efb629bb0nicolasroard        if (mMasterImage == null) {
70626f23e62096eb50344815e1b066e9a1efb629bb0nicolasroard            return;
70726f23e62096eb50344815e1b066e9a1efb629bb0nicolasroard        }
708acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        ImagePreset preset = mMasterImage.getPreset();
709acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryLooksAdapter.reflectImagePreset(preset);
710acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryBordersAdapter.reflectImagePreset(preset);
711acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    }
712acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard
713e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard    public View getMainStatePanelContainer(int id) {
714e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard        return findViewById(id);
715e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard    }
716e799626df47f99e4ba70bcfe787fdbdac64a8cc7nicolasroard
71764fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    public void onShowMenu(PopupMenu menu) {
71864fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        mCurrentMenu = menu;
71964fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        menu.setOnDismissListener(this);
72064fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    }
72164fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford
72264fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    @Override
72364fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    public void onDismiss(PopupMenu popupMenu){
72464fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        if (mCurrentMenu == null) {
72564fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford            return;
72664fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        }
72764fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        mCurrentMenu.setOnDismissListener(null);
72864fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        mCurrentMenu = null;
72964fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford    }
73064fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford
7316125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    @Override
7326125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    public void onShow(DialogInterface dialog) {
7336125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford        mCurrentDialog = dialog;
7346125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    }
7356125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford
7366125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    @Override
7376125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    public void onDismiss(DialogInterface dialogInterface) {
7386125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford        mCurrentDialog = null;
7396125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford    }
7406125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford
741be84355fddceb9690eef752707c42457ea251e77nicolasroard    private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
742be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
743be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected Boolean doInBackground(Void... params) {
7440c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            MasterImage master = MasterImage.getImage();
7450c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Rect originalBounds = master.getOriginalBounds();
7460c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (master.supportsHighRes()) {
7470c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                int highresPreviewSize = master.getOriginalBitmapLarge().getWidth() * 2;
7480c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                if (highresPreviewSize > originalBounds.width()) {
7490c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    highresPreviewSize = originalBounds.width();
7500c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                }
75147886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Rect bounds = new Rect();
75247886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(),
75347886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getActivity(), highresPreviewSize,
75447886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getOrientation(), bounds);
75547886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                master.setOriginalBounds(bounds);
7560c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.setOriginalBitmapHighres(originalHires);
757db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mBoundService.setOriginalBitmapHighres(originalHires);
7580c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.warnListeners();
7590c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            }
760be84355fddceb9690eef752707c42457ea251e77nicolasroard            return true;
761be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
762be84355fddceb9690eef752707c42457ea251e77nicolasroard
763be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
764be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected void onPostExecute(Boolean result) {
7650c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
766be84355fddceb9690eef752707c42457ea251e77nicolasroard            if (highresBitmap != null) {
7670c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                float highResPreviewScale = (float) highresBitmap.getWidth()
7680c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                        / (float) MasterImage.getImage().getOriginalBounds().width();
769db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mBoundService.setHighresPreviewScaleFactor(highResPreviewScale);
770be84355fddceb9690eef752707c42457ea251e77nicolasroard            }
77180b216d5c8e17e0358cf1508a1e177ccada8383fnicolasroard            MasterImage.getImage().warnListeners();
772be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
773be84355fddceb9690eef752707c42457ea251e77nicolasroard    }
774be84355fddceb9690eef752707c42457ea251e77nicolasroard
775f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford    public boolean isLoadingVisible() {
776f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        return mLoadingVisible;
777f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford    }
778f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford
779f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford    public void startLoadingIndicator() {
780f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        final View loading = findViewById(R.id.loading);
781f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        mLoadingVisible = true;
782f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        loading.setVisibility(View.VISIBLE);
783f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford    }
784f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford
78532cc4dd751569721aa19218b4d947145577060d0nicolasroard    public void stopLoadingIndicator() {
78632cc4dd751569721aa19218b4d947145577060d0nicolasroard        final View loading = findViewById(R.id.loading);
78732cc4dd751569721aa19218b4d947145577060d0nicolasroard        loading.setVisibility(View.GONE);
788f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        mLoadingVisible = false;
78932cc4dd751569721aa19218b4d947145577060d0nicolasroard    }
79032cc4dd751569721aa19218b4d947145577060d0nicolasroard
7918965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
792d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        int mBitmapSize;
7933d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
794f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        public LoadBitmapTask() {
795d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mBitmapSize = getScreenImageSize();
7963d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
7973d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
7983d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
799d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        protected Boolean doInBackground(Uri... params) {
8000c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) {
8018965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return false;
8028965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
8030c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity()));
8048965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            return true;
8053d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
8063d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
8073d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
8088965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk        protected void onProgressUpdate(Boolean... values) {
80900914f56c3390caa224b1c9fc07624665de40113John Reck            super.onProgressUpdate(values);
8106416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (isCancelled()) {
8118965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return;
8126416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
8138965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (values[0]) {
8145300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford                mShowingTinyPlanet = true;
8158965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
81600914f56c3390caa224b1c9fc07624665de40113John Reck        }
81700914f56c3390caa224b1c9fc07624665de40113John Reck
81800914f56c3390caa224b1c9fc07624665de40113John Reck        @Override
8193d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        protected void onPostExecute(Boolean result) {
82069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            MasterImage.setMaster(mMasterImage);
8213d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (isCancelled()) {
8223d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                return;
8233d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
824588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard
8258965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (!result) {
8263759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford                if (mOriginalImageUri != null
8273759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford                        && !mOriginalImageUri.equals(mSelectedImageUri)) {
828441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    mOriginalImageUri = mSelectedImageUri;
829441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    mOriginalPreset = null;
830441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    Toast.makeText(FilterShowActivity.this,
831441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                            R.string.cannot_edit_original, Toast.LENGTH_SHORT).show();
832441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    startLoadBitmap(mOriginalImageUri);
833441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                } else {
834441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                    cannotLoadImage();
835441d7a8930360d1c043daabd76a6599f2a8a60baJohn Hoford                }
836a08fab5958ecd50ada4b7c013af362029c61f117ztenghui                return;
8373d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
8388965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk
83952fa110135563740ebc27326afab4326bbb9b9f5John Hoford            if (null == CachingPipeline.getRenderScriptContext()){
84052fa110135563740ebc27326afab4326bbb9b9f5John Hoford                Log.v(LOGTAG,"RenderScript context destroyed during load");
84152fa110135563740ebc27326afab4326bbb9b9f5John Hoford                return;
84252fa110135563740ebc27326afab4326bbb9b9f5John Hoford            }
843733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View imageShow = findViewById(R.id.imageShow);
844733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            imageShow.setVisibility(View.VISIBLE);
845733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard
84632cc4dd751569721aa19218b4d947145577060d0nicolasroard
8470c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
848db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mBoundService.setOriginalBitmap(largeBitmap);
849db5d060e8077f70d650e1ce56618f953114551e0nicolasroard
8500c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            float previewScale = (float) largeBitmap.getWidth()
8510c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    / (float) MasterImage.getImage().getOriginalBounds().width();
852db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mBoundService.setPreviewScaleFactor(previewScale);
853f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mShowingTinyPlanet) {
854f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mCategoryFiltersAdapter.removeTinyPlanet();
855f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
856f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.imageLoaded();
857f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryBordersAdapter.imageLoaded();
858f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.imageLoaded();
859f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.imageLoaded();
860d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask = null;
861ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk
86232cc4dd751569721aa19218b4d947145577060d0nicolasroard            MasterImage.getImage().warnListeners();
86332cc4dd751569721aa19218b4d947145577060d0nicolasroard            loadActions();
86432cc4dd751569721aa19218b4d947145577060d0nicolasroard
865afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            if (mOriginalPreset != null) {
866d2e9ea0ce1949e192e80ce806e702606694440acztenghui                MasterImage.getImage().setLoadedPreset(mOriginalPreset);
867ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                MasterImage.getImage().setPreset(mOriginalPreset,
868ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                        mOriginalPreset.getLastRepresentation(), true);
869afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                mOriginalPreset = null;
87032cc4dd751569721aa19218b4d947145577060d0nicolasroard            } else {
87132cc4dd751569721aa19218b4d947145577060d0nicolasroard                setDefaultPreset();
872afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            }
873c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
87432cc4dd751569721aa19218b4d947145577060d0nicolasroard            MasterImage.getImage().resetGeometryImages(true);
87532cc4dd751569721aa19218b4d947145577060d0nicolasroard
876f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (mAction == TINY_PLANET_ACTION) {
877f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
878ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk            }
879be84355fddceb9690eef752707c42457ea251e77nicolasroard            LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask();
880be84355fddceb9690eef752707c42457ea251e77nicolasroard            highresLoad.execute();
88180b216d5c8e17e0358cf1508a1e177ccada8383fnicolasroard            MasterImage.getImage().warnListeners();
8823d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            super.onPostExecute(result);
8833d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
8843d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
8853d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
8863d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
887f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    private void clearGalleryBitmapPool() {
888f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        (new AsyncTask<Void, Void, Void>() {
889f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            @Override
890f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            protected Void doInBackground(Void... params) {
891f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                // Free memory held in Gallery's Bitmap pool.  May be O(n) for n bitmaps.
892f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                GalleryBitmapPool.getInstance().clear();
893f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                return null;
894f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            }
895f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        }).execute();
896f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    }
897f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
8983d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    @Override
8993d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    protected void onDestroy() {
900d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (mLoadBitmapTask != null) {
901d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask.cancel(false);
9023d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
903fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.close();
90424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        doUnbindService();
9053d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        super.onDestroy();
9063d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
9073d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
90847886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // TODO: find a more robust way of handling image size selection
90947886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // for high screen densities.
9100f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
91147886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        DisplayMetrics outMetrics = new DisplayMetrics();
91247886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
913a08fab5958ecd50ada4b7c013af362029c61f117ztenghui        return Math.max(outMetrics.heightPixels, outMetrics.widthPixels);
914fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
915fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
9160addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
917ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
918ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
919ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
920ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
921ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
922ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
923ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
924ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
925ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
9260addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
9270addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
9280addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
9290addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
9300addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
9310addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
9320addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
933ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
934ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
935ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
936ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
937ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
938ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
93908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
94008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
941ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
942ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
943ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
9440ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
9450ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
9460ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
9470ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
9480ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
9490ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
9500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
9510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
9520ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
9530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
954ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
9550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
9560ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
9570ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
9580ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
9590ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
96092e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
96192e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
9620ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
9630ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
9640ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
9650ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
9660ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
9670ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
9680ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
9690ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
9700addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
9710ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
9720ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
9730ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
9740ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
9750ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
9760ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
9770ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
9780ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
9790ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
98024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mSharedOutputFile = SaveImage.getNewFile(this, MasterImage.getImage().getUri());
9810ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
9820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
9830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
9840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
9850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
9860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
9879594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
9889594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
9899594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
990bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
991bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
992bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
9939594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
994bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
9959594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
9960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
9970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
9980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
9990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
10003759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        mMenu = menu;
100146868d049a2b4b96c50559ad8a50a4104af15c80John Hoford        setupMenu();
10023759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        return true;
10033759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford    }
100423e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard
10053759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford    private void setupMenu(){
100646868d049a2b4b96c50559ad8a50a4104af15c80John Hoford        if (mMenu == null || mMasterImage == null) {
100746868d049a2b4b96c50559ad8a50a4104af15c80John Hoford            return;
100846868d049a2b4b96c50559ad8a50a4104af15c80John Hoford        }
10093759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        MenuItem undoItem = mMenu.findItem(R.id.undoButton);
10103759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        MenuItem redoItem = mMenu.findItem(R.id.redoButton);
10113759b2d6670df1e645f630d18b2387c458fdfcc1John Hoford        MenuItem resetItem = mMenu.findItem(R.id.resetHistoryButton);
1012ef3cc52f473f15534f00b61b55b53e93931fef97John Hoford        MenuItem printItem = mMenu.findItem(R.id.printButton);
1013391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov        if (!PrintHelper.systemSupportsPrint()) {
1014ef3cc52f473f15534f00b61b55b53e93931fef97John Hoford            printItem.setVisible(false);
1015ef3cc52f473f15534f00b61b55b53e93931fef97John Hoford        }
101663a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
10179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
10189594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
101992e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
10206e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
10216e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
10226e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
10236e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
10246e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
10256e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
10266e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
10276e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
10286e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
10296e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
10306e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
10316e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
10326e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
10336e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
10346e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
10356e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
10369594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
10379594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
10389594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
10396a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
10409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
104163a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
1042a7a6a3a5efaf62cdd5d562a9141678671952d27dJohn Hoford                backToMain();
10439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
10449594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
10459594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
10469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
10476a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
10489594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
104963a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
10509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
10519594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
10529594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
1053f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
1054f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
1055f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
1056f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
1057bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
1058bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
1059bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
1060bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
1061568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk            case R.id.exportFlattenButton: {
1062077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk                showExportOptionsDialog();
1063568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk                return true;
1064568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk            }
10659594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
10669594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
10679594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
10689594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
1069fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            case R.id.manageUserPresets: {
1070fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                manageUserPresets();
1071fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                return true;
1072fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            }
1073860af325f2030a03c526e8551a85230d17df7b15nicolasroard            case R.id.showInfoPanel: {
10745d1cf1f9c8c6359905988e096b50f07ce326df21John Hoford                toggleInformationPanel();
1075860af325f2030a03c526e8551a85230d17df7b15nicolasroard                return true;
1076860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
10779c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard            case R.id.printButton: {
10789c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard                print();
10799c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard                return true;
10809c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard            }
10819594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
10829594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
10839594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
10849594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
10859c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard    public void print() {
10869c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard        Bitmap bitmap = MasterImage.getImage().getHighresImage();
1087391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov        PrintHelper printer = new PrintHelper(this);
1088391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov        printer.printBitmap("ImagePrint", bitmap);
10899c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard    }
10909c5d6700209699c3f1a47b6fa37618ddcd2f24c3nicolasroard
109155a0279ee420c649606edd7815403d3ca1820c07nicolasroard    public void addNewPreset() {
109255a0279ee420c649606edd7815403d3ca1820c07nicolasroard        DialogFragment dialog = new PresetManagementDialog();
109355a0279ee420c649606edd7815403d3ca1820c07nicolasroard        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
109455a0279ee420c649606edd7815403d3ca1820c07nicolasroard    }
109555a0279ee420c649606edd7815403d3ca1820c07nicolasroard
1096fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void manageUserPresets() {
1097fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        DialogFragment dialog = new PresetManagementDialog();
1098fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
1099fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1100fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1101077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk    private void showExportOptionsDialog() {
1102077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk        DialogFragment dialog = new ExportDialog();
1103077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk        dialog.show(getSupportFragmentManager(), "ExportDialogFragment");
1104077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk    }
1105077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk
1106fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateUserPresetsFromAdapter(UserPresetsAdapter adapter) {
1107fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> representations =
1108fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                adapter.getDeletedRepresentations();
1109fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (FilterUserPresetRepresentation representation : representations) {
1110fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            deletePreset(representation.getId());
1111fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
1112fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> changedRepresentations =
1113fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                adapter.getChangedRepresentations();
1114fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (FilterUserPresetRepresentation representation : changedRepresentations) {
1115fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            updatePreset(representation);
1116fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
1117fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        adapter.clearDeletedRepresentations();
1118fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        adapter.clearChangedRepresentations();
1119fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        loadUserPresets();
1120fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1121fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1122fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void loadUserPresets() {
1123fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.load();
11245af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        updateUserPresetsFromManager();
1125fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1126fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1127fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateUserPresetsFromManager() {
1128fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> presets = mUserPresetsManager.getRepresentations();
1129fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        if (presets == null) {
1130fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            return;
1131fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
1132fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        if (mCategoryLooksAdapter != null) {
1133fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            fillLooks();
1134fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
113555a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (presets.size() > 0) {
113655a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryLooksAdapter.add(new Action(this, Action.SPACER));
113755a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
1138fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsAdapter.clear();
1139fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (int i = 0; i < presets.size(); i++) {
1140fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            FilterUserPresetRepresentation representation = presets.get(i);
1141fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            mCategoryLooksAdapter.add(
11420a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard                    new Action(this, representation, Action.FULL_VIEW, true));
1143fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            mUserPresetsAdapter.add(new Action(this, representation, Action.FULL_VIEW));
1144fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
114555a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (presets.size() > 0) {
114655a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
114755a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
11485af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        mCategoryLooksAdapter.notifyDataSetChanged();
1149fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mCategoryLooksAdapter.notifyDataSetInvalidated();
1150fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1151fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
11520a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard    public void saveCurrentImagePreset(String name) {
11530a24e52185c4e88dd52b8e072cf7cd1d04f74b0anicolasroard        mUserPresetsManager.save(MasterImage.getImage().getPreset(), name);
1154fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1155fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1156fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void deletePreset(int id) {
1157fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.delete(id);
1158fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1159fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1160fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void updatePreset(FilterUserPresetRepresentation representation) {
1161fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.update(representation);
1162fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
1163fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
1164bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    public void enableSave(boolean enable) {
1165545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        if (mSaveButton != null) {
1166bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu            mSaveButton.setEnabled(enable);
1167545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        }
1168bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    }
1169bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu
117024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillLooks() {
117124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
117224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getLooks();
1173f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
117432cc4dd751569721aa19218b4d947145577060d0nicolasroard        if (mCategoryLooksAdapter != null) {
117532cc4dd751569721aa19218b4d947145577060d0nicolasroard            mCategoryLooksAdapter.clear();
117632cc4dd751569721aa19218b4d947145577060d0nicolasroard        }
11771a1cb07982f574a59cd84b0501770da97accad89nicolasroard        mCategoryLooksAdapter = new CategoryAdapter(this);
1178f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
1179f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
1180f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
1181f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
1182f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        }
118355a0279ee420c649606edd7815403d3ca1820c07nicolasroard        if (mUserPresetsManager.getRepresentations() == null
118455a0279ee420c649606edd7815403d3ca1820c07nicolasroard            || mUserPresetsManager.getRepresentations().size() == 0) {
118555a0279ee420c649606edd7815403d3ca1820c07nicolasroard            mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
118655a0279ee420c649606edd7815403d3ca1820c07nicolasroard        }
11875af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard
11885af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
11895af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        if (panel != null) {
11905af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard            if (panel instanceof MainPanel) {
11915af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard                MainPanel mainPanel = (MainPanel) panel;
11925af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard                mainPanel.loadCategoryLookPanel(true);
11935af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard            }
11945af55f4f37c3d8fd471144f1175a45e2933ca015nicolasroard        }
11953a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
11960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11973a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    public void setDefaultPreset() {
11980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
1199ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset preset = new ImagePreset(); // empty
1200ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
12010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
12040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
120592e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
12060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
12080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
12098537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
12100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
12110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
12140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
12150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
12160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
12175b85b092af404effd32aa513f9c45a0232d7ae81nicolasroard        mEditorPlaceHolder.hide();
12180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
12200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
1221bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
1222bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
1223f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void toggleImageStatePanel() {
1224fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidateOptionsMenu();
1225f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingImageStatePanel = !mShowingImageStatePanel;
1226f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1227f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (panel != null) {
1228f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (panel instanceof EditorPanel) {
1229f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                EditorPanel editorPanel = (EditorPanel) panel;
1230f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                editorPanel.showImageStatePanel(mShowingImageStatePanel);
1231f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            } else if (panel instanceof MainPanel) {
1232f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                MainPanel mainPanel = (MainPanel) panel;
1233f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mainPanel.showImageStatePanel(mShowingImageStatePanel);
1234f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
1235bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
1236bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
1237bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
1238860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void toggleVersionsPanel() {
1239860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingVersionsPanel = !mShowingVersionsPanel;
1240860af325f2030a03c526e8551a85230d17df7b15nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1241860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (panel != null && panel instanceof MainPanel) {
1242860af325f2030a03c526e8551a85230d17df7b15nicolasroard            MainPanel mainPanel = (MainPanel) panel;
1243860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mainPanel.loadCategoryVersionsPanel();
1244860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1245860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
1246860af325f2030a03c526e8551a85230d17df7b15nicolasroard
1247a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    @Override
1248a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    public void onConfigurationChanged(Configuration newConfig)
1249a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    {
1250a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        super.onConfigurationChanged(newConfig);
1251f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford
12523a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
1253f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        if (mMasterImage == null) {
1254f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford            return;
1255f7f24e806ef4646db3f49f637e86417d3a0bebf2John Hoford        }
12563a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
1257b9b95fb792c2b0f0b1ecbbcb30713b345475b332nicolasroard        fillCategories();
1258f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
1259f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
126064fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        if (mCurrentMenu != null) {
126164fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford            mCurrentMenu.dismiss();
126264fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford            mCurrentMenu = null;
126364fc2ed005e2f1dc9ed0b34481c46a370c244b86John Hoford        }
12646125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford        if (mCurrentDialog != null) {
12656125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford            mCurrentDialog.dismiss();
12666125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford            mCurrentDialog = null;
12676125a082a2b5ddc0d34a5198c5a7e826bd77e202John Hoford        }
1268f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        // mLoadBitmapTask==null implies you have looked at the intent
1269f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
1270f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.removeTinyPlanet();
12715300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford        }
127232cc4dd751569721aa19218b4d947145577060d0nicolasroard        stopLoadingIndicator();
1273a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    }
1274a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard
127563a7dac01d394523799939596b960cb03321798dJohn Hoford    public void setupMasterImage() {
12763a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
1277ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        HistoryManager historyManager = new HistoryManager();
1278ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        StateAdapter imageStateAdapter = new StateAdapter(this, 0);
1279588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        MasterImage.reset();
1280588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        mMasterImage = MasterImage.getImage();
1281ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setHistoryManager(historyManager);
1282ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setStateAdapter(imageStateAdapter);
128363a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.setActivity(this);
12844dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
12854dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
12864dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(true);
12874dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        } else {
12884dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(false);
12894dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        }
129063a7dac01d394523799939596b960cb03321798dJohn Hoford    }
129163a7dac01d394523799939596b960cb03321798dJohn Hoford
12922e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    void resetHistory() {
12936a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        HistoryManager adapter = mMasterImage.getHistory();
12949594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
1295ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        HistoryItem historyItem = adapter.getItem(0);
129632646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        ImagePreset original = null;
129732646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        if (RESET_TO_LOADED) {
129832646aabd8228e1494ba090a02ffb8adaa369127nicolasroard            original = new ImagePreset(historyItem.getImagePreset());
129932646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        } else {
130032646aabd8228e1494ba090a02ffb8adaa369127nicolasroard            original = new ImagePreset();
130132646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        }
130232646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        FilterRepresentation rep = null;
130332646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        if (historyItem != null) {
130432646aabd8228e1494ba090a02ffb8adaa369127nicolasroard            rep = historyItem.getFilterRepresentation();
130532646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        }
130632646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        mMasterImage.setPreset(original, rep, true);
13079594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
1308be9c8105b431de765f5811bfd170c899d1c8d3b3John Reck        backToMain();
13090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
13100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1311f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showDefaultImageView() {
1312f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mEditorPlaceHolder.hide();
1313f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mImageShow.setVisibility(View.VISIBLE);
1314f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilter(null);
1315f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(null);
1316f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
1317f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
1318f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void backToMain() {
1319f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1320f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
1321f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
1322f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
1323f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
1324f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        showDefaultImageView();
1325f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
1326f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
132775608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
132875608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
1329f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1330f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
1331f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mImageShow.hasModifications()) {
1332a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                done();
1333a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            } else {
1334a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                AlertDialog.Builder builder = new AlertDialog.Builder(this);
1335a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit);
1336a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() {
1337b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
1338a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
1339a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        saveImage();
1340a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
1341a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
1342e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
1343b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
1344a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
1345a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        done();
1346a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
1347a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
1348e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.show();
1349a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            }
1350f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
1351f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            backToMain();
135275608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
135375608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
1354e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
1355e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
1356a2c4bda1ed7b44085516b2e8f140637e4691bab1Ruben Brunk        Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
1357e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
1358e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
1359e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
13600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
13610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
13620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
13630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
13640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
13650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
13660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
13670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
13680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
13690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
13700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
137163a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.onHistoryItemClick(position);
13720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
13730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
13740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
13750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
13760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
13770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
13780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
13790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
13800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
13810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
13820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
138392e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
13840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
13850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
13860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
13870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
1388d49d53206a197b08ec4754d8751b6860e33d9f48John Reck                startLoadBitmap(selectedImageUri);
13890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
13900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
13910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
13920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
13936416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
13940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
1395d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        if (mImageShow.hasModifications()) {
1396d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            // Get the name of the album, to which the image will be saved
139724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            File saveDir = SaveImage.getFinalSaveDirectory(this, mSelectedImageUri);
1398d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
1399d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
1400d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            showSavingProgress(albumName);
1401d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            mImageShow.saveImage(this, null);
1402d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        } else {
14036416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            done();
14046416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
14056416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    }
14066416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1407a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk
14086416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public void done() {
1409d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        hideSavingProgress();
141052fa110135563740ebc27326afab4326bbb9b9f5John Hoford        if (mLoadBitmapTask != null) {
141152fa110135563740ebc27326afab4326bbb9b9f5John Hoford            mLoadBitmapTask.cancel(false);
141252fa110135563740ebc27326afab4326bbb9b9f5John Hoford        }
14136416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        finish();
14140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
14150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1416afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private void extractXMPData() {
1417afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        XMresults res = XmpPresets.extractXMPData(
1418afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                getBaseContext(), mMasterImage, getIntent().getData());
1419afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (res == null)
1420afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            return;
1421afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford
1422afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalImageUri = res.originalimage;
1423afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalPreset = res.preset;
1424afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    }
1425b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1426b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    public Uri getSelectedImageUri() {
1427b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        return mSelectedImageUri;
1428b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    }
1429b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
14309737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard    public void setHandlesSwipeForView(View view, float startX, float startY) {
1431860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (view != null) {
1432860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mHandlingSwipeButton = true;
1433860af325f2030a03c526e8551a85230d17df7b15nicolasroard        } else {
1434860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mHandlingSwipeButton = false;
1435860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1436860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mHandledSwipeView = view;
1437860af325f2030a03c526e8551a85230d17df7b15nicolasroard        int[] location = new int[2];
1438860af325f2030a03c526e8551a85230d17df7b15nicolasroard        view.getLocationInWindow(location);
14399737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard        mSwipeStartX = location[0] + startX;
1440860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mSwipeStartY = location[1] + startY;
1441860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
1442860af325f2030a03c526e8551a85230d17df7b15nicolasroard
1443860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public boolean dispatchTouchEvent (MotionEvent ev) {
1444860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (mHandlingSwipeButton) {
14459737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard            int direction = CategoryView.HORIZONTAL;
14469737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard            if (mHandledSwipeView instanceof CategoryView) {
14479737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                direction = ((CategoryView) mHandledSwipeView).getOrientation();
14489737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard            }
1449860af325f2030a03c526e8551a85230d17df7b15nicolasroard            if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
1450860af325f2030a03c526e8551a85230d17df7b15nicolasroard                float delta = ev.getY() - mSwipeStartY;
14519737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                float distance = mHandledSwipeView.getHeight();
14529737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                if (direction == CategoryView.VERTICAL) {
14539737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    delta = ev.getX() - mSwipeStartX;
14549737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    mHandledSwipeView.setTranslationX(delta);
14559737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    distance = mHandledSwipeView.getWidth();
14569737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                } else {
14579737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    mHandledSwipeView.setTranslationY(delta);
14589737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                }
1459860af325f2030a03c526e8551a85230d17df7b15nicolasroard                delta = Math.abs(delta);
14609737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                float transparency = Math.min(1, delta / distance);
1461860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setAlpha(1.f - transparency);
1462860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeViewLastDelta = delta;
1463860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
1464860af325f2030a03c526e8551a85230d17df7b15nicolasroard            if (ev.getActionMasked() == MotionEvent.ACTION_CANCEL
1465860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    || ev.getActionMasked() == MotionEvent.ACTION_UP) {
14669737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                mHandledSwipeView.setTranslationX(0);
1467860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setTranslationY(0);
1468860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setAlpha(1.f);
1469860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandlingSwipeButton = false;
14709737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                float distance = mHandledSwipeView.getHeight();
14719737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                if (direction == CategoryView.VERTICAL) {
14729737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                    distance = mHandledSwipeView.getWidth();
14739737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                }
14749737f3a18a8c302160e213afa30a4db710e41fb6nicolasroard                if (mHandledSwipeViewLastDelta > distance) {
1475860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    ((SwipableView) mHandledSwipeView).delete();
1476860af325f2030a03c526e8551a85230d17df7b15nicolasroard                }
1477860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
1478860af325f2030a03c526e8551a85230d17df7b15nicolasroard            return true;
1479860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1480860af325f2030a03c526e8551a85230d17df7b15nicolasroard        return super.dispatchTouchEvent(ev);
1481860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
14829f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard
148332cc4dd751569721aa19218b4d947145577060d0nicolasroard    public Point mHintTouchPoint = new Point();
148432cc4dd751569721aa19218b4d947145577060d0nicolasroard
148532cc4dd751569721aa19218b4d947145577060d0nicolasroard    public Point hintTouchPoint(View view) {
148632cc4dd751569721aa19218b4d947145577060d0nicolasroard        int location[] = new int[2];
148732cc4dd751569721aa19218b4d947145577060d0nicolasroard        view.getLocationOnScreen(location);
148832cc4dd751569721aa19218b4d947145577060d0nicolasroard        int x = mHintTouchPoint.x - location[0];
148932cc4dd751569721aa19218b4d947145577060d0nicolasroard        int y = mHintTouchPoint.y - location[1];
149032cc4dd751569721aa19218b4d947145577060d0nicolasroard        return new Point(x, y);
149132cc4dd751569721aa19218b4d947145577060d0nicolasroard    }
149232cc4dd751569721aa19218b4d947145577060d0nicolasroard
14939f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard    public void startTouchAnimation(View target, float x, float y) {
14949f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        final CategorySelected hint =
14959f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                (CategorySelected) findViewById(R.id.categorySelectedIndicator);
14969f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int location[] = new int[2];
14979f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        target.getLocationOnScreen(location);
149832cc4dd751569721aa19218b4d947145577060d0nicolasroard        mHintTouchPoint.x = (int) (location[0] + x);
149932cc4dd751569721aa19218b4d947145577060d0nicolasroard        mHintTouchPoint.y = (int) (location[1] + y);
15009f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int locationHint[] = new int[2];
15019f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        ((View)hint.getParent()).getLocationOnScreen(locationHint);
15029f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int dx = (int) (x - (hint.getWidth())/2);
15039f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        int dy = (int) (y - (hint.getHeight())/2);
15049f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.setTranslationX(location[0] - locationHint[0] + dx);
15059f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.setTranslationY(location[1] - locationHint[1] + dy);
15069f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.setVisibility(View.VISIBLE);
15079f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        hint.animate().scaleX(2).scaleY(2).alpha(0).withEndAction(new Runnable() {
15089f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            @Override
15099f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            public void run() {
15109f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setVisibility(View.INVISIBLE);
15119f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setScaleX(1);
15129f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setScaleY(1);
15139f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard                hint.setAlpha(1);
15149f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard            }
15159f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard        });
15169f452e09889199a28a86d9bd8f8fdaa8508ca0c1nicolasroard    }
15170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
1518