FilterShowActivity.java revision be84355fddceb9690eef752707c42457ea251e77
13bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet/*
23bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * Copyright (C) 2012 The Android Open Source Project
33bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet *
43bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
53bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * you may not use this file except in compliance with the License.
63bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * You may obtain a copy of the License at
73bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet *
83bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
93bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet *
103bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * Unless required by applicable law or agreed to in writing, software
113bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
123bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * See the License for the specific language governing permissions and
143bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet * limitations under the License.
153bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet */
163bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
173bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetpackage com.android.gallery3d.filtershow;
183bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
197062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport android.app.ActionBar;
2064f5dc0e6437e95695ed4048f047c3cbef447e0fXavier Ducrohetimport android.app.AlertDialog;
21ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohetimport android.app.ProgressDialog;
22ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohetimport android.content.ContentValues;
235cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perezimport android.content.DialogInterface;
24b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Guptaimport android.content.Intent;
250d829bd739dfcb3374971c776676bf2e53bab43cXavier Ducrohetimport android.content.pm.ActivityInfo;
26ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohetimport android.content.res.Configuration;
277062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport android.content.res.Resources;
28ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohetimport android.graphics.Bitmap;
29ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohetimport android.graphics.Point;
30ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohetimport android.graphics.drawable.Drawable;
31d98e133b3911b8db3430ce9d85efd5a6adcf70bfXavier Ducrohetimport android.net.Uri;
32b32414fe256a6fe1d65e7a1443cd6ea77db8bd95Xavier Ducrohetimport android.os.AsyncTask;
33d98e133b3911b8db3430ce9d85efd5a6adcf70bfXavier Ducrohetimport android.os.Bundle;
3470114b33f8054cc38090a2bbd213ebf15abee63dDeepanshu Guptaimport android.os.Handler;
3541670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Guptaimport android.support.v4.app.Fragment;
3641670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Guptaimport android.support.v4.app.FragmentActivity;
3741670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Guptaimport android.support.v4.app.FragmentTransaction;
3841670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Guptaimport android.util.DisplayMetrics;
3941670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Guptaimport android.util.Log;
4041670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Guptaimport android.util.TypedValue;
41ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohetimport android.view.Display;
423bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport android.view.Menu;
43ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohetimport android.view.MenuItem;
443bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport android.view.View;
45a4a2d3d5936bcdda1409796179725d354e5f4400Andrew Shulaevimport android.view.View.OnClickListener;
46259504c6368e44adfffd4f56f7a838b2d5e73ff9Diego Perezimport android.view.ViewPropertyAnimator;
47c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsenimport android.view.WindowManager;
48b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perezimport android.widget.AdapterView;
497062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport android.widget.AdapterView.OnItemClickListener;
507062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport android.widget.FrameLayout;
511b5ef2d19e1d7cb491c1c79f867e38ec0bde2770Xavier Ducrohetimport android.widget.ShareActionProvider;
52344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Guptaimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
53947b979a91ac1cd556244d875d8b8d4fec8fd474Xavier Ducrohetimport android.widget.Toast;
5418be29a3d14f1b3e840e8ee88b5a1951a6f6e9c8Deepanshu Gupta
553bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.R;
56994236e95e9809ec8c1d06a218f606f1af2083afXavier Ducrohetimport com.android.gallery3d.data.LocalAlbum;
5733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohetimport com.android.gallery3d.filtershow.cache.CachingPipeline;
58ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohetimport com.android.gallery3d.filtershow.cache.FilteringPipeline;
5933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohetimport com.android.gallery3d.filtershow.cache.ImageLoader;
6062039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohetimport com.android.gallery3d.filtershow.category.Action;
61442aee6bc1abfb143dcfa1ba60d696e576d066c4Deepanshu Guptaimport com.android.gallery3d.filtershow.category.CategoryAdapter;
62442aee6bc1abfb143dcfa1ba60d696e576d066c4Deepanshu Guptaimport com.android.gallery3d.filtershow.category.CategoryView;
633bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.category.MainPanel;
643bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.editors.BasicEditor;
653bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.editors.Editor;
663bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorCrop;
67e4cf18face6980b0c7ac42761512cd93b89927c3Diego Perezimport com.android.gallery3d.filtershow.editors.EditorDraw;
688a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Guptaimport com.android.gallery3d.filtershow.editors.EditorFlip;
69994236e95e9809ec8c1d06a218f606f1af2083afXavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorInfo;
70994236e95e9809ec8c1d06a218f606f1af2083afXavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorManager;
71344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Guptaimport com.android.gallery3d.filtershow.editors.EditorPanel;
7276f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorRedEye;
7364f5dc0e6437e95695ed4048f047c3cbef447e0fXavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorRotate;
7476f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorStraighten;
753bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
763bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
77d98e133b3911b8db3430ce9d85efd5a6adcf70bfXavier Ducrohetimport com.android.gallery3d.filtershow.filters.FilterFxRepresentation;
78ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohetimport com.android.gallery3d.filtershow.filters.FilterImageBorderRepresentation;
796208081afd488af51d4f7cbf858e2de59d47e4e5Xavier Ducrohetimport com.android.gallery3d.filtershow.filters.FilterRepresentation;
8070114b33f8054cc38090a2bbd213ebf15abee63dDeepanshu Guptaimport com.android.gallery3d.filtershow.filters.FiltersManager;
8176f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohetimport com.android.gallery3d.filtershow.filters.ImageFilter;
827062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport com.android.gallery3d.filtershow.history.HistoryManager;
837062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport com.android.gallery3d.filtershow.history.HistoryItem;
8470114b33f8054cc38090a2bbd213ebf15abee63dDeepanshu Guptaimport com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
857062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport com.android.gallery3d.filtershow.imageshow.ImageCrop;
867062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport com.android.gallery3d.filtershow.imageshow.ImageShow;
873bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.imageshow.MasterImage;
88f14c342b8a0024e5ca8c2c3ffce8b79abe03e941Tor Norbyeimport com.android.gallery3d.filtershow.presets.ImagePreset;
897062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohetimport com.android.gallery3d.filtershow.provider.SharedImageProvider;
9062c9c3463a9b4a4bc899f5db353f2856876e6590Xavier Ducrohetimport com.android.gallery3d.filtershow.state.StateAdapter;
913bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.tools.SaveCopyTask;
92f14c342b8a0024e5ca8c2c3ffce8b79abe03e941Tor Norbyeimport com.android.gallery3d.filtershow.tools.XmpPresets;
93d98e133b3911b8db3430ce9d85efd5a6adcf70bfXavier Ducrohetimport com.android.gallery3d.filtershow.tools.XmpPresets.XMresults;
943bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.filtershow.ui.FramedTextButton;
954c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohetimport com.android.gallery3d.filtershow.ui.Spline;
963bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.util.GalleryUtils;
973bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.gallery3d.util.UsageStatistics;
983bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport com.android.photos.data.GalleryBitmapPool;
993bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1003bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport java.io.File;
1013bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport java.lang.ref.WeakReference;
1023bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohetimport java.util.Vector;
103b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta
104b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Guptapublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener,
105b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        OnShareTargetSelectedListener {
106b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta
107b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    private String mAction = "";
108b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    MasterImage mMasterImage = null;
109baf88de1f5c435a788f6c38720354b2dbaa19e60Deepanshu Gupta
110b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb
1113bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
112ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
113952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta    public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
114ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    private ImageLoader mImageLoader = null;
115ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    private ImageShow mImageShow = null;
1163bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1173bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private View mSaveButton = null;
1180fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet
1193bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this);
120259504c6368e44adfffd4f56f7a838b2d5e73ff9Diego Perez
121259504c6368e44adfffd4f56f7a838b2d5e73ff9Diego Perez    private static final int SELECT_PICTURE = 1;
1223bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private static final String LOGTAG = "FilterShowActivity";
123ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    protected static final boolean ANIMATE_PANELS = true;
1243bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1253bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private boolean mShowingTinyPlanet = false;
126799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet    private boolean mShowingImageStatePanel = false;
127799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet
1281392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet    private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
1291392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet
1301392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet    private ShareActionProvider mShareActionProvider;
131799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet    private File mSharedOutputFile = null;
132344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta
133344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta    private boolean mSharingImage = false;
134344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta
135344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta    private WeakReference<ProgressDialog> mSavingProgressDialog;
136a6a38c02bfd3f6a678ac1671f5744b8e439e075aXavier Ducrohet
1373bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private LoadBitmapTask mLoadBitmapTask;
1383bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private boolean mLoading = true;
139e9a2ea4ac32589b372ec195d8be59391c686a8c6Xavier Ducrohet
14085c5ae75ab4b9041bb143f146ef5fc4547686210Deepanshu Gupta    private Uri mOriginalImageUri = null;
1418b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta    private ImagePreset mOriginalPreset = null;
1426e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
1433bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private Uri mSelectedImageUri = null;
1443bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1453bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private CategoryAdapter mCategoryLooksAdapter = null;
1463bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private CategoryAdapter mCategoryBordersAdapter = null;
147bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez    private CategoryAdapter mCategoryGeometryAdapter = null;
1483bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private CategoryAdapter mCategoryFiltersAdapter = null;
1493bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private int mCurrentPanel = MainPanel.LOOKS;
1503bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1513bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    @Override
1523bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    public void onCreate(Bundle savedInstanceState) {
1533bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        super.onCreate(savedInstanceState);
1543bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1558d43509cc2c0f95bd07d6585dadfac296bc5d24dDeepanshu Gupta        boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait);
1568d43509cc2c0f95bd07d6585dadfac296bc5d24dDeepanshu Gupta        if (onlyUsePortrait) {
157ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
1583bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        }
1598d43509cc2c0f95bd07d6585dadfac296bc5d24dDeepanshu Gupta        MasterImage.setMaster(mMasterImage);
1603bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
161b32414fe256a6fe1d65e7a1443cd6ea77db8bd95Xavier Ducrohet        clearGalleryBitmapPool();
1620fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet
163ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        CachingPipeline.createRenderscriptContext(this);
164ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        setupMasterImage();
165ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        setDefaultValues();
166ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        fillEditors();
167ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
168ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        loadXML();
169ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        loadMainPanel();
170ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
171ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        setDefaultPreset();
172ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
173ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        extractXMPData();
174ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        processIntent();
175ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        UsageStatistics.onContentViewChanged(UsageStatistics.COMPONENT_EDITOR, "Main");
1760fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
177ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet                UsageStatistics.CATEGORY_LIFECYCLE, UsageStatistics.LIFECYCLE_START);
1780fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet    }
179952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta
180ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet    public boolean isShowingImageStatePanel() {
181ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        return mShowingImageStatePanel;
1823bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    }
1830fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet
1840fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet    public void loadMainPanel() {
1853bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        if (findViewById(R.id.main_panel_container) == null) {
186a6a38c02bfd3f6a678ac1671f5744b8e439e075aXavier Ducrohet            return;
187300f4893351a9974fa3380c513b29d4a7883cd74Deepanshu Gupta        }
188300f4893351a9974fa3380c513b29d4a7883cd74Deepanshu Gupta        MainPanel panel = new MainPanel();
189ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
1908b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta        transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
1913bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        transaction.commit();
19276f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohet    }
19376f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohet
194952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta    public void loadEditorPanel(FilterRepresentation representation,
19576f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohet                                final Editor currentEditor) {
1968b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta        if (representation.getEditorId() == ImageOnlyEditor.ID) {
19776f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohet            currentEditor.reflectCurrentFilter();
19876f4c3e91d8579a580569c3d079da99511309727Xavier Ducrohet            return;
1993bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        }
200b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        final int currentId = currentEditor.getID();
2010fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        Runnable showEditor = new Runnable() {
202ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            @Override
2038b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta            public void run() {
204ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet                EditorPanel panel = new EditorPanel();
2053054fe698a6be732e24128541a1db867ec606a59Xavier Ducrohet                panel.setEditor(currentId);
2063bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
2073bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG));
2083bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
2096e1b7e3e383e12d36356841130647b846e4c8467Diego Perez                transaction.commit();
2106e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            }
2117bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        };
2126e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2136e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        boolean doAnimation = false;
2146e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        if (mShowingImageStatePanel
2156e1b7e3e383e12d36356841130647b846e4c8467Diego Perez                && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
2166e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            doAnimation = true;
2176e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        }
2186e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        if (doAnimation && main != null && main instanceof MainPanel) {
2196e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            MainPanel mainPanel = (MainPanel) main;
2206e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            View container = mainPanel.getView().findViewById(R.id.category_panel_container);
2216e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
2226e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            int panelHeight = container.getHeight() + bottom.getHeight();
2236e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            ViewPropertyAnimator anim = mainPanel.getView().animate();
2246e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            anim.translationY(panelHeight).start();
2256e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            final Handler handler = new Handler();
2266e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            handler.postDelayed(showEditor, anim.getDuration());
2276e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        } else {
2286e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            showEditor.run();
2296e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        }
2306e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    }
2316e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2326e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    private void loadXML() {
2336e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        setContentView(R.layout.filtershow_activity);
2346e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2356e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        ActionBar actionBar = getActionBar();
2366e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
2376e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        actionBar.setCustomView(R.layout.filtershow_actionbar);
2386e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2396e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mSaveButton = actionBar.getCustomView();
2406e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mSaveButton.setOnClickListener(new OnClickListener() {
2416e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            @Override
2426e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            public void onClick(View view) {
2436e1b7e3e383e12d36356841130647b846e4c8467Diego Perez                saveImage();
2446e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            }
245bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez        });
246bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez
2476e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mImageShow = (ImageShow) findViewById(R.id.imageShow);
2486e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mImageViews.add(mImageShow);
2496e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2506e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        setupEditors();
251bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez
2526e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mEditorPlaceHolder.hide();
2536e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2546e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mImageShow.setImageLoader(mImageLoader);
2556e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2566e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        fillFx();
2576e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        fillBorders();
2586e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        fillGeometry();
2596e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        fillFilters();
2606e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2616e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        setupStatePanel();
2626e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    }
263bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez
264bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez    public void setupStatePanel() {
265bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez        mImageLoader.setHistoryManager(mMasterImage.getHistory());
266bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez    }
2676e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2686e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    private void fillFilters() {
2696e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>();
2706e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        FiltersManager filtersManager = FiltersManager.getManager();
2716e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        filtersManager.addEffects(filtersRepresentations);
2726e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2736e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        mCategoryFiltersAdapter = new CategoryAdapter(this);
2746e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        for (FilterRepresentation representation : filtersRepresentations) {
2756e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            if (representation.getTextId() != 0) {
2766e1b7e3e383e12d36356841130647b846e4c8467Diego Perez                representation.setName(getString(representation.getTextId()));
2776e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            }
2786e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            mCategoryFiltersAdapter.add(new Action(this, representation));
2796e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        }
2806e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    }
2816e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2826e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    private void fillGeometry() {
2836e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>();
2846e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        FiltersManager filtersManager = FiltersManager.getManager();
2856e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
2866e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        GeometryMetadata geo = new GeometryMetadata();
2876e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        int[] editorsId = geo.getEditorIds();
2886e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        for (int i = 0; i < editorsId.length; i++) {
2896e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            int editorId = editorsId[i];
2906e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            GeometryMetadata geometry = new GeometryMetadata(geo);
2916e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            geometry.setEditorId(editorId);
2926e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            EditorInfo editorInfo = (EditorInfo) mEditorPlaceHolder.getEditor(editorId);
2936e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            geometry.setTextId(editorInfo.getTextId());
2946e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            geometry.setOverlayId(editorInfo.getOverlayId());
2956e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            geometry.setOverlayOnly(editorInfo.getOverlayOnly());
2966e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            if (geometry.getTextId() != 0) {
2973bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                geometry.setName(getString(geometry.getTextId()));
2983bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            }
299ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            filtersRepresentations.add(geometry);
300ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        }
301ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
302ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        filtersManager.addTools(filtersRepresentations);
3033bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
304ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        mCategoryGeometryAdapter = new CategoryAdapter(this);
305ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        for (FilterRepresentation representation : filtersRepresentations) {
306ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            mCategoryGeometryAdapter.add(new Action(this, representation));
3073bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        }
3088b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta    }
3098b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta
3108b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta    private void processIntent() {
3110fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        Intent intent = getIntent();
3120fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
3133bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
3145cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        }
3155cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez
3165cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        mAction = intent.getAction();
3175cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        mSelectedImageUri = intent.getData();
3185cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        Uri loadUri = mSelectedImageUri;
3195cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        if (mOriginalImageUri != null) {
3205cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez            loadUri = mOriginalImageUri;
3215cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        }
3225cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        if (loadUri != null) {
3235cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez            startLoadBitmap(loadUri);
3245cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        } else {
3255cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez            pickImage();
3265cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez        }
3275cee4833e93b8f9aa9f38815eaa342fab9cc8658Diego Perez    }
3283bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
3293bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private void setupEditors() {
330b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer));
3313bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        EditorManager.addEditors(mEditorPlaceHolder);
332a4a2d3d5936bcdda1409796179725d354e5f4400Andrew Shulaev        mEditorPlaceHolder.setOldViews(mImageViews);
3338a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta        mEditorPlaceHolder.setImageLoader(mImageLoader);
3348a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta    }
3358a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta
336b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez    private void fillEditors() {
337b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez        mEditorPlaceHolder.addEditor(new EditorDraw());
338b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez        mEditorPlaceHolder.addEditor(new BasicEditor());
3398b4b0ce31acc9f57c7df5b1c70183a6655c1edfbDeepanshu Gupta        mEditorPlaceHolder.addEditor(new ImageOnlyEditor());
340b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez        mEditorPlaceHolder.addEditor(new EditorTinyPlanet());
341b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez        mEditorPlaceHolder.addEditor(new EditorRedEye());
342b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez        mEditorPlaceHolder.addEditor(new EditorCrop());
343b321cbfeb00723a6d18746f0d5bbcfd6b6602f6eDiego Perez        mEditorPlaceHolder.addEditor(new EditorFlip());
3448a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta        mEditorPlaceHolder.addEditor(new EditorRotate());
3458a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta        mEditorPlaceHolder.addEditor(new EditorStraighten());
3468a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta    }
3473bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
3487062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    private void setDefaultValues() {
3497062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        ImageFilter.setActivityForMemoryToasts(this);
3507062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
351b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        Resources res = getResources();
3523bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        FiltersManager.setResources(res);
3533bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
354994236e95e9809ec8c1d06a218f606f1af2083afXavier Ducrohet        CategoryView.setMargin((int) getPixelsFromDip(8));
3553bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        CategoryView.setTextSize((int) getPixelsFromDip(16));
356a2378f55b81e7d29f451d7f65527de49417a3f0cXavier Ducrohet
357b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        // TODO: get those values from XML.
3589028fa93da0f9c7dad2176de347cd6e705084c9fDeepanshu Gupta        FramedTextButton.setTextSize((int) getPixelsFromDip(14));
359a2378f55b81e7d29f451d7f65527de49417a3f0cXavier Ducrohet        FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
360c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen        FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
361c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen
3627bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
3636e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
3646e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        Spline.setCurveHandle(curveHandle, curveHandleSize);
3656e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        Spline.setCurveWidth((int) getPixelsFromDip(3));
3666e1b7e3e383e12d36356841130647b846e4c8467Diego Perez
367e48b02f441a8a90f0a1618ed2116c83441aae3bdDiego Perez        ImageCrop.setAspectTextSize((int) getPixelsFromDip(18));
368e48b02f441a8a90f0a1618ed2116c83441aae3bdDiego Perez        ImageCrop.setTouchTolerance((int) getPixelsFromDip(25));
3696e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        ImageCrop.setMinCropSize((int) getPixelsFromDip(55));
3706e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    }
371ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet
3723bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private void startLoadBitmap(Uri uri) {
373ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        mLoading = true;
3743bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        final View loading = findViewById(R.id.loading);
3753bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        final View imageShow = findViewById(R.id.imageShow);
3763bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        imageShow.setVisibility(View.INVISIBLE);
3773bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        loading.setVisibility(View.VISIBLE);
3783bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        mShowingTinyPlanet = false;
3793bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        mLoadBitmapTask = new LoadBitmapTask();
3803bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        mLoadBitmapTask.execute(uri);
381ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    }
3823bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
3833bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    private void fillBorders() {
3843bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        Vector<FilterRepresentation> borders = new Vector<FilterRepresentation>();
3853bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
386344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta        // The "no border" implementation
387344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta        borders.add(new FilterImageBorderRepresentation(0));
388344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta
389344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta        // Google-build borders
390344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta        FiltersManager.getManager().addBorders(this, borders);
391344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta
392344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta        for (int i = 0; i < borders.size(); i++) {
393344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            FilterRepresentation filter = borders.elementAt(i);
394f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez            filter.setName(getString(R.string.borders));
3950685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            if (i == 0) {
396f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez                filter.setName(getString(R.string.none));
397f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez            }
3980685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        }
3990685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez
4000685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        mCategoryBordersAdapter = new CategoryAdapter(this);
4010685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        for (FilterRepresentation representation : borders) {
4020685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            if (representation.getTextId() != 0) {
4030685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez                representation.setName(getString(representation.getTextId()));
4040685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            }
4050685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW));
4060685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        }
407f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez    }
4080685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez
409f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez    public CategoryAdapter getCategoryLooksAdapter() {
410f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez        return mCategoryLooksAdapter;
411f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez    }
412f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez
413f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez    public CategoryAdapter getCategoryBordersAdapter() {
414f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez        return mCategoryBordersAdapter;
415bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez    }
4160685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez
4170685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez    public CategoryAdapter getCategoryGeometryAdapter() {
4180685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        return mCategoryGeometryAdapter;
4190685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez    }
4200685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez
4210685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez    public CategoryAdapter getCategoryFiltersAdapter() {
4220685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        return mCategoryFiltersAdapter;
4230685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez    }
4240685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez
4250685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez    public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
4260685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        if (filterRepresentation == null) {
4273bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            return;
4283bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        }
429ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        ImagePreset oldPreset = MasterImage.getImage().getPreset();
430ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        ImagePreset copy = new ImagePreset(oldPreset);
4314c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet        copy.removeFilter(filterRepresentation);
4324c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet        MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
4334c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
4344c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet            FilterRepresentation lastRepresentation = copy.getLastRepresentation();
435ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
436ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        }
4371392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet    }
4388d43509cc2c0f95bd07d6585dadfac296bc5d24dDeepanshu Gupta
439799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet    public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
4403bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        if (filterRepresentation == null) {
4414c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet            return;
4427bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        }
4437bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
4447bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez            return;
4457bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        }
4467bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        ImagePreset oldPreset = MasterImage.getImage().getPreset();
4477bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        ImagePreset copy = new ImagePreset(oldPreset);
4487bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
4497bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        if (representation == null) {
4507bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez            copy.addFilter(filterRepresentation);
4517bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        } else {
4527bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez            if (filterRepresentation.allowsSingleInstanceOnly()) {
4537bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez                // Don't just update the filter representation. Centralize the
4547bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez                // logic in the addFilter(), such that we can keep "None" as
4557bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez                // null.
4567bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez                copy.removeFilter(representation);
4577bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez                copy.addFilter(filterRepresentation);
4587bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez            }
4597bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        }
4607bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        MasterImage.getImage().setPreset(copy, filterRepresentation, true);
4617bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
4627bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez    }
4637bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez
4647bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez    public void showRepresentation(FilterRepresentation representation) {
4657bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        if (representation == null) {
4667bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez            return;
4677bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        }
4687bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez
4697bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        // TODO: this check is needed because the GeometryMetadata doesn't quite
4707bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        // follow the same pattern as the other filters to update/sync their values.
4717bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        // We thus need to not call useFilterRepresentation() for now, as it
4727bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        // would override the current Geometry. Once GeometryMetadata is fixed,
4737bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        // let's remove the check and call useFilterRepresentation all the time.
4747bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez        if (!(representation instanceof GeometryMetadata)) {
4757bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez            useFilterRepresentation(representation);
476ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        }
477ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
4780fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        // show representation
4790fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId());
4803bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        loadEditorPanel(representation, mCurrentEditor);
4813bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    }
482ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet
4833bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    public Editor getEditor(int editorID) {
4843bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        return mEditorPlaceHolder.getEditor(editorID);
4857bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez    }
4863bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
4876e1b7e3e383e12d36356841130647b846e4c8467Diego Perez    public void setCurrentPanel(int currentPanel) {
4880685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez        mCurrentPanel = currentPanel;
4897bb8850ed2076ebf8442a5fdb68ec9a8f53623e0Diego Perez    }
490f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
491f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet    public int getCurrentPanel() {
492f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        return mCurrentPanel;
493f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez    }
494f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
495f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet    public void updateCategories() {
496f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        ImagePreset preset = mMasterImage.getPreset();
497f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        mCategoryLooksAdapter.reflectImagePreset(preset);
498e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez        mCategoryBordersAdapter.reflectImagePreset(preset);
499e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez    }
500e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez
501e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez    private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
502e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez        @Override
503e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez        protected Boolean doInBackground(Void... params) {
504a4a2d3d5936bcdda1409796179725d354e5f4400Andrew Shulaev            mImageLoader.loadHighResBitmap();
5056e1b7e3e383e12d36356841130647b846e4c8467Diego Perez            return true;
5066e1b7e3e383e12d36356841130647b846e4c8467Diego Perez        }
507f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
508f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        @Override
509f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        protected void onPostExecute(Boolean result) {
510f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres();
511f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            if (highresBitmap != null) {
512f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet                FilteringPipeline pipeline = FilteringPipeline.getPipeline();
513f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet                float highResPreviewScale = (float) highresBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width();
514f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet                pipeline.setHighResPreviewScaleFactor(highResPreviewScale);
515f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            }
516f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        }
517f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet    }
518f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
519f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
520f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        int mBitmapSize;
521f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
522f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        public LoadBitmapTask() {
523f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            mBitmapSize = getScreenImageSize();
524f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        }
525f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
526f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        @Override
527f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        protected Boolean doInBackground(Uri... params) {
528f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            if (!mImageLoader.loadBitmap(params[0], mBitmapSize)) {
529f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet                return false;
530f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            }
53164f5dc0e6437e95695ed4048f047c3cbef447e0fXavier Ducrohet            publishProgress(mImageLoader.queryLightCycle360());
532f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            return true;
533e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez        }
534e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez
535e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez        @Override
536e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez        protected void onProgressUpdate(Boolean... values) {
537e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez            super.onProgressUpdate(values);
538e12b3f96291cf0e3dc60d9db9ac3d3859325f3d4Diego Perez            if (isCancelled()) {
53964f5dc0e6437e95695ed4048f047c3cbef447e0fXavier Ducrohet                return;
5401392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet            }
5413bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            if (values[0]) {
542952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta                mShowingTinyPlanet = true;
5431392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet            }
5444c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet        }
5453bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
546f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet        @Override
547f4978e031c3ad565f02d5a4c65f87ae4477f3613Deepanshu Gupta        protected void onPostExecute(Boolean result) {
548f4978e031c3ad565f02d5a4c65f87ae4477f3613Deepanshu Gupta            MasterImage.setMaster(mMasterImage);
549a6a38c02bfd3f6a678ac1671f5744b8e439e075aXavier Ducrohet            if (isCancelled()) {
550f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet                return;
551f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet            }
552f27575799aab2e552c0491a07b34389e1422fc27Xavier Ducrohet
553a6a38c02bfd3f6a678ac1671f5744b8e439e075aXavier Ducrohet            if (!result) {
554f1a0a823499fc0a464e18b8eba992b32d14b8bb1Diego Perez                cannotLoadImage();
555344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            }
556344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta
557344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            if (null == CachingPipeline.getRenderScriptContext()){
5580685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez                Log.v(LOGTAG,"RenderScript context destroyed during load");
559bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez                return;
5600685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            }
561344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            final View loading = findViewById(R.id.loading);
562344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            loading.setVisibility(View.GONE);
563344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            final View imageShow = findViewById(R.id.imageShow);
564344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            imageShow.setVisibility(View.VISIBLE);
565344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta
566344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            Bitmap largeBitmap = mImageLoader.getOriginalBitmapLarge();
567344cbc9b8ed3ae06a5b183d684df0399fef59879Deepanshu Gupta            FilteringPipeline pipeline = FilteringPipeline.getPipeline();
568bca9e5623c820c9aa1e959e3874442de9a9a6c32Diego Perez            pipeline.setOriginal(largeBitmap);
5694c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet            float previewScale = (float) largeBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width();
5704c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet            pipeline.setPreviewScaleFactor(previewScale);
571e48b02f441a8a90f0a1618ed2116c83441aae3bdDiego Perez            if (!mShowingTinyPlanet) {
572e48b02f441a8a90f0a1618ed2116c83441aae3bdDiego Perez                mCategoryFiltersAdapter.removeTinyPlanet();
57341670df819e35f5822cc166db775ed2e9e3dfb7dDeepanshu Gupta            }
5743bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            pipeline.turnOnPipeline(true);
5753bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            MasterImage.getImage().setOriginalGeometry(largeBitmap);
5760685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            mCategoryLooksAdapter.imageLoaded();
5773bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            mCategoryBordersAdapter.imageLoaded();
5783bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            mCategoryGeometryAdapter.imageLoaded();
5793bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            mCategoryFiltersAdapter.imageLoaded();
5803bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            mLoadBitmapTask = null;
5813bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
5823bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            if (mOriginalPreset != null) {
5833bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                MasterImage.getImage().setLoadedPreset(mOriginalPreset);
584ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet                MasterImage.getImage().setPreset(mOriginalPreset,
5853bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                        mOriginalPreset.getLastRepresentation(), true);
5863bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet                mOriginalPreset = null;
5873bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            }
5883bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
5898ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            if (mAction == TINY_PLANET_ACTION) {
5908ae691c1148038995d1185716f629b82c582897fXavier Ducrohet                showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
5918ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            }
5928ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            mLoading = false;
5938ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            MasterImage.getImage().notifyGeometryChange();
5948ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask();
5958ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            highresLoad.execute();
5968ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            super.onPostExecute(result);
5978ae691c1148038995d1185716f629b82c582897fXavier Ducrohet        }
5988ae691c1148038995d1185716f629b82c582897fXavier Ducrohet
5998ae691c1148038995d1185716f629b82c582897fXavier Ducrohet    }
6008ae691c1148038995d1185716f629b82c582897fXavier Ducrohet
6018ae691c1148038995d1185716f629b82c582897fXavier Ducrohet    private void clearGalleryBitmapPool() {
6028ae691c1148038995d1185716f629b82c582897fXavier Ducrohet        (new AsyncTask<Void, Void, Void>() {
603952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta            @Override
6040685ab35ad78094ceb2d9fb0583e2cadd1968c90Diego Perez            protected Void doInBackground(Void... params) {
6058ae691c1148038995d1185716f629b82c582897fXavier Ducrohet                // Free memory held in Gallery's Bitmap pool.  May be O(n) for n bitmaps.
6068ae691c1148038995d1185716f629b82c582897fXavier Ducrohet                GalleryBitmapPool.getInstance().clear();
6078ae691c1148038995d1185716f629b82c582897fXavier Ducrohet                return null;
6088ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            }
6098ae691c1148038995d1185716f629b82c582897fXavier Ducrohet        }).execute();
6108ae691c1148038995d1185716f629b82c582897fXavier Ducrohet    }
6118ae691c1148038995d1185716f629b82c582897fXavier Ducrohet
6128ae691c1148038995d1185716f629b82c582897fXavier Ducrohet    @Override
6138ae691c1148038995d1185716f629b82c582897fXavier Ducrohet    protected void onDestroy() {
6148ae691c1148038995d1185716f629b82c582897fXavier Ducrohet        if (mLoadBitmapTask != null) {
6158ae691c1148038995d1185716f629b82c582897fXavier Ducrohet            mLoadBitmapTask.cancel(false);
6168ae691c1148038995d1185716f629b82c582897fXavier Ducrohet        }
6178ae691c1148038995d1185716f629b82c582897fXavier Ducrohet        // TODO:  refactor, don't use so many singletons.
618ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        FilteringPipeline.getPipeline().turnOnPipeline(false);
619ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        MasterImage.reset();
620ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        FilteringPipeline.reset();
621ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        ImageFilter.resetStatics();
622ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        FiltersManager.getPreviewManager().freeRSFilterScripts();
623ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        FiltersManager.getManager().freeRSFilterScripts();
62433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        FiltersManager.getHighresManager().freeRSFilterScripts();
625799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet        FiltersManager.reset();
626ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        CachingPipeline.destroyRenderScriptContext();
627ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        super.onDestroy();
628ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet    }
629ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
630ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet    private int getScreenImageSize() {
6310fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        DisplayMetrics metrics = new DisplayMetrics();
6320fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        Display display = getWindowManager().getDefaultDisplay();
633ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        Point size = new Point();
634952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta        display.getSize(size);
635ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        display.getMetrics(metrics);
636ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        int msize = Math.min(size.x, size.y);
6370fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        return (133 * msize) / metrics.densityDpi;
6381b5ef2d19e1d7cb491c1c79f867e38ec0bde2770Xavier Ducrohet    }
639ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet
640947b979a91ac1cd556244d875d8b8d4fec8fd474Xavier Ducrohet    private void showSavingProgress(String albumName) {
641ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        ProgressDialog progress;
642ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        if (mSavingProgressDialog != null) {
6430fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet            progress = mSavingProgressDialog.get();
6441b5ef2d19e1d7cb491c1c79f867e38ec0bde2770Xavier Ducrohet            if (progress != null) {
645ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet                progress.show();
646b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta                return;
6471b5ef2d19e1d7cb491c1c79f867e38ec0bde2770Xavier Ducrohet            }
648ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        }
649ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        // TODO: Allow cancellation of the saving process
650ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        String progressText;
651ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        if (albumName == null) {
652ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            progressText = getString(R.string.saving_image);
6530fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        } else {
654ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            progressText = getString(R.string.filtershow_saving_image, albumName);
655ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        }
656ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        progress = ProgressDialog.show(this, "", progressText, true, false);
65733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
658ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet    }
659ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet
660ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet    private void hideSavingProgress() {
661ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        if (mSavingProgressDialog != null) {
662b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet            ProgressDialog progress = mSavingProgressDialog.get();
663b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet            if (progress != null)
664b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet                progress.dismiss();
665b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        }
666b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet    }
667b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet
668ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    public void completeSaveImage(Uri saveUri) {
669ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        if (mSharingImage && mSharedOutputFile != null) {
670ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            // Image saved, we unblock the content provider
671ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
672ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet                    Uri.encode(mSharedOutputFile.getAbsolutePath()));
673b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet            ContentValues values = new ContentValues();
674b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet            values.put(SharedImageProvider.PREPARE, false);
67533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            getContentResolver().insert(uri, values);
67633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        }
67733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        setResult(RESULT_OK, new Intent().setData(saveUri));
67833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        hideSavingProgress();
67933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        finish();
68033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
68133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
68233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    @Override
683799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet    public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) {
68433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        // First, let's tell the SharedImageProvider that it will need to wait
685ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        // for the image
68633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
687b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet                Uri.encode(mSharedOutputFile.getAbsolutePath()));
688b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        ContentValues values = new ContentValues();
6890fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        values.put(SharedImageProvider.PREPARE, true);
6900fde9af6be75b32a401eafc8904426424e00e70cXavier Ducrohet        getContentResolver().insert(uri, values);
691b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        mSharingImage = true;
692a732a0101ad07b28e828bbbc8fb81be0580d53b5Xavier Ducrohet
693a732a0101ad07b28e828bbbc8fb81be0580d53b5Xavier Ducrohet        // Process and save the image in the background.
694b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        showSavingProgress(null);
695b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        mImageShow.saveImage(this, mSharedOutputFile);
696b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        return true;
697b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet    }
69833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
699a732a0101ad07b28e828bbbc8fb81be0580d53b5Xavier Ducrohet    private Intent getDefaultShareIntent() {
700b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        Intent intent = new Intent(Intent.ACTION_SEND);
70133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
70233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
70333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        intent.setType(SharedImageProvider.MIME_TYPE);
70433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri());
70533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
70633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                Uri.encode(mSharedOutputFile.getAbsolutePath()));
707ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        intent.putExtra(Intent.EXTRA_STREAM, uri);
70833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        return intent;
70933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
71033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
71133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    @Override
71233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public boolean onCreateOptionsMenu(Menu menu) {
71333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
71433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        MenuItem showState = menu.findItem(R.id.showImageStateButton);
71533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (mShowingImageStatePanel) {
71633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            showState.setTitle(R.string.hide_imagestate_panel);
71733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        } else {
71833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            showState.setTitle(R.string.show_imagestate_panel);
719ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        }
7201392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
7211392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet                .getActionProvider();
72233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        mShareActionProvider.setShareIntent(getDefaultShareIntent());
723ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        mShareActionProvider.setOnShareTargetSelectedListener(this);
724952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta
72533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        MenuItem undoItem = menu.findItem(R.id.undoButton);
72633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        MenuItem redoItem = menu.findItem(R.id.redoButton);
727b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        MenuItem resetItem = menu.findItem(R.id.resetHistoryButton);
7284c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet        mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
7291766c77e7e79afbb4fd2611837ac487f5610d71dXavier Ducrohet        return true;
73033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
7311766c77e7e79afbb4fd2611837ac487f5610d71dXavier Ducrohet
7321766c77e7e79afbb4fd2611837ac487f5610d71dXavier Ducrohet    @Override
7331766c77e7e79afbb4fd2611837ac487f5610d71dXavier Ducrohet    public void onPause() {
734b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        super.onPause();
735b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        rsPause();
73633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (mShareActionProvider != null) {
73733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            mShareActionProvider.setOnShareTargetSelectedListener(null);
73833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        }
73933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
74033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
74133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    @Override
74233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void onResume() {
743ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        super.onResume();
744ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        rsResume();
74533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (mShareActionProvider != null) {
74633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            mShareActionProvider.setOnShareTargetSelectedListener(this);
747ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        }
74833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
74933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
750ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    private void rsResume() {
75133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        ImageFilter.setActivityForMemoryToasts(this);
75233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        MasterImage.setMaster(mMasterImage);
753ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        if (CachingPipeline.getRenderScriptContext() == null) {
75433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            CachingPipeline.createRenderscriptContext(this);
75533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        }
75633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        FiltersManager.setResources(getResources());
75733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (!mLoading) {
75833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            Bitmap largeBitmap = mImageLoader.getOriginalBitmapLarge();
75933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            FilteringPipeline pipeline = FilteringPipeline.getPipeline();
76033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            pipeline.setOriginal(largeBitmap);
76133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            float previewScale = (float) largeBitmap.getWidth() /
76233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                    (float) mImageLoader.getOriginalBounds().width();
76333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            pipeline.setPreviewScaleFactor(previewScale);
76433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres();
765799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet            if (highresBitmap != null) {
76633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                float highResPreviewScale = (float) highresBitmap.getWidth() /
76762039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet                        (float) mImageLoader.getOriginalBounds().width();
76824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                pipeline.setHighResPreviewScaleFactor(highResPreviewScale);
769b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet            }
770b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet            pipeline.turnOnPipeline(true);
77133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            MasterImage.getImage().setOriginalGeometry(largeBitmap);
77233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        }
773ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet    }
77433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
77533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    private void rsPause() {
77662039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        FilteringPipeline.getPipeline().turnOnPipeline(false);
77733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        FilteringPipeline.reset();
77833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        ImageFilter.resetStatics();
7791392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet        FiltersManager.getPreviewManager().freeRSFilterScripts();
78062039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        FiltersManager.getManager().freeRSFilterScripts();
78162039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        FiltersManager.getHighresManager().freeRSFilterScripts();
78262039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        FiltersManager.reset();
78333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        CachingPipeline.destroyRenderScriptContext();
78433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
785ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet
78624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    @Override
78724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    public boolean onOptionsItemSelected(MenuItem item) {
78824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        switch (item.getItemId()) {
78924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            case R.id.undoButton: {
79024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                HistoryManager adapter = mMasterImage.getHistory();
79124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                int position = adapter.undo();
79224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                mMasterImage.onHistoryItemClick(position);
79324cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                backToMain();
794952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta                invalidateViews();
79524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
79624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Undo");
79724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                return true;
79824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            }
79924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            case R.id.redoButton: {
800952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta                HistoryManager adapter = mMasterImage.getHistory();
80124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                int position = adapter.redo();
80224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                mMasterImage.onHistoryItemClick(position);
80324cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                invalidateViews();
80424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
80524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                        UsageStatistics.CATEGORY_BUTTON_PRESS, "Redo");
8064c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet                return true;
80724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            }
80824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            case R.id.resetHistoryButton: {
80924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                resetHistory();
81024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
81124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                        UsageStatistics.CATEGORY_BUTTON_PRESS, "ResetHistory");
81224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                return true;
81324cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            }
81424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            case R.id.showImageStateButton: {
81562039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet                toggleImageStatePanel();
81624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
81724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                        UsageStatistics.CATEGORY_BUTTON_PRESS,
81824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                        mShowingImageStatePanel ? "ShowPanel" : "HidePanel");
81962039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet                return true;
82024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            }
82124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            case android.R.id.home: {
82224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                saveImage();
82324cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                return true;
82424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            }
8255562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet        }
82624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        return false;
82724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    }
82824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
82924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    public void enableSave(boolean enable) {
83024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        if (mSaveButton != null) {
83124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            mSaveButton.setEnabled(enable);
83224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        }
833ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet    }
83424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
83524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    private void fillFx() {
83624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        FilterFxRepresentation nullFx =
83724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                new FilterFxRepresentation(getString(R.string.none), 0, R.string.none);
83824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>();
83924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        FiltersManager.getManager().addLooks(this, filtersRepresentations);
84024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
84124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mCategoryLooksAdapter = new CategoryAdapter(this);
84224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
84324cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
84424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mCategoryLooksAdapter.add(new Action(this, nullFx, Action.FULL_VIEW));
84524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        for (FilterRepresentation representation : filtersRepresentations) {
84624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
84724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        }
84824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    }
84924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
85024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    public void setDefaultPreset() {
85124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        // Default preset (original)
85233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        ImagePreset preset = new ImagePreset(); // empty
85333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        preset.setImageLoader(mImageLoader);
854ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet
855b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
856b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet    }
85762039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet
858952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta    // //////////////////////////////////////////////////////////////////////////////
85933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    // Some utility functions
86033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    // TODO: finish the cleanup.
861b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet
8624c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet    public void invalidateViews() {
863ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet        for (ImageShow views : mImageViews) {
86433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            views.invalidate();
865ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet            views.updateImage();
866ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet        }
867ce63b05275ddd2acd9d2f39e9ab3cb3039f26677Xavier Ducrohet    }
868b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet
869b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet    public void hideImageViews() {
87033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        for (View view : mImageViews) {
87133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            view.setVisibility(View.GONE);
87233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        }
87333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        mEditorPlaceHolder.hide();
87462039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet    }
87562039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet
87624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    // //////////////////////////////////////////////////////////////////////////////
87733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    // imageState panel...
87833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
87933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void toggleImageStatePanel() {
880ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        invalidateOptionsMenu();
881ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        mShowingImageStatePanel = !mShowingImageStatePanel;
88233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
88333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (panel != null) {
88424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            if (panel instanceof EditorPanel) {
88524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                EditorPanel editorPanel = (EditorPanel) panel;
8861392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet                editorPanel.showImageStatePanel(mShowingImageStatePanel);
88762039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet            } else if (panel instanceof MainPanel) {
88824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                MainPanel mainPanel = (MainPanel) panel;
88924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet                mainPanel.showImageStatePanel(mShowingImageStatePanel);
8905562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet            }
8915562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet        }
8925562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet    }
8935562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet
8945562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet    @Override
8955562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet    public void onConfigurationChanged(Configuration newConfig)
8965562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet    {
8975562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet        super.onConfigurationChanged(newConfig);
8985562208aafcaccf366dd8cd906700f48c6c342a8Xavier Ducrohet        setDefaultValues();
89962039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        loadXML();
90062039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        loadMainPanel();
90124cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
90224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        // mLoadBitmapTask==null implies you have looked at the intent
90362039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
904d98e133b3911b8db3430ce9d85efd5a6adcf70bfXavier Ducrohet            mCategoryFiltersAdapter.removeTinyPlanet();
90562039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        }
90662039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        final View loading = findViewById(R.id.loading);
90724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        loading.setVisibility(View.GONE);
90824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    }
90924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
91062039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet    public void setupMasterImage() {
91133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        mImageLoader = new ImageLoader(this, getApplicationContext());
912d98e133b3911b8db3430ce9d85efd5a6adcf70bfXavier Ducrohet
91362039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        HistoryManager mHistoryManager = new HistoryManager();
91462039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        StateAdapter mImageStateAdapter = new StateAdapter(this, 0);
91524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        MasterImage.reset();
91624cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mMasterImage = MasterImage.getImage();
91724cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mMasterImage.setHistoryManager(mHistoryManager);
91824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mMasterImage.setStateAdapter(mImageStateAdapter);
91924cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mMasterImage.setActivity(this);
92024cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        mMasterImage.setImageLoader(mImageLoader);
92162039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet
92262039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
92324cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            mMasterImage.setSupportsHighRes(true);
92462039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        } else {
92524cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet            mMasterImage.setSupportsHighRes(false);
92662039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        }
92762039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet    }
92862039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet
92962039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet    void resetHistory() {
93062039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        HistoryManager adapter = mMasterImage.getHistory();
93162039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        adapter.reset();
93224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        HistoryItem historyItem = adapter.getItem(0);
93362039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        ImagePreset original = new ImagePreset(historyItem.getImagePreset());
93462039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        mMasterImage.setPreset(original, historyItem.getFilterRepresentation(), true);
93562039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        invalidateViews();
93633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        backToMain();
93762039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet    }
93824cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet
93933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void showDefaultImageView() {
94062039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        mEditorPlaceHolder.hide();
94162039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        mImageShow.setVisibility(View.VISIBLE);
94224cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet        MasterImage.getImage().setCurrentFilter(null);
94362039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        MasterImage.getImage().setCurrentFilterRepresentation(null);
94424cdf6c407351a157880a0a1bbf65c95af753418Xavier Ducrohet    }
94562039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet
94662039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet    public void backToMain() {
94762039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
94862039873060d26a7be141573b0f468c5ba0414dcXavier Ducrohet        if (currentPanel instanceof MainPanel) {
9491392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet            return;
9501392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet        }
951ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        loadMainPanel();
952b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet        showDefaultImageView();
95333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
95433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
95533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    @Override
95633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void onBackPressed() {
95733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
95833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (currentPanel instanceof MainPanel) {
95933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            if (!mImageShow.hasModifications()) {
96033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                done();
96133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            } else {
96233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                AlertDialog.Builder builder = new AlertDialog.Builder(this);
963799fe3b371c812a0e94872f896b54afa44e94868Xavier Ducrohet                builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit);
96433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() {
965ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet                    @Override
96633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                    public void onClick(DialogInterface dialog, int id) {
967b12b63f973ebf8fdc4f36f77dd29bd1bed436609Xavier Ducrohet                        saveImage();
9681392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet                    }
9691392615c49943383baf51262e2df6975266b4c2fXavier Ducrohet                });
97033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
97133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                    @Override
97233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                    public void onClick(DialogInterface dialog, int id) {
97333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                        done();
97433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                    }
97533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                });
976ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet                builder.show();
97733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            }
97833840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        } else {
97933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            backToMain();
98033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        }
98133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
98233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
98333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void cannotLoadImage() {
98433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
98533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        finish();
98633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
98733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
988ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    // //////////////////////////////////////////////////////////////////////////////
98933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
99033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public float getPixelsFromDip(float value) {
991ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        Resources r = getResources();
992952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
99333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                r.getDisplayMetrics());
99433840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
99533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
9964c6c050f68c67097b92eb38e9f01dae9885907caXavier Ducrohet    @Override
997ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet    public void onItemClick(AdapterView<?> parent, View view, int position,
998ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet            long id) {
999ddea50d03cdda807bbaea54beffd7a341c51f770Xavier Ducrohet        mMasterImage.onHistoryItemClick(position);
100033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        invalidateViews();
100133840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
100233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
100333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void pickImage() {
1004ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        Intent intent = new Intent();
1005ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet        intent.setType("image/*");
100633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        intent.setAction(Intent.ACTION_GET_CONTENT);
100733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
1008ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet                SELECT_PICTURE);
100933840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    }
101033840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet
1011ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet    @Override
101233840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet    public void onActivityResult(int requestCode, int resultCode, Intent data) {
101333840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet        if (resultCode == RESULT_OK) {
1014ecb67b629266bd616da571c1e391164a4f8c8e93Xavier Ducrohet            if (requestCode == SELECT_PICTURE) {
101533840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                Uri selectedImageUri = data.getData();
101633840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet                startLoadBitmap(selectedImageUri);
101733840c00b3b56db9613dcd33abd69601b711ce69Xavier Ducrohet            }
10183bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        }
1019952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta    }
1020952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta
1021952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta
10223bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet    public void saveImage() {
10233bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        if (mImageShow.hasModifications()) {
10243bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            // Get the name of the album, to which the image will be saved
1025b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mSelectedImageUri);
10268a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta            int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
10273bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet            String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
1028952c989b307d4b710ee1adba064f663808af9eb3Deepanshu Gupta            showSavingProgress(albumName);
1029b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            mImageShow.saveImage(this, null);
10303bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet        } else {
10318a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta            done();
10328a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta        }
10338a16d5d203a48e7b13761f329333b3dcb8f8210bDeepanshu Gupta    }
10343bd98986a97e4e1921616a0a86983307e68ceb6cXavier Ducrohet
1035b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta
103662c9c3463a9b4a4bc899f5db353f2856876e6590Xavier Ducrohet    public void done() {
103762c9c3463a9b4a4bc899f5db353f2856876e6590Xavier Ducrohet        hideSavingProgress();
103862c9c3463a9b4a4bc899f5db353f2856876e6590Xavier Ducrohet        if (mLoadBitmapTask != null) {
10397062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet            mLoadBitmapTask.cancel(false);
10407062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        }
10417062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        finish();
10427062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    }
10437062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
10447062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    private void extractXMPData() {
10457062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        XMresults res = XmpPresets.extractXMPData(
10467062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet                getBaseContext(), mMasterImage, getIntent().getData());
10477062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        if (res == null)
10487062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet            return;
10497062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
10507062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        mOriginalImageUri = res.originalimage;
10517062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        mOriginalPreset = res.preset;
10527062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    }
10537062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
1054b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    public Uri getSelectedImageUri() {
1055b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        return mSelectedImageUri;
10567062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    }
10577062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
10587062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    static {
10597062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet        System.loadLibrary("jni_filtershow_filters");
10607062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet    }
10617062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
10627062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet
10637062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet}
10647062c1ad9adcb216ac49100ca1044e9d89e8f8c1Xavier Ducrohet