FilterShowActivity.java revision 860af325f2030a03c526e8551a85230d17df7b15
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;
320c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport android.graphics.Rect;
330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
3492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
353d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask;
3692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
37af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.os.Handler;
3824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.os.IBinder;
39fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport android.support.v4.app.DialogFragment;
40f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.support.v4.app.Fragment;
41fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentActivity;
42fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentTransaction;
43fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
4452fa110135563740ebc27326afab4326bbb9b9f5John Hofordimport android.util.Log;
45d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport android.util.TypedValue;
46f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Menu;
47f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.MenuItem;
48860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport android.view.MotionEvent;
49f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.View;
500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
51af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.view.ViewPropertyAnimator;
52f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.WindowManager;
53be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.AdapterView;
540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
55be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.FrameLayout;
56be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.ShareActionProvider;
570ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
58f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.widget.Toast;
59d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk
6092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
6124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.app.PhotoPage;
620addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
6392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
64d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.Action;
65d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.CategoryAdapter;
66d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.MainPanel;
67860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport com.android.gallery3d.filtershow.category.SwipableView;
68077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.data.UserPresetsManager;
69d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.BasicEditor;
70d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.Editor;
71077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorChanSat;
72d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorCrop;
73d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorDraw;
74077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorGrad;
75d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorManager;
76077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorMirror;
77d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorPanel;
78d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRedEye;
79d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRotate;
80d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorStraighten;
81d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
82d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
83d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterRepresentation;
84077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation;
85d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FiltersManager;
86d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.ImageFilter;
875180e681e1b68eae403b2740c609792ca44f77cenicolasroardimport com.android.gallery3d.filtershow.history.HistoryItem;
88077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.history.HistoryManager;
8992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
9063a7dac01d394523799939596b960cb03321798dJohn Hofordimport com.android.gallery3d.filtershow.imageshow.MasterImage;
91368ae73ad0627dac41709b925fc02a12548ab80dnicolasroardimport com.android.gallery3d.filtershow.imageshow.Spline;
92860af325f2030a03c526e8551a85230d17df7b15nicolasroardimport com.android.gallery3d.filtershow.info.InfoPanel;
93077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.pipeline.CachingPipeline;
94ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset;
9524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.pipeline.ProcessingService;
96fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.presets.PresetManagementDialog;
97fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroardimport com.android.gallery3d.filtershow.presets.UserPresetsAdapter;
9892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
99fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter;
10024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.tools.SaveImage;
101afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets;
102afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets.XMresults;
103077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunkimport com.android.gallery3d.filtershow.ui.ExportDialog;
1047592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton;
1050addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
106842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescuimport com.android.gallery3d.util.UsageStatistics;
107f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunkimport com.android.photos.data.GalleryBitmapPool;
10892e2341248e99c691f38820503984bc5e2f18811nicolasroard
10992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
110ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
11124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport java.util.ArrayList;
11292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
11392e2341248e99c691f38820503984bc5e2f18811nicolasroard
114fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener,
1150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        OnShareTargetSelectedListener {
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
117ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk    private String mAction = "";
118588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard    MasterImage mMasterImage = null;
1196416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1204dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard    private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb
1214dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
122a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
123a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
1240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
1250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
126bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    private View mSaveButton = null;
1270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1285aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford    private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this);
1295aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
1320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1335300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford    private boolean mShowingTinyPlanet = false;
134bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
135860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mShowingVersionsPanel = false;
136860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mShowingInformationPanel = false;
137bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
13892e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1400ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1410ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1420ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1430ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1440ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
145ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
14655550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
147d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private LoadBitmapTask mLoadBitmapTask;
1483d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
149afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private Uri mOriginalImageUri = null;
150afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private ImagePreset mOriginalPreset = null;
151c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
152b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    private Uri mSelectedImageUri = null;
153b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
154fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private UserPresetsManager mUserPresetsManager = null;
155fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private UserPresetsAdapter mUserPresetsAdapter = null;
156f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryLooksAdapter = null;
157f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryBordersAdapter = null;
158f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryGeometryAdapter = null;
159f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryFiltersAdapter = null;
160860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private CategoryAdapter mCategoryVersionsAdapter = null;
161f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mCurrentPanel = MainPanel.LOOKS;
162860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private Vector<FilterUserPresetRepresentation> mVersions =
163860af325f2030a03c526e8551a85230d17df7b15nicolasroard            new Vector<FilterUserPresetRepresentation>();
164860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private int mVersionsCounter = 0;
165860af325f2030a03c526e8551a85230d17df7b15nicolasroard
166860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private boolean mHandlingSwipeButton = false;
167860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private View mHandledSwipeView = null;
168860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private float mHandledSwipeViewLastDelta = 0;
169860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private float mSwipeStartY = 0;
1703a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
17124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ProcessingService mBoundService;
17224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private boolean mIsBound = false;
17324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
17424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public ProcessingService getProcessingService() {
17524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return mBoundService;
17624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
17724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
17824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public boolean isSimpleEditAction() {
17924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return !PhotoPage.ACTION_NEXTGEN_EDIT.equalsIgnoreCase(mAction);
18024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
18124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
18224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ServiceConnection mConnection = new ServiceConnection() {
18324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        public void onServiceConnected(ComponentName className, IBinder service) {
18424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            /*
18524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * This is called when the connection with the service has been
18624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * established, giving us the service object we can use to
18724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * interact with the service.  Because we have bound to a explicit
18824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * service that we know is running in our own process, we can
18924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * cast its IBinder to a concrete class and directly access it.
19024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             */
19124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService = ((ProcessingService.LocalBinder)service).getService();
19224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService.setFiltershowActivity(FilterShowActivity.this);
19324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService.onStart();
19424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
19524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
19624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        public void onServiceDisconnected(ComponentName className) {
19724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            /*
19824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * This is called when the connection with the service has been
19924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * unexpectedly disconnected -- that is, its process crashed.
20024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * Because it is running in our same process, we should never
20124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             * see this happen.
20224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard             */
20324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mBoundService = null;
20424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
20524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    };
20624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
20724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    void doBindService() {
20824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        /*
20924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * Establish a connection with the service.  We use an explicit
21024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * class name because we want a specific service implementation that
21124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * we know will be running in our own process (and thus won't be
21224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         * supporting component replacement by other applications).
21324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard         */
21424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        bindService(new Intent(FilterShowActivity.this, ProcessingService.class),
21524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard                mConnection, Context.BIND_AUTO_CREATE);
21624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mIsBound = true;
21724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
21824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
21924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    void doUnbindService() {
22024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        if (mIsBound) {
22124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            // Detach our existing connection.
22224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            unbindService(mConnection);
22324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            mIsBound = false;
22424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        }
22524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
22624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
22724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void setupPipeline() {
22824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        doBindService();
22924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ImageFilter.setActivityForMemoryToasts(this);
230fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager = new UserPresetsManager(this);
231fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsAdapter = new UserPresetsAdapter(this);
232fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mCategoryLooksAdapter = new CategoryAdapter(this);
23324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
23424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
23524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void updateUIAfterServiceStarted() {
23624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillCategories();
23724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        loadMainPanel();
23824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        setDefaultPreset();
23924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        extractXMPData();
24024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        processIntent();
24124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
24224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
2430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
2440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
2450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
2460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
247f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait);
248f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (onlyUsePortrait) {
249f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
250f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
25169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        MasterImage.setMaster(mMasterImage);
252f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
253f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        clearGalleryBitmapPool();
25424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        setupPipeline();
255f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
25663a7dac01d394523799939596b960cb03321798dJohn Hoford        setupMasterImage();
2573a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
2583a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        fillEditors();
2595448bf8095483574649afcc2add7f153670c7450nicolasroard
2603a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
261842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu        UsageStatistics.onContentViewChanged(UsageStatistics.COMPONENT_EDITOR, "Main");
262842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu        UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
263842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.CATEGORY_LIFECYCLE, UsageStatistics.LIFECYCLE_START);
2643a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
2655ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
266f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public boolean isShowingImageStatePanel() {
267f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mShowingImageStatePanel;
268f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
269f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
270f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadMainPanel() {
271f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (findViewById(R.id.main_panel_container) == null) {
272f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
273f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
274f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MainPanel panel = new MainPanel();
275f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
276f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
277f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.commit();
278f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
279f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
280f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadEditorPanel(FilterRepresentation representation,
28100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                                final Editor currentEditor) {
282f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation.getEditorId() == ImageOnlyEditor.ID) {
283f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            currentEditor.reflectCurrentFilter();
284f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
285f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
28600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        final int currentId = currentEditor.getID();
28700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Runnable showEditor = new Runnable() {
28800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            @Override
28900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            public void run() {
29000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                EditorPanel panel = new EditorPanel();
29100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                panel.setEditor(currentId);
29200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
29300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG));
29400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
29500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.commit();
29600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            }
29700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        };
29800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
29900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        boolean doAnimation = false;
30000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (mShowingImageStatePanel
30100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
30200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            doAnimation = true;
30300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
30400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (doAnimation && main != null && main instanceof MainPanel) {
30500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            MainPanel mainPanel = (MainPanel) main;
30600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View container = mainPanel.getView().findViewById(R.id.category_panel_container);
30700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
30800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            int panelHeight = container.getHeight() + bottom.getHeight();
309af59322ac944e6e17aaf718045949a3352016945nicolasroard            ViewPropertyAnimator anim = mainPanel.getView().animate();
310af59322ac944e6e17aaf718045949a3352016945nicolasroard            anim.translationY(panelHeight).start();
311af59322ac944e6e17aaf718045949a3352016945nicolasroard            final Handler handler = new Handler();
312af59322ac944e6e17aaf718045949a3352016945nicolasroard            handler.postDelayed(showEditor, anim.getDuration());
31300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        } else {
31400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            showEditor.run();
31500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
316f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
317f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
318860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private void hideInformationPanel() {
319860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FrameLayout infoLayout = (FrameLayout) findViewById(R.id.central_panel_container);
320860af325f2030a03c526e8551a85230d17df7b15nicolasroard        infoLayout.setVisibility(View.GONE);
321860af325f2030a03c526e8551a85230d17df7b15nicolasroard        Fragment fragment = getSupportFragmentManager().findFragmentByTag(InfoPanel.FRAGMENT_TAG);
322860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (fragment != null) {
323860af325f2030a03c526e8551a85230d17df7b15nicolasroard            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
324860af325f2030a03c526e8551a85230d17df7b15nicolasroard            transaction.remove(fragment);
325860af325f2030a03c526e8551a85230d17df7b15nicolasroard            transaction.commit();
326860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
327860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingInformationPanel = false;
328860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
329860af325f2030a03c526e8551a85230d17df7b15nicolasroard
330860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void showInformationPanel() {
331860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingInformationPanel = !mShowingInformationPanel;
332860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (!mShowingInformationPanel) {
333860af325f2030a03c526e8551a85230d17df7b15nicolasroard            hideInformationPanel();
334860af325f2030a03c526e8551a85230d17df7b15nicolasroard            showDefaultImageView();
335860af325f2030a03c526e8551a85230d17df7b15nicolasroard            return;
336860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
337860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
338860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
339860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FrameLayout infoLayout = (FrameLayout) findViewById(R.id.central_panel_container);
340860af325f2030a03c526e8551a85230d17df7b15nicolasroard        infoLayout.setVisibility(View.VISIBLE);
341860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mEditorPlaceHolder.hide();
342860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mImageShow.setVisibility(View.GONE);
343860af325f2030a03c526e8551a85230d17df7b15nicolasroard
344860af325f2030a03c526e8551a85230d17df7b15nicolasroard        InfoPanel panel = new InfoPanel();
345860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.replace(R.id.central_panel_container, panel, InfoPanel.FRAGMENT_TAG);
346860af325f2030a03c526e8551a85230d17df7b15nicolasroard        transaction.commit();
347860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
348860af325f2030a03c526e8551a85230d17df7b15nicolasroard
3493a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void loadXML() {
3500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
3513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3529594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
353786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
354786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
355786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
356bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton = actionBar.getCustomView();
357bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton.setOnClickListener(new OnClickListener() {
358786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
359786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
360786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
361786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
362786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
3630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
3650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
3660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3673a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setupEditors();
3685aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
369733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        mEditorPlaceHolder.hide();
3700c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        mImageShow.bindAsImageLoadListener();
37192e2341248e99c691f38820503984bc5e2f18811nicolasroard
3726019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard        setupStatePanel();
3736019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    }
3746019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard
37524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void fillCategories() {
37624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillLooks();
377fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        loadUserPresets();
37824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillBorders();
37924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillTools();
38024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        fillEffects();
381860af325f2030a03c526e8551a85230d17df7b15nicolasroard        fillVersions();
38224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
38324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
3846019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    public void setupStatePanel() {
3850c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        MasterImage.getImage().setHistoryManager(mMasterImage.getHistory());
38638fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard    }
38738fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard
388860af325f2030a03c526e8551a85230d17df7b15nicolasroard    private void fillVersions() {
389860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter = new CategoryAdapter(this);
390860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.setShowAddButton(true);
391860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
392860af325f2030a03c526e8551a85230d17df7b15nicolasroard
393860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void updateVersions() {
394860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.clear();
395860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation originalRep = new FilterUserPresetRepresentation(
396860af325f2030a03c526e8551a85230d17df7b15nicolasroard                getString(R.string.filtershow_version_original), new ImagePreset(), -1);
397860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.add(
398860af325f2030a03c526e8551a85230d17df7b15nicolasroard                new Action(this, originalRep, Action.FULL_VIEW));
399860af325f2030a03c526e8551a85230d17df7b15nicolasroard        ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
400860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation currentRep = new FilterUserPresetRepresentation(
401860af325f2030a03c526e8551a85230d17df7b15nicolasroard                getString(R.string.filtershow_version_current), current, -1);
402860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.add(
403860af325f2030a03c526e8551a85230d17df7b15nicolasroard                new Action(this, currentRep, Action.FULL_VIEW));
404860af325f2030a03c526e8551a85230d17df7b15nicolasroard        for (FilterUserPresetRepresentation rep : mVersions) {
405860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mCategoryVersionsAdapter.add(
406860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    new Action(this, rep, Action.FULL_VIEW));
407860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
408860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mCategoryVersionsAdapter.notifyDataSetInvalidated();
409860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
410860af325f2030a03c526e8551a85230d17df7b15nicolasroard
411860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void addCurrentVersion() {
412860af325f2030a03c526e8551a85230d17df7b15nicolasroard        ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
413860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersionsCounter++;
414860af325f2030a03c526e8551a85230d17df7b15nicolasroard        FilterUserPresetRepresentation rep = new FilterUserPresetRepresentation(
415860af325f2030a03c526e8551a85230d17df7b15nicolasroard                "" + mVersionsCounter, current, -1);
416860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersions.add(rep);
417860af325f2030a03c526e8551a85230d17df7b15nicolasroard        updateVersions();
418860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
419860af325f2030a03c526e8551a85230d17df7b15nicolasroard
420860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void removeVersion(Action action) {
421860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mVersions.remove(action.getRepresentation());
422860af325f2030a03c526e8551a85230d17df7b15nicolasroard        updateVersions();
423860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
424860af325f2030a03c526e8551a85230d17df7b15nicolasroard
42524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillEffects() {
4263a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
42724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getEffects();
428f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryFiltersAdapter = new CategoryAdapter(this);
429f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
430f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
431f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
432f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
433f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.add(new Action(this, representation));
434f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
4353a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4363a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
43724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillTools() {
43838fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
43924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTools();
440f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryGeometryAdapter = new CategoryAdapter(this);
441f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
442f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.add(new Action(this, representation));
443f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
4443a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4453a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4463a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void processIntent() {
4470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
448a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
449a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
450a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        }
451a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu
452ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk        mAction = intent.getAction();
453b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        mSelectedImageUri = intent.getData();
454b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        Uri loadUri = mSelectedImageUri;
455afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (mOriginalImageUri != null) {
456b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            loadUri = mOriginalImageUri;
457afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        }
458b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        if (loadUri != null) {
459b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            startLoadBitmap(loadUri);
4600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
4610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
4620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
4630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
4640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
4653a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setupEditors() {
4663a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer));
4673a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        EditorManager.addEditors(mEditorPlaceHolder);
4683a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setOldViews(mImageViews);
4693a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4703a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4713a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void fillEditors() {
472bc8e077e77cf6f0dda8efd8318b8a8e7eda16f61John Hoford        mEditorPlaceHolder.addEditor(new EditorChanSat());
473e162b032fe387eabbd69d367dae6fe7003e850a1John Hoford        mEditorPlaceHolder.addEditor(new EditorGrad());
4743a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorDraw());
4753a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new BasicEditor());
4763a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new ImageOnlyEditor());
4773a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorTinyPlanet());
4783a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRedEye());
4793a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorCrop());
480b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        mEditorPlaceHolder.addEditor(new EditorMirror());
4813a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRotate());
4823a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorStraighten());
4833a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4843a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4853a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setDefaultValues() {
4863a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Resources res = getResources();
4873a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4883a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        // TODO: get those values from XML.
4893a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
4903a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
4913a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
4923a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
4933a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
4943a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
4953a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
4963a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
4973a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
4983a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
499d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private void startLoadBitmap(Uri uri) {
50000914f56c3390caa224b1c9fc07624665de40113John Reck        final View loading = findViewById(R.id.loading);
501733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        final View imageShow = findViewById(R.id.imageShow);
502733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        imageShow.setVisibility(View.INVISIBLE);
503733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        loading.setVisibility(View.VISIBLE);
504f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingTinyPlanet = false;
505f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mLoadBitmapTask = new LoadBitmapTask();
506d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask.execute(uri);
507d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    }
508d49d53206a197b08ec4754d8751b6860e33d9f48John Reck
509f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private void fillBorders() {
51024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
51124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> borders = filtersManager.getBorders();
5124c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford
513f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        for (int i = 0; i < borders.size(); i++) {
51424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            FilterRepresentation filter = borders.get(i);
5153cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk            filter.setName(getString(R.string.borders));
516f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk            if (i == 0) {
5173cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk                filter.setName(getString(R.string.none));
5189090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
519f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
520f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
521f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryBordersAdapter = new CategoryAdapter(this);
522f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : borders) {
523f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
524f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
5259090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
52600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW));
5279090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
5289090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
5299090141f56b4e2000704d0c4a778d3a819821726nicolasroard
530fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public UserPresetsAdapter getUserPresetsAdapter() {
531fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        return mUserPresetsAdapter;
532fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
533fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
534f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryLooksAdapter() {
535f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryLooksAdapter;
536f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
537f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
538f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryBordersAdapter() {
539f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryBordersAdapter;
540f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
541f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
542f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryGeometryAdapter() {
543f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryGeometryAdapter;
544f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
545f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
546f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryFiltersAdapter() {
547f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryFiltersAdapter;
548f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
549f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
550860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public CategoryAdapter getCategoryVersionsAdapter() {
551860af325f2030a03c526e8551a85230d17df7b15nicolasroard        return mCategoryVersionsAdapter;
552860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
553860af325f2030a03c526e8551a85230d17df7b15nicolasroard
554f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
555f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
556f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
557f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
558f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
559f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
560f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        copy.removeFilter(filterRepresentation);
561ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
562f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
563f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            FilterRepresentation lastRepresentation = copy.getLastRepresentation();
564f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
565f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
566f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
567f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
568f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
569f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
570f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
571f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
572f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
573f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
574f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
575f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
576f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
577f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
578f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation == null) {
579f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            copy.addFilter(filterRepresentation);
580b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        } else if (filterRepresentation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) {
581b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk            filterRepresentation = representation;
582f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
583c9ca6d1eb85a71b7667f4c25d879e78cce16ac4cztenghui            if (filterRepresentation.allowsSingleInstanceOnly()) {
584d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // Don't just update the filter representation. Centralize the
585d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // logic in the addFilter(), such that we can keep "None" as
586d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // null.
587d2e9ea0ce1949e192e80ce806e702606694440acztenghui                copy.removeFilter(representation);
588d2e9ea0ce1949e192e80ce806e702606694440acztenghui                copy.addFilter(filterRepresentation);
5899090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
5909090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
591ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, filterRepresentation, true);
592f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
593f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
594f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
595f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showRepresentation(FilterRepresentation representation) {
596f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (representation == null) {
597f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford            return;
598f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        }
599e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard
600b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        useFilterRepresentation(representation);
601f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
602f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        // show representation
603f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId());
604f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadEditorPanel(representation, mCurrentEditor);
605860af325f2030a03c526e8551a85230d17df7b15nicolasroard        hideInformationPanel();
606f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
607f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
608f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public Editor getEditor(int editorID) {
609f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mEditorPlaceHolder.getEditor(editorID);
610f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
611f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
612f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void setCurrentPanel(int currentPanel) {
613f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCurrentPanel = currentPanel;
614f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
615f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
616f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public int getCurrentPanel() {
617f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCurrentPanel;
6189090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
6199090141f56b4e2000704d0c4a778d3a819821726nicolasroard
620acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    public void updateCategories() {
621acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        ImagePreset preset = mMasterImage.getPreset();
622acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryLooksAdapter.reflectImagePreset(preset);
623acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryBordersAdapter.reflectImagePreset(preset);
624acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    }
625acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard
626be84355fddceb9690eef752707c42457ea251e77nicolasroard    private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
627be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
628be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected Boolean doInBackground(Void... params) {
6290c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            MasterImage master = MasterImage.getImage();
6300c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Rect originalBounds = master.getOriginalBounds();
6310c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (master.supportsHighRes()) {
6320c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                int highresPreviewSize = master.getOriginalBitmapLarge().getWidth() * 2;
6330c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                if (highresPreviewSize > originalBounds.width()) {
6340c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    highresPreviewSize = originalBounds.width();
6350c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                }
63647886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Rect bounds = new Rect();
63747886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(),
63847886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getActivity(), highresPreviewSize,
63947886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getOrientation(), bounds);
64047886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                master.setOriginalBounds(bounds);
6410c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.setOriginalBitmapHighres(originalHires);
642db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mBoundService.setOriginalBitmapHighres(originalHires);
6430c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.warnListeners();
6440c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            }
645be84355fddceb9690eef752707c42457ea251e77nicolasroard            return true;
646be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
647be84355fddceb9690eef752707c42457ea251e77nicolasroard
648be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
649be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected void onPostExecute(Boolean result) {
6500c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
651be84355fddceb9690eef752707c42457ea251e77nicolasroard            if (highresBitmap != null) {
6520c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                float highResPreviewScale = (float) highresBitmap.getWidth()
6530c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                        / (float) MasterImage.getImage().getOriginalBounds().width();
654db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mBoundService.setHighresPreviewScaleFactor(highResPreviewScale);
655be84355fddceb9690eef752707c42457ea251e77nicolasroard            }
656be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
657be84355fddceb9690eef752707c42457ea251e77nicolasroard    }
658be84355fddceb9690eef752707c42457ea251e77nicolasroard
6598965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
660d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        int mBitmapSize;
6613d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
662f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        public LoadBitmapTask() {
663d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mBitmapSize = getScreenImageSize();
6643d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
6653d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
6663d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
667d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        protected Boolean doInBackground(Uri... params) {
6680c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) {
6698965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return false;
6708965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
6710c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity()));
6728965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            return true;
6733d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
6743d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
6753d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
6768965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk        protected void onProgressUpdate(Boolean... values) {
67700914f56c3390caa224b1c9fc07624665de40113John Reck            super.onProgressUpdate(values);
6786416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (isCancelled()) {
6798965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return;
6806416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
6818965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (values[0]) {
6825300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford                mShowingTinyPlanet = true;
6838965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
68400914f56c3390caa224b1c9fc07624665de40113John Reck        }
68500914f56c3390caa224b1c9fc07624665de40113John Reck
68600914f56c3390caa224b1c9fc07624665de40113John Reck        @Override
6873d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        protected void onPostExecute(Boolean result) {
68869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            MasterImage.setMaster(mMasterImage);
6893d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (isCancelled()) {
6903d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                return;
6913d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
692588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard
6938965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (!result) {
6948965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                cannotLoadImage();
6953d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
6968965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk
69752fa110135563740ebc27326afab4326bbb9b9f5John Hoford            if (null == CachingPipeline.getRenderScriptContext()){
69852fa110135563740ebc27326afab4326bbb9b9f5John Hoford                Log.v(LOGTAG,"RenderScript context destroyed during load");
69952fa110135563740ebc27326afab4326bbb9b9f5John Hoford                return;
70052fa110135563740ebc27326afab4326bbb9b9f5John Hoford            }
701733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View loading = findViewById(R.id.loading);
702733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            loading.setVisibility(View.GONE);
703733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View imageShow = findViewById(R.id.imageShow);
704733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            imageShow.setVisibility(View.VISIBLE);
705733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard
7060c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
707db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mBoundService.setOriginalBitmap(largeBitmap);
708860af325f2030a03c526e8551a85230d17df7b15nicolasroard            MasterImage.getImage().resetGeometryImages();
709db5d060e8077f70d650e1ce56618f953114551e0nicolasroard
7100c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            float previewScale = (float) largeBitmap.getWidth()
7110c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    / (float) MasterImage.getImage().getOriginalBounds().width();
712db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mBoundService.setPreviewScaleFactor(previewScale);
713f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mShowingTinyPlanet) {
714f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mCategoryFiltersAdapter.removeTinyPlanet();
715f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
716f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.imageLoaded();
717f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryBordersAdapter.imageLoaded();
718f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.imageLoaded();
719f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.imageLoaded();
720d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask = null;
721ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk
722afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            if (mOriginalPreset != null) {
723d2e9ea0ce1949e192e80ce806e702606694440acztenghui                MasterImage.getImage().setLoadedPreset(mOriginalPreset);
724ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                MasterImage.getImage().setPreset(mOriginalPreset,
725ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                        mOriginalPreset.getLastRepresentation(), true);
726afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                mOriginalPreset = null;
727afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            }
728c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
729f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (mAction == TINY_PLANET_ACTION) {
730f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
731ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk            }
732be84355fddceb9690eef752707c42457ea251e77nicolasroard            LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask();
733be84355fddceb9690eef752707c42457ea251e77nicolasroard            highresLoad.execute();
7343d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            super.onPostExecute(result);
7353d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
7363d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
7373d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
7383d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
739f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    private void clearGalleryBitmapPool() {
740f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        (new AsyncTask<Void, Void, Void>() {
741f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            @Override
742f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            protected Void doInBackground(Void... params) {
743f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                // Free memory held in Gallery's Bitmap pool.  May be O(n) for n bitmaps.
744f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                GalleryBitmapPool.getInstance().clear();
745f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                return null;
746f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            }
747f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        }).execute();
748f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    }
749f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
7503d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    @Override
7513d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    protected void onDestroy() {
752d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (mLoadBitmapTask != null) {
753d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask.cancel(false);
7543d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
755fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.close();
75624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        doUnbindService();
7573d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        super.onDestroy();
7583d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
7593d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
76047886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // TODO: find a more robust way of handling image size selection
76147886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // for high screen densities.
7620f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
76347886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        DisplayMetrics outMetrics = new DisplayMetrics();
76447886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
76547886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        return (int) Math.max(outMetrics.heightPixels, outMetrics.widthPixels);
766fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
767fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
7680addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
769ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
770ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
771ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
772ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
773ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
774ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
775ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
776ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
777ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
7780addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
7790addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
7800addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
7810addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
7820addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
7830addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
7840addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
785ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
786ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
787ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
788ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
789ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
790ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
79108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
79208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
793ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
794ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
795ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
7960ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
7970ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
7980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
7990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
8000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
8010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
8020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
8030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
8040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
8050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
806ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
8070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
8080ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
8090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
8110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
81292e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
81392e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
8140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
8150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
8160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
8170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
8180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
8190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
8200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
8220addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
8230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
8240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
8250ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
8260ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
8280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
8290ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
8300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
8310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
83224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mSharedOutputFile = SaveImage.getNewFile(this, MasterImage.getImage().getUri());
8330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
8340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
8350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
8360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
8370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
8380ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
8399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
8409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
8419594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
842bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
843bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
844bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
8459594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
846bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
8479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
8480ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
8490ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
8500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
8510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
85223e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard
85323e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem undoItem = menu.findItem(R.id.undoButton);
85423e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem redoItem = menu.findItem(R.id.redoButton);
85523e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
85663a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
8579594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return true;
8589594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
8599594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
86092e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
8616e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
8626e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
8636e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
8646e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
8656e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
8666e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
8676e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
8686e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
8696e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
8706e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
8716e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
8726e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
8736e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
8746e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
8756e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
8766e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
8779594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
8789594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
8799594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
8806a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
8819594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
88263a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
883a7a6a3a5efaf62cdd5d562a9141678671952d27dJohn Hoford                backToMain();
8849594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
885842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
886842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Undo");
8879594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
8889594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
8899594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
8906a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
8919594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
89263a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
8939594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
894842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
895842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Redo");
8969594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
8979594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
898f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
899f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
900842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
901842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "ResetHistory");
902f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
903f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
904bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
905bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
906842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
907842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS,
908842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        mShowingImageStatePanel ? "ShowPanel" : "HidePanel");
909bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
910bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
911568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk            case R.id.exportFlattenButton: {
912077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk                showExportOptionsDialog();
913568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk                return true;
914568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk            }
9159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
9169594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
9179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
9189594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
919fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            case R.id.manageUserPresets: {
920fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                manageUserPresets();
921fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                return true;
922fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            }
923860af325f2030a03c526e8551a85230d17df7b15nicolasroard            case R.id.showInfoPanel: {
924860af325f2030a03c526e8551a85230d17df7b15nicolasroard                showInformationPanel();
925860af325f2030a03c526e8551a85230d17df7b15nicolasroard                return true;
926860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
9279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
9289594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
9299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
9309594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
931fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void manageUserPresets() {
932fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        DialogFragment dialog = new PresetManagementDialog();
933fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        dialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
934fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
935fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
936077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk    private void showExportOptionsDialog() {
937077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk        DialogFragment dialog = new ExportDialog();
938077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk        dialog.show(getSupportFragmentManager(), "ExportDialogFragment");
939077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk    }
940077e718ecb6eb07997ad7c458d38eb21b3b2e6f9Ruben Brunk
941fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateUserPresetsFromAdapter(UserPresetsAdapter adapter) {
942fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> representations =
943fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                adapter.getDeletedRepresentations();
944fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (FilterUserPresetRepresentation representation : representations) {
945fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            deletePreset(representation.getId());
946fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
947fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> changedRepresentations =
948fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                adapter.getChangedRepresentations();
949fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (FilterUserPresetRepresentation representation : changedRepresentations) {
950fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            updatePreset(representation);
951fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
952fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        adapter.clearDeletedRepresentations();
953fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        adapter.clearChangedRepresentations();
954fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        loadUserPresets();
955fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
956fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
957fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void loadUserPresets() {
958fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.load();
959fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
960fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
961fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void updateUserPresetsFromManager() {
962fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        ArrayList<FilterUserPresetRepresentation> presets = mUserPresetsManager.getRepresentations();
963fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        if (presets == null) {
964fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            return;
965fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
966fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        if (mCategoryLooksAdapter != null) {
967fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            fillLooks();
968fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
969fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsAdapter.clear();
970fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        for (int i = 0; i < presets.size(); i++) {
971fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            FilterUserPresetRepresentation representation = presets.get(i);
972fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            mCategoryLooksAdapter.add(
973fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard                    new Action(this, representation, Action.FULL_VIEW));
974fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard            mUserPresetsAdapter.add(new Action(this, representation, Action.FULL_VIEW));
975fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        }
976fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mCategoryLooksAdapter.notifyDataSetInvalidated();
977fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
978fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
979fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
980fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    public void saveCurrentImagePreset() {
981fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.save(MasterImage.getImage().getPreset());
982fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
983fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
984fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void deletePreset(int id) {
985fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.delete(id);
986fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
987fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
988fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    private void updatePreset(FilterUserPresetRepresentation representation) {
989fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mUserPresetsManager.update(representation);
990fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard    }
991fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard
992bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    public void enableSave(boolean enable) {
993545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        if (mSaveButton != null) {
994bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu            mSaveButton.setEnabled(enable);
995545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        }
996bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    }
997bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu
99824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private void fillLooks() {
99924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
100024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getLooks();
1001f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
1002fa474a198019851ecc3824a1dfbac94cd1928efcnicolasroard        mCategoryLooksAdapter.clear();
1003f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
1004f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
1005f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
1006f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
1007f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        }
10083a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
10090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10103a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    public void setDefaultPreset() {
10110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
1012ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset preset = new ImagePreset(); // empty
1013ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
10140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
10170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
101892e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
10190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
10210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
10228537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
10230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
10240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
10270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
10280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
10290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
10305b85b092af404effd32aa513f9c45a0232d7ae81nicolasroard        mEditorPlaceHolder.hide();
10310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
1034bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
1035bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
1036f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void toggleImageStatePanel() {
1037fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidateOptionsMenu();
1038f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingImageStatePanel = !mShowingImageStatePanel;
1039f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1040f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (panel != null) {
1041f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (panel instanceof EditorPanel) {
1042f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                EditorPanel editorPanel = (EditorPanel) panel;
1043f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                editorPanel.showImageStatePanel(mShowingImageStatePanel);
1044f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            } else if (panel instanceof MainPanel) {
1045f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                MainPanel mainPanel = (MainPanel) panel;
1046f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mainPanel.showImageStatePanel(mShowingImageStatePanel);
1047f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
1048bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
1049bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
1050bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
1051860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void toggleVersionsPanel() {
1052860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mShowingVersionsPanel = !mShowingVersionsPanel;
1053860af325f2030a03c526e8551a85230d17df7b15nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1054860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (panel != null && panel instanceof MainPanel) {
1055860af325f2030a03c526e8551a85230d17df7b15nicolasroard            MainPanel mainPanel = (MainPanel) panel;
1056860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mainPanel.loadCategoryVersionsPanel();
1057860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1058860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
1059860af325f2030a03c526e8551a85230d17df7b15nicolasroard
1060a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    @Override
1061a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    public void onConfigurationChanged(Configuration newConfig)
1062a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    {
1063a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        super.onConfigurationChanged(newConfig);
10643a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
10653a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
1066b9b95fb792c2b0f0b1ecbbcb30713b345475b332nicolasroard        fillCategories();
1067f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
1068f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
1069f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        // mLoadBitmapTask==null implies you have looked at the intent
1070f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
1071f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.removeTinyPlanet();
10725300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford        }
10733a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        final View loading = findViewById(R.id.loading);
10743a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loading.setVisibility(View.GONE);
1075a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    }
1076a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard
107763a7dac01d394523799939596b960cb03321798dJohn Hoford    public void setupMasterImage() {
10783a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
1079ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        HistoryManager historyManager = new HistoryManager();
1080ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        StateAdapter imageStateAdapter = new StateAdapter(this, 0);
1081588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        MasterImage.reset();
1082588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        mMasterImage = MasterImage.getImage();
1083ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setHistoryManager(historyManager);
1084ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setStateAdapter(imageStateAdapter);
108563a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.setActivity(this);
10864dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
10874dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
10884dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(true);
10894dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        } else {
10904dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(false);
10914dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        }
109263a7dac01d394523799939596b960cb03321798dJohn Hoford    }
109363a7dac01d394523799939596b960cb03321798dJohn Hoford
10942e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    void resetHistory() {
10956a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        HistoryManager adapter = mMasterImage.getHistory();
10969594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
1097ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        HistoryItem historyItem = adapter.getItem(0);
1098ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset original = new ImagePreset(historyItem.getImagePreset());
1099ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(original, historyItem.getFilterRepresentation(), true);
11009594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
1101be9c8105b431de765f5811bfd170c899d1c8d3b3John Reck        backToMain();
11020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1104f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showDefaultImageView() {
1105860af325f2030a03c526e8551a85230d17df7b15nicolasroard        hideInformationPanel();
1106f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mEditorPlaceHolder.hide();
1107f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mImageShow.setVisibility(View.VISIBLE);
1108f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilter(null);
1109f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(null);
1110f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
1111f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
1112f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void backToMain() {
1113f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1114f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
1115f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
1116f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
1117f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
1118f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        showDefaultImageView();
1119f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
1120f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
112175608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
112275608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
1123f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1124f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
1125f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mImageShow.hasModifications()) {
1126a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                done();
1127a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            } else {
1128a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                AlertDialog.Builder builder = new AlertDialog.Builder(this);
1129a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit);
1130a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() {
1131b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
1132a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
1133a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        saveImage();
1134a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
1135a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
1136e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
1137b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
1138a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
1139a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        done();
1140a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
1141a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
1142e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.show();
1143a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            }
1144f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
1145f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            backToMain();
114675608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
114775608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
1148e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
1149e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
1150a2c4bda1ed7b44085516b2e8f140637e4691bab1Ruben Brunk        Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
1151e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
1152e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
1153e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
11540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
11550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
11570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
11580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
11590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
11600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
11630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
11640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
116563a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.onHistoryItemClick(position);
11660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
11670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
11700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
11710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
11720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
11730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
11740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
11750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
117792e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
11780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
11790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
11800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
11810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
1182d49d53206a197b08ec4754d8751b6860e33d9f48John Reck                startLoadBitmap(selectedImageUri);
11830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
11840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
11850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
11860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
11876416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
11880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
1189d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        if (mImageShow.hasModifications()) {
1190d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            // Get the name of the album, to which the image will be saved
119124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard            File saveDir = SaveImage.getFinalSaveDirectory(this, mSelectedImageUri);
1192d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
1193d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
1194d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            showSavingProgress(albumName);
1195d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            mImageShow.saveImage(this, null);
1196d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        } else {
11976416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            done();
11986416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
11996416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    }
12006416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1201a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk
12026416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public void done() {
1203d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        hideSavingProgress();
120452fa110135563740ebc27326afab4326bbb9b9f5John Hoford        if (mLoadBitmapTask != null) {
120552fa110135563740ebc27326afab4326bbb9b9f5John Hoford            mLoadBitmapTask.cancel(false);
120652fa110135563740ebc27326afab4326bbb9b9f5John Hoford        }
12076416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        finish();
12080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
12090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1210afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private void extractXMPData() {
1211afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        XMresults res = XmpPresets.extractXMPData(
1212afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                getBaseContext(), mMasterImage, getIntent().getData());
1213afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (res == null)
1214afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            return;
1215afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford
1216afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalImageUri = res.originalimage;
1217afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalPreset = res.preset;
1218afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    }
1219b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1220b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    public Uri getSelectedImageUri() {
1221b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        return mSelectedImageUri;
1222b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    }
1223b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1224860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public void setHandlesSwipeForView(View view, float startY) {
1225860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (view != null) {
1226860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mHandlingSwipeButton = true;
1227860af325f2030a03c526e8551a85230d17df7b15nicolasroard        } else {
1228860af325f2030a03c526e8551a85230d17df7b15nicolasroard            mHandlingSwipeButton = false;
1229860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1230860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mHandledSwipeView = view;
1231860af325f2030a03c526e8551a85230d17df7b15nicolasroard        int[] location = new int[2];
1232860af325f2030a03c526e8551a85230d17df7b15nicolasroard        view.getLocationInWindow(location);
1233860af325f2030a03c526e8551a85230d17df7b15nicolasroard        mSwipeStartY = location[1] + startY;
1234860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
1235860af325f2030a03c526e8551a85230d17df7b15nicolasroard
1236860af325f2030a03c526e8551a85230d17df7b15nicolasroard    public boolean dispatchTouchEvent (MotionEvent ev) {
1237860af325f2030a03c526e8551a85230d17df7b15nicolasroard        if (mHandlingSwipeButton) {
1238860af325f2030a03c526e8551a85230d17df7b15nicolasroard            if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
1239860af325f2030a03c526e8551a85230d17df7b15nicolasroard                float delta = ev.getY() - mSwipeStartY;
1240860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setTranslationY(delta);
1241860af325f2030a03c526e8551a85230d17df7b15nicolasroard                delta = Math.abs(delta);
1242860af325f2030a03c526e8551a85230d17df7b15nicolasroard                float transparency = Math.min(1, delta / mHandledSwipeView.getHeight());
1243860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setAlpha(1.f - transparency);
1244860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeViewLastDelta = delta;
1245860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
1246860af325f2030a03c526e8551a85230d17df7b15nicolasroard            if (ev.getActionMasked() == MotionEvent.ACTION_CANCEL
1247860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    || ev.getActionMasked() == MotionEvent.ACTION_UP) {
1248860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setTranslationY(0);
1249860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandledSwipeView.setAlpha(1.f);
1250860af325f2030a03c526e8551a85230d17df7b15nicolasroard                mHandlingSwipeButton = false;
1251860af325f2030a03c526e8551a85230d17df7b15nicolasroard                if (mHandledSwipeViewLastDelta > mHandledSwipeView.getHeight()) {
1252860af325f2030a03c526e8551a85230d17df7b15nicolasroard                    ((SwipableView) mHandledSwipeView).delete();
1253860af325f2030a03c526e8551a85230d17df7b15nicolasroard                }
1254860af325f2030a03c526e8551a85230d17df7b15nicolasroard            }
1255860af325f2030a03c526e8551a85230d17df7b15nicolasroard            return true;
1256860af325f2030a03c526e8551a85230d17df7b15nicolasroard        }
1257860af325f2030a03c526e8551a85230d17df7b15nicolasroard        return super.dispatchTouchEvent(ev);
1258860af325f2030a03c526e8551a85230d17df7b15nicolasroard    }
12590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
1260