FilterShowActivity.java revision b9b95fb792c2b0f0b1ecbbcb30713b345475b332
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; 39f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.support.v4.app.Fragment; 40fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentActivity; 41fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentTransaction; 42fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics; 4352fa110135563740ebc27326afab4326bbb9b9f5John Hofordimport android.util.Log; 44d2e9ea0ce1949e192e80ce806e702606694440acztenghuiimport android.util.TypedValue; 45f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Menu; 46f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.MenuItem; 47f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.View; 480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener; 49af59322ac944e6e17aaf718045949a3352016945nicolasroardimport android.view.ViewPropertyAnimator; 50f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.WindowManager; 51be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.AdapterView; 520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener; 53be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.FrameLayout; 54be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.ShareActionProvider; 550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener; 56f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.widget.Toast; 57d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk 5892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R; 5924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.app.PhotoPage; 600addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum; 61ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.CachingPipeline; 6292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader; 63d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.Action; 64d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.CategoryAdapter; 65d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.category.MainPanel; 66d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.BasicEditor; 67d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.Editor; 68d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorCrop; 69d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorDraw; 70d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorFlip; 71d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorManager; 72d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorPanel; 73d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRedEye; 74d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorRotate; 75d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorStraighten; 76d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorTinyPlanet; 77d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.editors.ImageOnlyEditor; 78d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FilterRepresentation; 79d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.FiltersManager; 80d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.filters.ImageFilter; 816a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardimport com.android.gallery3d.filtershow.history.HistoryManager; 825180e681e1b68eae403b2740c609792ca44f77cenicolasroardimport com.android.gallery3d.filtershow.history.HistoryItem; 83d61a2f9fcaad0309132b6b9b666c3dc6df62fed7John Hofordimport com.android.gallery3d.filtershow.imageshow.GeometryMetadata; 84de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageCrop; 8592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow; 8663a7dac01d394523799939596b960cb03321798dJohn Hofordimport com.android.gallery3d.filtershow.imageshow.MasterImage; 87368ae73ad0627dac41709b925fc02a12548ab80dnicolasroardimport com.android.gallery3d.filtershow.imageshow.Spline; 88ce9ceff5776a9b0479c30cbeb2a9388b44df1865nicolasroardimport com.android.gallery3d.filtershow.pipeline.ImagePreset; 8924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.pipeline.ProcessingService; 9092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider; 91fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter; 9224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport com.android.gallery3d.filtershow.tools.SaveImage; 93afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets; 94afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hofordimport com.android.gallery3d.filtershow.tools.XmpPresets.XMresults; 957592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton; 960addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils; 97842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescuimport com.android.gallery3d.util.UsageStatistics; 98f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunkimport com.android.photos.data.GalleryBitmapPool; 9992e2341248e99c691f38820503984bc5e2f18811nicolasroard 10092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File; 101ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference; 10224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport java.util.ArrayList; 10392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector; 10492e2341248e99c691f38820503984bc5e2f18811nicolasroard 105fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener, 1060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard OnShareTargetSelectedListener { 1070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 108ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk private String mAction = ""; 109588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard MasterImage mMasterImage = null; 1106416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 1114dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb 1124dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard 113a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET"; 114a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu public static final String LAUNCH_FULLSCREEN = "launch-fullscreen"; 1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageShow mImageShow = null; 1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 117bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu private View mSaveButton = null; 1180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1195aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this); 1205aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford 1210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final int SELECT_PICTURE = 1; 1220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final String LOGTAG = "FilterShowActivity"; 12392e2341248e99c691f38820503984bc5e2f18811nicolasroard protected static final boolean ANIMATE_PANELS = true; 1240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1255300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford private boolean mShowingTinyPlanet = false; 126bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard private boolean mShowingImageStatePanel = false; 127bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 12892e2341248e99c691f38820503984bc5e2f18811nicolasroard private final Vector<ImageShow> mImageViews = new Vector<ImageShow>(); 1290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private ShareActionProvider mShareActionProvider; 1310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private File mSharedOutputFile = null; 1320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 1330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private boolean mSharingImage = false; 1340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 135ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private WeakReference<ProgressDialog> mSavingProgressDialog; 13655550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard 137d49d53206a197b08ec4754d8751b6860e33d9f48John Reck private LoadBitmapTask mLoadBitmapTask; 13869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk private boolean mLoading = true; 1393d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 140afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford private Uri mOriginalImageUri = null; 141afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford private ImagePreset mOriginalPreset = null; 142c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard 143b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui private Uri mSelectedImageUri = null; 144b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui 145f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryLooksAdapter = null; 146f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryBordersAdapter = null; 147f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryGeometryAdapter = null; 148f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryFiltersAdapter = null; 149f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private int mCurrentPanel = MainPanel.LOOKS; 1503a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 15124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private ProcessingService mBoundService; 15224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private boolean mIsBound = false; 15324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 15424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public ProcessingService getProcessingService() { 15524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return mBoundService; 15624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 15724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 15824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public boolean isSimpleEditAction() { 15924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return !PhotoPage.ACTION_NEXTGEN_EDIT.equalsIgnoreCase(mAction); 16024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 16124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 16224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private ServiceConnection mConnection = new ServiceConnection() { 16324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void onServiceConnected(ComponentName className, IBinder service) { 16424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard /* 16524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * This is called when the connection with the service has been 16624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * established, giving us the service object we can use to 16724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * interact with the service. Because we have bound to a explicit 16824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * service that we know is running in our own process, we can 16924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * cast its IBinder to a concrete class and directly access it. 17024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard */ 17124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mBoundService = ((ProcessingService.LocalBinder)service).getService(); 17224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mBoundService.setFiltershowActivity(FilterShowActivity.this); 17324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mBoundService.onStart(); 17424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 17524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 17624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void onServiceDisconnected(ComponentName className) { 17724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard /* 17824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * This is called when the connection with the service has been 17924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * unexpectedly disconnected -- that is, its process crashed. 18024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Because it is running in our same process, we should never 18124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * see this happen. 18224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard */ 18324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mBoundService = null; 18424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 18524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard }; 18624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 18724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard void doBindService() { 18824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard /* 18924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Establish a connection with the service. We use an explicit 19024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * class name because we want a specific service implementation that 19124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * we know will be running in our own process (and thus won't be 19224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * supporting component replacement by other applications). 19324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard */ 19424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard bindService(new Intent(FilterShowActivity.this, ProcessingService.class), 19524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mConnection, Context.BIND_AUTO_CREATE); 19624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mIsBound = true; 19724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 19824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 19924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard void doUnbindService() { 20024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard if (mIsBound) { 20124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard // Detach our existing connection. 20224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard unbindService(mConnection); 20324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mIsBound = false; 20424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 20524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 20624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 20724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private void setupPipeline() { 20824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard doBindService(); 20924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ImageFilter.setActivityForMemoryToasts(this); 21024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 21124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 21224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void updateUIAfterServiceStarted() { 21324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard fillCategories(); 21424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard loadMainPanel(); 21524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard setDefaultPreset(); 21624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard extractXMPData(); 21724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard processIntent(); 21824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 21924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 2200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 2210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onCreate(Bundle savedInstanceState) { 2220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard super.onCreate(savedInstanceState); 2230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 224f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait); 225f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (onlyUsePortrait) { 226f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 227f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 22869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk MasterImage.setMaster(mMasterImage); 229f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 230f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk clearGalleryBitmapPool(); 23124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard setupPipeline(); 232f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk 23363a7dac01d394523799939596b960cb03321798dJohn Hoford setupMasterImage(); 2343a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setDefaultValues(); 2353a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard fillEditors(); 2365448bf8095483574649afcc2add7f153670c7450nicolasroard 2373a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard loadXML(); 238842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.onContentViewChanged(UsageStatistics.COMPONENT_EDITOR, "Main"); 239842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR, 240842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.CATEGORY_LIFECYCLE, UsageStatistics.LIFECYCLE_START); 2413a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 2425ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard 243f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public boolean isShowingImageStatePanel() { 244f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mShowingImageStatePanel; 245f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 246f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 247f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void loadMainPanel() { 248f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (findViewById(R.id.main_panel_container) == null) { 249f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 250f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 251f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MainPanel panel = new MainPanel(); 252f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 253f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG); 254f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard transaction.commit(); 255f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 256f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 257f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void loadEditorPanel(FilterRepresentation representation, 25800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard final Editor currentEditor) { 259f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation.getEditorId() == ImageOnlyEditor.ID) { 260f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard currentEditor.reflectCurrentFilter(); 261f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 262f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 26300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard final int currentId = currentEditor.getID(); 26400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard Runnable showEditor = new Runnable() { 26500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard @Override 26600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard public void run() { 26700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard EditorPanel panel = new EditorPanel(); 26800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard panel.setEditor(currentId); 26900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 27000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG)); 27100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG); 27200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard transaction.commit(); 27300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } 27400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard }; 27500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 27600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard boolean doAnimation = false; 27700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard if (mShowingImageStatePanel 27800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 27900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard doAnimation = true; 28000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } 28100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard if (doAnimation && main != null && main instanceof MainPanel) { 28200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard MainPanel mainPanel = (MainPanel) main; 28300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard View container = mainPanel.getView().findViewById(R.id.category_panel_container); 28400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard View bottom = mainPanel.getView().findViewById(R.id.bottom_panel); 28500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard int panelHeight = container.getHeight() + bottom.getHeight(); 286af59322ac944e6e17aaf718045949a3352016945nicolasroard ViewPropertyAnimator anim = mainPanel.getView().animate(); 287af59322ac944e6e17aaf718045949a3352016945nicolasroard anim.translationY(panelHeight).start(); 288af59322ac944e6e17aaf718045949a3352016945nicolasroard final Handler handler = new Handler(); 289af59322ac944e6e17aaf718045949a3352016945nicolasroard handler.postDelayed(showEditor, anim.getDuration()); 29000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } else { 29100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard showEditor.run(); 29200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } 293f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 294f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 2953a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void loadXML() { 2960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard setContentView(R.layout.filtershow_activity); 2973a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 2989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard ActionBar actionBar = getActionBar(); 299786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 300786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.setCustomView(R.layout.filtershow_actionbar); 301786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard 302bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu mSaveButton = actionBar.getCustomView(); 303bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu mSaveButton.setOnClickListener(new OnClickListener() { 304786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard @Override 305786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard public void onClick(View view) { 306786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard saveImage(); 307786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard } 308786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard }); 3090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow = (ImageShow) findViewById(R.id.imageShow); 3110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageViews.add(mImageShow); 3120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3133a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setupEditors(); 3145aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford 315733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard mEditorPlaceHolder.hide(); 3160c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk mImageShow.bindAsImageLoadListener(); 31792e2341248e99c691f38820503984bc5e2f18811nicolasroard 3186019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard setupStatePanel(); 3196019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard } 3206019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard 32124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void fillCategories() { 32224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard fillLooks(); 32324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard fillBorders(); 32424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard fillTools(); 32524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard fillEffects(); 32624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 32724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 3286019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard public void setupStatePanel() { 3290c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk MasterImage.getImage().setHistoryManager(mMasterImage.getHistory()); 33038fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard } 33138fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard 33224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private void fillEffects() { 3333a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FiltersManager filtersManager = FiltersManager.getManager(); 33424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getEffects(); 335f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter = new CategoryAdapter(this); 336f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard for (FilterRepresentation representation : filtersRepresentations) { 337f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation.getTextId() != 0) { 338f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard representation.setName(getString(representation.getTextId())); 339f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 340f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.add(new Action(this, representation)); 341f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 3423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3433a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 34424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private void fillTools() { 34538fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard FiltersManager filtersManager = FiltersManager.getManager(); 34624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTools(); 347f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryGeometryAdapter = new CategoryAdapter(this); 348f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard for (FilterRepresentation representation : filtersRepresentations) { 349f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryGeometryAdapter.add(new Action(this, representation)); 350f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 3513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3523a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3533a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void processIntent() { 3540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Intent intent = getIntent(); 355a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) { 356a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 357a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu } 358a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu 359ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk mAction = intent.getAction(); 360b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui mSelectedImageUri = intent.getData(); 361b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui Uri loadUri = mSelectedImageUri; 362afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford if (mOriginalImageUri != null) { 363b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui loadUri = mOriginalImageUri; 364afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 365b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui if (loadUri != null) { 366b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui startLoadBitmap(loadUri); 3670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } else { 3680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard pickImage(); 3690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 3700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 3710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3723a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void setupEditors() { 3733a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer)); 3743a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard EditorManager.addEditors(mEditorPlaceHolder); 3753a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.setOldViews(mImageViews); 3763a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3773a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3783a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void fillEditors() { 3793a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorDraw()); 3803a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new BasicEditor()); 3813a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new ImageOnlyEditor()); 3823a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorTinyPlanet()); 3833a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorRedEye()); 3843a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorCrop()); 3853a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorFlip()); 3863a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorRotate()); 3873a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorStraighten()); 3883a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3893a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3903a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void setDefaultValues() { 3913a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Resources res = getResources(); 3923a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3933a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard // TODO: get those values from XML. 3943a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FramedTextButton.setTextSize((int) getPixelsFromDip(14)); 3953a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4)); 3963a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FramedTextButton.setTriangleSize((int) getPixelsFromDip(10)); 3973a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3983a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Drawable curveHandle = res.getDrawable(R.drawable.camera_crop); 3993a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size); 4003a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Spline.setCurveHandle(curveHandle, curveHandleSize); 4013a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Spline.setCurveWidth((int) getPixelsFromDip(3)); 4023a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 4033a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageCrop.setAspectTextSize((int) getPixelsFromDip(18)); 4043a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageCrop.setTouchTolerance((int) getPixelsFromDip(25)); 4053a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageCrop.setMinCropSize((int) getPixelsFromDip(55)); 4063a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 4073a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 408d49d53206a197b08ec4754d8751b6860e33d9f48John Reck private void startLoadBitmap(Uri uri) { 40969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk mLoading = true; 41000914f56c3390caa224b1c9fc07624665de40113John Reck final View loading = findViewById(R.id.loading); 411733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard final View imageShow = findViewById(R.id.imageShow); 412733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard imageShow.setVisibility(View.INVISIBLE); 413733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard loading.setVisibility(View.VISIBLE); 414f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mShowingTinyPlanet = false; 415f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mLoadBitmapTask = new LoadBitmapTask(); 416d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mLoadBitmapTask.execute(uri); 417d49d53206a197b08ec4754d8751b6860e33d9f48John Reck } 418d49d53206a197b08ec4754d8751b6860e33d9f48John Reck 419f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private void fillBorders() { 42024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard FiltersManager filtersManager = FiltersManager.getManager(); 42124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ArrayList<FilterRepresentation> borders = filtersManager.getBorders(); 4224c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford 423f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk for (int i = 0; i < borders.size(); i++) { 42424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard FilterRepresentation filter = borders.get(i); 4253cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk filter.setName(getString(R.string.borders)); 426f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk if (i == 0) { 4273cb106ddd7ad0f8494ac9c7a33660831c1694295Ruben Brunk filter.setName(getString(R.string.none)); 4289090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 429f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 430f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 431f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryBordersAdapter = new CategoryAdapter(this); 432f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard for (FilterRepresentation representation : borders) { 433f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation.getTextId() != 0) { 434f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard representation.setName(getString(representation.getTextId())); 4359090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 43600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW)); 4379090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 4389090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 4399090141f56b4e2000704d0c4a778d3a819821726nicolasroard 440f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryLooksAdapter() { 441f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryLooksAdapter; 442f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 443f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 444f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryBordersAdapter() { 445f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryBordersAdapter; 446f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 447f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 448f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryGeometryAdapter() { 449f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryGeometryAdapter; 450f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 451f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 452f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryFiltersAdapter() { 453f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryFiltersAdapter; 454f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 455f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 456f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void removeFilterRepresentation(FilterRepresentation filterRepresentation) { 457f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (filterRepresentation == null) { 458f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 459f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 460f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset oldPreset = MasterImage.getImage().getPreset(); 461f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset copy = new ImagePreset(oldPreset); 462f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard copy.removeFilter(filterRepresentation); 463ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true); 464f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) { 465f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard FilterRepresentation lastRepresentation = copy.getLastRepresentation(); 466f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation); 467f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 468f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 469f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 470f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void useFilterRepresentation(FilterRepresentation filterRepresentation) { 471f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (filterRepresentation == null) { 472f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 473f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 474f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) { 475f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 476f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 477f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset oldPreset = MasterImage.getImage().getPreset(); 478f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset copy = new ImagePreset(oldPreset); 479f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard FilterRepresentation representation = copy.getRepresentation(filterRepresentation); 480f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation == null) { 481f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard copy.addFilter(filterRepresentation); 482f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } else { 483c9ca6d1eb85a71b7667f4c25d879e78cce16ac4cztenghui if (filterRepresentation.allowsSingleInstanceOnly()) { 484d2e9ea0ce1949e192e80ce806e702606694440acztenghui // Don't just update the filter representation. Centralize the 485d2e9ea0ce1949e192e80ce806e702606694440acztenghui // logic in the addFilter(), such that we can keep "None" as 486d2e9ea0ce1949e192e80ce806e702606694440acztenghui // null. 487d2e9ea0ce1949e192e80ce806e702606694440acztenghui copy.removeFilter(representation); 488d2e9ea0ce1949e192e80ce806e702606694440acztenghui copy.addFilter(filterRepresentation); 4899090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 4909090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 491ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard MasterImage.getImage().setPreset(copy, filterRepresentation, true); 492f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation); 493f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 494f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 495f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void showRepresentation(FilterRepresentation representation) { 496f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford if (representation == null) { 497f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford return; 498f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford } 499e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard 500e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard // TODO: this check is needed because the GeometryMetadata doesn't quite 501e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard // follow the same pattern as the other filters to update/sync their values. 502e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard // We thus need to not call useFilterRepresentation() for now, as it 503e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard // would override the current Geometry. Once GeometryMetadata is fixed, 504e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard // let's remove the check and call useFilterRepresentation all the time. 505e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard if (!(representation instanceof GeometryMetadata)) { 506e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard useFilterRepresentation(representation); 507e5f4b784ddfaf359fe460998d0edc25755df8bdcnicolasroard } 508f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 509f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard // show representation 510f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId()); 511f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadEditorPanel(representation, mCurrentEditor); 512f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 513f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 514f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public Editor getEditor(int editorID) { 515f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mEditorPlaceHolder.getEditor(editorID); 516f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 517f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 518f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void setCurrentPanel(int currentPanel) { 519f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCurrentPanel = currentPanel; 520f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 521f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 522f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public int getCurrentPanel() { 523f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCurrentPanel; 5249090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 5259090141f56b4e2000704d0c4a778d3a819821726nicolasroard 526acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard public void updateCategories() { 527acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard ImagePreset preset = mMasterImage.getPreset(); 528acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard mCategoryLooksAdapter.reflectImagePreset(preset); 529acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard mCategoryBordersAdapter.reflectImagePreset(preset); 530acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard } 531acc00f8fed8960b079448db8f05c3fbac8642ca4nicolasroard 532be84355fddceb9690eef752707c42457ea251e77nicolasroard private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> { 533be84355fddceb9690eef752707c42457ea251e77nicolasroard @Override 534be84355fddceb9690eef752707c42457ea251e77nicolasroard protected Boolean doInBackground(Void... params) { 5350c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk MasterImage master = MasterImage.getImage(); 5360c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk Rect originalBounds = master.getOriginalBounds(); 5370c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk if (master.supportsHighRes()) { 5380c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk int highresPreviewSize = master.getOriginalBitmapLarge().getWidth() * 2; 5390c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk if (highresPreviewSize > originalBounds.width()) { 5400c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk highresPreviewSize = originalBounds.width(); 5410c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk } 54247886ac74f2874633d4c1284b91c33117f056581Ruben Brunk Rect bounds = new Rect(); 54347886ac74f2874633d4c1284b91c33117f056581Ruben Brunk Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(), 54447886ac74f2874633d4c1284b91c33117f056581Ruben Brunk master.getActivity(), highresPreviewSize, 54547886ac74f2874633d4c1284b91c33117f056581Ruben Brunk master.getOrientation(), bounds); 54647886ac74f2874633d4c1284b91c33117f056581Ruben Brunk master.setOriginalBounds(bounds); 5470c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk master.setOriginalBitmapHighres(originalHires); 548db5d060e8077f70d650e1ce56618f953114551e0nicolasroard mBoundService.setOriginalBitmapHighres(originalHires); 5490c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk master.warnListeners(); 5500c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk } 551be84355fddceb9690eef752707c42457ea251e77nicolasroard return true; 552be84355fddceb9690eef752707c42457ea251e77nicolasroard } 553be84355fddceb9690eef752707c42457ea251e77nicolasroard 554be84355fddceb9690eef752707c42457ea251e77nicolasroard @Override 555be84355fddceb9690eef752707c42457ea251e77nicolasroard protected void onPostExecute(Boolean result) { 5560c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres(); 557be84355fddceb9690eef752707c42457ea251e77nicolasroard if (highresBitmap != null) { 5580c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk float highResPreviewScale = (float) highresBitmap.getWidth() 5590c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk / (float) MasterImage.getImage().getOriginalBounds().width(); 560db5d060e8077f70d650e1ce56618f953114551e0nicolasroard mBoundService.setHighresPreviewScaleFactor(highResPreviewScale); 561be84355fddceb9690eef752707c42457ea251e77nicolasroard } 562be84355fddceb9690eef752707c42457ea251e77nicolasroard } 563be84355fddceb9690eef752707c42457ea251e77nicolasroard } 564be84355fddceb9690eef752707c42457ea251e77nicolasroard 5658965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> { 566d49d53206a197b08ec4754d8751b6860e33d9f48John Reck int mBitmapSize; 5673d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 568f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public LoadBitmapTask() { 569d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mBitmapSize = getScreenImageSize(); 5703d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 5713d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 5723d4f2c7443f6f6015efab769bfaad19263137c67John Hoford @Override 573d49d53206a197b08ec4754d8751b6860e33d9f48John Reck protected Boolean doInBackground(Uri... params) { 5740c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) { 5758965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk return false; 5768965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk } 5770c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity())); 5788965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk return true; 5793d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 5803d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 5813d4f2c7443f6f6015efab769bfaad19263137c67John Hoford @Override 5828965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk protected void onProgressUpdate(Boolean... values) { 58300914f56c3390caa224b1c9fc07624665de40113John Reck super.onProgressUpdate(values); 5846416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (isCancelled()) { 5858965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk return; 5866416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 5878965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk if (values[0]) { 5885300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford mShowingTinyPlanet = true; 5898965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk } 59000914f56c3390caa224b1c9fc07624665de40113John Reck } 59100914f56c3390caa224b1c9fc07624665de40113John Reck 59200914f56c3390caa224b1c9fc07624665de40113John Reck @Override 5933d4f2c7443f6f6015efab769bfaad19263137c67John Hoford protected void onPostExecute(Boolean result) { 59469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk MasterImage.setMaster(mMasterImage); 5953d4f2c7443f6f6015efab769bfaad19263137c67John Hoford if (isCancelled()) { 5963d4f2c7443f6f6015efab769bfaad19263137c67John Hoford return; 5973d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 598588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard 5998965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk if (!result) { 6008965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk cannotLoadImage(); 6013d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 6028965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk 60352fa110135563740ebc27326afab4326bbb9b9f5John Hoford if (null == CachingPipeline.getRenderScriptContext()){ 60452fa110135563740ebc27326afab4326bbb9b9f5John Hoford Log.v(LOGTAG,"RenderScript context destroyed during load"); 60552fa110135563740ebc27326afab4326bbb9b9f5John Hoford return; 60652fa110135563740ebc27326afab4326bbb9b9f5John Hoford } 607733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard final View loading = findViewById(R.id.loading); 608733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard loading.setVisibility(View.GONE); 609733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard final View imageShow = findViewById(R.id.imageShow); 610733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard imageShow.setVisibility(View.VISIBLE); 611733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard 6120c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge(); 613db5d060e8077f70d650e1ce56618f953114551e0nicolasroard mBoundService.setOriginalBitmap(largeBitmap); 614db5d060e8077f70d650e1ce56618f953114551e0nicolasroard 6150c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk float previewScale = (float) largeBitmap.getWidth() 6160c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk / (float) MasterImage.getImage().getOriginalBounds().width(); 617db5d060e8077f70d650e1ce56618f953114551e0nicolasroard mBoundService.setPreviewScaleFactor(previewScale); 618f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (!mShowingTinyPlanet) { 619f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.removeTinyPlanet(); 620f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 621be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hoford MasterImage.getImage().setOriginalGeometry(largeBitmap); 622f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter.imageLoaded(); 623f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryBordersAdapter.imageLoaded(); 624f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryGeometryAdapter.imageLoaded(); 625f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.imageLoaded(); 626d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mLoadBitmapTask = null; 627ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk 628afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford if (mOriginalPreset != null) { 629d2e9ea0ce1949e192e80ce806e702606694440acztenghui MasterImage.getImage().setLoadedPreset(mOriginalPreset); 630ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard MasterImage.getImage().setPreset(mOriginalPreset, 631ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard mOriginalPreset.getLastRepresentation(), true); 632afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford mOriginalPreset = null; 633afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 634c7b38f384ce7d4dd8cc472c802d691e490c8e162nicolasroard 635f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (mAction == TINY_PLANET_ACTION) { 636f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard showRepresentation(mCategoryFiltersAdapter.getTinyPlanet()); 637ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk } 63869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk mLoading = false; 6392d0eaf53ef11c9fd9b3abb824c12087fe1230cdfJohn Hoford MasterImage.getImage().notifyGeometryChange(); 640be84355fddceb9690eef752707c42457ea251e77nicolasroard LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask(); 641be84355fddceb9690eef752707c42457ea251e77nicolasroard highresLoad.execute(); 6423d4f2c7443f6f6015efab769bfaad19263137c67John Hoford super.onPostExecute(result); 6433d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 6443d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 6453d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 6463d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 647f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk private void clearGalleryBitmapPool() { 648f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk (new AsyncTask<Void, Void, Void>() { 649f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk @Override 650f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk protected Void doInBackground(Void... params) { 651f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk // Free memory held in Gallery's Bitmap pool. May be O(n) for n bitmaps. 652f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk GalleryBitmapPool.getInstance().clear(); 653f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk return null; 654f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk } 655f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk }).execute(); 656f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk } 657f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk 6583d4f2c7443f6f6015efab769bfaad19263137c67John Hoford @Override 6593d4f2c7443f6f6015efab769bfaad19263137c67John Hoford protected void onDestroy() { 660d49d53206a197b08ec4754d8751b6860e33d9f48John Reck if (mLoadBitmapTask != null) { 661d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mLoadBitmapTask.cancel(false); 6623d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 66324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard doUnbindService(); 6643d4f2c7443f6f6015efab769bfaad19263137c67John Hoford super.onDestroy(); 6653d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 6663d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 66747886ac74f2874633d4c1284b91c33117f056581Ruben Brunk // TODO: find a more robust way of handling image size selection 66847886ac74f2874633d4c1284b91c33117f056581Ruben Brunk // for high screen densities. 6690f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk private int getScreenImageSize() { 67047886ac74f2874633d4c1284b91c33117f056581Ruben Brunk DisplayMetrics outMetrics = new DisplayMetrics(); 67147886ac74f2874633d4c1284b91c33117f056581Ruben Brunk getWindowManager().getDefaultDisplay().getMetrics(outMetrics); 67247886ac74f2874633d4c1284b91c33117f056581Ruben Brunk return (int) Math.max(outMetrics.heightPixels, outMetrics.widthPixels); 673fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford } 674fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford 6750addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu private void showSavingProgress(String albumName) { 676ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu ProgressDialog progress; 677ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (mSavingProgressDialog != null) { 678ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress = mSavingProgressDialog.get(); 679ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (progress != null) { 680ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress.show(); 681ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu return; 682ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 683ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 684ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu // TODO: Allow cancellation of the saving process 6850addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu String progressText; 6860addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu if (albumName == null) { 6870addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu progressText = getString(R.string.saving_image); 6880addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu } else { 6890addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu progressText = getString(R.string.filtershow_saving_image, albumName); 6900addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu } 6910addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu progress = ProgressDialog.show(this, "", progressText, true, false); 692ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu mSavingProgressDialog = new WeakReference<ProgressDialog>(progress); 693ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 694ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 695ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private void hideSavingProgress() { 696ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (mSavingProgressDialog != null) { 697ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu ProgressDialog progress = mSavingProgressDialog.get(); 69808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard if (progress != null) 69908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard progress.dismiss(); 700ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 701ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 702ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 7030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public void completeSaveImage(Uri saveUri) { 7040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (mSharingImage && mSharedOutputFile != null) { 7050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Image saved, we unblock the content provider 7060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 7070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 7080ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard ContentValues values = new ContentValues(); 7090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard values.put(SharedImageProvider.PREPARE, false); 7100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard getContentResolver().insert(uri, values); 7110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 7120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard setResult(RESULT_OK, new Intent().setData(saveUri)); 713ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu hideSavingProgress(); 7140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard finish(); 7150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 7160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 7170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 7180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) { 71992e2341248e99c691f38820503984bc5e2f18811nicolasroard // First, let's tell the SharedImageProvider that it will need to wait 72092e2341248e99c691f38820503984bc5e2f18811nicolasroard // for the image 7210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 7220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 7230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard ContentValues values = new ContentValues(); 7240ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard values.put(SharedImageProvider.PREPARE, true); 7250ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard getContentResolver().insert(uri, values); 7260ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mSharingImage = true; 7270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 7280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Process and save the image in the background. 7290addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu showSavingProgress(null); 7300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageShow.saveImage(this, mSharedOutputFile); 7310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return true; 7320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 7330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 7340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private Intent getDefaultShareIntent() { 7350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Intent intent = new Intent(Intent.ACTION_SEND); 7360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 7370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 7380ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.setType(SharedImageProvider.MIME_TYPE); 73924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mSharedOutputFile = SaveImage.getNewFile(this, MasterImage.getImage().getUri()); 7400ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 7410ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 7420ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.putExtra(Intent.EXTRA_STREAM, uri); 7430ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return intent; 7440ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 7450ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 7469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard @Override 7479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean onCreateOptionsMenu(Menu menu) { 7489594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu); 749bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard MenuItem showState = menu.findItem(R.id.showImageStateButton); 750bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (mShowingImageStatePanel) { 751bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showState.setTitle(R.string.hide_imagestate_panel); 7529594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } else { 753bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showState.setTitle(R.string.show_imagestate_panel); 7549594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share) 7560ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard .getActionProvider(); 7570ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider.setShareIntent(getDefaultShareIntent()); 7580ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider.setOnShareTargetSelectedListener(this); 75923e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard 76023e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard MenuItem undoItem = menu.findItem(R.id.undoButton); 76123e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard MenuItem redoItem = menu.findItem(R.id.redoButton); 76223e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard MenuItem resetItem = menu.findItem(R.id.resetHistoryButton); 76363a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem); 7649594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 7659594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7669594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 76792e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 7686e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu public void onPause() { 7696e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu super.onPause(); 7706e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu if (mShareActionProvider != null) { 7716e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu mShareActionProvider.setOnShareTargetSelectedListener(null); 7726e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 7736e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 7746e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu 7756e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu @Override 7766e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu public void onResume() { 7776e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu super.onResume(); 7786e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu if (mShareActionProvider != null) { 7796e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu mShareActionProvider.setOnShareTargetSelectedListener(this); 7806e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 7816e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 7826e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu 7836e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu @Override 7849594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean onOptionsItemSelected(MenuItem item) { 7859594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard switch (item.getItemId()) { 7869594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.undoButton: { 7876a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard HistoryManager adapter = mMasterImage.getHistory(); 7889594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard int position = adapter.undo(); 78963a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.onHistoryItemClick(position); 790a7a6a3a5efaf62cdd5d562a9141678671952d27dJohn Hoford backToMain(); 7919594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 792842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR, 793842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.CATEGORY_BUTTON_PRESS, "Undo"); 7949594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 7959594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7969594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.redoButton: { 7976a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard HistoryManager adapter = mMasterImage.getHistory(); 7989594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard int position = adapter.redo(); 79963a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.onHistoryItemClick(position); 8009594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 801842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR, 802842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.CATEGORY_BUTTON_PRESS, "Redo"); 8039594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 8049594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 805f47e790e3f3553f69abe054eec20bd7585118843nicolasroard case R.id.resetHistoryButton: { 806f47e790e3f3553f69abe054eec20bd7585118843nicolasroard resetHistory(); 807842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR, 808842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.CATEGORY_BUTTON_PRESS, "ResetHistory"); 809f47e790e3f3553f69abe054eec20bd7585118843nicolasroard return true; 810f47e790e3f3553f69abe054eec20bd7585118843nicolasroard } 811bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard case R.id.showImageStateButton: { 812bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard toggleImageStatePanel(); 813842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR, 814842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu UsageStatistics.CATEGORY_BUTTON_PRESS, 815842985c1561b6e0447c71ebb18298cf5cb62fce2Bobby Georgescu mShowingImageStatePanel ? "ShowPanel" : "HidePanel"); 816bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard return true; 817bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 818568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk case R.id.exportFlattenButton: { 819568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk Uri sourceUri = MasterImage.getImage().getUri(); 820568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk File dest = SaveImage.getNewFile(this, sourceUri); 821568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk Intent processIntent = ProcessingService.getSaveIntent(this, MasterImage.getImage() 822568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk .getPreset(), dest, getSelectedImageUri(), sourceUri, true); 823568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk startService(processIntent); 824568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk return true; 825568b8d8bade4aac4bc598dff9b76ced159c533bfRuben Brunk } 8269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case android.R.id.home: { 8279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard saveImage(); 8289594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 8299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 8309594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 8319594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return false; 8329594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 8339594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 834bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu public void enableSave(boolean enable) { 835545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui if (mSaveButton != null) { 836bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu mSaveButton.setEnabled(enable); 837545eca119e7b2dc783f8d89a0de4330b5444ed79ztenghui } 838bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu } 839bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu 84024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private void fillLooks() { 84124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard FiltersManager filtersManager = FiltersManager.getManager(); 84224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getLooks(); 843f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 844f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter = new CategoryAdapter(this); 845f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height); 846f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter.setItemHeight(verticalItemHeight); 847f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard for (FilterRepresentation representation : filtersRepresentations) { 848f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW)); 849f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard } 8503a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 8510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 8523a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard public void setDefaultPreset() { 8530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Default preset (original) 854ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard ImagePreset preset = new ImagePreset(); // empty 855ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard mMasterImage.setPreset(preset, preset.getLastRepresentation(), true); 8560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 8570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 8580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 8590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Some utility functions 86092e2341248e99c691f38820503984bc5e2f18811nicolasroard // TODO: finish the cleanup. 8610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 8620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void invalidateViews() { 8630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (ImageShow views : mImageViews) { 8640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard views.invalidate(); 8658537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk views.updateImage(); 8660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 8670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 8680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 8690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void hideImageViews() { 8700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (View view : mImageViews) { 8710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard view.setVisibility(View.GONE); 8720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 8735b85b092af404effd32aa513f9c45a0232d7ae81nicolasroard mEditorPlaceHolder.hide(); 8740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 8750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 8760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 877bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard // imageState panel... 878bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 879f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void toggleImageStatePanel() { 880fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard invalidateOptionsMenu(); 881f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mShowingImageStatePanel = !mShowingImageStatePanel; 882f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 883f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (panel != null) { 884f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (panel instanceof EditorPanel) { 885f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard EditorPanel editorPanel = (EditorPanel) panel; 886f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard editorPanel.showImageStatePanel(mShowingImageStatePanel); 887f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } else if (panel instanceof MainPanel) { 888f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MainPanel mainPanel = (MainPanel) panel; 889f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mainPanel.showImageStatePanel(mShowingImageStatePanel); 890f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 891bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 892bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 893bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 894a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard @Override 895a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard public void onConfigurationChanged(Configuration newConfig) 896a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard { 897a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard super.onConfigurationChanged(newConfig); 8983a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setDefaultValues(); 8993a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard loadXML(); 900b9b95fb792c2b0f0b1ecbbcb30713b345475b332nicolasroard fillCategories(); 901f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadMainPanel(); 902f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 903f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford // mLoadBitmapTask==null implies you have looked at the intent 904f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) { 905f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.removeTinyPlanet(); 9065300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford } 9073a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard final View loading = findViewById(R.id.loading); 9083a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard loading.setVisibility(View.GONE); 909a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard } 910a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard 91163a7dac01d394523799939596b960cb03321798dJohn Hoford public void setupMasterImage() { 9123a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 913ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard HistoryManager historyManager = new HistoryManager(); 914ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard StateAdapter imageStateAdapter = new StateAdapter(this, 0); 915588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard MasterImage.reset(); 916588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard mMasterImage = MasterImage.getImage(); 917ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard mMasterImage.setHistoryManager(historyManager); 918ffc6aea8d586de43e246e60155e573fd34d90da2nicolasroard mMasterImage.setStateAdapter(imageStateAdapter); 91963a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.setActivity(this); 9204dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard 9214dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) { 9224dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard mMasterImage.setSupportsHighRes(true); 9234dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard } else { 9244dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard mMasterImage.setSupportsHighRes(false); 9254dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard } 92663a7dac01d394523799939596b960cb03321798dJohn Hoford } 92763a7dac01d394523799939596b960cb03321798dJohn Hoford 9282e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk void resetHistory() { 9296a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard HistoryManager adapter = mMasterImage.getHistory(); 9309594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard adapter.reset(); 931ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard HistoryItem historyItem = adapter.getItem(0); 932ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard ImagePreset original = new ImagePreset(historyItem.getImagePreset()); 933ed60979e64de8837dd1e2e8b2d208e34583d853cnicolasroard mMasterImage.setPreset(original, historyItem.getFilterRepresentation(), true); 9349594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 935be9c8105b431de765f5811bfd170c899d1c8d3b3John Reck backToMain(); 9360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 938f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void showDefaultImageView() { 939f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mEditorPlaceHolder.hide(); 940f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mImageShow.setVisibility(View.VISIBLE); 941f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilter(null); 942f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilterRepresentation(null); 943f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 944f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 945f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void backToMain() { 946f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 947f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (currentPanel instanceof MainPanel) { 948f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 949f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 950f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadMainPanel(); 951f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard showDefaultImageView(); 952f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 953f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 95475608166f54891972ebad3d8fd958fed9a5300e6nicolasroard @Override 95575608166f54891972ebad3d8fd958fed9a5300e6nicolasroard public void onBackPressed() { 956f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 957f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (currentPanel instanceof MainPanel) { 958f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (!mImageShow.hasModifications()) { 959a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk done(); 960a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } else { 961a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk AlertDialog.Builder builder = new AlertDialog.Builder(this); 962a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit); 963a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() { 964b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui @Override 965a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk public void onClick(DialogInterface dialog, int id) { 966a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk saveImage(); 967a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 968a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk }); 969e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() { 970b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui @Override 971a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk public void onClick(DialogInterface dialog, int id) { 972a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk done(); 973a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 974a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk }); 975e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk builder.show(); 976a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 977f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } else { 978f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard backToMain(); 97975608166f54891972ebad3d8fd958fed9a5300e6nicolasroard } 98075608166f54891972ebad3d8fd958fed9a5300e6nicolasroard } 981e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard 982e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard public void cannotLoadImage() { 983a2c4bda1ed7b44085516b2e8f140637e4691bab1Ruben Brunk Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show(); 984e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard finish(); 985e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard } 986e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard 9870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 9880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public float getPixelsFromDip(float value) { 9900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Resources r = getResources(); 9910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, 9920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard r.getDisplayMetrics()); 9930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 9960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onItemClick(AdapterView<?> parent, View view, int position, 9970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard long id) { 99863a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.onHistoryItemClick(position); 9990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard invalidateViews(); 10000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 10020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void pickImage() { 10030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Intent intent = new Intent(); 10040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard intent.setType("image/*"); 10050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard intent.setAction(Intent.ACTION_GET_CONTENT); 10060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)), 10070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard SELECT_PICTURE); 10080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 101092e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 10110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onActivityResult(int requestCode, int resultCode, Intent data) { 10120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (resultCode == RESULT_OK) { 10130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (requestCode == SELECT_PICTURE) { 10140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Uri selectedImageUri = data.getData(); 1015d49d53206a197b08ec4754d8751b6860e33d9f48John Reck startLoadBitmap(selectedImageUri); 10160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 10206416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 10210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void saveImage() { 1022d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk if (mImageShow.hasModifications()) { 1023d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk // Get the name of the album, to which the image will be saved 102424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard File saveDir = SaveImage.getFinalSaveDirectory(this, mSelectedImageUri); 1025d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk int bucketId = GalleryUtils.getBucketId(saveDir.getPath()); 1026d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null); 1027d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk showSavingProgress(albumName); 1028d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk mImageShow.saveImage(this, null); 1029d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk } else { 10306416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk done(); 10316416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10326416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10336416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 1034a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk 10356416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk public void done() { 1036d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk hideSavingProgress(); 103752fa110135563740ebc27326afab4326bbb9b9f5John Hoford if (mLoadBitmapTask != null) { 103852fa110135563740ebc27326afab4326bbb9b9f5John Hoford mLoadBitmapTask.cancel(false); 103952fa110135563740ebc27326afab4326bbb9b9f5John Hoford } 10406416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk finish(); 10410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1043afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford private void extractXMPData() { 1044afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford XMresults res = XmpPresets.extractXMPData( 1045afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford getBaseContext(), mMasterImage, getIntent().getData()); 1046afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford if (res == null) 1047afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford return; 1048afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 1049afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford mOriginalImageUri = res.originalimage; 1050afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford mOriginalPreset = res.preset; 1051afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford } 1052b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui 1053b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui public Uri getSelectedImageUri() { 1054b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui return mSelectedImageUri; 1055b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui } 1056b3f62e4ed7a80010017dc3893460ca9043afb383ztenghui 10570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard} 1058