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; 226416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunkimport android.app.WallpaperManager; 230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues; 24a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunkimport android.content.DialogInterface; 250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent; 26f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.content.pm.ActivityInfo; 27a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroardimport android.content.res.Configuration; 280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources; 29457e88cd2ba6a8a93b1643a3fb3d50ee758671adJohn Hofordimport android.graphics.Bitmap; 30fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.graphics.Point; 310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable; 3292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri; 333d4f2c7443f6f6015efab769bfaad19263137c67John Hofordimport android.os.AsyncTask; 3492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle; 35f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.support.v4.app.Fragment; 36fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentActivity; 37fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport android.support.v4.app.FragmentTransaction; 38fafb2edbb9928039b887f59685d82593bd79e06aJohn Hofordimport android.util.DisplayMetrics; 390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log; 400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.TypedValue; 41f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Display; 42f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.Menu; 43f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.MenuItem; 44f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.View; 450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener; 46f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.view.WindowManager; 47be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.AdapterView; 480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener; 49be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.FrameLayout; 50be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hofordimport android.widget.ShareActionProvider; 510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener; 520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 53f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport android.widget.Toast; 5492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R; 550addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.data.LocalAlbum; 56560f959b659bb510a6ac9a92831534c5dfcf16benicolasroardimport com.android.gallery3d.filtershow.cache.CachingPipeline; 57cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroardimport com.android.gallery3d.filtershow.cache.FilteringPipeline; 5892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader; 59f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport com.android.gallery3d.filtershow.category.*; 606fe165b7d28299d5b2f97deb135b233d84eb300fRuben Brunkimport com.android.gallery3d.filtershow.crop.CropExtras; 61f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroardimport com.android.gallery3d.filtershow.editors.*; 628d2c7ee02c8fde53effc787c172b10b14ae34d42nicolasroardimport com.android.gallery3d.filtershow.filters.*; 63d61a2f9fcaad0309132b6b9b666c3dc6df62fed7John Hofordimport com.android.gallery3d.filtershow.imageshow.GeometryMetadata; 64de154778c8f94121cb2117fcf6224c40c01b6132nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageCrop; 6592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow; 6663a7dac01d394523799939596b960cb03321798dJohn Hofordimport com.android.gallery3d.filtershow.imageshow.MasterImage; 6792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset; 6892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider; 69fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardimport com.android.gallery3d.filtershow.state.StateAdapter; 70a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunkimport com.android.gallery3d.filtershow.tools.BitmapTask; 7192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.tools.SaveCopyTask; 727592704e662e49e4bbf3ba86a43d790774829bb0nicolasroardimport com.android.gallery3d.filtershow.ui.FramedTextButton; 733992ae6cf1cbb7b57a22d8287c40451558408335nicolasroardimport com.android.gallery3d.filtershow.ui.Spline; 740addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liuimport com.android.gallery3d.util.GalleryUtils; 75f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunkimport com.android.photos.data.GalleryBitmapPool; 7692e2341248e99c691f38820503984bc5e2f18811nicolasroard 7792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File; 786416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunkimport java.io.IOException; 79ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference; 8092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector; 8192e2341248e99c691f38820503984bc5e2f18811nicolasroard 82fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroardpublic class FilterShowActivity extends FragmentActivity implements OnItemClickListener, 830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard OnShareTargetSelectedListener { 840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 856416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk // fields for supporting crop action 86795776f67fe5bca902b09c01edec630879263341Ruben Brunk public static final String CROP_ACTION = "com.android.camera.action.CROP"; 876416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk private CropExtras mCropExtras = null; 88ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk private String mAction = ""; 89588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard MasterImage mMasterImage = null; 906416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 914dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb 924dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard 93a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET"; 94a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu public static final String LAUNCH_FULLSCREEN = "launch-fullscreen"; 956416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk public static final int MAX_BMAP_IN_INTENT = 990000; 960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageLoader mImageLoader = null; 970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageShow mImageShow = null; 980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 99bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu private View mSaveButton = null; 1000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1015aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this); 1025aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford 1030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final int SELECT_PICTURE = 1; 1040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final String LOGTAG = "FilterShowActivity"; 10592e2341248e99c691f38820503984bc5e2f18811nicolasroard protected static final boolean ANIMATE_PANELS = true; 1060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1075300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford private boolean mShowingTinyPlanet = false; 108bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard private boolean mShowingImageStatePanel = false; 109bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 11092e2341248e99c691f38820503984bc5e2f18811nicolasroard private final Vector<ImageShow> mImageViews = new Vector<ImageShow>(); 1110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private ShareActionProvider mShareActionProvider; 1130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private File mSharedOutputFile = null; 1140ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 1150ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private boolean mSharingImage = false; 1160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 117ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private WeakReference<ProgressDialog> mSavingProgressDialog; 11855550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard 119d49d53206a197b08ec4754d8751b6860e33d9f48John Reck private LoadBitmapTask mLoadBitmapTask; 12069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk private boolean mLoading = true; 1213d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 122f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryLooksAdapter = null; 123f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryBordersAdapter = null; 124f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryGeometryAdapter = null; 125f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private CategoryAdapter mCategoryFiltersAdapter = null; 126f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private int mCurrentPanel = MainPanel.LOOKS; 1273a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 1280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 1290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onCreate(Bundle savedInstanceState) { 1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard super.onCreate(savedInstanceState); 1310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 132f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait); 133f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (onlyUsePortrait) { 134f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 135f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 13669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk MasterImage.setMaster(mMasterImage); 137f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 138f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk clearGalleryBitmapPool(); 139f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk 140560f959b659bb510a6ac9a92831534c5dfcf16benicolasroard CachingPipeline.createRenderscriptContext(this); 14163a7dac01d394523799939596b960cb03321798dJohn Hoford setupMasterImage(); 1423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setDefaultValues(); 1433a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard fillEditors(); 1445448bf8095483574649afcc2add7f153670c7450nicolasroard 1453a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard loadXML(); 146f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadMainPanel(); 147cdea10749cbdb6bab8f49f1b5b562b6e89781981nicolasroard 1483a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setDefaultPreset(); 1492e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk 1503a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard processIntent(); 1513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 1525ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard 153f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public boolean isShowingImageStatePanel() { 154f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mShowingImageStatePanel; 155f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 156f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 157f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void loadMainPanel() { 158f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (findViewById(R.id.main_panel_container) == null) { 159f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 160f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 161f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MainPanel panel = new MainPanel(); 162f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 163f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG); 164f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard transaction.commit(); 165f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 166f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 167f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void loadEditorPanel(FilterRepresentation representation, 16800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard final Editor currentEditor) { 169f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation.getEditorId() == ImageOnlyEditor.ID) { 170f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard currentEditor.getImageShow().select(); 171f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard currentEditor.reflectCurrentFilter(); 172f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 173f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 17400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard final int currentId = currentEditor.getID(); 17500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard Runnable showEditor = new Runnable() { 17600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard @Override 17700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard public void run() { 17800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard EditorPanel panel = new EditorPanel(); 17900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard panel.setEditor(currentId); 18000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 18100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard transaction.remove(getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG)); 18200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG); 18300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard transaction.commit(); 18400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } 18500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard }; 18600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 18700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard boolean doAnimation = false; 18800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard if (mShowingImageStatePanel 18900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 19000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard doAnimation = true; 19100259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } 19200259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard if (doAnimation && main != null && main instanceof MainPanel) { 19300259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard MainPanel mainPanel = (MainPanel) main; 19400259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard View container = mainPanel.getView().findViewById(R.id.category_panel_container); 19500259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard View bottom = mainPanel.getView().findViewById(R.id.bottom_panel); 19600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard int panelHeight = container.getHeight() + bottom.getHeight(); 19700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard mainPanel.getView().animate().translationY(panelHeight).withEndAction(showEditor).start(); 19800259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } else { 19900259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard showEditor.run(); 20000259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard } 201f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 202f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 2033a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void loadXML() { 2040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard setContentView(R.layout.filtershow_activity); 2053a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 2069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard ActionBar actionBar = getActionBar(); 207786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 208786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.setCustomView(R.layout.filtershow_actionbar); 209786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard 210bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu mSaveButton = actionBar.getCustomView(); 211bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu mSaveButton.setOnClickListener(new OnClickListener() { 212786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard @Override 213786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard public void onClick(View view) { 214786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard saveImage(); 215786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard } 216786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard }); 2170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 2180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow = (ImageShow) findViewById(R.id.imageShow); 2190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageViews.add(mImageShow); 2200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 2213a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setupEditors(); 2225aa08941bda0cfbcfba522c53937dd66867f890dJohn Hoford 223733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard mEditorPlaceHolder.hide(); 224733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard 22592e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageShow.setImageLoader(mImageLoader); 226d61a2f9fcaad0309132b6b9b666c3dc6df62fed7John Hoford 227f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard fillFx(); 228f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard fillBorders(); 22938fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard fillGeometry(); 23038fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard fillFilters(); 2316900cad45d240c9a54b92991538b6a33652e766cnicolasroard 2326019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard setupStatePanel(); 2336019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard } 2346019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard 2356019ad95f1c85786488d2d4cae1cbb665d33bd30nicolasroard public void setupStatePanel() { 23663a7dac01d394523799939596b960cb03321798dJohn Hoford mImageLoader.setAdapter(mMasterImage.getHistory()); 23738fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard } 23838fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard 2393a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void fillFilters() { 2403a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>(); 2413a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FiltersManager filtersManager = FiltersManager.getManager(); 2423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard filtersManager.addEffects(filtersRepresentations); 243f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 244f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter = new CategoryAdapter(this); 245f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard for (FilterRepresentation representation : filtersRepresentations) { 246f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation.getTextId() != 0) { 247f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard representation.setName(getString(representation.getTextId())); 248f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 249f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.add(new Action(this, representation)); 250f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 2513a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 2523a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 2533a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void fillGeometry() { 25438fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>(); 25538fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard FiltersManager filtersManager = FiltersManager.getManager(); 25638fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard 2573a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard GeometryMetadata geo = new GeometryMetadata(); 2583a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard int[] editorsId = geo.getEditorIds(); 2593a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard for (int i = 0; i < editorsId.length; i++) { 2603a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard int editorId = editorsId[i]; 2613a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard GeometryMetadata geometry = new GeometryMetadata(geo); 2623a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard geometry.setEditorId(editorId); 2633a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard EditorInfo editorInfo = (EditorInfo) mEditorPlaceHolder.getEditor(editorId); 2643a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard geometry.setTextId(editorInfo.getTextId()); 2653a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard geometry.setOverlayId(editorInfo.getOverlayId()); 2663a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard geometry.setOverlayOnly(editorInfo.getOverlayOnly()); 267f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (geometry.getTextId() != 0) { 268f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard geometry.setName(getString(geometry.getTextId())); 269f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 27038fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard filtersRepresentations.add(geometry); 2713a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 27238fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard 27338fc044a6d45e7283f05e6fe800bc5faf9f2e573nicolasroard filtersManager.addTools(filtersRepresentations); 274f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 275f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryGeometryAdapter = new CategoryAdapter(this); 276f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard for (FilterRepresentation representation : filtersRepresentations) { 277f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryGeometryAdapter.add(new Action(this, representation)); 278f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 2793a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 2803a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 2813a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void processIntent() { 2820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Intent intent = getIntent(); 283a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) { 284a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 285a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu } 286a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu 287ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk mAction = intent.getAction(); 288ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk 289d49d53206a197b08ec4754d8751b6860e33d9f48John Reck if (intent.getData() != null) { 290d49d53206a197b08ec4754d8751b6860e33d9f48John Reck startLoadBitmap(intent.getData()); 2910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } else { 2920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard pickImage(); 2930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 2940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 2950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 2963a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void setupEditors() { 2973a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer)); 2983a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard EditorManager.addEditors(mEditorPlaceHolder); 2993a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.setOldViews(mImageViews); 3003a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.setImageLoader(mImageLoader); 3013a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3023a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3033a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void fillEditors() { 3043a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorDraw()); 3053a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new BasicEditor()); 3063a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new ImageOnlyEditor()); 3073a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorTinyPlanet()); 3083a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorRedEye()); 3093a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorCrop()); 3103a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorFlip()); 3113a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorRotate()); 3123a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mEditorPlaceHolder.addEditor(new EditorStraighten()); 3133a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3143a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3153a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard private void setDefaultValues() { 3163a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageFilter.setActivityForMemoryToasts(this); 3173a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3183a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Resources res = getResources(); 3193bc806a8575072c9459fe3698675d3713300d1d3nicolasroard FiltersManager.setResources(res); 3203a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 321f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard CategoryView.setMargin((int) getPixelsFromDip(8)); 322f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard CategoryView.setTextSize((int) getPixelsFromDip(16)); 323f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 3243a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageShow.setDefaultBackgroundColor(res.getColor(R.color.background_screen)); 3253a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard // TODO: get those values from XML. 3263a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FramedTextButton.setTextSize((int) getPixelsFromDip(14)); 3273a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4)); 3283a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard FramedTextButton.setTriangleSize((int) getPixelsFromDip(10)); 3293a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageShow.setTextSize((int) getPixelsFromDip(12)); 3303a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageShow.setTextPadding((int) getPixelsFromDip(10)); 3313a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4)); 3323a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageShow.setOriginalTextSize((int) getPixelsFromDip(18)); 3333a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageShow.setOriginalText(res.getString(R.string.original_picture_text)); 3343a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3353a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Drawable curveHandle = res.getDrawable(R.drawable.camera_crop); 3363a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size); 3373a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Spline.setCurveHandle(curveHandle, curveHandleSize); 3383a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard Spline.setCurveWidth((int) getPixelsFromDip(3)); 3393a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 3403a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageCrop.setAspectTextSize((int) getPixelsFromDip(18)); 3413a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageCrop.setTouchTolerance((int) getPixelsFromDip(25)); 3423a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImageCrop.setMinCropSize((int) getPixelsFromDip(55)); 3433a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 3443a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 345d49d53206a197b08ec4754d8751b6860e33d9f48John Reck private void startLoadBitmap(Uri uri) { 34669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk mLoading = true; 34700914f56c3390caa224b1c9fc07624665de40113John Reck final View loading = findViewById(R.id.loading); 348733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard final View imageShow = findViewById(R.id.imageShow); 349733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard imageShow.setVisibility(View.INVISIBLE); 350733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard loading.setVisibility(View.VISIBLE); 351f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mShowingTinyPlanet = false; 352f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mLoadBitmapTask = new LoadBitmapTask(); 353d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mLoadBitmapTask.execute(uri); 354d49d53206a197b08ec4754d8751b6860e33d9f48John Reck } 355d49d53206a197b08ec4754d8751b6860e33d9f48John Reck 356f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private void fillBorders() { 357f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk Vector<FilterRepresentation> borders = new Vector<FilterRepresentation>(); 358d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk 359d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk // The "no border" implementation 360f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk borders.add(new FilterImageBorderRepresentation(0)); 361d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk 362d88683e307eb058e71c083bb795bd31945ed1292Ruben Brunk // Google-build borders 3634c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford FiltersManager.getManager().addBorders(this, borders); 3644c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford 365f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk for (int i = 0; i < borders.size(); i++) { 366f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk FilterRepresentation filter = borders.elementAt(i); 367f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk if (i == 0) { 368f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk filter.setName(getString(R.string.none)); 3699090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 370f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 371f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 372f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryBordersAdapter = new CategoryAdapter(this); 373f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard for (FilterRepresentation representation : borders) { 374f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation.getTextId() != 0) { 375f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard representation.setName(getString(representation.getTextId())); 3769090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 37700259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard mCategoryBordersAdapter.add(new Action(this, representation, Action.FULL_VIEW)); 3789090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 3799090141f56b4e2000704d0c4a778d3a819821726nicolasroard } 3809090141f56b4e2000704d0c4a778d3a819821726nicolasroard 381f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryLooksAdapter() { 382f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryLooksAdapter; 383f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 384f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 385f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryBordersAdapter() { 386f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryBordersAdapter; 387f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 388f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 389f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryGeometryAdapter() { 390f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryGeometryAdapter; 391f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 392f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 393f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public CategoryAdapter getCategoryFiltersAdapter() { 394f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCategoryFiltersAdapter; 395f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 396f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 397f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void removeFilterRepresentation(FilterRepresentation filterRepresentation) { 398f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (filterRepresentation == null) { 399f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 400f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 401f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset oldPreset = MasterImage.getImage().getPreset(); 402f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset copy = new ImagePreset(oldPreset); 403f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard copy.removeFilter(filterRepresentation); 404f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setPreset(copy, true); 405f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) { 406f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard FilterRepresentation lastRepresentation = copy.getLastRepresentation(); 407f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation); 408f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 409f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 410f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 411f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void useFilterRepresentation(FilterRepresentation filterRepresentation) { 412f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (filterRepresentation == null) { 413f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 414f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 415f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) { 416f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 417f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 418f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset oldPreset = MasterImage.getImage().getPreset(); 419f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard ImagePreset copy = new ImagePreset(oldPreset); 420f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard FilterRepresentation representation = copy.getRepresentation(filterRepresentation); 421f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (representation == null) { 422f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard copy.addFilter(filterRepresentation); 423f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } else { 424f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (filterRepresentation.allowsMultipleInstances()) { 425f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard representation.updateTempParametersFrom(filterRepresentation); 426f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard copy.setHistoryName(filterRepresentation.getName()); 427f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard representation.synchronizeRepresentation(); 428f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 429f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard filterRepresentation = representation; 430f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 431f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setPreset(copy, true); 432f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation); 433f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 434f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 435f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void showRepresentation(FilterRepresentation representation) { 436f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford if (representation == null) { 437f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford return; 438f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford } 439f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard useFilterRepresentation(representation); 440f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 441f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard // show representation 442f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId()); 443f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadEditorPanel(representation, mCurrentEditor); 444f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 445f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 446f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public Editor getEditor(int editorID) { 447f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mEditorPlaceHolder.getEditor(editorID); 448f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 449f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 450f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void setCurrentPanel(int currentPanel) { 451f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCurrentPanel = currentPanel; 452f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 453f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 454f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public int getCurrentPanel() { 455f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return mCurrentPanel; 456f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 457f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 4588965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> { 459d49d53206a197b08ec4754d8751b6860e33d9f48John Reck int mBitmapSize; 4603d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 461f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public LoadBitmapTask() { 462d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mBitmapSize = getScreenImageSize(); 4633d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 4643d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 4653d4f2c7443f6f6015efab769bfaad19263137c67John Hoford @Override 466d49d53206a197b08ec4754d8751b6860e33d9f48John Reck protected Boolean doInBackground(Uri... params) { 4678965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk if (!mImageLoader.loadBitmap(params[0], mBitmapSize)) { 4688965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk return false; 4698965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk } 4708965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk publishProgress(mImageLoader.queryLightCycle360()); 4718965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk return true; 4723d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 4733d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 4743d4f2c7443f6f6015efab769bfaad19263137c67John Hoford @Override 4758965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk protected void onProgressUpdate(Boolean... values) { 47600914f56c3390caa224b1c9fc07624665de40113John Reck super.onProgressUpdate(values); 4776416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (isCancelled()) { 4788965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk return; 4796416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 4808965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk if (values[0]) { 4815300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford mShowingTinyPlanet = true; 4828965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk } 48300914f56c3390caa224b1c9fc07624665de40113John Reck } 48400914f56c3390caa224b1c9fc07624665de40113John Reck 48500914f56c3390caa224b1c9fc07624665de40113John Reck @Override 4863d4f2c7443f6f6015efab769bfaad19263137c67John Hoford protected void onPostExecute(Boolean result) { 48769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk MasterImage.setMaster(mMasterImage); 4883d4f2c7443f6f6015efab769bfaad19263137c67John Hoford if (isCancelled()) { 4893d4f2c7443f6f6015efab769bfaad19263137c67John Hoford return; 4903d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 491588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard 4928965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk if (!result) { 4938965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk cannotLoadImage(); 4943d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 4958965d1f4c2d437e0a0ad4fd225ea2cad9d2471c4Ruben Brunk 496733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard final View loading = findViewById(R.id.loading); 497733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard loading.setVisibility(View.GONE); 498733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard final View imageShow = findViewById(R.id.imageShow); 499733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard imageShow.setVisibility(View.VISIBLE); 500733a013ae1f2fe9979fb5a277b98af1544b8afb7nicolasroard 501cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard Bitmap largeBitmap = mImageLoader.getOriginalBitmapLarge(); 502cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard FilteringPipeline pipeline = FilteringPipeline.getPipeline(); 503cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard pipeline.setOriginal(largeBitmap); 504cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard float previewScale = (float) largeBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width(); 505cf0b2aad3bc5d80c51316ae10e1cf2c3476259aanicolasroard pipeline.setPreviewScaleFactor(previewScale); 5064dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres(); 5074dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard if (highresBitmap != null) { 5084dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard float highResPreviewScale = (float) highresBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width(); 5094dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard pipeline.setHighResPreviewScaleFactor(highResPreviewScale); 5104dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard } 511f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (!mShowingTinyPlanet) { 512f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.removeTinyPlanet(); 513f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 51433fca9ef7f89b60e3b1a361fdf5fc597b3994e74nicolasroard pipeline.turnOnPipeline(true); 515be61c1fcfae87f00d2b3111b15e90bbf4a88b6bcJohn Hoford MasterImage.getImage().setOriginalGeometry(largeBitmap); 516f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter.imageLoaded(); 517f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryBordersAdapter.imageLoaded(); 518f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryGeometryAdapter.imageLoaded(); 519f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.imageLoaded(); 520d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mLoadBitmapTask = null; 521ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk 522f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (mAction == TINY_PLANET_ACTION) { 523f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard showRepresentation(mCategoryFiltersAdapter.getTinyPlanet()); 524ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk } 52569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk mLoading = false; 5263d4f2c7443f6f6015efab769bfaad19263137c67John Hoford super.onPostExecute(result); 5273d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 5283d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 5293d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 5303d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 531f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk private void clearGalleryBitmapPool() { 532f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk (new AsyncTask<Void, Void, Void>() { 533f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk @Override 534f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk protected Void doInBackground(Void... params) { 535f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk // Free memory held in Gallery's Bitmap pool. May be O(n) for n bitmaps. 536f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk GalleryBitmapPool.getInstance().clear(); 537f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk return null; 538f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk } 539f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk }).execute(); 540f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk } 541f07bb27436a65b233c1caf4aa06c6257a9cf4046Ruben Brunk 5423d4f2c7443f6f6015efab769bfaad19263137c67John Hoford @Override 5433d4f2c7443f6f6015efab769bfaad19263137c67John Hoford protected void onDestroy() { 544d49d53206a197b08ec4754d8751b6860e33d9f48John Reck if (mLoadBitmapTask != null) { 545d49d53206a197b08ec4754d8751b6860e33d9f48John Reck mLoadBitmapTask.cancel(false); 5463d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 547f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard // TODO: refactor, don't use so many singletons. 5488898eaabfa0cdf70e00078d2dea810f9aab4dfd1Ruben Brunk FilteringPipeline.getPipeline().turnOnPipeline(false); 549b17b1b0758799914fbad5f4a3afae71ce58891fcRuben Brunk MasterImage.reset(); 550b17b1b0758799914fbad5f4a3afae71ce58891fcRuben Brunk FilteringPipeline.reset(); 551b17b1b0758799914fbad5f4a3afae71ce58891fcRuben Brunk ImageFilter.resetStatics(); 552f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk FiltersManager.getPreviewManager().freeRSFilterScripts(); 553f79f954f4eb23bce55061c683a07fc7b3a965451Ruben Brunk FiltersManager.getManager().freeRSFilterScripts(); 554e29b57330be471dd74672a7bdc74a93dcae3a98bnicolasroard FiltersManager.getHighresManager().freeRSFilterScripts(); 55521a01faab1125c5c347a3dfbf6a71de6aec233a1Ruben Brunk FiltersManager.reset(); 556560f959b659bb510a6ac9a92831534c5dfcf16benicolasroard CachingPipeline.destroyRenderScriptContext(); 5573d4f2c7443f6f6015efab769bfaad19263137c67John Hoford super.onDestroy(); 5583d4f2c7443f6f6015efab769bfaad19263137c67John Hoford } 5593d4f2c7443f6f6015efab769bfaad19263137c67John Hoford 5600f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk private int getScreenImageSize() { 5610f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk DisplayMetrics metrics = new DisplayMetrics(); 562fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford Display display = getWindowManager().getDefaultDisplay(); 5630f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk Point size = new Point(); 564fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford display.getSize(size); 565fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford display.getMetrics(metrics); 566fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford int msize = Math.min(size.x, size.y); 5670f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return (133 * msize) / metrics.densityDpi; 568fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford } 569fafb2edbb9928039b887f59685d82593bd79e06aJohn Hoford 5700addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu private void showSavingProgress(String albumName) { 571ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu ProgressDialog progress; 572ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (mSavingProgressDialog != null) { 573ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress = mSavingProgressDialog.get(); 574ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (progress != null) { 575ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress.show(); 576ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu return; 577ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 578ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 579ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu // TODO: Allow cancellation of the saving process 5800addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu String progressText; 5810addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu if (albumName == null) { 5820addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu progressText = getString(R.string.saving_image); 5830addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu } else { 5840addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu progressText = getString(R.string.filtershow_saving_image, albumName); 5850addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu } 5860addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu progress = ProgressDialog.show(this, "", progressText, true, false); 587ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu mSavingProgressDialog = new WeakReference<ProgressDialog>(progress); 588ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 589ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 590ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private void hideSavingProgress() { 591ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (mSavingProgressDialog != null) { 592ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu ProgressDialog progress = mSavingProgressDialog.get(); 59308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard if (progress != null) 59408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard progress.dismiss(); 595ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 596ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 597ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 5980ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public void completeSaveImage(Uri saveUri) { 5990ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (mSharingImage && mSharedOutputFile != null) { 6000ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Image saved, we unblock the content provider 6010ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 6020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 6030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard ContentValues values = new ContentValues(); 6040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard values.put(SharedImageProvider.PREPARE, false); 6050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard getContentResolver().insert(uri, values); 6060ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 6070ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard setResult(RESULT_OK, new Intent().setData(saveUri)); 608ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu hideSavingProgress(); 6090ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard finish(); 6100ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 6110ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 6120ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 6130ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) { 61492e2341248e99c691f38820503984bc5e2f18811nicolasroard // First, let's tell the SharedImageProvider that it will need to wait 61592e2341248e99c691f38820503984bc5e2f18811nicolasroard // for the image 6160ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 6170ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 6180ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard ContentValues values = new ContentValues(); 6190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard values.put(SharedImageProvider.PREPARE, true); 6200ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard getContentResolver().insert(uri, values); 6210ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mSharingImage = true; 6220ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 6230ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Process and save the image in the background. 6240addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu showSavingProgress(null); 6250ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageShow.saveImage(this, mSharedOutputFile); 6260ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return true; 6270ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 6280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 6290ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private Intent getDefaultShareIntent() { 6300ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Intent intent = new Intent(Intent.ACTION_SEND); 6310ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 6320ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 6330ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.setType(SharedImageProvider.MIME_TYPE); 6340ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri()); 6350ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 6360ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 6370ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.putExtra(Intent.EXTRA_STREAM, uri); 6380ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return intent; 6390ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 6400ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 6419594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard @Override 6429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean onCreateOptionsMenu(Menu menu) { 6439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu); 644bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard MenuItem showState = menu.findItem(R.id.showImageStateButton); 645bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (mShowingImageStatePanel) { 646bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showState.setTitle(R.string.hide_imagestate_panel); 6479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } else { 648bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showState.setTitle(R.string.show_imagestate_panel); 6499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 6500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share) 6510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard .getActionProvider(); 6520ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider.setShareIntent(getDefaultShareIntent()); 6530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider.setOnShareTargetSelectedListener(this); 65423e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard 65523e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard MenuItem undoItem = menu.findItem(R.id.undoButton); 65623e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard MenuItem redoItem = menu.findItem(R.id.redoButton); 65723e58b3595de28bc8f899f3fba1ca9734533213cnicolasroard MenuItem resetItem = menu.findItem(R.id.resetHistoryButton); 65863a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem); 6599594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 6609594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 6619594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 66292e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 6636e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu public void onPause() { 6646e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu super.onPause(); 66569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk rsPause(); 6666e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu if (mShareActionProvider != null) { 6676e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu mShareActionProvider.setOnShareTargetSelectedListener(null); 6686e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 6696e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 6706e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu 6716e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu @Override 6726e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu public void onResume() { 6736e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu super.onResume(); 67469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk rsResume(); 6756e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu if (mShareActionProvider != null) { 6766e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu mShareActionProvider.setOnShareTargetSelectedListener(this); 6776e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 6786e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu } 6796e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu 68069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk private void rsResume() { 68169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk ImageFilter.setActivityForMemoryToasts(this); 68269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk MasterImage.setMaster(mMasterImage); 68369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk if (CachingPipeline.getRenderScriptContext() == null) { 68469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk CachingPipeline.createRenderscriptContext(this); 68569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk } 68669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FiltersManager.setResources(getResources()); 68769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk if (!mLoading) { 68869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk Bitmap largeBitmap = mImageLoader.getOriginalBitmapLarge(); 68969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FilteringPipeline pipeline = FilteringPipeline.getPipeline(); 69069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk pipeline.setOriginal(largeBitmap); 69169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk float previewScale = (float) largeBitmap.getWidth() / 69269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk (float) mImageLoader.getOriginalBounds().width(); 69369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk pipeline.setPreviewScaleFactor(previewScale); 69469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres(); 69569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk if (highresBitmap != null) { 69669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk float highResPreviewScale = (float) highresBitmap.getWidth() / 69769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk (float) mImageLoader.getOriginalBounds().width(); 69869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk pipeline.setHighResPreviewScaleFactor(highResPreviewScale); 69969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk } 70069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk pipeline.turnOnPipeline(true); 70169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk MasterImage.getImage().setOriginalGeometry(largeBitmap); 70269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk } 70369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk } 70469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk 70569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk private void rsPause() { 70669f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FilteringPipeline.getPipeline().turnOnPipeline(false); 70769f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FilteringPipeline.reset(); 70869f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk ImageFilter.resetStatics(); 70969f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FiltersManager.getPreviewManager().freeRSFilterScripts(); 71069f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FiltersManager.getManager().freeRSFilterScripts(); 71169f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FiltersManager.getHighresManager().freeRSFilterScripts(); 71269f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk FiltersManager.reset(); 71369f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk CachingPipeline.destroyRenderScriptContext(); 71469f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk } 71569f5d8cbf51422454257a00d7959b2e8d50cb0caRuben Brunk 7166e733b74465ad6994c23d624fd8ee9b7c249e7b3Bobby Georgescu @Override 7179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean onOptionsItemSelected(MenuItem item) { 7189594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard switch (item.getItemId()) { 7199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.undoButton: { 72063a7dac01d394523799939596b960cb03321798dJohn Hoford HistoryAdapter adapter = mMasterImage.getHistory(); 7219594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard int position = adapter.undo(); 72263a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.onHistoryItemClick(position); 7239594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.showToast("Undo"); 724a7a6a3a5efaf62cdd5d562a9141678671952d27dJohn Hoford backToMain(); 7259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 7269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 7279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7289594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.redoButton: { 72963a7dac01d394523799939596b960cb03321798dJohn Hoford HistoryAdapter adapter = mMasterImage.getHistory(); 7309594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard int position = adapter.redo(); 73163a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.onHistoryItemClick(position); 7329594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.showToast("Redo"); 7339594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 7349594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 7359594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 736f47e790e3f3553f69abe054eec20bd7585118843nicolasroard case R.id.resetHistoryButton: { 737f47e790e3f3553f69abe054eec20bd7585118843nicolasroard resetHistory(); 738f47e790e3f3553f69abe054eec20bd7585118843nicolasroard return true; 739f47e790e3f3553f69abe054eec20bd7585118843nicolasroard } 740bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard case R.id.showImageStateButton: { 741bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard toggleImageStatePanel(); 742bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard return true; 743bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 7449594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case android.R.id.home: { 7459594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard saveImage(); 7469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 7479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7489594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return false; 7509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 7519594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 752bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu public void enableSave(boolean enable) { 753bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu if (mSaveButton != null) 754bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu mSaveButton.setEnabled(enable); 755bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu } 756bf1677a434760fcb7389a30c18e05cc3e7926d40Doris Liu 757f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard private void fillFx() { 75833de212ec780eaf2bc8d86908f07da33ea8dd7f2John Hoford FilterFxRepresentation nullFx = 75933de212ec780eaf2bc8d86908f07da33ea8dd7f2John Hoford new FilterFxRepresentation(getString(R.string.none), 0, R.string.none); 760f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard Vector<FilterRepresentation> filtersRepresentations = new Vector<FilterRepresentation>(); 7614c792cc7b44be1ea0a2cfc2e7259828b81b0e4a4John Hoford FiltersManager.getManager().addLooks(this, filtersRepresentations); 762f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 763f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter = new CategoryAdapter(this); 764f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height); 765f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter.setItemHeight(verticalItemHeight); 76600259461be82e601b58d3e970afbf0c012c5f3e7nicolasroard mCategoryLooksAdapter.add(new Action(this, nullFx, Action.FULL_VIEW)); 767f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard for (FilterRepresentation representation : filtersRepresentations) { 768f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW)); 769f60760478ec7c78446be0e0c6bc5502d1557974cnicolasroard } 7703a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard } 7710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 7723a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard public void setDefaultPreset() { 7730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Default preset (original) 7743a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard ImagePreset preset = new ImagePreset(getString(R.string.history_original)); // empty 7753a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard preset.setImageLoader(mImageLoader); 7763a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 77763a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.setPreset(preset, true); 7780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 7790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 7800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 7810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Some utility functions 78292e2341248e99c691f38820503984bc5e2f18811nicolasroard // TODO: finish the cleanup. 7830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 7840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void invalidateViews() { 7850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (ImageShow views : mImageViews) { 7860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard views.invalidate(); 7878537d097f8827caedc8c39564de54d36eae8b16fRuben Brunk views.updateImage(); 7880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 7890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 7900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 7910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void hideImageViews() { 7920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (View view : mImageViews) { 7930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard view.setVisibility(View.GONE); 7940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 7955b85b092af404effd32aa513f9c45a0232d7ae81nicolasroard mEditorPlaceHolder.hide(); 7960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 7970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 7980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 799bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard // imageState panel... 800bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 801f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void toggleImageStatePanel() { 802fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard invalidateOptionsMenu(); 803f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mShowingImageStatePanel = !mShowingImageStatePanel; 804f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 805f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (panel != null) { 806f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (panel instanceof EditorPanel) { 807f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard EditorPanel editorPanel = (EditorPanel) panel; 808f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard editorPanel.showImageStatePanel(mShowingImageStatePanel); 809f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } else if (panel instanceof MainPanel) { 810f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MainPanel mainPanel = (MainPanel) panel; 811f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mainPanel.showImageStatePanel(mShowingImageStatePanel); 812f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 813bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 814bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 815bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 816a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard @Override 817a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard public void onConfigurationChanged(Configuration newConfig) 818a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard { 819a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard super.onConfigurationChanged(newConfig); 8203a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard setDefaultValues(); 8213a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard loadXML(); 822f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadMainPanel(); 823f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 824f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford // mLoadBitmapTask==null implies you have looked at the intent 825f57e5885f74f586760daa9eeb0808c53ac4b2c9dJohn Hoford if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) { 826f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mCategoryFiltersAdapter.removeTinyPlanet(); 8275300e0c54110d67f85fdb2ee9c90be58f50ca4acJohn Hoford } 8283a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard final View loading = findViewById(R.id.loading); 8293a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard loading.setVisibility(View.GONE); 830a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard } 831a9bc8ef5774557a66bcb9bb6d38cb16f7ef56e2enicolasroard 83263a7dac01d394523799939596b960cb03321798dJohn Hoford public void setupMasterImage() { 8333a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard mImageLoader = new ImageLoader(this, getApplicationContext()); 8343a5556d3ce5dba33021867468ae0d5d222f256dbnicolasroard 83563a7dac01d394523799939596b960cb03321798dJohn Hoford HistoryAdapter mHistoryAdapter = new HistoryAdapter( 83663a7dac01d394523799939596b960cb03321798dJohn Hoford this, R.layout.filtershow_history_operation_row, 83763a7dac01d394523799939596b960cb03321798dJohn Hoford R.id.rowTextView); 83863a7dac01d394523799939596b960cb03321798dJohn Hoford 839fb6a8e166f0a46d2a994a408b1679e3a67fdcb52nicolasroard StateAdapter mImageStateAdapter = new StateAdapter(this, 0); 840588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard MasterImage.reset(); 841588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard mMasterImage = MasterImage.getImage(); 84263a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.setHistoryAdapter(mHistoryAdapter); 84363a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.setStateAdapter(mImageStateAdapter); 84463a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.setActivity(this); 8458d2c7ee02c8fde53effc787c172b10b14ae34d42nicolasroard mMasterImage.setImageLoader(mImageLoader); 8464dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard 8474dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) { 8484dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard mMasterImage.setSupportsHighRes(true); 8494dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard } else { 8504dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard mMasterImage.setSupportsHighRes(false); 8514dad1a9e3f213e95a4f419c06ea885fee75d3297nicolasroard } 85263a7dac01d394523799939596b960cb03321798dJohn Hoford } 85363a7dac01d394523799939596b960cb03321798dJohn Hoford 8542e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk void resetHistory() { 85563a7dac01d394523799939596b960cb03321798dJohn Hoford HistoryAdapter adapter = mMasterImage.getHistory(); 8569594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard adapter.reset(); 8579594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard ImagePreset original = new ImagePreset(adapter.getItem(0)); 85863a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.setPreset(original, true); 8599594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 860be9c8105b431de765f5811bfd170c899d1c8d3b3John Reck backToMain(); 8610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 8620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 863f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void showDefaultImageView() { 864f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mEditorPlaceHolder.hide(); 865f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard mImageShow.setVisibility(View.VISIBLE); 866f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilter(null); 867f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard MasterImage.getImage().setCurrentFilterRepresentation(null); 868f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 869f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 870f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard public void backToMain() { 871f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 872f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (currentPanel instanceof MainPanel) { 873f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard return; 874f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 875f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard loadMainPanel(); 876f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard showDefaultImageView(); 877f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } 878f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard 87975608166f54891972ebad3d8fd958fed9a5300e6nicolasroard @Override 88075608166f54891972ebad3d8fd958fed9a5300e6nicolasroard public void onBackPressed() { 881f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); 882f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (currentPanel instanceof MainPanel) { 883f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard if (!mImageShow.hasModifications()) { 884a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk done(); 885a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } else { 886a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk AlertDialog.Builder builder = new AlertDialog.Builder(this); 887a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk builder.setMessage(R.string.unsaved).setTitle(R.string.save_before_exit); 888a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk builder.setPositiveButton(R.string.save_and_exit, new DialogInterface.OnClickListener() { 889a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk public void onClick(DialogInterface dialog, int id) { 890a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk saveImage(); 891a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 892a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk }); 893e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() { 894a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk public void onClick(DialogInterface dialog, int id) { 895a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk done(); 896a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 897a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk }); 898e7aa98e533531f5e82f5de37c24701bc44bc6cd1Ruben Brunk builder.show(); 899a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 900f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard } else { 901f5eedf1635eba7edfa7d41fd4e991cced978c4b2nicolasroard backToMain(); 90275608166f54891972ebad3d8fd958fed9a5300e6nicolasroard } 90375608166f54891972ebad3d8fd958fed9a5300e6nicolasroard } 904e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard 905e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard public void cannotLoadImage() { 906e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard CharSequence text = getString(R.string.cannot_load_image); 907e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT); 908e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard toast.show(); 909e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard finish(); 910e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard } 911e34a5a5eaedb870798a5cc7415079d04a6ca42e0nicolasroard 9120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 9130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public float getPixelsFromDip(float value) { 9150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Resources r = getResources(); 9160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, 9170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard r.getDisplayMetrics()); 9180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 9210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onItemClick(AdapterView<?> parent, View view, int position, 9220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard long id) { 92363a7dac01d394523799939596b960cb03321798dJohn Hoford mMasterImage.onHistoryItemClick(position); 9240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard invalidateViews(); 9250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void pickImage() { 9280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Intent intent = new Intent(); 9290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard intent.setType("image/*"); 9300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard intent.setAction(Intent.ACTION_GET_CONTENT); 9310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)), 9320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard SELECT_PICTURE); 9330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 93592e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 9360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onActivityResult(int requestCode, int resultCode, Intent data) { 9370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (resultCode == RESULT_OK) { 9380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (requestCode == SELECT_PICTURE) { 9390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Uri selectedImageUri = data.getData(); 940d49d53206a197b08ec4754d8751b6860e33d9f48John Reck startLoadBitmap(selectedImageUri); 9410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 9440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9456416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk private boolean mSaveToExtraUri = false; 9466416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk private boolean mSaveAsWallpaper = false; 9476416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk private boolean mReturnAsExtra = false; 948ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk private boolean mOutputted = false; 9496416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 9500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void saveImage() { 951a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk handleSpecialExitCases(); 952a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk if (!mOutputted) { 953a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk if (mImageShow.hasModifications()) { 954a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk // Get the name of the album, to which the image will be saved 955a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri()); 956a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk int bucketId = GalleryUtils.getBucketId(saveDir.getPath()); 957a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null); 958a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk showSavingProgress(albumName); 959a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk mImageShow.saveImage(this, null); 960a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } else { 961a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk done(); 962a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 963a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 964a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 965a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk 966a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk public boolean detectSpecialExitCases() { 967a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk return mCropExtras != null && (mCropExtras.getExtraOutput() != null 968a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk || mCropExtras.getSetAsWallpaper() || mCropExtras.getReturnData()); 969a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk } 970a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk 971a3dbbd7dcbd9aead7b10653b95685f5d2a71947aRuben Brunk public void handleSpecialExitCases() { 9726416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mCropExtras != null) { 9736416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mCropExtras.getExtraOutput() != null) { 9746416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mSaveToExtraUri = true; 975ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk mOutputted = true; 9766416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 9776416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mCropExtras.getSetAsWallpaper()) { 9786416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mSaveAsWallpaper = true; 979ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk mOutputted = true; 9806416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 9816416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mCropExtras.getReturnData()) { 9826416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mReturnAsExtra = true; 983ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk mOutputted = true; 9846416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 985ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk if (mOutputted) { 9866416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mImageShow.getImagePreset().mGeoData.setUseCropExtrasFlag(true); 9876416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk showSavingProgress(null); 9886416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mImageShow.returnFilteredResult(this); 9896416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 9906416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 9916416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 9926416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 9936416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk public void onFilteredResult(Bitmap filtered) { 9946416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk Intent intent = new Intent(); 9956416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk intent.putExtra(CropExtras.KEY_CROPPED_RECT, mImageShow.getImageCropBounds()); 9966416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mSaveToExtraUri) { 9976416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mImageShow.saveToUri(filtered, mCropExtras.getExtraOutput(), 9986416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk mCropExtras.getOutputFormat(), this); 9996416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10006416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mSaveAsWallpaper) { 1001a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk setWallpaperInBackground(filtered); 100255550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard } 10036416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (mReturnAsExtra) { 10046416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (filtered != null) { 10056416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk int bmapSize = filtered.getRowBytes() * filtered.getHeight(); 10066416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk /* 10076416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk * Max size of Binder transaction buffer is 1Mb, so constrain 10086416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk * Bitmap to be somewhat less than this, otherwise we get 10096416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk * TransactionTooLargeExceptions. 10106416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk */ 10116416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (bmapSize > MAX_BMAP_IN_INTENT) { 10126416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk Log.w(LOGTAG, "Bitmap too large to be returned via intent"); 10136416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } else { 10146416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk intent.putExtra(CropExtras.KEY_DATA, filtered); 10156416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10166416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10176416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10186416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk setResult(RESULT_OK, intent); 10196416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk if (!mSaveToExtraUri) { 10206416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk done(); 10216416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10226416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10236416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk 1024a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk void setWallpaperInBackground(final Bitmap bmap) { 1025a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk Toast.makeText(this, R.string.setting_wallpaper, Toast.LENGTH_LONG).show(); 1026c01187e2ef31115518cd1eb900ebf4cfa14e1976Ruben Brunk BitmapTask.Callbacks<FilterShowActivity> cb = new BitmapTask.Callbacks<FilterShowActivity>() { 1027a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk @Override 1028a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk public void onComplete(Bitmap result) {} 1029a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk 1030a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk @Override 1031a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk public void onCancel() {} 1032a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk 1033a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk @Override 1034a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk public Bitmap onExecute(FilterShowActivity param) { 1035a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk try { 1036a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk WallpaperManager.getInstance(param).setBitmap(bmap); 1037a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk } catch (IOException e) { 1038a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk Log.w(LOGTAG, "fail to set wall paper", e); 1039a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk } 1040a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk return null; 1041a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk } 1042a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk }; 1043c01187e2ef31115518cd1eb900ebf4cfa14e1976Ruben Brunk (new BitmapTask<FilterShowActivity>(cb)).execute(this); 1044a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk } 1045a24145829118672e8b9b98e18de78eae71daaa08Ruben Brunk 10466416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk public void done() { 1047ab779def9c3aa45b100872f2369ec2f4a1d9a709Ruben Brunk if (mOutputted) { 10486416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk hideSavingProgress(); 10496416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk } 10506416dd59687768d4152d5d954dd0e8c3617b9d97Ruben Brunk finish(); 10510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 10530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard static { 1054e3f9f579d73af613a33ba1d0a93dc101ea671a69nicolasroard System.loadLibrary("jni_filtershow_filters"); 10550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 10560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 10570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard} 1058