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