FilterShowActivity.java revision 47886ac74f2874633d4c1284b91c33117f056581
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;
220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues;
230c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport android.content.Context;
24a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunkimport android.content.DialogInterface;
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent;
26f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.content.pm.ActivityInfo;
27a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroardimport android.content.res.Configuration;
280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources;
29457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.Bitmap;
30fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.graphics.Point;
310c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport android.graphics.Rect;
320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
3392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri;
343d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask;
3592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle;
36af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.os.Handler;
37f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.support.v4.app.Fragment;
38fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentActivity;
39fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentTransaction;
40fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics;
4152fa110135563740ebc27326afab4326bbb9b9f5John Hofordimport android.util.Log;
42d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport android.util.TypedValue;
43f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Display;
44f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Menu;
45f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.MenuItem;
46f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.View;
470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener;
48af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.view.ViewPropertyAnimator;
49f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.WindowManager;
50be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.AdapterView;
510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener;
52be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.FrameLayout;
53be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.ShareActionProvider;
540ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
55f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.widget.Toast;
56d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk
5792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R;
580addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum;
59ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.CachingPipeline;
60ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.FilteringPipeline;
6192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader;
62d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.Action;
63d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.CategoryAdapter;
64d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.CategoryView;
65d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.MainPanel;
66d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.BasicEditor;
67d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.Editor;
68d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorCrop;
69d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorDraw;
70d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorFlip;
71d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorInfo;
72d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorManager;
73d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorPanel;
74d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRedEye;
75d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRotate;
76d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorStraighten;
77d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
78d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
79d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterFxRepresentation;
80d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterImageBorderRepresentation;
81d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterRepresentation;
82d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FiltersManager;
83d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.ImageFilter;
846a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardimport com.android.gallery3d.filtershow.history.HistoryManager;
855180e681e1b68eae403b2740c609792ca44f77cenicolasroardimport com.android.gallery3d.filtershow.history.HistoryItem;
86d61a2f9fcaad0309132b6b9b666c3dc6df62fed7John Hofordimport com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
87de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageCrop;
8892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow;
8963a7dac01d394523799939596b960cb03321798dJohn Hofordimport com.android.gallery3d.filtershow.imageshow.MasterImage;
90ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset;
9192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
92fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter;
9392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.tools.SaveCopyTask;
94afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets;
95afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets.XMresults;
967592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton;
973992ae6cf1cbb7b57a22d8287c40451558408335nicolasroardimport com.android.gallery3d.filtershow.ui.Spline;
980addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils;
99842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescuimport com.android.gallery3d.util.UsageStatistics;
100f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunkimport com.android.photos.data.GalleryBitmapPool;
10192e2341248e99c691f38820503984bc5e2f18811nicolasroard
10292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File;
103ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference;
10492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector;
10592e2341248e99c691f38820503984bc5e2f18811nicolasroard
106fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener,
1070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        OnShareTargetSelectedListener {
1080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
109ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk    private String mAction = "";
110588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard    MasterImage mMasterImage = null;
1116416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1124dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard    private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb
1134dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
114a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
115a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private ImageShow mImageShow = null;
1170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
118bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    private View mSaveButton = null;
1190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1205aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford    private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this);
1215aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
1220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final int SELECT_PICTURE = 1;
1230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "FilterShowActivity";
12492e2341248e99c691f38820503984bc5e2f18811nicolasroard    protected static final boolean ANIMATE_PANELS = true;
1250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1265300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford    private boolean mShowingTinyPlanet = false;
127bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowingImageStatePanel = false;
128bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
12992e2341248e99c691f38820503984bc5e2f18811nicolasroard    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private ShareActionProvider mShareActionProvider;
1320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private File mSharedOutputFile = null;
1330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
1340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private boolean mSharingImage = false;
1350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
136ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private WeakReference<ProgressDialog> mSavingProgressDialog;
13755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
138d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private LoadBitmapTask mLoadBitmapTask;
13969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk    private boolean mLoading = true;
1403d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
141afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private Uri mOriginalImageUri = null;
142afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private ImagePreset mOriginalPreset = null;
143c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
144b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    private Uri mSelectedImageUri = null;
145b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
146f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryLooksAdapter = null;
147f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryBordersAdapter = null;
148f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryGeometryAdapter = null;
149f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private CategoryAdapter mCategoryFiltersAdapter = null;
150f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private int mCurrentPanel = MainPanel.LOOKS;
1513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
1520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
1530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onCreate(Bundle savedInstanceState) {
1540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super.onCreate(savedInstanceState);
1550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
156f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait);
157f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (onlyUsePortrait) {
158f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
159f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
16069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        MasterImage.setMaster(mMasterImage);
161f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
162f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        clearGalleryBitmapPool();
163f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
164560f959b659bb510a6ac9a92831534c5dfcf16benicolasroard        CachingPipeline.createRenderscriptContext(this);
16563a7dac01d394523799939596b960cb03321798dJohn Hoford        setupMasterImage();
1663a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
1673a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        fillEditors();
1685448bf8095483574649afcc2add7f153670c7450nicolasroard
1693a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
170f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
171cdea10749cbdb6bab8f49f1b5b562b6e89781981nicolasroard
1723a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultPreset();
1732e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk
174afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        extractXMPData();
1753a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        processIntent();
176842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu        UsageStatistics.onContentViewChanged(UsageStatistics.COMPONENT_EDITOR, "Main");
177842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu        UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
178842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.CATEGORY_LIFECYCLE, UsageStatistics.LIFECYCLE_START);
1793a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
1805ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
181f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public boolean isShowingImageStatePanel() {
182f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mShowingImageStatePanel;
183f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
184f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
185f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadMainPanel() {
186f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (findViewById(R.id.main_panel_container) == null) {
187f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
188f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
189f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MainPanel panel = new MainPanel();
190f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
191f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
192f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        transaction.commit();
193f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
194f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
195f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void loadEditorPanel(FilterRepresentation representation,
19600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                                final Editor currentEditor) {
197f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation.getEditorId() == ImageOnlyEditor.ID) {
198f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            currentEditor.reflectCurrentFilter();
199f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
200f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
20100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        final int currentId = currentEditor.getID();
20200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Runnable showEditor = new Runnable() {
20300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            @Override
20400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            public void run() {
20500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                EditorPanel panel = new EditorPanel();
20600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                panel.setEditor(currentId);
20700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
20800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG));
20900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
21000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                transaction.commit();
21100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            }
21200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        };
21300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
21400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        boolean doAnimation = false;
21500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (mShowingImageStatePanel
21600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard                && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
21700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            doAnimation = true;
21800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
21900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        if (doAnimation && main != null && main instanceof MainPanel) {
22000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            MainPanel mainPanel = (MainPanel) main;
22100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View container = mainPanel.getView().findViewById(R.id.category_panel_container);
22200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
22300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            int panelHeight = container.getHeight() + bottom.getHeight();
224af59322ac944e6e17aaf718045949a3352016945nicolasroard            ViewPropertyAnimator anim = mainPanel.getView().animate();
225af59322ac944e6e17aaf718045949a3352016945nicolasroard            anim.translationY(panelHeight).start();
226af59322ac944e6e17aaf718045949a3352016945nicolasroard            final Handler handler = new Handler();
227af59322ac944e6e17aaf718045949a3352016945nicolasroard            handler.postDelayed(showEditor, anim.getDuration());
22800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        } else {
22900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            showEditor.run();
23000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        }
231f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
232f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
2333a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void loadXML() {
2340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setContentView(R.layout.filtershow_activity);
2353a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
2369594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        ActionBar actionBar = getActionBar();
237786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
238786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        actionBar.setCustomView(R.layout.filtershow_actionbar);
239786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard
240bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton = actionBar.getCustomView();
241bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu        mSaveButton.setOnClickListener(new OnClickListener() {
242786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            @Override
243786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            public void onClick(View view) {
244786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard                saveImage();
245786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard            }
246786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard        });
2470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageShow = (ImageShow) findViewById(R.id.imageShow);
2490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageViews.add(mImageShow);
2500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
2513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setupEditors();
2525aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford
253733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        mEditorPlaceHolder.hide();
254733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard
2550c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        mImageShow.bindAsImageLoadListener();
25692e2341248e99c691f38820503984bc5e2f18811nicolasroard
257f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        fillFx();
258f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        fillBorders();
25938fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        fillGeometry();
26038fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        fillFilters();
2616900cad45d240c9a54b92991538b6a33652e766cnicolasroard
2626019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard        setupStatePanel();
2636019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    }
2646019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard
2656019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard    public void setupStatePanel() {
2660c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        MasterImage.getImage().setHistoryManager(mMasterImage.getHistory());
26738fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard    }
26838fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard
2693a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void fillFilters() {
2703a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>();
2713a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
2723a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        filtersManager.addEffects(filtersRepresentations);
273f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
274f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryFiltersAdapter = new CategoryAdapter(this);
275f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
276f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
277f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
278f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
279f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.add(new Action(this, representation));
280f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
2813a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
2823a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
2833a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void fillGeometry() {
28438fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>();
28538fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        FiltersManager filtersManager = FiltersManager.getManager();
28638fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard
2873a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        GeometryMetadata geo = new GeometryMetadata();
2883a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        int[] editorsId = geo.getEditorIds();
2893a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        for (int i = 0; i < editorsId.length; i++) {
2903a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            int editorId = editorsId[i];
2913a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            GeometryMetadata geometry = new GeometryMetadata(geo);
2923a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            geometry.setEditorId(editorId);
2933a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            EditorInfo editorInfo = (EditorInfo) mEditorPlaceHolder.getEditor(editorId);
2943a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            geometry.setTextId(editorInfo.getTextId());
2953a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            geometry.setOverlayId(editorInfo.getOverlayId());
2963a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard            geometry.setOverlayOnly(editorInfo.getOverlayOnly());
297f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (geometry.getTextId() != 0) {
298f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                geometry.setName(getString(geometry.getTextId()));
299f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
30038fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard            filtersRepresentations.add(geometry);
3013a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        }
30238fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard
30338fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard        filtersManager.addTools(filtersRepresentations);
304f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
305f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryGeometryAdapter = new CategoryAdapter(this);
306f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
307f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.add(new Action(this, representation));
308f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
3093a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
3103a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3113a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void processIntent() {
3120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = getIntent();
313a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
314a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
315a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        }
316a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu
317ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk        mAction = intent.getAction();
318b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        mSelectedImageUri = intent.getData();
319b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        Uri loadUri = mSelectedImageUri;
320afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (mOriginalImageUri != null) {
321b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            loadUri = mOriginalImageUri;
322afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        }
323b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        if (loadUri != null) {
324b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            startLoadBitmap(loadUri);
3250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        } else {
3260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            pickImage();
3270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
3280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
3290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
3303a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setupEditors() {
3313a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer));
3323a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        EditorManager.addEditors(mEditorPlaceHolder);
3333a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.setOldViews(mImageViews);
3340c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk
3353a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
3363a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3373a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void fillEditors() {
3383a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorDraw());
3393a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new BasicEditor());
3403a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new ImageOnlyEditor());
3413a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorTinyPlanet());
3423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRedEye());
3433a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorCrop());
3443a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorFlip());
3453a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorRotate());
3463a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        mEditorPlaceHolder.addEditor(new EditorStraighten());
3473a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
3483a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3493a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    private void setDefaultValues() {
3503a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        ImageFilter.setActivityForMemoryToasts(this);
3513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3523a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Resources res = getResources();
3533bc806a8575072c9459fe3698675d3713300d1d3nicolasroard        FiltersManager.setResources(res);
3543a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3553a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        // TODO: get those values from XML.
3563a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
3573a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
3583a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
3593a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3603a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
3613a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
3623a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveHandle(curveHandle, curveHandleSize);
3633a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        Spline.setCurveWidth((int) getPixelsFromDip(3));
3643a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
3653a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        ImageCrop.setAspectTextSize((int) getPixelsFromDip(18));
3663a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        ImageCrop.setTouchTolerance((int) getPixelsFromDip(25));
3673a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        ImageCrop.setMinCropSize((int) getPixelsFromDip(55));
3683a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
3693a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
370d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    private void startLoadBitmap(Uri uri) {
37169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        mLoading = true;
37200914f56c3390caa224b1c9fc07624665de40113John Reck        final View loading = findViewById(R.id.loading);
373733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        final View imageShow = findViewById(R.id.imageShow);
374733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        imageShow.setVisibility(View.INVISIBLE);
375733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard        loading.setVisibility(View.VISIBLE);
376f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingTinyPlanet = false;
377f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mLoadBitmapTask = new LoadBitmapTask();
378d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        mLoadBitmapTask.execute(uri);
379d49d53206a197b08ec4754d8751b6860e33d9f48John Reck    }
380d49d53206a197b08ec4754d8751b6860e33d9f48John Reck
381f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private void fillBorders() {
382f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        Vector<FilterRepresentation> borders = new Vector<FilterRepresentation>();
383d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk
384d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk        // The "no border" implementation
385f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        borders.add(new FilterImageBorderRepresentation(0));
386d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk
387d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk        // Google-build borders
3884c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford        FiltersManager.getManager().addBorders(this, borders);
3894c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford
390f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        for (int i = 0; i < borders.size(); i++) {
391f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk            FilterRepresentation filter = borders.elementAt(i);
3923cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk            filter.setName(getString(R.string.borders));
393f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk            if (i == 0) {
3943cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk                filter.setName(getString(R.string.none));
3959090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
396f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
397f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
398f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryBordersAdapter = new CategoryAdapter(this);
399f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        for (FilterRepresentation representation : borders) {
400f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (representation.getTextId() != 0) {
401f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                representation.setName(getString(representation.getTextId()));
4029090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
40300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard            mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW));
4049090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
4059090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
4069090141f56b4e2000704d0c4a778d3a819821726nicolasroard
407f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryLooksAdapter() {
408f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryLooksAdapter;
409f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
410f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
411f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryBordersAdapter() {
412f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryBordersAdapter;
413f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
414f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
415f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryGeometryAdapter() {
416f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryGeometryAdapter;
417f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
418f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
419f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public CategoryAdapter getCategoryFiltersAdapter() {
420f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCategoryFiltersAdapter;
421f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
422f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
423f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
424f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
425f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
426f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
427f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
428f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
429f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        copy.removeFilter(filterRepresentation);
430ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
431f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
432f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            FilterRepresentation lastRepresentation = copy.getLastRepresentation();
433f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
434f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
435f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
436f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
437f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
438f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (filterRepresentation == null) {
439f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
440f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
441f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
442f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
443f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
444f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset oldPreset = MasterImage.getImage().getPreset();
445f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        ImagePreset copy = new ImagePreset(oldPreset);
446f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
447f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (representation == null) {
448f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            copy.addFilter(filterRepresentation);
449f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
450c9ca6d1eb85a71b7667f4c25d879e78cce16ac4cztenghui            if (filterRepresentation.allowsSingleInstanceOnly()) {
451d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // Don't just update the filter representation. Centralize the
452d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // logic in the addFilter(), such that we can keep "None" as
453d2e9ea0ce1949e192e80ce806e702606694440acztenghui                // null.
454d2e9ea0ce1949e192e80ce806e702606694440acztenghui                copy.removeFilter(representation);
455d2e9ea0ce1949e192e80ce806e702606694440acztenghui                copy.addFilter(filterRepresentation);
4569090141f56b4e2000704d0c4a778d3a819821726nicolasroard            }
4579090141f56b4e2000704d0c4a778d3a819821726nicolasroard        }
458ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        MasterImage.getImage().setPreset(copy, filterRepresentation, true);
459f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
460f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
461f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
462f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showRepresentation(FilterRepresentation representation) {
463f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (representation == null) {
464f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford            return;
465f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        }
466e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard
467e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        // TODO: this check is needed because the GeometryMetadata doesn't quite
468e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        // follow the same pattern as the other filters to update/sync their values.
469e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        // We thus need to not call useFilterRepresentation() for now, as it
470e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        // would override the current Geometry. Once GeometryMetadata is fixed,
471e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        // let's remove the check and call useFilterRepresentation all the time.
472e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        if (!(representation instanceof GeometryMetadata)) {
473e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard            useFilterRepresentation(representation);
474e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard        }
475f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
476f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        // show representation
477f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId());
478f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadEditorPanel(representation, mCurrentEditor);
479f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
480f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
481f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public Editor getEditor(int editorID) {
482f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mEditorPlaceHolder.getEditor(editorID);
483f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
484f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
485f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void setCurrentPanel(int currentPanel) {
486f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCurrentPanel = currentPanel;
487f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
488f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
489f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public int getCurrentPanel() {
490f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        return mCurrentPanel;
4919090141f56b4e2000704d0c4a778d3a819821726nicolasroard    }
4929090141f56b4e2000704d0c4a778d3a819821726nicolasroard
493acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    public void updateCategories() {
494acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        ImagePreset preset = mMasterImage.getPreset();
495acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryLooksAdapter.reflectImagePreset(preset);
496acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard        mCategoryBordersAdapter.reflectImagePreset(preset);
497acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard    }
498acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard
499be84355fddceb9690eef752707c42457ea251e77nicolasroard    private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
500be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
501be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected Boolean doInBackground(Void... params) {
5020c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            MasterImage master = MasterImage.getImage();
5030c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Rect originalBounds = master.getOriginalBounds();
5040c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (master.supportsHighRes()) {
5050c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                int highresPreviewSize = master.getOriginalBitmapLarge().getWidth() * 2;
5060c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                if (highresPreviewSize > originalBounds.width()) {
5070c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    highresPreviewSize = originalBounds.width();
5080c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                }
50947886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Rect bounds = new Rect();
51047886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(),
51147886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getActivity(), highresPreviewSize,
51247886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                        master.getOrientation(), bounds);
51347886ac74f2874633d4c1284b91c33117f056581Ruben Brunk                master.setOriginalBounds(bounds);
5140c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.setOriginalBitmapHighres(originalHires);
5150c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                master.warnListeners();
5160c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            }
517be84355fddceb9690eef752707c42457ea251e77nicolasroard            return true;
518be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
519be84355fddceb9690eef752707c42457ea251e77nicolasroard
520be84355fddceb9690eef752707c42457ea251e77nicolasroard        @Override
521be84355fddceb9690eef752707c42457ea251e77nicolasroard        protected void onPostExecute(Boolean result) {
5220c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
523be84355fddceb9690eef752707c42457ea251e77nicolasroard            if (highresBitmap != null) {
524be84355fddceb9690eef752707c42457ea251e77nicolasroard                FilteringPipeline pipeline = FilteringPipeline.getPipeline();
5250c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                float highResPreviewScale = (float) highresBitmap.getWidth()
5260c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                        / (float) MasterImage.getImage().getOriginalBounds().width();
527be84355fddceb9690eef752707c42457ea251e77nicolasroard                pipeline.setHighResPreviewScaleFactor(highResPreviewScale);
528be84355fddceb9690eef752707c42457ea251e77nicolasroard            }
529be84355fddceb9690eef752707c42457ea251e77nicolasroard        }
530be84355fddceb9690eef752707c42457ea251e77nicolasroard    }
531be84355fddceb9690eef752707c42457ea251e77nicolasroard
5328965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
533d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        int mBitmapSize;
5343d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
535f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        public LoadBitmapTask() {
536d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mBitmapSize = getScreenImageSize();
5373d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
5383d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
5393d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
540d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        protected Boolean doInBackground(Uri... params) {
5410c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) {
5428965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return false;
5438965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
5440c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity()));
5458965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            return true;
5463d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
5473d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
5483d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        @Override
5498965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk        protected void onProgressUpdate(Boolean... values) {
55000914f56c3390caa224b1c9fc07624665de40113John Reck            super.onProgressUpdate(values);
5516416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            if (isCancelled()) {
5528965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                return;
5536416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            }
5548965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (values[0]) {
5555300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford                mShowingTinyPlanet = true;
5568965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            }
55700914f56c3390caa224b1c9fc07624665de40113John Reck        }
55800914f56c3390caa224b1c9fc07624665de40113John Reck
55900914f56c3390caa224b1c9fc07624665de40113John Reck        @Override
5603d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        protected void onPostExecute(Boolean result) {
56169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            MasterImage.setMaster(mMasterImage);
5623d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            if (isCancelled()) {
5633d4f2c7443f6f6015efab769bfaad19263137c67John Hoford                return;
5643d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
565588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard
5668965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk            if (!result) {
5678965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk                cannotLoadImage();
5683d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            }
5698965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk
57052fa110135563740ebc27326afab4326bbb9b9f5John Hoford            if (null == CachingPipeline.getRenderScriptContext()){
57152fa110135563740ebc27326afab4326bbb9b9f5John Hoford                Log.v(LOGTAG,"RenderScript context destroyed during load");
57252fa110135563740ebc27326afab4326bbb9b9f5John Hoford                return;
57352fa110135563740ebc27326afab4326bbb9b9f5John Hoford            }
574733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View loading = findViewById(R.id.loading);
575733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            loading.setVisibility(View.GONE);
576733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            final View imageShow = findViewById(R.id.imageShow);
577733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard            imageShow.setVisibility(View.VISIBLE);
578733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard
5790c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
580cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard            FilteringPipeline pipeline = FilteringPipeline.getPipeline();
581cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard            pipeline.setOriginal(largeBitmap);
5820c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            float previewScale = (float) largeBitmap.getWidth()
5830c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    / (float) MasterImage.getImage().getOriginalBounds().width();
584cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard            pipeline.setPreviewScaleFactor(previewScale);
585f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mShowingTinyPlanet) {
586f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mCategoryFiltersAdapter.removeTinyPlanet();
587f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
58833fca9ef7f89b60e3b1a361fdf5fc597b3994e74nicolasroard            pipeline.turnOnPipeline(true);
589be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hoford            MasterImage.getImage().setOriginalGeometry(largeBitmap);
590f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.imageLoaded();
591f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryBordersAdapter.imageLoaded();
592f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryGeometryAdapter.imageLoaded();
593f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.imageLoaded();
594d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask = null;
595ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk
596afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            if (mOriginalPreset != null) {
597d2e9ea0ce1949e192e80ce806e702606694440acztenghui                MasterImage.getImage().setLoadedPreset(mOriginalPreset);
598ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                MasterImage.getImage().setPreset(mOriginalPreset,
599ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard                        mOriginalPreset.getLastRepresentation(), true);
600afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                mOriginalPreset = null;
601afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            }
602c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard
603f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (mAction == TINY_PLANET_ACTION) {
604f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
605ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk            }
60669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            mLoading = false;
6072d0eaf53ef11c9fd9b3abb824c12087fe1230cdfJohn Hoford            MasterImage.getImage().notifyGeometryChange();
608be84355fddceb9690eef752707c42457ea251e77nicolasroard            LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask();
609be84355fddceb9690eef752707c42457ea251e77nicolasroard            highresLoad.execute();
6103d4f2c7443f6f6015efab769bfaad19263137c67John Hoford            super.onPostExecute(result);
6113d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
6123d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
6133d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
6143d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
615f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    private void clearGalleryBitmapPool() {
616f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        (new AsyncTask<Void, Void, Void>() {
617f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            @Override
618f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            protected Void doInBackground(Void... params) {
619f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                // Free memory held in Gallery's Bitmap pool.  May be O(n) for n bitmaps.
620f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                GalleryBitmapPool.getInstance().clear();
621f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk                return null;
622f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk            }
623f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk        }).execute();
624f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk    }
625f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk
6263d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    @Override
6273d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    protected void onDestroy() {
628d49d53206a197b08ec4754d8751b6860e33d9f48John Reck        if (mLoadBitmapTask != null) {
629d49d53206a197b08ec4754d8751b6860e33d9f48John Reck            mLoadBitmapTask.cancel(false);
6303d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        }
631f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        // TODO:  refactor, don't use so many singletons.
6328898eaabfa0cdf70e00078d2dea810f9aab4dfd1Ruben Brunk        FilteringPipeline.getPipeline().turnOnPipeline(false);
633b17b1b0758799914fbad5f4a3afae71ce58891fcRuben Brunk        MasterImage.reset();
634b17b1b0758799914fbad5f4a3afae71ce58891fcRuben Brunk        FilteringPipeline.reset();
635b17b1b0758799914fbad5f4a3afae71ce58891fcRuben Brunk        ImageFilter.resetStatics();
636f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        FiltersManager.getPreviewManager().freeRSFilterScripts();
637f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk        FiltersManager.getManager().freeRSFilterScripts();
638e29b57330be471dd74672a7bdc74a93dcae3a98bnicolasroard        FiltersManager.getHighresManager().freeRSFilterScripts();
63921a01faab1125c5c347a3dfbf6a71de6aec233a1Ruben Brunk        FiltersManager.reset();
640560f959b659bb510a6ac9a92831534c5dfcf16benicolasroard        CachingPipeline.destroyRenderScriptContext();
6413d4f2c7443f6f6015efab769bfaad19263137c67John Hoford        super.onDestroy();
6423d4f2c7443f6f6015efab769bfaad19263137c67John Hoford    }
6433d4f2c7443f6f6015efab769bfaad19263137c67John Hoford
64447886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // TODO: find a more robust way of handling image size selection
64547886ac74f2874633d4c1284b91c33117f056581Ruben Brunk    // for high screen densities.
6460f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk    private int getScreenImageSize() {
64747886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        DisplayMetrics outMetrics = new DisplayMetrics();
64847886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
64947886ac74f2874633d4c1284b91c33117f056581Ruben Brunk        return (int) Math.max(outMetrics.heightPixels, outMetrics.widthPixels);
650fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford    }
651fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford
6520addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu    private void showSavingProgress(String albumName) {
653ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        ProgressDialog progress;
654ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
655ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            progress = mSavingProgressDialog.get();
656ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            if (progress != null) {
657ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                progress.show();
658ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu                return;
659ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            }
660ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
661ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        // TODO: Allow cancellation of the saving process
6620addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        String progressText;
6630addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        if (albumName == null) {
6640addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.saving_image);
6650addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        } else {
6660addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            progressText = getString(R.string.filtershow_saving_image, albumName);
6670addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        }
6680addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        progress = ProgressDialog.show(this, "", progressText, true, false);
669ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
670ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
671ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
672ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    private void hideSavingProgress() {
673ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        if (mSavingProgressDialog != null) {
674ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu            ProgressDialog progress = mSavingProgressDialog.get();
67508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (progress != null)
67608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard                progress.dismiss();
677ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        }
678ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu    }
679ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu
6800ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public void completeSaveImage(Uri saveUri) {
6810ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        if (mSharingImage && mSharedOutputFile != null) {
6820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            // Image saved, we unblock the content provider
6830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
6840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
6850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            ContentValues values = new ContentValues();
6860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            values.put(SharedImageProvider.PREPARE, false);
6870ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard            getContentResolver().insert(uri, values);
6880ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        }
6890ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        setResult(RESULT_OK, new Intent().setData(saveUri));
690ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu        hideSavingProgress();
6910ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        finish();
6920ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
6930ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
6940ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    @Override
6950ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
69692e2341248e99c691f38820503984bc5e2f18811nicolasroard        // First, let's tell the SharedImageProvider that it will need to wait
69792e2341248e99c691f38820503984bc5e2f18811nicolasroard        // for the image
6980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
6990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
7000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        ContentValues values = new ContentValues();
7010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        values.put(SharedImageProvider.PREPARE, true);
7020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        getContentResolver().insert(uri, values);
7030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mSharingImage = true;
7040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
7050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        // Process and save the image in the background.
7060addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu        showSavingProgress(null);
7070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mImageShow.saveImage(this, mSharedOutputFile);
7080ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return true;
7090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
7100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
7110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    private Intent getDefaultShareIntent() {
7120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Intent intent = new Intent(Intent.ACTION_SEND);
7130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
7140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
7150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.setType(SharedImageProvider.MIME_TYPE);
7160c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk        mSharedOutputFile = SaveCopyTask.getNewFile(this, MasterImage.getImage().getUri());
7170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
7180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                Uri.encode(mSharedOutputFile.getAbsolutePath()));
7190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        intent.putExtra(Intent.EXTRA_STREAM, uri);
7200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        return intent;
7210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard    }
7220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard
7239594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    @Override
7249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onCreateOptionsMenu(Menu menu) {
7259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
726bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        MenuItem showState = menu.findItem(R.id.showImageStateButton);
727bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        if (mShowingImageStatePanel) {
728bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.hide_imagestate_panel);
7299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        } else {
730bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            showState.setTitle(R.string.show_imagestate_panel);
7319594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
7320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
7330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard                .getActionProvider();
7340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setShareIntent(getDefaultShareIntent());
7350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard        mShareActionProvider.setOnShareTargetSelectedListener(this);
73623e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard
73723e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem undoItem = menu.findItem(R.id.undoButton);
73823e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem redoItem = menu.findItem(R.id.redoButton);
73923e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard        MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
74063a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
7419594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return true;
7429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
7439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
74492e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
7456e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onPause() {
7466e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onPause();
74769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        rsPause();
7486e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
7496e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(null);
7506e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
7516e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
7526e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
7536e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
7546e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    public void onResume() {
7556e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        super.onResume();
75669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        rsResume();
7576e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        if (mShareActionProvider != null) {
7586e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu            mShareActionProvider.setOnShareTargetSelectedListener(this);
7596e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu        }
7606e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    }
7616e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu
76269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk    private void rsResume() {
76369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        ImageFilter.setActivityForMemoryToasts(this);
76469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        MasterImage.setMaster(mMasterImage);
76569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        if (CachingPipeline.getRenderScriptContext() == null) {
76669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            CachingPipeline.createRenderscriptContext(this);
76769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        }
76869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FiltersManager.setResources(getResources());
76969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        if (!mLoading) {
7700c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
77169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            FilteringPipeline pipeline = FilteringPipeline.getPipeline();
77269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            pipeline.setOriginal(largeBitmap);
77369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            float previewScale = (float) largeBitmap.getWidth() /
7740c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                    (float) MasterImage.getImage().getOriginalBounds().width();
77569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            pipeline.setPreviewScaleFactor(previewScale);
7760c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk            Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
77769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            if (highresBitmap != null) {
77869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk                float highResPreviewScale = (float) highresBitmap.getWidth() /
7790c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk                        (float) MasterImage.getImage().getOriginalBounds().width();
78069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk                pipeline.setHighResPreviewScaleFactor(highResPreviewScale);
78169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            }
78269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            pipeline.turnOnPipeline(true);
78369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk            MasterImage.getImage().setOriginalGeometry(largeBitmap);
78469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        }
78569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk    }
78669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk
78769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk    private void rsPause() {
78869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FilteringPipeline.getPipeline().turnOnPipeline(false);
78969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FilteringPipeline.reset();
79069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        ImageFilter.resetStatics();
79169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FiltersManager.getPreviewManager().freeRSFilterScripts();
79269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FiltersManager.getManager().freeRSFilterScripts();
79369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FiltersManager.getHighresManager().freeRSFilterScripts();
79469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        FiltersManager.reset();
79569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk        CachingPipeline.destroyRenderScriptContext();
79669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk    }
79769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk
7986e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu    @Override
7999594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean onOptionsItemSelected(MenuItem item) {
8009594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        switch (item.getItemId()) {
8019594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.undoButton: {
8026a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
8039594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.undo();
80463a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
805a7a6a3a5efaf62cdd5d562a9141678671952d27dJohn Hoford                backToMain();
8069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
807842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
808842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Undo");
8099594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
8109594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
8119594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case R.id.redoButton: {
8126a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                HistoryManager adapter = mMasterImage.getHistory();
8139594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                int position = adapter.redo();
81463a7dac01d394523799939596b960cb03321798dJohn Hoford                mMasterImage.onHistoryItemClick(position);
8159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                invalidateViews();
816842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
817842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Redo");
8189594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
8199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
820f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            case R.id.resetHistoryButton: {
821f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                resetHistory();
822842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
823842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS, "ResetHistory");
824f47e790e3f3553f69abe054eec20bd7585118843nicolasroard                return true;
825f47e790e3f3553f69abe054eec20bd7585118843nicolasroard            }
826bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            case R.id.showImageStateButton: {
827bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                toggleImageStatePanel();
828842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
829842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        UsageStatistics.CATEGORY_BUTTON_PRESS,
830842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu                        mShowingImageStatePanel ? "ShowPanel" : "HidePanel");
831bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard                return true;
832bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard            }
8339594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            case android.R.id.home: {
8349594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                saveImage();
8359594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard                return true;
8369594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard            }
8379594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        }
8389594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        return false;
8399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
8409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
841bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    public void enableSave(boolean enable) {
842545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        if (mSaveButton != null) {
843bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu            mSaveButton.setEnabled(enable);
844545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui        }
845bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu    }
846bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu
847f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    private void fillFx() {
84833de212ec780eaf2bc8d86908f07da33ea8dd7f2John Hoford        FilterFxRepresentation nullFx =
84933de212ec780eaf2bc8d86908f07da33ea8dd7f2John Hoford                new FilterFxRepresentation(getString(R.string.none), 0, R.string.none);
850f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>();
8514c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford        FiltersManager.getManager().addLooks(this, filtersRepresentations);
852f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
853f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryLooksAdapter = new CategoryAdapter(this);
854f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
855f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
85600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard        mCategoryLooksAdapter.add(new Action(this, nullFx, Action.FULL_VIEW));
857f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        for (FilterRepresentation representation : filtersRepresentations) {
858f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
859f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard        }
8603a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    }
8610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8623a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard    public void setDefaultPreset() {
8630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // Default preset (original)
864ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset preset = new ImagePreset(); // empty
865ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
8660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
8690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // Some utility functions
87092e2341248e99c691f38820503984bc5e2f18811nicolasroard    // TODO: finish the cleanup.
8710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void invalidateViews() {
8730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (ImageShow views : mImageViews) {
8740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            views.invalidate();
8758537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk            views.updateImage();
8760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void hideImageViews() {
8800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (View view : mImageViews) {
8810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            view.setVisibility(View.GONE);
8820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
8835b85b092af404effd32aa513f9c45a0232d7ae81nicolasroard        mEditorPlaceHolder.hide();
8840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
8850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
887bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    // imageState panel...
888bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
889f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void toggleImageStatePanel() {
890fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard        invalidateOptionsMenu();
891f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mShowingImageStatePanel = !mShowingImageStatePanel;
892f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
893f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (panel != null) {
894f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (panel instanceof EditorPanel) {
895f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                EditorPanel editorPanel = (EditorPanel) panel;
896f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                editorPanel.showImageStatePanel(mShowingImageStatePanel);
897f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            } else if (panel instanceof MainPanel) {
898f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                MainPanel mainPanel = (MainPanel) panel;
899f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard                mainPanel.showImageStatePanel(mShowingImageStatePanel);
900f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            }
901bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        }
902bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
903bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
904a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    @Override
905a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    public void onConfigurationChanged(Configuration newConfig)
906a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    {
907a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard        super.onConfigurationChanged(newConfig);
9083a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        setDefaultValues();
9093a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loadXML();
910f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
911f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
912f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        // mLoadBitmapTask==null implies you have looked at the intent
913f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford        if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
914f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            mCategoryFiltersAdapter.removeTinyPlanet();
9155300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford        }
9163a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        final View loading = findViewById(R.id.loading);
9173a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard        loading.setVisibility(View.GONE);
918a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard    }
919a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard
92063a7dac01d394523799939596b960cb03321798dJohn Hoford    public void setupMasterImage() {
9213a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard
922ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        HistoryManager historyManager = new HistoryManager();
923ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        StateAdapter imageStateAdapter = new StateAdapter(this, 0);
924588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        MasterImage.reset();
925588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard        mMasterImage = MasterImage.getImage();
926ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setHistoryManager(historyManager);
927ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard        mMasterImage.setStateAdapter(imageStateAdapter);
92863a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.setActivity(this);
9294dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard
9304dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
9314dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(true);
9324dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        } else {
9334dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard            mMasterImage.setSupportsHighRes(false);
9344dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard        }
93563a7dac01d394523799939596b960cb03321798dJohn Hoford    }
93663a7dac01d394523799939596b960cb03321798dJohn Hoford
9372e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    void resetHistory() {
9386a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        HistoryManager adapter = mMasterImage.getHistory();
9399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        adapter.reset();
940ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        HistoryItem historyItem = adapter.getItem(0);
941ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        ImagePreset original = new ImagePreset(historyItem.getImagePreset());
942ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard        mMasterImage.setPreset(original, historyItem.getFilterRepresentation(), true);
9439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard        invalidateViews();
944be9c8105b431de765f5811bfd170c899d1c8d3b3John Reck        backToMain();
9450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
9460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
947f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void showDefaultImageView() {
948f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mEditorPlaceHolder.hide();
949f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        mImageShow.setVisibility(View.VISIBLE);
950f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilter(null);
951f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        MasterImage.getImage().setCurrentFilterRepresentation(null);
952f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
953f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
954f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    public void backToMain() {
955f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
956f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
957f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            return;
958f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        }
959f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        loadMainPanel();
960f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        showDefaultImageView();
961f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard    }
962f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard
96375608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    @Override
96475608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    public void onBackPressed() {
965f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
966f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        if (currentPanel instanceof MainPanel) {
967f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            if (!mImageShow.hasModifications()) {
968a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                done();
969a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            } else {
970a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                AlertDialog.Builder builder = new AlertDialog.Builder(this);
971a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit);
972a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() {
973b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
974a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
975a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        saveImage();
976a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
977a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
978e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
979b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui                    @Override
980a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    public void onClick(DialogInterface dialog, int id) {
981a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                        done();
982a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                    }
983a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk                });
984e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk                builder.show();
985a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk            }
986f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard        } else {
987f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard            backToMain();
98875608166f54891972ebad3d8fd958fed9a5300e6nicolasroard        }
98975608166f54891972ebad3d8fd958fed9a5300e6nicolasroard    }
990e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
991e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    public void cannotLoadImage() {
992a2c4bda1ed7b44085516b2e8f140637e4691bab1Ruben Brunk        Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
993e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard        finish();
994e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard    }
995e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard
9960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    // //////////////////////////////////////////////////////////////////////////////
9970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public float getPixelsFromDip(float value) {
9990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Resources r = getResources();
10000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
10010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                r.getDisplayMetrics());
10020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    @Override
10050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onItemClick(AdapterView<?> parent, View view, int position,
10060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            long id) {
100763a7dac01d394523799939596b960cb03321798dJohn Hoford        mMasterImage.onHistoryItemClick(position);
10080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        invalidateViews();
10090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void pickImage() {
10120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Intent intent = new Intent();
10130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setType("image/*");
10140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        intent.setAction(Intent.ACTION_GET_CONTENT);
10150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
10160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                SELECT_PICTURE);
10170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
101992e2341248e99c691f38820503984bc5e2f18811nicolasroard    @Override
10200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onActivityResult(int requestCode, int resultCode, Intent data) {
10210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (resultCode == RESULT_OK) {
10220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (requestCode == SELECT_PICTURE) {
10230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                Uri selectedImageUri = data.getData();
1024d49d53206a197b08ec4754d8751b6860e33d9f48John Reck                startLoadBitmap(selectedImageUri);
10250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
10260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
10270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
10296416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
10300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void saveImage() {
1031d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        if (mImageShow.hasModifications()) {
1032d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            // Get the name of the album, to which the image will be saved
1033b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui            File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mSelectedImageUri);
1034d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
1035d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
1036d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            showSavingProgress(albumName);
1037d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            mImageShow.saveImage(this, null);
1038d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        } else {
10396416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk            done();
10406416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        }
10416416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    }
10426416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk
1043a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk
10446416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk    public void done() {
1045d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk        hideSavingProgress();
104652fa110135563740ebc27326afab4326bbb9b9f5John Hoford        if (mLoadBitmapTask != null) {
104752fa110135563740ebc27326afab4326bbb9b9f5John Hoford            mLoadBitmapTask.cancel(false);
104852fa110135563740ebc27326afab4326bbb9b9f5John Hoford        }
10496416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk        finish();
10500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
10510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
1052afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    private void extractXMPData() {
1053afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        XMresults res = XmpPresets.extractXMPData(
1054afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford                getBaseContext(), mMasterImage, getIntent().getData());
1055afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        if (res == null)
1056afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford            return;
1057afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford
1058afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalImageUri = res.originalimage;
1059afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford        mOriginalPreset = res.preset;
1060afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford    }
1061b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1062b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    public Uri getSelectedImageUri() {
1063b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        return mSelectedImageUri;
1064b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    }
1065b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1066b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    static {
1067b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui        System.loadLibrary("jni_filtershow_filters");
1068b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui    }
1069b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
1070b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui
10710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
1072