blob: bc8f7d8eeabcce283b645841e21a0d0c9a15c4e3 [file] [log] [blame]
nicolasroarda9f280f2012-10-23 11:26:38 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
nicolasroard0d7cdf82012-09-25 14:27:56 -070016
17package com.android.gallery3d.filtershow;
18
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -070019import java.io.File;
20import java.lang.ref.WeakReference;
21import java.util.ArrayList;
jinwu4fafa7a2017-04-07 13:27:48 +080022import java.util.Collections;
Ravi Banuri49f14dd2015-10-21 15:54:59 +053023import java.util.Locale;
Jay Wang723944e2016-06-15 16:14:50 -070024import java.util.Vector;
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -070025
nicolasroard9594c8d2012-09-27 20:54:48 -070026import android.app.ActionBar;
Ruben Brunka3dbbd72013-03-29 12:36:30 -070027import android.app.AlertDialog;
Bobby Georgescuec29b732012-10-07 15:20:44 -070028import android.app.ProgressDialog;
huiyan3de604e2016-04-27 15:28:45 +080029import android.content.BroadcastReceiver;
nicolasroard24d6ec72013-07-12 18:27:54 -070030import android.content.ComponentName;
zhuwf4f10df2017-09-18 09:23:03 +080031import android.content.ContentResolver;
nicolasroard0ee91a22012-10-01 00:25:11 -070032import android.content.ContentValues;
Ruben Brunk0c1b4c62013-07-08 18:11:49 -070033import android.content.Context;
Ruben Brunka3dbbd72013-03-29 12:36:30 -070034import android.content.DialogInterface;
Byunghun Jeon863bd522015-11-02 17:20:55 -080035import android.content.DialogInterface.OnCancelListener;
nicolasroard0d7cdf82012-09-25 14:27:56 -070036import android.content.Intent;
huiyan3de604e2016-04-27 15:28:45 +080037import android.content.IntentFilter;
nicolasroard24d6ec72013-07-12 18:27:54 -070038import android.content.ServiceConnection;
nicolasroardf5eedf12013-04-19 17:13:30 -070039import android.content.pm.ActivityInfo;
nicolasroarda9bc8ef2012-10-23 14:09:53 -070040import android.content.res.Configuration;
nicolasroard0d7cdf82012-09-25 14:27:56 -070041import android.content.res.Resources;
zhuwf4f10df2017-09-18 09:23:03 +080042import android.database.Cursor;
John Hoford457e88c2012-10-09 16:17:17 -070043import android.graphics.Bitmap;
John Hoford3759b2d2013-09-10 16:59:23 -070044import android.graphics.Color;
jinwu4fafa7a2017-04-07 13:27:48 +080045import android.graphics.Matrix;
nicolasroard32cc4dd2013-09-06 17:21:55 -070046import android.graphics.Point;
Ruben Brunk0c1b4c62013-07-08 18:11:49 -070047import android.graphics.Rect;
nicolasroard9f452e02013-08-23 00:10:01 -070048import android.graphics.drawable.ColorDrawable;
nicolasroard0d7cdf82012-09-25 14:27:56 -070049import android.graphics.drawable.Drawable;
nicolasroard92e23412012-10-05 03:48:34 -070050import android.net.Uri;
John Hoford3d4f2c72012-10-23 17:14:35 -070051import android.os.AsyncTask;
nicolasroard92e23412012-10-05 03:48:34 -070052import android.os.Bundle;
nicolasroardaf593222013-06-10 18:33:11 -070053import android.os.Handler;
nicolasroard24d6ec72013-07-12 18:27:54 -070054import android.os.IBinder;
jinwu4fafa7a2017-04-07 13:27:48 +080055import android.os.Message;
zhuwf4f10df2017-09-18 09:23:03 +080056import android.provider.MediaStore;
nicolasroardfa474a12013-07-15 11:24:36 -070057import android.support.v4.app.DialogFragment;
nicolasroardf5eedf12013-04-19 17:13:30 -070058import android.support.v4.app.Fragment;
nicolasroardfb6a8e12013-04-15 14:41:00 -070059import android.support.v4.app.FragmentTransaction;
Svetoslav Ganov391e4a12013-10-06 20:03:32 -070060import android.support.v4.print.PrintHelper;
John Hofordfafb2ed2012-10-11 12:55:05 -070061import android.util.DisplayMetrics;
John Hoford52fa1102013-06-11 13:07:15 -070062import android.util.Log;
ztenghuid2e9ea02013-06-24 13:54:04 -070063import android.util.TypedValue;
wqi07055372016-04-13 09:57:51 +080064import android.view.Gravity;
nicolasroardf5eedf12013-04-19 17:13:30 -070065import android.view.Menu;
66import android.view.MenuItem;
nicolasroard860af322013-08-08 20:47:28 -070067import android.view.MotionEvent;
nicolasroardf5eedf12013-04-19 17:13:30 -070068import android.view.View;
nicolasroard0d7cdf82012-09-25 14:27:56 -070069import android.view.View.OnClickListener;
Ravi Banuri49f14dd2015-10-21 15:54:59 +053070import android.view.View.OnTouchListener;
nicolasroardaf593222013-06-10 18:33:11 -070071import android.view.ViewPropertyAnimator;
Jay Wang723944e2016-06-15 16:14:50 -070072import android.view.Window;
nicolasroardf5eedf12013-04-19 17:13:30 -070073import android.view.WindowManager;
zhuwf4f10df2017-09-18 09:23:03 +080074import android.webkit.MimeTypeMap;
John Hofordbe61c1f2013-02-27 19:21:38 -080075import android.widget.AdapterView;
nicolasroard0d7cdf82012-09-25 14:27:56 -070076import android.widget.AdapterView.OnItemClickListener;
Ravi Banuri49f14dd2015-10-21 15:54:59 +053077import android.widget.Button;
jinwu4fafa7a2017-04-07 13:27:48 +080078import android.widget.EditText;
John Hofordbe61c1f2013-02-27 19:21:38 -080079import android.widget.FrameLayout;
Ravi Banuri49f14dd2015-10-21 15:54:59 +053080import android.widget.ImageButton;
81import android.widget.LinearLayout;
John Hoford64fc2ed2013-10-09 13:54:45 -070082import android.widget.PopupMenu;
Ravi Banuri49f14dd2015-10-21 15:54:59 +053083import android.widget.RelativeLayout;
nicolasroardf5eedf12013-04-19 17:13:30 -070084import android.widget.Toast;
Ruben Brunkd25fdea2013-05-28 12:34:14 -070085
Likai Dingc83b5b72016-05-25 14:48:41 +080086import org.codeaurora.gallery.R;
jinwu4fafa7a2017-04-07 13:27:48 +080087
zhuwad6505d2017-07-26 15:09:37 +080088import com.android.gallery3d.app.AbstractPermissionActivity;
nicolasroard24d6ec72013-07-12 18:27:54 -070089import com.android.gallery3d.app.PhotoPage;
Doris Liu0addfc72012-10-17 16:15:51 -070090import com.android.gallery3d.data.LocalAlbum;
nicolasroard92e23412012-10-05 03:48:34 -070091import com.android.gallery3d.filtershow.cache.ImageLoader;
Ruben Brunkd25fdea2013-05-28 12:34:14 -070092import com.android.gallery3d.filtershow.category.Action;
93import com.android.gallery3d.filtershow.category.CategoryAdapter;
jinwu4fafa7a2017-04-07 13:27:48 +080094import com.android.gallery3d.filtershow.category.CategoryPanelLevelTwo;
nicolasroard9737f3a2013-08-14 11:14:47 -070095import com.android.gallery3d.filtershow.category.CategoryView;
wqi6c5a2dd2016-04-14 11:25:23 +080096import com.android.gallery3d.filtershow.category.EditorCropPanel;
Ruben Brunkd25fdea2013-05-28 12:34:14 -070097import com.android.gallery3d.filtershow.category.MainPanel;
wqi6c5a2dd2016-04-14 11:25:23 +080098import com.android.gallery3d.filtershow.category.StraightenPanel;
nicolasroard860af322013-08-08 20:47:28 -070099import com.android.gallery3d.filtershow.category.SwipableView;
Jay Wangf19b0702016-06-09 12:49:49 -0700100import com.android.gallery3d.filtershow.category.TruePortraitMaskEditorPanel;
Jack Yooe94e7662016-05-18 11:34:04 -0700101import com.android.gallery3d.filtershow.category.TrueScannerPanel;
jinwu4fafa7a2017-04-07 13:27:48 +0800102import com.android.gallery3d.filtershow.data.FilterPresetSource;
103import com.android.gallery3d.filtershow.data.FilterPresetSource.SaveOption;
104import com.android.gallery3d.filtershow.category.WaterMarkView;
Ruben Brunk077e7182013-08-01 19:05:18 -0700105import com.android.gallery3d.filtershow.data.UserPresetsManager;
Ruben Brunkd25fdea2013-05-28 12:34:14 -0700106import com.android.gallery3d.filtershow.editors.Editor;
wqi6c5a2dd2016-04-14 11:25:23 +0800107import com.android.gallery3d.filtershow.editors.EditorCrop;
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -0700108import com.android.gallery3d.filtershow.editors.EditorDualCamFusion;
Ruben Brunkd25fdea2013-05-28 12:34:14 -0700109import com.android.gallery3d.filtershow.editors.EditorManager;
110import com.android.gallery3d.filtershow.editors.EditorPanel;
wqi6c5a2dd2016-04-14 11:25:23 +0800111import com.android.gallery3d.filtershow.editors.EditorStraighten;
Jay Wangf19b0702016-06-09 12:49:49 -0700112import com.android.gallery3d.filtershow.editors.EditorTruePortraitFusion;
113import com.android.gallery3d.filtershow.editors.EditorTruePortraitImageOnly;
114import com.android.gallery3d.filtershow.editors.EditorTruePortraitMask;
Chao Zhang7362c022016-05-23 14:31:39 +0800115import com.android.gallery3d.filtershow.editors.HazeBusterEditor;
Ruben Brunkd25fdea2013-05-28 12:34:14 -0700116import com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
Chao Zhang7362c022016-05-23 14:31:39 +0800117import com.android.gallery3d.filtershow.editors.SeeStraightEditor;
118import com.android.gallery3d.filtershow.editors.TrueScannerEditor;
jinwu4fafa7a2017-04-07 13:27:48 +0800119import com.android.gallery3d.filtershow.filters.FilterDualCamBasicRepresentation;
120import com.android.gallery3d.filtershow.filters.FilterDualCamFusionRepresentation;
nicolasroard57bd0922013-08-12 14:04:11 -0700121import com.android.gallery3d.filtershow.filters.FilterMirrorRepresentation;
jinwu4fafa7a2017-04-07 13:27:48 +0800122import com.android.gallery3d.filtershow.filters.FilterPresetRepresentation;
Ruben Brunkd25fdea2013-05-28 12:34:14 -0700123import com.android.gallery3d.filtershow.filters.FilterRepresentation;
nicolasroard57bd0922013-08-12 14:04:11 -0700124import com.android.gallery3d.filtershow.filters.FilterRotateRepresentation;
Ruben Brunk077e7182013-08-01 19:05:18 -0700125import com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation;
jinwu4fafa7a2017-04-07 13:27:48 +0800126import com.android.gallery3d.filtershow.filters.FilterWatermarkRepresentation;
Ruben Brunkd25fdea2013-05-28 12:34:14 -0700127import com.android.gallery3d.filtershow.filters.FiltersManager;
128import com.android.gallery3d.filtershow.filters.ImageFilter;
jinwu4fafa7a2017-04-07 13:27:48 +0800129import com.android.gallery3d.filtershow.filters.SaveWaterMark;
Zhang Zhenzhen38478f22015-03-10 16:40:13 +0800130import com.android.gallery3d.filtershow.filters.SimpleMakeupImageFilter;
jinwu4fafa7a2017-04-07 13:27:48 +0800131import com.android.gallery3d.filtershow.filters.TrueScannerActs;
nicolasroard5180e682013-06-27 14:12:17 -0700132import com.android.gallery3d.filtershow.history.HistoryItem;
Ruben Brunk077e7182013-08-01 19:05:18 -0700133import com.android.gallery3d.filtershow.history.HistoryManager;
nicolasroard92e23412012-10-05 03:48:34 -0700134import com.android.gallery3d.filtershow.imageshow.ImageShow;
John Hoford63a7dac2013-01-14 14:48:39 -0800135import com.android.gallery3d.filtershow.imageshow.MasterImage;
nicolasroard368ae732013-07-22 14:08:04 -0700136import com.android.gallery3d.filtershow.imageshow.Spline;
nicolasroard860af322013-08-08 20:47:28 -0700137import com.android.gallery3d.filtershow.info.InfoPanel;
jinwu4fafa7a2017-04-07 13:27:48 +0800138import com.android.gallery3d.filtershow.mediapicker.MediaPickerFragment;
Ruben Brunk077e7182013-08-01 19:05:18 -0700139import com.android.gallery3d.filtershow.pipeline.CachingPipeline;
nicolasroardce9ceff2013-07-02 15:46:23 -0700140import com.android.gallery3d.filtershow.pipeline.ImagePreset;
nicolasroard24d6ec72013-07-12 18:27:54 -0700141import com.android.gallery3d.filtershow.pipeline.ProcessingService;
nicolasroardfa474a12013-07-15 11:24:36 -0700142import com.android.gallery3d.filtershow.presets.PresetManagementDialog;
143import com.android.gallery3d.filtershow.presets.UserPresetsAdapter;
nicolasroard92e23412012-10-05 03:48:34 -0700144import com.android.gallery3d.filtershow.provider.SharedImageProvider;
nicolasroardfb6a8e12013-04-15 14:41:00 -0700145import com.android.gallery3d.filtershow.state.StateAdapter;
Likai Dingb7c13c22017-02-16 14:54:04 +0800146import com.android.gallery3d.filtershow.tools.DualCameraEffect;
jinwu4fafa7a2017-04-07 13:27:48 +0800147import com.android.gallery3d.filtershow.tools.FilterGeneratorNativeEngine;
nicolasroard24d6ec72013-07-12 18:27:54 -0700148import com.android.gallery3d.filtershow.tools.SaveImage;
Jay Wangf19b0702016-06-09 12:49:49 -0700149import com.android.gallery3d.filtershow.tools.TruePortraitNativeEngine;
John Hofordafa8ed92013-04-15 22:10:43 -0700150import com.android.gallery3d.filtershow.tools.XmpPresets;
151import com.android.gallery3d.filtershow.tools.XmpPresets.XMresults;
Ruben Brunk077e7182013-08-01 19:05:18 -0700152import com.android.gallery3d.filtershow.ui.ExportDialog;
nicolasroard75927042012-10-24 16:39:41 -0700153import com.android.gallery3d.filtershow.ui.FramedTextButton;
Doris Liu0addfc72012-10-17 16:15:51 -0700154import com.android.gallery3d.util.GalleryUtils;
Ruben Brunkf07bb272013-03-11 12:00:06 -0700155import com.android.photos.data.GalleryBitmapPool;
Jay Wangf19b0702016-06-09 12:49:49 -0700156import com.thundersoft.hz.selfportrait.detect.FaceDetect;
157import com.thundersoft.hz.selfportrait.detect.FaceInfo;
Zhang Zhenzhen38478f22015-03-10 16:40:13 +0800158import com.thundersoft.hz.selfportrait.makeup.engine.MakeupEngine;
nicolasroard92e23412012-10-05 03:48:34 -0700159
zhuwad6505d2017-07-26 15:09:37 +0800160public class FilterShowActivity extends AbstractPermissionActivity implements OnItemClickListener,
maxwend57f7232016-06-04 22:51:06 +0200161 DialogInterface.OnShowListener,
162 DialogInterface.OnDismissListener, PopupMenu.OnDismissListener {
nicolasroard0d7cdf82012-09-25 14:27:56 -0700163
Ruben Brunkab779de2013-02-14 16:18:22 -0800164 private String mAction = "";
nicolasroard588c30c2013-02-08 14:06:33 -0800165 MasterImage mMasterImage = null;
Ruben Brunk6416dd52012-11-28 14:00:30 -0800166
nicolasroard4dad1a92013-03-29 14:41:38 -0700167 private static final long LIMIT_SUPPORTS_HIGHRES = 134217728; // 128Mb
168
Doris Liua680a0c2012-10-18 15:01:35 -0700169 public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET";
Bobby Georgescua850a542012-10-23 15:40:06 -0700170 public static final String LAUNCH_FULLSCREEN = "launch-fullscreen";
nicolasroard0d7cdf82012-09-25 14:27:56 -0700171 private ImageShow mImageShow = null;
nicolasroard0d7cdf82012-09-25 14:27:56 -0700172
Doris Liubf1677a2012-10-29 13:11:10 -0700173 private View mSaveButton = null;
nicolasroard0d7cdf82012-09-25 14:27:56 -0700174
John Hoford5aa08942013-01-18 08:59:35 -0800175 private EditorPlaceHolder mEditorPlaceHolder = new EditorPlaceHolder(this);
nicolasroard9f452e02013-08-23 00:10:01 -0700176 private Editor mCurrentEditor = null;
John Hoford5aa08942013-01-18 08:59:35 -0800177
jinwu4fafa7a2017-04-07 13:27:48 +0800178 private MediaPickerFragment mMediaPicker;
179
nicolasroard0d7cdf82012-09-25 14:27:56 -0700180 private static final int SELECT_PICTURE = 1;
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -0700181 public static final int SELECT_FUSION_UNDERLAY = 2;
nicolasroard0d7cdf82012-09-25 14:27:56 -0700182 private static final String LOGTAG = "FilterShowActivity";
nicolasroard0d7cdf82012-09-25 14:27:56 -0700183
John Hoford5300e0c2013-03-04 17:50:58 -0800184 private boolean mShowingTinyPlanet = false;
nicolasroardbf93da72012-09-29 00:17:09 -0700185 private boolean mShowingImageStatePanel = false;
nicolasroard860af322013-08-08 20:47:28 -0700186 private boolean mShowingVersionsPanel = false;
jinwu4fafa7a2017-04-07 13:27:48 +0800187 private boolean mShowingFilterGenerator = false;
nicolasroardbf93da72012-09-29 00:17:09 -0700188
nicolasroard92e23412012-10-05 03:48:34 -0700189 private final Vector<ImageShow> mImageViews = new Vector<ImageShow>();
nicolasroard0d7cdf82012-09-25 14:27:56 -0700190
nicolasroard0ee91a22012-10-01 00:25:11 -0700191 private File mSharedOutputFile = null;
192
193 private boolean mSharingImage = false;
194
Bobby Georgescuec29b732012-10-07 15:20:44 -0700195 private WeakReference<ProgressDialog> mSavingProgressDialog;
nicolasroard55550692012-10-17 15:11:53 -0700196
John Reckd49d5322012-10-24 12:56:31 -0700197 private LoadBitmapTask mLoadBitmapTask;
Jay Wang8f0f5c02015-11-06 14:35:17 -0800198 private LoadHighresBitmapTask mHiResBitmapTask;
Likai Dingb7c13c22017-02-16 14:54:04 +0800199 private ParseDepthMapTask mParseDepthMapTask;
Jay Wangf19b0702016-06-09 12:49:49 -0700200 private LoadTruePortraitTask mLoadTruePortraitTask;
John Hoford3d4f2c72012-10-23 17:14:35 -0700201
John Hofordafa8ed92013-04-15 22:10:43 -0700202 private Uri mOriginalImageUri = null;
203 private ImagePreset mOriginalPreset = null;
nicolasroardc7b38f32013-04-25 08:47:11 -0700204
ztenghuib3f62e42013-06-10 15:51:42 -0700205 private Uri mSelectedImageUri = null;
206
nicolasroard32cc4dd2013-09-06 17:21:55 -0700207 private ArrayList<Action> mActions = new ArrayList<Action>();
nicolasroardfa474a12013-07-15 11:24:36 -0700208 private UserPresetsManager mUserPresetsManager = null;
209 private UserPresetsAdapter mUserPresetsAdapter = null;
nicolasroardf5eedf12013-04-19 17:13:30 -0700210 private CategoryAdapter mCategoryLooksAdapter = null;
211 private CategoryAdapter mCategoryBordersAdapter = null;
212 private CategoryAdapter mCategoryGeometryAdapter = null;
213 private CategoryAdapter mCategoryFiltersAdapter = null;
Jack Yoo66d21442015-10-27 16:27:49 -0700214 private CategoryAdapter mCategoryTrueScannerAdapter = null;
Jack Yoo1d415cf2016-01-18 15:49:46 -0800215 private CategoryAdapter mCategoryHazeBusterAdapter = null;
Jack Yoo813c89e2016-01-21 15:28:31 -0800216 private CategoryAdapter mCategorySeeStraightAdapter = null;
nicolasroard860af322013-08-08 20:47:28 -0700217 private CategoryAdapter mCategoryVersionsAdapter = null;
Zhang Zhenzhen38478f22015-03-10 16:40:13 +0800218 private CategoryAdapter mCategoryMakeupAdapter = null;
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -0700219 private CategoryAdapter mCategoryDualCamAdapter = null;
Jay Wangf19b0702016-06-09 12:49:49 -0700220 private CategoryAdapter mCategoryTruePortraitAdapter = null;
jinwu4fafa7a2017-04-07 13:27:48 +0800221 private CategoryAdapter mCategoryFilterPresetAdapter = null;
222 private ArrayList<CategoryAdapter> mCategoryWatermarkAdapters;
nicolasroardf5eedf12013-04-19 17:13:30 -0700223 private int mCurrentPanel = MainPanel.LOOKS;
nicolasroard860af322013-08-08 20:47:28 -0700224 private Vector<FilterUserPresetRepresentation> mVersions =
225 new Vector<FilterUserPresetRepresentation>();
226 private int mVersionsCounter = 0;
227
228 private boolean mHandlingSwipeButton = false;
229 private View mHandledSwipeView = null;
230 private float mHandledSwipeViewLastDelta = 0;
nicolasroard9737f3a2013-08-14 11:14:47 -0700231 private float mSwipeStartX = 0;
nicolasroard860af322013-08-08 20:47:28 -0700232 private float mSwipeStartY = 0;
nicolasroard3a5556d2013-02-28 12:11:35 -0800233
nicolasroard24d6ec72013-07-12 18:27:54 -0700234 private ProcessingService mBoundService;
235 private boolean mIsBound = false;
John Hoford3759b2d2013-09-10 16:59:23 -0700236 private Menu mMenu;
John Hoford6125a082013-09-12 07:49:24 -0700237 private DialogInterface mCurrentDialog = null;
John Hoford64fc2ed2013-10-09 13:54:45 -0700238 private PopupMenu mCurrentMenu = null;
jinwue99f7222017-05-15 17:25:46 +0800239 private boolean mReleaseDualCam = false;
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530240 private ImageButton imgComparison;
Chao Zhanga731e092016-04-01 10:49:29 +0800241 private String mPopUpText, mCancel;
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530242 RelativeLayout rlImageContainer;
wqi99b35c12016-05-03 17:17:10 +0800243 private int mEditrCropButtonSelect = 0;
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530244 private boolean isComingFromEditorScreen;
wqi99b35c12016-05-03 17:17:10 +0800245 private boolean mIsReloadByConfigurationChanged;
wqi07055372016-04-13 09:57:51 +0800246 private AlertDialog.Builder mBackAlertDialogBuilder;
nicolasroard24d6ec72013-07-12 18:27:54 -0700247
Byunghun Jeon863bd522015-11-02 17:20:55 -0800248 private ProgressDialog mLoadingDialog;
huiyan3de604e2016-04-27 15:28:45 +0800249 private long mRequestId = -1;
jinwu4fafa7a2017-04-07 13:27:48 +0800250 private WaterMarkView mWaterMarkView;
251 private boolean hasWaterMark;
252 private String locationStr;
253 private String temperature;
254 protected Handler handler = new Handler() {
255 @Override
256 public void handleMessage(Message msg) {
257 switch (msg.what) {
258 case SaveWaterMark.MARK_SAVE_COMPLETE:
jinwue99f7222017-05-15 17:25:46 +0800259 completeSaveImage((Uri) msg.obj);
jinwu4fafa7a2017-04-07 13:27:48 +0800260 break;
261 default:
262 break;
263 }
264 super.handleMessage(msg);
265 }
266 };
267 private SaveWaterMark mSaveWaterMark = new SaveWaterMark();
268
jinwuf23224f2017-06-19 11:16:06 +0800269 private PresetManagementDialog mPresetDialog;
jinwu4fafa7a2017-04-07 13:27:48 +0800270 private FilterPresetSource mFilterPresetSource;
271 private ArrayList <SaveOption> tempFilterArray = new ArrayList<SaveOption>();
272 private boolean mChangeable = false;
273 private int mOrientation;
Byunghun Jeon863bd522015-11-02 17:20:55 -0800274
nicolasroard24d6ec72013-07-12 18:27:54 -0700275 public ProcessingService getProcessingService() {
276 return mBoundService;
277 }
278
279 public boolean isSimpleEditAction() {
280 return !PhotoPage.ACTION_NEXTGEN_EDIT.equalsIgnoreCase(mAction);
281 }
282
huiyan3de604e2016-04-27 15:28:45 +0800283 public long getRequestId() {
284 return mRequestId;
285 }
286
287 private void registerFilter() {
288 IntentFilter filter = new IntentFilter();
289 filter.addAction(ProcessingService.SAVE_IMAGE_COMPLETE_ACTION);
jinwu4fafa7a2017-04-07 13:27:48 +0800290 filter.addAction(Intent.ACTION_LOCALE_CHANGED);
huiyan3de604e2016-04-27 15:28:45 +0800291 registerReceiver(mHandlerReceiver, filter);
292 }
293
294 private final BroadcastReceiver mHandlerReceiver = new BroadcastReceiver() {
295 @Override
296 public void onReceive(Context context, Intent intent) {
297 String action = intent.getAction();
jinwu4fafa7a2017-04-07 13:27:48 +0800298 if (ProcessingService.SAVE_IMAGE_COMPLETE_ACTION.equals(action)) {
huiyan3de604e2016-04-27 15:28:45 +0800299 Bundle bundle = intent.getExtras();
300 long requestId = bundle.getLong(ProcessingService.KEY_REQUEST_ID);
301 //only handle own request
302 if (requestId == mRequestId) {
zhuw48efd7d2016-08-03 10:05:00 +0800303 String url = bundle.getString(ProcessingService.KEY_URL);
304 Uri saveUri = url == null ? null : Uri.parse(url);
jinwue99f7222017-05-15 17:25:46 +0800305 completeSaveImage(saveUri);
huiyan3de604e2016-04-27 15:28:45 +0800306 }
jinwu4fafa7a2017-04-07 13:27:48 +0800307 } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
308 FiltersManager.reset();
309 getProcessingService().setupPipeline();
310 fillCategories();
huiyan3de604e2016-04-27 15:28:45 +0800311 }
312 }
313 };
314
zhuwad6505d2017-07-26 15:09:37 +0800315 private boolean canUpdataUI = false;
nicolasroard24d6ec72013-07-12 18:27:54 -0700316 private ServiceConnection mConnection = new ServiceConnection() {
ztenghuia08fab52013-07-22 14:06:22 -0700317 @Override
nicolasroard24d6ec72013-07-12 18:27:54 -0700318 public void onServiceConnected(ComponentName className, IBinder service) {
319 /*
320 * This is called when the connection with the service has been
321 * established, giving us the service object we can use to
322 * interact with the service. Because we have bound to a explicit
323 * service that we know is running in our own process, we can
324 * cast its IBinder to a concrete class and directly access it.
325 */
326 mBoundService = ((ProcessingService.LocalBinder)service).getService();
huiyan3de604e2016-04-27 15:28:45 +0800327 updateUIAfterServiceStarted();
nicolasroard24d6ec72013-07-12 18:27:54 -0700328 }
329
ztenghuia08fab52013-07-22 14:06:22 -0700330 @Override
nicolasroard24d6ec72013-07-12 18:27:54 -0700331 public void onServiceDisconnected(ComponentName className) {
332 /*
333 * This is called when the connection with the service has been
334 * unexpectedly disconnected -- that is, its process crashed.
335 * Because it is running in our same process, we should never
336 * see this happen.
337 */
338 mBoundService = null;
Kedi Xuf1069d52016-09-26 19:53:51 +0800339 ImageFilter.resetStatics();
Jay Wang8f0f5c02015-11-06 14:35:17 -0800340 MasterImage.setMaster(null);
nicolasroard24d6ec72013-07-12 18:27:54 -0700341 }
342 };
343
344 void doBindService() {
345 /*
346 * Establish a connection with the service. We use an explicit
347 * class name because we want a specific service implementation that
348 * we know will be running in our own process (and thus won't be
349 * supporting component replacement by other applications).
350 */
351 bindService(new Intent(FilterShowActivity.this, ProcessingService.class),
352 mConnection, Context.BIND_AUTO_CREATE);
353 mIsBound = true;
354 }
355
356 void doUnbindService() {
357 if (mIsBound) {
358 // Detach our existing connection.
359 unbindService(mConnection);
360 mIsBound = false;
361 }
362 }
363
John Hoford3759b2d2013-09-10 16:59:23 -0700364 public void updateUIAfterServiceStarted() {
zhuwad6505d2017-07-26 15:09:37 +0800365 if (!isPermissionGranted()) {
366 canUpdataUI = true;
367 return;
368 }
huiyan3de604e2016-04-27 15:28:45 +0800369 //This activity will have more than one running instances
370 //mRequestId to distinguish the different instance's request
371 mRequestId = System.currentTimeMillis();
John Hoford3759b2d2013-09-10 16:59:23 -0700372 MasterImage.setMaster(mMasterImage);
nicolasroard24d6ec72013-07-12 18:27:54 -0700373 ImageFilter.setActivityForMemoryToasts(this);
nicolasroardfa474a12013-07-15 11:24:36 -0700374 mUserPresetsManager = new UserPresetsManager(this);
375 mUserPresetsAdapter = new UserPresetsAdapter(this);
nicolasroard24d6ec72013-07-12 18:27:54 -0700376
John Hoford3759b2d2013-09-10 16:59:23 -0700377 setupMasterImage();
378 setupMenu();
379 setDefaultValues();
John Hoford3759b2d2013-09-10 16:59:23 -0700380 getWindow().setBackgroundDrawable(new ColorDrawable(0));
381 loadXML();
382
nicolasroard24d6ec72013-07-12 18:27:54 -0700383 fillCategories();
384 loadMainPanel();
nicolasroard24d6ec72013-07-12 18:27:54 -0700385 extractXMPData();
386 processIntent();
387 }
388
nicolasroard0d7cdf82012-09-25 14:27:56 -0700389 @Override
390 public void onCreate(Bundle savedInstanceState) {
391 super.onCreate(savedInstanceState);
jinwu4fafa7a2017-04-07 13:27:48 +0800392 mOrientation = getResources().getConfiguration().orientation;
nicolasroardf5eedf12013-04-19 17:13:30 -0700393 boolean onlyUsePortrait = getResources().getBoolean(R.bool.only_use_portrait);
394 if (onlyUsePortrait) {
395 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
396 }
397
Ruben Brunkf07bb272013-03-11 12:00:06 -0700398 clearGalleryBitmapPool();
huiyan3de604e2016-04-27 15:28:45 +0800399 registerFilter();
John Hoford3759b2d2013-09-10 16:59:23 -0700400 doBindService();
401 getWindow().setBackgroundDrawable(new ColorDrawable(Color.GRAY));
402 setContentView(R.layout.filtershow_splashscreen);
huiyan4c35ffd2016-03-09 11:48:47 +0800403 Window win = getWindow();
404 WindowManager.LayoutParams winParams = win.getAttributes();
405 winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
406 win.setAttributes(winParams);
nicolasroard3a5556d2013-02-28 12:11:35 -0800407 }
nicolasroard5ec40a62012-10-13 18:38:51 -0700408
nicolasroardf5eedf12013-04-19 17:13:30 -0700409 public boolean isShowingImageStatePanel() {
410 return mShowingImageStatePanel;
411 }
412
413 public void loadMainPanel() {
414 if (findViewById(R.id.main_panel_container) == null) {
415 return;
416 }
417 MainPanel panel = new MainPanel();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530418 Bundle bundle = new Bundle();
419 bundle.putBoolean(MainPanel.EDITOR_TAG, isComingFromEditorScreen);
420 panel.setArguments(bundle);
421 isComingFromEditorScreen = false;
nicolasroardf5eedf12013-04-19 17:13:30 -0700422 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
423 transaction.replace(R.id.main_panel_container, panel, MainPanel.FRAGMENT_TAG);
nicolasroardd1a098e2013-10-15 19:46:05 -0700424 transaction.commitAllowingStateLoss();
nicolasroardf5eedf12013-04-19 17:13:30 -0700425 }
426
Jay Wangf19b0702016-06-09 12:49:49 -0700427 public void loadEditorPanel(final FilterRepresentation representation) {
428 final int currentId = representation.getEditorId();
429
430 // show representation
431 if (mCurrentEditor != null) {
432 mCurrentEditor.detach();
433 }
434 mCurrentEditor = mEditorPlaceHolder.showEditor(currentId);
435
436 if (mCurrentEditor.showsActionBar()) {
Chao Zhang9c0d4752016-04-14 18:04:44 +0800437 setActionBar();
438 showActionBar(true);
439 } else {
440 showActionBar(false);
441 }
442
jinwu4fafa7a2017-04-07 13:27:48 +0800443 if (representation.getFilterType() == FilterRepresentation.TYPE_WATERMARK_CATEGORY) {
444 loadWaterMarkPanel((FilterWatermarkRepresentation) representation);
jinwu523164f2017-05-23 15:32:00 +0800445 return;
jinwu4fafa7a2017-04-07 13:27:48 +0800446 }
447
Jay Wangf19b0702016-06-09 12:49:49 -0700448 if (currentId == ImageOnlyEditor.ID) {
449 mCurrentEditor.reflectCurrentFilter();
nicolasroardf5eedf12013-04-19 17:13:30 -0700450 return;
451 }
Jay Wangf19b0702016-06-09 12:49:49 -0700452 if (currentId == EditorTruePortraitImageOnly.ID) {
453 mCurrentEditor.reflectCurrentFilter();
454 setActionBarForEffects(mCurrentEditor);
455 return;
456 }
wqi6c5a2dd2016-04-14 11:25:23 +0800457 if (currentId == EditorCrop.ID) {
wqi99b35c12016-05-03 17:17:10 +0800458 loadEditorCropPanel();
wqi6c5a2dd2016-04-14 11:25:23 +0800459 return;
460 }
Chao Zhang7362c022016-05-23 14:31:39 +0800461 if (useStraightenPanel(currentId)) {
wqi6c5a2dd2016-04-14 11:25:23 +0800462 new Runnable() {
463 @Override
464 public void run() {
465 StraightenPanel panel = new StraightenPanel();
Chao Zhang7362c022016-05-23 14:31:39 +0800466 Bundle bundle = new Bundle();
467 bundle.putInt(StraightenPanel.EDITOR_ID, currentId);
468 bundle.putString(StraightenPanel.EDITOR_NAME, representation.getName());
469 panel.setArguments(bundle);
wqi6c5a2dd2016-04-14 11:25:23 +0800470 FragmentTransaction transaction =
471 getSupportFragmentManager().beginTransaction();
472 transaction.remove(getSupportFragmentManager().findFragmentByTag(
473 MainPanel.FRAGMENT_TAG));
474 transaction.replace(R.id.main_panel_container, panel,
475 MainPanel.FRAGMENT_TAG);
476 transaction.commit();
477 }
478 }.run();
479 return;
480 }
Jack Yooe94e7662016-05-18 11:34:04 -0700481 if (currentId == TrueScannerEditor.ID) {
482 new Runnable() {
483 @Override
484 public void run() {
485 TrueScannerPanel panel = new TrueScannerPanel();
486 FragmentTransaction transaction =
487 getSupportFragmentManager().beginTransaction();
488 transaction.remove(getSupportFragmentManager().findFragmentByTag(
489 MainPanel.FRAGMENT_TAG));
490 transaction.replace(R.id.main_panel_container, panel,
491 MainPanel.FRAGMENT_TAG);
492 transaction.commit();
493 }
494 }.run();
495 return;
496 }
Jay Wangf19b0702016-06-09 12:49:49 -0700497 if(currentId == EditorTruePortraitMask.ID) {
498 new Runnable() {
499 @Override
500 public void run() {
501 setActionBarForEffects(mCurrentEditor);
502 TruePortraitMaskEditorPanel panel = new TruePortraitMaskEditorPanel();
503 FragmentTransaction transaction =
504 getSupportFragmentManager().beginTransaction();
505 transaction.remove(getSupportFragmentManager().findFragmentByTag(
506 MainPanel.FRAGMENT_TAG));
507 transaction.replace(R.id.main_panel_container, panel,
508 MainPanel.FRAGMENT_TAG);
509 transaction.commit();
510 }
511 }.run();
512 return;
513 }
514
nicolasroard00259462013-04-30 20:50:03 -0700515 Runnable showEditor = new Runnable() {
516 @Override
517 public void run() {
518 EditorPanel panel = new EditorPanel();
519 panel.setEditor(currentId);
Jay Wangf19b0702016-06-09 12:49:49 -0700520 setActionBarForEffects(mCurrentEditor);
Chao Zhang80516ca2016-04-25 15:37:33 +0800521 Fragment main =
522 getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
523 if (main instanceof MainPanel) {
524 ((MainPanel) main).setEditorPanelFragment(panel);
525 }
nicolasroard00259462013-04-30 20:50:03 -0700526 }
527 };
528 Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
529 boolean doAnimation = false;
530 if (mShowingImageStatePanel
531 && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
532 doAnimation = true;
533 }
534 if (doAnimation && main != null && main instanceof MainPanel) {
535 MainPanel mainPanel = (MainPanel) main;
536 View container = mainPanel.getView().findViewById(R.id.category_panel_container);
537 View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
538 int panelHeight = container.getHeight() + bottom.getHeight();
nicolasroardaf593222013-06-10 18:33:11 -0700539 ViewPropertyAnimator anim = mainPanel.getView().animate();
540 anim.translationY(panelHeight).start();
541 final Handler handler = new Handler();
542 handler.postDelayed(showEditor, anim.getDuration());
nicolasroard00259462013-04-30 20:50:03 -0700543 } else {
544 showEditor.run();
545 }
nicolasroardf5eedf12013-04-19 17:13:30 -0700546 }
547
Chao Zhang7362c022016-05-23 14:31:39 +0800548 private boolean useStraightenPanel(int EditorID) {
Jack Yooe94e7662016-05-18 11:34:04 -0700549 return (EditorID == EditorStraighten.ID || EditorID == HazeBusterEditor.ID || EditorID == SeeStraightEditor.ID);
Chao Zhang7362c022016-05-23 14:31:39 +0800550 }
551
wqi99b35c12016-05-03 17:17:10 +0800552 private void loadEditorCropPanel() {
553 new Runnable() {
554 @Override
555 public void run() {
556 EditorCropPanel panel = new EditorCropPanel();
557 FragmentTransaction transaction =
558 getSupportFragmentManager().beginTransaction();
559 transaction.remove(getSupportFragmentManager().findFragmentByTag(
560 MainPanel.FRAGMENT_TAG));
561 transaction.replace(R.id.main_panel_container, panel,
562 MainPanel.FRAGMENT_TAG);
Kedi Xu5db68ed2016-08-10 17:48:13 +0800563 transaction.commitAllowingStateLoss();
wqi99b35c12016-05-03 17:17:10 +0800564 }
565 }.run();
566 }
567
jinwu4fafa7a2017-04-07 13:27:48 +0800568 private void loadWaterMarkPanel(final FilterWatermarkRepresentation representation) {
569 new Runnable() {
570 @Override
571 public void run() {
572 CategoryPanelLevelTwo panel = new CategoryPanelLevelTwo(representation.getAdapterId());
573 FragmentTransaction transaction =
574 getSupportFragmentManager().beginTransaction();
575 transaction.remove(getSupportFragmentManager().findFragmentByTag(
576 MainPanel.FRAGMENT_TAG));
577 transaction.replace(R.id.main_panel_container, panel,
578 MainPanel.FRAGMENT_TAG);
579 transaction.commitAllowingStateLoss();
580 }
581 }.run();
582 }
583
584 public void setLocation(String location) {
585 locationStr = location;
586 }
587
588 public void setTemperature(String temperature) {
589 this.temperature = temperature;
590 }
591
Chao Zhang80516ca2016-04-25 15:37:33 +0800592 public void leaveSeekBarPanel() {
593 removeSeekBarPanel();
594 showDefaultImageView();
595 setActionBar();
596 showActionBar(true);
597 }
598
599 private void removeSeekBarPanel() {
600 Fragment currentPanel =
601 getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
602 if (currentPanel instanceof MainPanel) {
603 ((MainPanel) currentPanel).removeEditorPanelFragment();
Jay Wangf19b0702016-06-09 12:49:49 -0700604 if (mCurrentEditor != null) {
605 mCurrentEditor.detach();
606 }
607 mCurrentEditor = null;
Chao Zhang80516ca2016-04-25 15:37:33 +0800608 }
609 }
610
John Hoford5d1cf1f2013-08-14 12:14:54 -0700611 public void toggleInformationPanel() {
nicolasroard860af322013-08-08 20:47:28 -0700612 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
613 transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
nicolasroard860af322013-08-08 20:47:28 -0700614
615 InfoPanel panel = new InfoPanel();
nicolasroardb2039682013-09-11 17:46:38 -0700616 panel.show(transaction, InfoPanel.FRAGMENT_TAG);
nicolasroard860af322013-08-08 20:47:28 -0700617 }
618
nicolasroard3a5556d2013-02-28 12:11:35 -0800619 private void loadXML() {
nicolasroard0d7cdf82012-09-25 14:27:56 -0700620 setContentView(R.layout.filtershow_activity);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530621 Resources r = getResources();
wqi07055372016-04-13 09:57:51 +0800622 setActionBar();
wqi85875ab2016-03-10 11:54:20 +0800623 mPopUpText = r.getString(R.string.discard).toUpperCase(
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530624 Locale.getDefault());
Chao Zhanga731e092016-04-01 10:49:29 +0800625 mCancel = r.getString(R.string.cancel).toUpperCase(Locale.getDefault());
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530626 int marginTop = r.getDimensionPixelSize(R.dimen.compare_margin_top);
627 int marginRight = r.getDimensionPixelSize(R.dimen.compare_margin_right);
628 imgComparison = (ImageButton) findViewById(R.id.imgComparison);
629 rlImageContainer = (RelativeLayout) findViewById(R.id.imageContainer);
nicolasroard0d7cdf82012-09-25 14:27:56 -0700630
nicolasroard0d7cdf82012-09-25 14:27:56 -0700631 mImageShow = (ImageShow) findViewById(R.id.imageShow);
nicolasroard0d7cdf82012-09-25 14:27:56 -0700632 mImageViews.add(mImageShow);
nicolasroard0d7cdf82012-09-25 14:27:56 -0700633
nicolasroard3a5556d2013-02-28 12:11:35 -0800634 setupEditors();
John Hoford5aa08942013-01-18 08:59:35 -0800635
nicolasroard733a0132013-02-08 17:00:42 -0800636 mEditorPlaceHolder.hide();
nicolasroard32cc4dd2013-09-06 17:21:55 -0700637 mImageShow.attach();
John Hoforddb947252013-01-08 14:15:19 -0800638
nicolasroard6019ad92013-03-09 11:18:43 -0800639 setupStatePanel();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530640
641 imgComparison.setOnTouchListener(new OnTouchListener() {
642
643 @Override
644 public boolean onTouch(View v, MotionEvent event) {
645 int action = event.getAction();
646 action = action & MotionEvent.ACTION_MASK;
647 if (action == MotionEvent.ACTION_DOWN) {
Chao Zhang7362c022016-05-23 14:31:39 +0800648 MasterImage.getImage().setShowsOriginal(true);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530649 v.setPressed(true);
jinwu4fafa7a2017-04-07 13:27:48 +0800650 if (mWaterMarkView != null) {
651 mWaterMarkView.setVisibility(View.GONE);
652 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530653 }
654 if (action == MotionEvent.ACTION_UP
655 || action == MotionEvent.ACTION_CANCEL
656 || action == MotionEvent.ACTION_OUTSIDE) {
657 v.setPressed(false);
Chao Zhang7362c022016-05-23 14:31:39 +0800658 MasterImage.getImage().setShowsOriginal(false);
jinwu4fafa7a2017-04-07 13:27:48 +0800659 if (mWaterMarkView != null) {
660 mWaterMarkView.setVisibility(View.VISIBLE);
661 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530662 }
663
664 return false;
665 }
666 });
667 }
668
669 public void toggleComparisonButtonVisibility() {
Jay Wangf19b0702016-06-09 12:49:49 -0700670 if (imgComparison.getVisibility() == View.VISIBLE)
671 imgComparison.setVisibility(View.GONE);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530672 }
673
Chao Zhang9c0d4752016-04-14 18:04:44 +0800674 private void showSaveButtonIfNeed() {
675 if (MasterImage.getImage().hasModifications()) {
676 mSaveButton.setVisibility(View.VISIBLE);
677 } else {
678 mSaveButton.setVisibility(View.GONE);
679 }
680 }
681
wqi07055372016-04-13 09:57:51 +0800682 public void setActionBar() {
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530683 ActionBar actionBar = getActionBar();
684 actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
685 actionBar.setBackgroundDrawable(new ColorDrawable(getResources()
686 .getColor(R.color.edit_actionbar_background)));
wqi07055372016-04-13 09:57:51 +0800687 ActionBar.LayoutParams lp = new ActionBar.LayoutParams(
688 ActionBar.LayoutParams.MATCH_PARENT,
689 ActionBar.LayoutParams.MATCH_PARENT,
690 Gravity.CENTER);
691 View customView = getLayoutInflater().inflate(R.layout.filtershow_actionbar, null);
692 actionBar.setCustomView(customView, lp);
693 mSaveButton = actionBar.getCustomView().findViewById(R.id.filtershow_done);
694 mSaveButton.setOnClickListener(new OnClickListener() {
695 @Override
696 public void onClick(View view) {
697 saveImage();
zdica9299d2016-02-25 11:14:33 +0800698 }
wqi07055372016-04-13 09:57:51 +0800699 });
Chao Zhang9c0d4752016-04-14 18:04:44 +0800700
701 showSaveButtonIfNeed();
702
Chao Zhang80516ca2016-04-25 15:37:33 +0800703 View exitButton = actionBar.getCustomView().findViewById(R.id.filtershow_exit);
704 exitButton.setOnClickListener(new OnClickListener() {
wqi07055372016-04-13 09:57:51 +0800705 @Override
706 public void onClick(View v) {
707 if (mImageShow.hasModifications()) {
708 if (mBackAlertDialogBuilder == null) {
709 createBackDialog();
710 }
711 mBackAlertDialogBuilder.show();
712 } else {
713 done();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530714 }
wqi07055372016-04-13 09:57:51 +0800715 }
716 });
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530717
wqi07055372016-04-13 09:57:51 +0800718 invalidateOptionsMenu();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530719 }
720
721 public void setActionBarForEffects(final Editor currentEditor) {
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530722 ActionBar actionBar = getActionBar();
723 actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
724 actionBar.setBackgroundDrawable(new ColorDrawable(getResources()
725 .getColor(R.color.edit_actionbar_background)));
726 actionBar.setCustomView(R.layout.filtershow_actionbar_effects);
727 ImageButton cancelButton = (ImageButton) actionBar.getCustomView()
728 .findViewById(R.id.cancelFilter);
729 ImageButton applyButton = (ImageButton) actionBar.getCustomView()
730 .findViewById(R.id.applyFilter);
731 Button editTitle = (Button) actionBar.getCustomView().findViewById(
732 R.id.applyEffect);
733 editTitle.setTransformationMethod(null);
734 View actionControl = actionBar.getCustomView().findViewById(
735 R.id.panelAccessoryViewList);
736 cancelButton.setOnClickListener(new View.OnClickListener() {
737 @Override
738 public void onClick(View v) {
739 cancelCurrentFilter();
740 FilterShowActivity.this.backToMain();
wqi07055372016-04-13 09:57:51 +0800741 setActionBar();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530742 }
743 });
744 applyButton.setOnClickListener(new View.OnClickListener() {
745 @Override
746 public void onClick(View v) {
747 currentEditor.finalApplyCalled();
748 FilterShowActivity.this.backToMain();
wqi07055372016-04-13 09:57:51 +0800749 setActionBar();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530750 }
751 });
752
753 if (currentEditor != null) {
Jay Wangf19b0702016-06-09 12:49:49 -0700754 if(!currentEditor.showsActionBarControls()) {
755 cancelButton.setVisibility(View.GONE);
756 applyButton.setVisibility(View.GONE);
757 }
758 currentEditor.setEditorTitle(editTitle);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530759 currentEditor.reflectCurrentFilter();
760 if (currentEditor.useUtilityPanel()) {
761 currentEditor.openUtilityPanel((LinearLayout) actionControl);
762 }
763 }
764 }
765
Chao Zhang9c0d4752016-04-14 18:04:44 +0800766 private void showActionBar(boolean show) {
767 ActionBar actionBar = getActionBar();
768 if (actionBar != null ) {
769 if (show) {
770 if (!actionBar.isShowing()) {
771 actionBar.show();
772 }
773 } else {
774 if (actionBar.isShowing()) {
775 actionBar.hide();
776 }
777 }
778 }
779 }
780
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530781 public void cancelCurrentFilter() {
782 MasterImage masterImage = MasterImage.getImage();
783 HistoryManager adapter = masterImage.getHistory();
784
785 int position = adapter.undo();
786 masterImage.onHistoryItemClick(position);
787 invalidateViews();
Jay Wangf19b0702016-06-09 12:49:49 -0700788
789 if(!masterImage.hasFusionApplied()) {
790 masterImage.setFusionUnderlay(null);
791 masterImage.setScaleFactor(1);
792 masterImage.resetTranslation();
793 }
jinwu4fafa7a2017-04-07 13:27:48 +0800794 clearWaterMark();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530795 }
796
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530797 public void adjustCompareButton(boolean scaled) {
Chao Zhanga731e092016-04-01 10:49:29 +0800798 if (imgComparison == null) {
799 return;
800 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530801 Resources r = getResources();
802 int marginTop, marginRight;
Chao Zhanga731e092016-04-01 10:49:29 +0800803 marginTop = r.getDimensionPixelSize(R.dimen.compare_margin_top);
804 marginRight = r.getDimensionPixelSize(R.dimen.compare_margin_right);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530805 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) imgComparison
806 .getLayoutParams();
807 params.setMargins(0, marginTop, marginRight, 0);
808 imgComparison.setLayoutParams(params);
nicolasroard3a5556d2013-02-28 12:11:35 -0800809 }
810
nicolasroard24d6ec72013-07-12 18:27:54 -0700811 public void fillCategories() {
812 fillLooks();
nicolasroardfa474a12013-07-15 11:24:36 -0700813 loadUserPresets();
nicolasroard24d6ec72013-07-12 18:27:54 -0700814 fillBorders();
815 fillTools();
816 fillEffects();
Jack Yoo66d21442015-10-27 16:27:49 -0700817 fillTrueScanner();
Jack Yoo1d415cf2016-01-18 15:49:46 -0800818 fillHazeBuster();
Jack Yoo813c89e2016-01-21 15:28:31 -0800819 fillSeeStraight();
nicolasroard860af322013-08-08 20:47:28 -0700820 fillVersions();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +0800821 fillMakeup();
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -0700822 fillDualCamera();
Jay Wangf19b0702016-06-09 12:49:49 -0700823 fillTruePortrait();
jinwu4fafa7a2017-04-07 13:27:48 +0800824 fillWaterMarks();
nicolasroard24d6ec72013-07-12 18:27:54 -0700825 }
826
nicolasroard6019ad92013-03-09 11:18:43 -0800827 public void setupStatePanel() {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -0700828 MasterImage.getImage().setHistoryManager(mMasterImage.getHistory());
nicolasroard3a5556d2013-02-28 12:11:35 -0800829 }
830
nicolasroard860af322013-08-08 20:47:28 -0700831 private void fillVersions() {
nicolasroard32cc4dd2013-09-06 17:21:55 -0700832 if (mCategoryVersionsAdapter != null) {
833 mCategoryVersionsAdapter.clear();
834 }
nicolasroard860af322013-08-08 20:47:28 -0700835 mCategoryVersionsAdapter = new CategoryAdapter(this);
836 mCategoryVersionsAdapter.setShowAddButton(true);
837 }
838
nicolasroard32cc4dd2013-09-06 17:21:55 -0700839 public void registerAction(Action action) {
840 if (mActions.contains(action)) {
841 return;
842 }
843 mActions.add(action);
844 }
845
846 private void loadActions() {
847 for (int i = 0; i < mActions.size(); i++) {
848 Action action = mActions.get(i);
849 action.setImageFrame(new Rect(0, 0, 96, 96), 0);
850 }
851 }
852
nicolasroard860af322013-08-08 20:47:28 -0700853 public void updateVersions() {
854 mCategoryVersionsAdapter.clear();
855 FilterUserPresetRepresentation originalRep = new FilterUserPresetRepresentation(
856 getString(R.string.filtershow_version_original), new ImagePreset(), -1);
857 mCategoryVersionsAdapter.add(
858 new Action(this, originalRep, Action.FULL_VIEW));
859 ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
860 FilterUserPresetRepresentation currentRep = new FilterUserPresetRepresentation(
861 getString(R.string.filtershow_version_current), current, -1);
862 mCategoryVersionsAdapter.add(
863 new Action(this, currentRep, Action.FULL_VIEW));
nicolasroard55a02792013-08-13 17:36:00 -0700864 if (mVersions.size() > 0) {
865 mCategoryVersionsAdapter.add(new Action(this, Action.SPACER));
866 }
nicolasroard860af322013-08-08 20:47:28 -0700867 for (FilterUserPresetRepresentation rep : mVersions) {
868 mCategoryVersionsAdapter.add(
nicolasroard55a02792013-08-13 17:36:00 -0700869 new Action(this, rep, Action.FULL_VIEW, true));
nicolasroard860af322013-08-08 20:47:28 -0700870 }
871 mCategoryVersionsAdapter.notifyDataSetInvalidated();
872 }
873
874 public void addCurrentVersion() {
875 ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
876 mVersionsCounter++;
877 FilterUserPresetRepresentation rep = new FilterUserPresetRepresentation(
878 "" + mVersionsCounter, current, -1);
879 mVersions.add(rep);
880 updateVersions();
881 }
882
883 public void removeVersion(Action action) {
884 mVersions.remove(action.getRepresentation());
885 updateVersions();
886 }
887
nicolasroard0a24e522013-08-14 10:04:37 -0700888 public void removeLook(Action action) {
nicolasroard5af55f42013-08-14 10:34:08 -0700889 FilterUserPresetRepresentation rep =
890 (FilterUserPresetRepresentation) action.getRepresentation();
nicolasroard0a24e522013-08-14 10:04:37 -0700891 if (rep == null) {
892 return;
893 }
894 mUserPresetsManager.delete(rep.getId());
nicolasroard5af55f42013-08-14 10:34:08 -0700895 updateUserPresetsFromManager();
jinwu4fafa7a2017-04-07 13:27:48 +0800896 }
897
898 public void handlePreset(Action action,View view,int i) {
899 mChangeable = true;
900 mHandledSwipeView = view;
901 final Action ac = action;
902 mFilterPresetSource = new FilterPresetSource(this);
903 switch (i) {
904 case R.id.renameButton:
905 final View layout = View.inflate(this,R.layout.filtershow_default_edittext,null);
906 AlertDialog.Builder renameAlertDialogBuilder = new AlertDialog.Builder(this);
907 renameAlertDialogBuilder.setTitle(R.string.rename_before_exit);
908 renameAlertDialogBuilder.setView(layout);
909 renameAlertDialogBuilder.setPositiveButton(R.string.ok,
910 new DialogInterface.OnClickListener(){
911 @Override
912 public void onClick(DialogInterface dialog, int id){
913 EditText mEditText = (EditText) layout.findViewById(
914 R.id.filtershow_default_edit);
915 String name = String.valueOf(mEditText.getText());
916 if ( (name.trim().length() == 0)|| name.isEmpty()) {
917 Toast.makeText(getApplicationContext(),
918 getString(R.string.filter_name_notification),
919 Toast.LENGTH_SHORT).show();
920 } else if (isDuplicateName(name)) {
921 Toast.makeText(getApplicationContext(),
922 getString(R.string.filter_name_duplicate),
923 Toast.LENGTH_SHORT).show();
924 } else {
925 renamePreset(ac, name);
926 }
927 dialog.dismiss();
928 }
929 }
930 );
931 renameAlertDialogBuilder.setNegativeButton(mCancel,
932 new DialogInterface.OnClickListener() {
933 @Override
934 public void onClick (DialogInterface dialog, int id){
935
936 }
937 }
938 );
939 renameAlertDialogBuilder.create().show();
940 break;
941
942 case R.id.deleteButton:
943 String name = action.getName();
944 AlertDialog.Builder deleteAlertDialogBuilder = new AlertDialog.Builder(this);
945 String textview ="Do you want to delete "+name+"?";
946 deleteAlertDialogBuilder.setMessage(textview)
947 .setTitle(R.string.delete_before_exit);
948 deleteAlertDialogBuilder.setPositiveButton(R.string.ok,
949 new DialogInterface.OnClickListener(){
950 @Override
951 public void onClick(DialogInterface dialog, int id){
952 ((SwipableView) mHandledSwipeView).delete();
953 dialog.dismiss();
954 }
955 }
956 );
957 deleteAlertDialogBuilder.setNegativeButton(mCancel,
958 new DialogInterface.OnClickListener() {
959 @Override
960 public void onClick (DialogInterface dialog, int id){
961 dialog.dismiss();
962
963 }
964 }
965 );
966 deleteAlertDialogBuilder.create().show();
967 break;
968 }
969 }
970
971 public void removePreset(Action action) {
972 FilterPresetRepresentation rep =
973 (FilterPresetRepresentation)action.getRepresentation();
974 if (rep == null) {
975 return;
976 }
977 if (tempFilterArray.size() != 0) {
978 for (int i = 0; i < tempFilterArray.size(); i++) {
979 if (rep.getId() == tempFilterArray.get(i)._id) {
980 tempFilterArray.remove(i);
981 fillLooks();
982 return;
983 }
984 }
985 }
986 mFilterPresetSource.removePreset(rep.getId());
987 fillLooks();
988 }
989
990 public void renamePreset(Action action, String name) {
991 FilterPresetRepresentation rep =
992 (FilterPresetRepresentation)action.getRepresentation();
993 if (rep == null) {
994 return;
995 }
996 if (tempFilterArray.size() != 0) {
997 for (int i = 0; i < tempFilterArray.size(); i++) {
998 if (rep.getId() == tempFilterArray.get(i)._id) {
999 tempFilterArray.get(i).name = name;
1000 fillLooks();
1001 return;
1002 }
1003 }
1004 }
1005 mFilterPresetSource.updatePresetName(rep.getId(),name);
1006 fillLooks();
1007 }
1008
1009 public boolean isDuplicateName(String name) {
1010 ArrayList<String> nameSum = new ArrayList<String>();
1011 if (tempFilterArray.size() != 0) {
1012 for (int i = 0; i < tempFilterArray.size(); i++)
1013 nameSum.add(tempFilterArray.get(i).name);
1014 }
1015
1016 ArrayList<SaveOption> ret = mFilterPresetSource.getAllUserPresets();
1017 if (ret != null) {
1018 for (int id = 0; id < ret.size(); id++)
1019 nameSum.add(ret.get(id).name);
1020 }
1021
1022 for (int i = 0; i < nameSum.size(); i++) {
1023 if (name.equals(nameSum.get(i))) return true;
1024 }
1025 return false;
nicolasroard0a24e522013-08-14 10:04:37 -07001026 }
1027
nicolasroard24d6ec72013-07-12 18:27:54 -07001028 private void fillEffects() {
nicolasroard38fc0442013-03-04 16:01:24 -08001029 FiltersManager filtersManager = FiltersManager.getManager();
nicolasroard24d6ec72013-07-12 18:27:54 -07001030 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getEffects();
nicolasroard32cc4dd2013-09-06 17:21:55 -07001031 if (mCategoryFiltersAdapter != null) {
1032 mCategoryFiltersAdapter.clear();
1033 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001034 mCategoryFiltersAdapter = new CategoryAdapter(this);
1035 for (FilterRepresentation representation : filtersRepresentations) {
1036 if (representation.getTextId() != 0) {
1037 representation.setName(getString(representation.getTextId()));
1038 }
1039 mCategoryFiltersAdapter.add(new Action(this, representation));
1040 }
nicolasroard38fc0442013-03-04 16:01:24 -08001041 }
1042
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001043 private void fillMakeup() {
1044 if(!SimpleMakeupImageFilter.HAS_TS_MAKEUP) {
1045 return;
1046 }
1047
1048 FiltersManager filtersManager = FiltersManager.getManager();
1049 ArrayList<FilterRepresentation> makeups = filtersManager.getMakeup();
1050 if (mCategoryMakeupAdapter != null) {
1051 mCategoryMakeupAdapter.clear();
1052 }
1053 mCategoryMakeupAdapter = new CategoryAdapter(this);
1054 for (FilterRepresentation makeup : makeups) {
1055 if (makeup.getTextId() != 0) {
1056 makeup.setName(getString(makeup.getTextId()));
1057 }
1058 mCategoryMakeupAdapter.add(new Action(this, makeup));
1059 }
1060 }
1061
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001062 private void fillDualCamera() {
1063 FiltersManager filtersManager = FiltersManager.getManager();
1064 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getDualCamera();
1065 if (mCategoryDualCamAdapter != null) {
1066 mCategoryDualCamAdapter.clear();
1067 }
1068 mCategoryDualCamAdapter = new CategoryAdapter(this);
1069 for (FilterRepresentation representation : filtersRepresentations) {
1070 if (representation.getTextId() != 0) {
1071 representation.setName(getString(representation.getTextId()));
1072 }
1073 mCategoryDualCamAdapter.add(new Action(this, representation));
1074 }
1075 }
1076
Jay Wangf19b0702016-06-09 12:49:49 -07001077 private void fillTruePortrait() {
1078 FiltersManager filtersManager = FiltersManager.getManager();
1079 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTruePortrait();
1080 if (mCategoryTruePortraitAdapter != null) {
1081 mCategoryTruePortraitAdapter.clear();
1082 }
1083 mCategoryTruePortraitAdapter = new CategoryAdapter(this);
1084 for (FilterRepresentation representation : filtersRepresentations) {
1085 if (representation.getTextId() != 0) {
1086 representation.setName(getString(representation.getTextId()));
1087 }
1088 mCategoryTruePortraitAdapter.add(new Action(this, representation));
1089 }
1090 }
1091
jinwu4fafa7a2017-04-07 13:27:48 +08001092 private void fillPresetFilter() {
1093 FiltersManager filtersManager = FiltersManager.getManager();
1094 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getFilterPreset();
1095 if(mChangeable) {
1096 ArrayList<FilterRepresentation> mFilterPreset = new ArrayList<FilterRepresentation>();
1097 ArrayList<SaveOption> ret = mFilterPresetSource.getAllUserPresets();
1098 if (ret == null) return;
1099 for (int id = 0; id < ret.size(); id ++) {
1100 FilterPresetRepresentation representation = new FilterPresetRepresentation(
1101 ret.get(id).name, ret.get(id)._id, id + 1);
1102 Uri filteredUri = Uri.parse(ret.get(id).Uri);
1103 representation.setUri(filteredUri);
1104 representation.setSerializationName("Custom");
1105 mFilterPreset.add(representation);
1106 }
1107 if (tempFilterArray.size() != 0){
1108 for (int id = 0; id < tempFilterArray.size(); id ++) {
1109 FilterPresetRepresentation representation = new FilterPresetRepresentation(
1110 tempFilterArray.get(id).name, tempFilterArray.get(id)._id, id + 1);
1111 Uri filteredUri = Uri.parse(tempFilterArray.get(id).Uri);
1112 representation.setUri(filteredUri);
1113 representation.setSerializationName("Custom");
1114 mFilterPreset.add(representation);
1115 }
1116 }
1117 filtersRepresentations = mFilterPreset;
1118 mChangeable = false;
1119 }
1120
1121 if (filtersRepresentations == null) return;
1122 for (FilterRepresentation representation : filtersRepresentations) {
1123 mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW,true));
1124 }
1125 }
1126
Jack Yoo66d21442015-10-27 16:27:49 -07001127 private void fillTrueScanner() {
1128 FiltersManager filtersManager = FiltersManager.getManager();
1129 ArrayList<FilterRepresentation> trueScannerRepresentations = filtersManager.getTrueScanner();
1130 if (mCategoryTrueScannerAdapter != null) {
1131 mCategoryTrueScannerAdapter.clear();
1132 }
1133 mCategoryTrueScannerAdapter = new CategoryAdapter(this);
1134 for (FilterRepresentation representation : trueScannerRepresentations) {
1135 if (representation.getTextId() != 0) {
1136 representation.setName(getString(representation.getTextId()));
1137 }
1138 mCategoryTrueScannerAdapter.add(new Action(this, representation));
1139 }
1140 }
1141
Jack Yoo1d415cf2016-01-18 15:49:46 -08001142 private void fillHazeBuster() {
1143 FiltersManager filtersManager = FiltersManager.getManager();
1144 ArrayList<FilterRepresentation> hazeBusterRepresentations = filtersManager.getHazeBuster();
1145 if (mCategoryHazeBusterAdapter != null) {
1146 mCategoryHazeBusterAdapter.clear();
1147 }
1148 mCategoryHazeBusterAdapter = new CategoryAdapter(this);
1149 for (FilterRepresentation representation : hazeBusterRepresentations) {
1150 if (representation.getTextId() != 0) {
1151 representation.setName(getString(representation.getTextId()));
1152 }
1153 mCategoryHazeBusterAdapter.add(new Action(this, representation));
1154 }
1155 }
1156
Jack Yoo813c89e2016-01-21 15:28:31 -08001157 private void fillSeeStraight() {
1158 FiltersManager filtersManager = FiltersManager.getManager();
1159 ArrayList<FilterRepresentation> hazeBusterRepresentations = filtersManager.getSeeStraight();
1160 if (mCategorySeeStraightAdapter != null) {
1161 mCategorySeeStraightAdapter.clear();
1162 }
1163 mCategorySeeStraightAdapter = new CategoryAdapter(this);
1164 for (FilterRepresentation representation : hazeBusterRepresentations) {
1165 if (representation.getTextId() != 0) {
1166 representation.setName(getString(representation.getTextId()));
1167 }
1168 mCategorySeeStraightAdapter.add(new Action(this, representation));
1169 }
1170 }
1171
nicolasroard24d6ec72013-07-12 18:27:54 -07001172 private void fillTools() {
nicolasroard38fc0442013-03-04 16:01:24 -08001173 FiltersManager filtersManager = FiltersManager.getManager();
nicolasroard24d6ec72013-07-12 18:27:54 -07001174 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTools();
nicolasroard32cc4dd2013-09-06 17:21:55 -07001175 if (mCategoryGeometryAdapter != null) {
1176 mCategoryGeometryAdapter.clear();
1177 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001178 mCategoryGeometryAdapter = new CategoryAdapter(this);
1179 for (FilterRepresentation representation : filtersRepresentations) {
1180 mCategoryGeometryAdapter.add(new Action(this, representation));
1181 }
nicolasroard3a5556d2013-02-28 12:11:35 -08001182 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07001183
jinwu4fafa7a2017-04-07 13:27:48 +08001184 private void fillWaterMarks() {
1185 FiltersManager filtersManager = FiltersManager.getManager();
1186 ArrayList<ArrayList<FilterRepresentation>> filters = new ArrayList<>();
1187 filters.add(filtersManager.getWaterMarks());
1188 filters.add(filtersManager.getLocations());
1189 filters.add(filtersManager.getTimes());
1190 filters.add(filtersManager.getWeathers());
1191 filters.add(filtersManager.getEmotions());
1192 filters.add(filtersManager.getFoods());
1193 if (mCategoryWatermarkAdapters != null) {
1194 mCategoryWatermarkAdapters.clear();
1195 }
1196 mCategoryWatermarkAdapters = new ArrayList<>();
1197 for (int i = 0; i < filters.size(); i++) {
1198 mCategoryWatermarkAdapters.add(new CategoryAdapter(this));
1199 for (FilterRepresentation representation : filters.get(i)) {
1200 mCategoryWatermarkAdapters.get(i).add(new Action(this, representation));
1201 }
1202 }
1203 }
1204
nicolasroard3a5556d2013-02-28 12:11:35 -08001205 private void processIntent() {
nicolasroard0d7cdf82012-09-25 14:27:56 -07001206 Intent intent = getIntent();
Bobby Georgescua850a542012-10-23 15:40:06 -07001207 if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
1208 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
1209 }
1210
Ruben Brunkab779de2013-02-14 16:18:22 -08001211 mAction = intent.getAction();
ztenghuib3f62e42013-06-10 15:51:42 -07001212 mSelectedImageUri = intent.getData();
1213 Uri loadUri = mSelectedImageUri;
John Hofordafa8ed92013-04-15 22:10:43 -07001214 if (mOriginalImageUri != null) {
ztenghuib3f62e42013-06-10 15:51:42 -07001215 loadUri = mOriginalImageUri;
John Hofordafa8ed92013-04-15 22:10:43 -07001216 }
ztenghuib3f62e42013-06-10 15:51:42 -07001217 if (loadUri != null) {
1218 startLoadBitmap(loadUri);
nicolasroard0d7cdf82012-09-25 14:27:56 -07001219 } else {
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001220 pickImage(SELECT_PICTURE);
nicolasroard0d7cdf82012-09-25 14:27:56 -07001221 }
1222 }
1223
nicolasroard3a5556d2013-02-28 12:11:35 -08001224 private void setupEditors() {
Chao Zhang0316f862016-01-28 20:55:00 +08001225 FrameLayout editorContainer = (FrameLayout) findViewById(R.id.editorContainer);
Chao Zhang0316f862016-01-28 20:55:00 +08001226 mEditorPlaceHolder.setContainer(editorContainer);
nicolasroard3a5556d2013-02-28 12:11:35 -08001227 EditorManager.addEditors(mEditorPlaceHolder);
1228 mEditorPlaceHolder.setOldViews(mImageViews);
nicolasroard3a5556d2013-02-28 12:11:35 -08001229 }
1230
nicolasroard3a5556d2013-02-28 12:11:35 -08001231 private void setDefaultValues() {
nicolasroard3a5556d2013-02-28 12:11:35 -08001232 Resources res = getResources();
nicolasroard3a5556d2013-02-28 12:11:35 -08001233
nicolasroard3a5556d2013-02-28 12:11:35 -08001234 // TODO: get those values from XML.
nicolasroard3a5556d2013-02-28 12:11:35 -08001235 FramedTextButton.setTextSize((int) getPixelsFromDip(14));
1236 FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
1237 FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
nicolasroard3a5556d2013-02-28 12:11:35 -08001238
1239 Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
1240 int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
1241 Spline.setCurveHandle(curveHandle, curveHandleSize);
1242 Spline.setCurveWidth((int) getPixelsFromDip(3));
John Hoford3759b2d2013-09-10 16:59:23 -07001243
1244 mOriginalImageUri = null;
nicolasroard3a5556d2013-02-28 12:11:35 -08001245 }
1246
John Reckd49d5322012-10-24 12:56:31 -07001247 private void startLoadBitmap(Uri uri) {
nicolasroard733a0132013-02-08 17:00:42 -08001248 final View imageShow = findViewById(R.id.imageShow);
1249 imageShow.setVisibility(View.INVISIBLE);
John Hofordf7f24e82013-09-13 16:02:09 -07001250 startLoadingIndicator();
nicolasroardf5eedf12013-04-19 17:13:30 -07001251 mShowingTinyPlanet = false;
1252 mLoadBitmapTask = new LoadBitmapTask();
John Reckd49d5322012-10-24 12:56:31 -07001253 mLoadBitmapTask.execute(uri);
Byunghun Jeon863bd522015-11-02 17:20:55 -08001254
Likai Dingb7c13c22017-02-16 14:54:04 +08001255 mParseDepthMapTask = new ParseDepthMapTask();
1256 mParseDepthMapTask.execute(uri);
Jay Wangf19b0702016-06-09 12:49:49 -07001257
1258 if(TruePortraitNativeEngine.getInstance().isLibLoaded()) {
1259 mLoadTruePortraitTask = new LoadTruePortraitTask();
1260 mLoadTruePortraitTask.execute(uri);
1261 }
John Reckd49d5322012-10-24 12:56:31 -07001262 }
John Hoford3d4f2c72012-10-23 17:14:35 -07001263
Likai Dingb7c13c22017-02-16 14:54:04 +08001264 private void showDualCameraButton(boolean visible) {
1265 if (DualCameraEffect.isSupported())
1266 mReleaseDualCam = true;
1267 Fragment currentPanel = getSupportFragmentManager()
1268 .findFragmentByTag(MainPanel.FRAGMENT_TAG);
1269 if (currentPanel instanceof MainPanel) {
1270 ((MainPanel) currentPanel).showDualCameraButton(visible && mReleaseDualCam);
1271 }
1272 }
1273
nicolasroardf5eedf12013-04-19 17:13:30 -07001274 private void fillBorders() {
nicolasroard24d6ec72013-07-12 18:27:54 -07001275 FiltersManager filtersManager = FiltersManager.getManager();
1276 ArrayList<FilterRepresentation> borders = filtersManager.getBorders();
kaiyiz6e4a5cc2014-10-20 11:43:17 +08001277 mCategoryBordersAdapter = new CategoryAdapter(this);
Ruben Brunkd88683e2013-04-01 16:55:05 -07001278
Ruben Brunkf79f9542013-03-18 22:23:43 -07001279 for (int i = 0; i < borders.size(); i++) {
nicolasroard24d6ec72013-07-12 18:27:54 -07001280 FilterRepresentation filter = borders.get(i);
Michael Bestasf4f030b2016-06-07 00:06:53 +03001281 filter.setName(getString(R.string.frame, i));
Ruben Brunkf79f9542013-03-18 22:23:43 -07001282 if (i == 0) {
Ruben Brunk3cb106d2013-06-03 15:41:36 -07001283 filter.setName(getString(R.string.none));
nicolasroard90901412013-02-01 13:48:21 -08001284 }
kaiyiz6e4a5cc2014-10-20 11:43:17 +08001285 mCategoryBordersAdapter.add(new Action(this, filter, Action.FULL_VIEW));
nicolasroard90901412013-02-01 13:48:21 -08001286 }
1287 }
1288
nicolasroardfa474a12013-07-15 11:24:36 -07001289 public UserPresetsAdapter getUserPresetsAdapter() {
1290 return mUserPresetsAdapter;
1291 }
1292
nicolasroardf5eedf12013-04-19 17:13:30 -07001293 public CategoryAdapter getCategoryLooksAdapter() {
1294 return mCategoryLooksAdapter;
1295 }
1296
1297 public CategoryAdapter getCategoryBordersAdapter() {
1298 return mCategoryBordersAdapter;
1299 }
1300
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001301 public CategoryAdapter getCategoryMakeupAdapter() {
1302 return mCategoryMakeupAdapter;
1303 }
1304
nicolasroardf5eedf12013-04-19 17:13:30 -07001305 public CategoryAdapter getCategoryGeometryAdapter() {
1306 return mCategoryGeometryAdapter;
1307 }
1308
1309 public CategoryAdapter getCategoryFiltersAdapter() {
1310 return mCategoryFiltersAdapter;
1311 }
1312
Jack Yoo66d21442015-10-27 16:27:49 -07001313 public CategoryAdapter getCategoryTrueScannerAdapter() {
1314 return mCategoryTrueScannerAdapter;
1315 }
1316
Jack Yoo1d415cf2016-01-18 15:49:46 -08001317 public CategoryAdapter getCategoryHazeBusterAdapter() {
1318 return mCategoryHazeBusterAdapter;
1319 }
1320
Jack Yoo813c89e2016-01-21 15:28:31 -08001321 public CategoryAdapter getCategorySeeStraightAdapter() {
1322 return mCategorySeeStraightAdapter;
1323 }
1324
nicolasroard860af322013-08-08 20:47:28 -07001325 public CategoryAdapter getCategoryVersionsAdapter() {
1326 return mCategoryVersionsAdapter;
1327 }
1328
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001329 public CategoryAdapter getCategoryDualCamAdapter() {
1330 return mCategoryDualCamAdapter;
1331 }
1332
Jay Wangf19b0702016-06-09 12:49:49 -07001333 public CategoryAdapter getCategoryTruePortraitAdapter() {
1334 return mCategoryTruePortraitAdapter;
1335 }
1336
jinwu4fafa7a2017-04-07 13:27:48 +08001337 public CategoryAdapter getCategoryWatermarkAdapter() {
1338 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(0) : null;
1339 }
1340
1341 public CategoryAdapter getCategoryLocationAdapter() {
1342 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(1) : null;
1343 }
1344
1345 public CategoryAdapter getCategoryTimeAdapter() {
1346 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(2) : null;
1347 }
1348
1349 public CategoryAdapter getCategoryWeatherAdapter() {
1350 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(3) : null;
1351 }
1352
1353 public CategoryAdapter getCategoryEmotionAdapter() {
1354 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(4) : null;
1355 }
1356
1357 public CategoryAdapter getCategoryFoodAdapter() {
1358 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(5) : null;
1359 }
1360
nicolasroardf5eedf12013-04-19 17:13:30 -07001361 public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
1362 if (filterRepresentation == null) {
1363 return;
1364 }
1365 ImagePreset oldPreset = MasterImage.getImage().getPreset();
1366 ImagePreset copy = new ImagePreset(oldPreset);
1367 copy.removeFilter(filterRepresentation);
nicolasroarded609792013-06-26 16:56:31 -07001368 MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
nicolasroardf5eedf12013-04-19 17:13:30 -07001369 if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
1370 FilterRepresentation lastRepresentation = copy.getLastRepresentation();
1371 MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
1372 }
1373 }
1374
1375 public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
1376 if (filterRepresentation == null) {
1377 return;
1378 }
nicolasroard57bd0922013-08-12 14:04:11 -07001379 if (!(filterRepresentation instanceof FilterRotateRepresentation)
Jay Wangf19b0702016-06-09 12:49:49 -07001380 && !(filterRepresentation instanceof FilterMirrorRepresentation)
1381 && MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
nicolasroardf5eedf12013-04-19 17:13:30 -07001382 return;
1383 }
jinwu4fafa7a2017-04-07 13:27:48 +08001384 if (filterRepresentation.getFilterType() == FilterWatermarkRepresentation.TYPE_WATERMARK_CATEGORY) {
1385 return;
1386 }
zhuwfa5ddff2017-11-23 11:33:33 +08001387 boolean addToHistory = filterRepresentation.getFilterType()
1388 != FilterWatermarkRepresentation.TYPE_WATERMARK;
nicolasroard9f452e02013-08-23 00:10:01 -07001389 if (filterRepresentation instanceof FilterUserPresetRepresentation
1390 || filterRepresentation instanceof FilterRotateRepresentation
1391 || filterRepresentation instanceof FilterMirrorRepresentation) {
1392 MasterImage.getImage().onNewLook(filterRepresentation);
1393 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001394 ImagePreset oldPreset = MasterImage.getImage().getPreset();
1395 ImagePreset copy = new ImagePreset(oldPreset);
1396 FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
1397 if (representation == null) {
nicolasroard3cd6fc82013-08-15 15:35:53 -07001398 filterRepresentation = filterRepresentation.copy();
nicolasroardf5eedf12013-04-19 17:13:30 -07001399 copy.addFilter(filterRepresentation);
1400 } else {
ztenghuic9ca6d12013-06-26 13:54:17 -07001401 if (filterRepresentation.allowsSingleInstanceOnly()) {
ztenghuid2e9ea02013-06-24 13:54:04 -07001402 // Don't just update the filter representation. Centralize the
1403 // logic in the addFilter(), such that we can keep "None" as
1404 // null.
nicolasroard20667d22013-08-14 16:43:07 -07001405 if (!representation.equals(filterRepresentation)) {
1406 // Only do this if the filter isn't the same
1407 // (state panel clicks can lead us here)
1408 copy.removeFilter(representation);
1409 copy.addFilter(filterRepresentation);
1410 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001411 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001412 }
zhuwfa5ddff2017-11-23 11:33:33 +08001413 MasterImage.getImage().setPreset(copy, filterRepresentation, addToHistory);
nicolasroardf5eedf12013-04-19 17:13:30 -07001414 MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
1415 }
1416
1417 public void showRepresentation(FilterRepresentation representation) {
John Hofordf57e5882013-05-20 18:24:12 -07001418 if (representation == null) {
1419 return;
1420 }
zhuwabf30792018-04-20 17:18:03 +08001421 if (hasWaterMark && representation.getFilterType() != FilterRepresentation.TYPE_WATERMARK &&
1422 representation.getFilterType() !=
1423 FilterWatermarkRepresentation.TYPE_WATERMARK_CATEGORY) {
1424 clearWaterMark();
1425 resetHistory();
1426 showWatermarkButton(false);
1427 }
nicolasroarde5f4b782013-06-26 14:33:15 -07001428
Chao Zhang80516ca2016-04-25 15:37:33 +08001429 Fragment currentPanel =
1430 getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1431 if (currentPanel instanceof MainPanel && ((MainPanel) currentPanel).hasEditorPanel()) {
1432 if (representation.equals(MasterImage.getImage().getCurrentFilterRepresentation())) {
1433 return;
1434 }
1435 // cancel previous filter.
1436 cancelCurrentFilter();
1437 showDefaultImageView();
1438 removeSeekBarPanel();
1439 }
1440
nicolasroard57bd0922013-08-12 14:04:11 -07001441 if (representation instanceof FilterRotateRepresentation) {
1442 FilterRotateRepresentation r = (FilterRotateRepresentation) representation;
1443 r.rotateCW();
1444 }
1445 if (representation instanceof FilterMirrorRepresentation) {
1446 FilterMirrorRepresentation r = (FilterMirrorRepresentation) representation;
1447 r.cycle();
1448 }
nicolasroardedf4b092013-09-13 16:37:43 -07001449 if (representation.isBooleanFilter()) {
1450 ImagePreset preset = MasterImage.getImage().getPreset();
1451 if (preset.getRepresentation(representation) != null) {
1452 // remove
1453 ImagePreset copy = new ImagePreset(preset);
1454 copy.removeFilter(representation);
1455 FilterRepresentation filterRepresentation = representation.copy();
1456 MasterImage.getImage().setPreset(copy, filterRepresentation, true);
1457 MasterImage.getImage().setCurrentFilterRepresentation(null);
Chao Zhang80516ca2016-04-25 15:37:33 +08001458
1459 setActionBar();
1460 showActionBar(true);
nicolasroardedf4b092013-09-13 16:37:43 -07001461 return;
1462 }
1463 }
jinwu4fafa7a2017-04-07 13:27:48 +08001464 if (representation.getFilterType() == FilterRepresentation.TYPE_DUALCAM) {
1465 DisplayMetrics dm = getResources().getDisplayMetrics();
1466 float[] mTmpPoint = new float[2];
1467 mTmpPoint[0] = dm.widthPixels/2;
1468 mTmpPoint[1] = dm.heightPixels/2;
1469 Matrix m = MasterImage.getImage().getScreenToImageMatrix(true);
1470 m.mapPoints(mTmpPoint);
1471 if (representation instanceof FilterDualCamBasicRepresentation) {
1472 ((FilterDualCamBasicRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]);
1473 }
1474 if (representation instanceof FilterDualCamFusionRepresentation) {
1475 ((FilterDualCamFusionRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]);
1476 }
jinwu4fafa7a2017-04-07 13:27:48 +08001477 }
1478 if (representation.getFilterType() == FilterRepresentation.TYPE_WATERMARK) {
zhuwfa5ddff2017-11-23 11:33:33 +08001479 if (MasterImage.getImage().getCurrentFilterRepresentation() != null
1480 && representation.getSerializationName().equals(MasterImage.getImage()
1481 .getCurrentFilterRepresentation().getSerializationName())) {
1482 return;
1483 }
jinwu4fafa7a2017-04-07 13:27:48 +08001484 showWaterMark(representation);
1485 }
1486 if (TrueScannerActs.SERIALIZATION_NAME.equals(representation.getSerializationName())) {
1487 Bitmap b = MasterImage.getImage().getOriginalBitmapHighres();
1488 int w = b.getWidth();
1489 int h = b.getHeight();
1490 if (w < h) {
1491 w = h;
1492 h = b.getWidth();
1493 }
1494 if (w <= TrueScannerActs.MIN_WIDTH
1495 || h <= TrueScannerActs.MIN_HEIGHT) {
zhuw012ade82017-09-06 16:20:11 +08001496 Toast.makeText(this, getString(R.string.image_size_too_small),
1497 Toast.LENGTH_SHORT).show();
jinwu4fafa7a2017-04-07 13:27:48 +08001498 return;
1499 }
1500 }
Ruben Brunkb0f7a8f2013-07-18 16:37:30 -07001501 useFilterRepresentation(representation);
nicolasroardf5eedf12013-04-19 17:13:30 -07001502
Jay Wangf19b0702016-06-09 12:49:49 -07001503 loadEditorPanel(representation);
nicolasroardf5eedf12013-04-19 17:13:30 -07001504 }
1505
jinwu4fafa7a2017-04-07 13:27:48 +08001506 private void showWaterMark(FilterRepresentation representation) {
1507 FilterWatermarkRepresentation watermarkRepresentation =
1508 (FilterWatermarkRepresentation)representation;
1509 if (mWaterMarkView != null) {
1510 rlImageContainer.removeView(mWaterMarkView);
1511 hasWaterMark = false;
jinwu5a674072017-06-06 10:41:59 +08001512 watermarkRepresentation.reset();
jinwu4fafa7a2017-04-07 13:27:48 +08001513 }
1514 DisplayMetrics dm = getResources().getDisplayMetrics();
1515 RelativeLayout.LayoutParams params =
1516 new RelativeLayout.LayoutParams(dm.widthPixels,
1517 dm.heightPixels);
1518 String textHint;
1519 switch (watermarkRepresentation.getMarkType()) {
1520 case 0:
1521 textHint = locationStr;
1522 break;
1523 case 2:
1524 textHint = temperature;
1525 break;
1526 default:
1527 textHint = watermarkRepresentation.getTextHint();
1528 break;
1529 }
1530 WaterMarkView waterMarkView = watermarkRepresentation.getWaterMarkView(textHint);
1531 rlImageContainer.addView(waterMarkView, params);
1532 mWaterMarkView = waterMarkView;
1533 mSaveWaterMark.useRepresentation(representation);
1534 imgComparison.bringToFront();
1535 mSaveWaterMark.getExifData(this, mSelectedImageUri);
1536 mWaterMarkView.mTouchable = true;
1537 hasWaterMark = true;
1538 }
1539
1540 private void clearWaterMark() {
1541 if (mWaterMarkView != null) {
1542 rlImageContainer.removeView(mWaterMarkView);
1543 mWaterMarkView = null;
1544 hasWaterMark = false;
1545 }
1546 }
1547
1548 public void disableTouchEvent() {
1549 if (mWaterMarkView == null) return;
1550 mWaterMarkView.mTouchable = false;
1551 }
1552
1553 public boolean isWaterMarked() {
1554 return hasWaterMark;
1555 }
1556
1557 public SaveWaterMark getSaveWaterMark() {
1558 return mSaveWaterMark;
1559 }
1560
nicolasroardf5eedf12013-04-19 17:13:30 -07001561 public Editor getEditor(int editorID) {
1562 return mEditorPlaceHolder.getEditor(editorID);
1563 }
1564
1565 public void setCurrentPanel(int currentPanel) {
1566 mCurrentPanel = currentPanel;
Chao Zhanga731e092016-04-01 10:49:29 +08001567 if (mMasterImage == null) {
1568 return;
1569 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05301570 HistoryManager adapter = mMasterImage.getHistory();
1571 adapter.setActiveFilter(currentPanel);
nicolasroardf5eedf12013-04-19 17:13:30 -07001572 }
1573
1574 public int getCurrentPanel() {
1575 return mCurrentPanel;
1576 }
1577
nicolasroardacc00f82013-06-25 16:32:01 -07001578 public void updateCategories() {
nicolasroard26f23e62013-09-23 18:36:25 -07001579 if (mMasterImage == null) {
1580 return;
1581 }
nicolasroardacc00f82013-06-25 16:32:01 -07001582 ImagePreset preset = mMasterImage.getPreset();
1583 mCategoryLooksAdapter.reflectImagePreset(preset);
1584 mCategoryBordersAdapter.reflectImagePreset(preset);
Chao Zhang80516ca2016-04-25 15:37:33 +08001585 mCategoryFiltersAdapter.reflectImagePreset(preset);
Likai Ding49eee1c2016-06-17 15:30:06 +08001586 if (mCategoryMakeupAdapter != null) {
1587 mCategoryMakeupAdapter.reflectImagePreset(preset);
1588 }
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001589 mCategoryDualCamAdapter.reflectImagePreset(preset);
Jay Wangf19b0702016-06-09 12:49:49 -07001590 mCategoryTruePortraitAdapter.reflectImagePreset(preset);
nicolasroardacc00f82013-06-25 16:32:01 -07001591 }
1592
nicolasroarde7996262013-08-13 16:29:11 -07001593 public View getMainStatePanelContainer(int id) {
1594 return findViewById(id);
1595 }
1596
John Hoford64fc2ed2013-10-09 13:54:45 -07001597 public void onShowMenu(PopupMenu menu) {
1598 mCurrentMenu = menu;
1599 menu.setOnDismissListener(this);
1600 }
1601
1602 @Override
1603 public void onDismiss(PopupMenu popupMenu){
1604 if (mCurrentMenu == null) {
1605 return;
1606 }
1607 mCurrentMenu.setOnDismissListener(null);
1608 mCurrentMenu = null;
1609 }
1610
John Hoford6125a082013-09-12 07:49:24 -07001611 @Override
1612 public void onShow(DialogInterface dialog) {
1613 mCurrentDialog = dialog;
1614 }
1615
1616 @Override
1617 public void onDismiss(DialogInterface dialogInterface) {
1618 mCurrentDialog = null;
1619 }
1620
jinwu4fafa7a2017-04-07 13:27:48 +08001621 public void onMediaPickerStarted() {
jinwu4fafa7a2017-04-07 13:27:48 +08001622 toggleComparisonButtonVisibility();
1623 ActionBar actionBar = getActionBar();
1624 actionBar.hide();
1625 if (mMediaPicker == null)
1626 mMediaPicker = MediaPickerFragment.newInstance(getApplicationContext());
1627 getSupportFragmentManager()
1628 .beginTransaction()
1629 .replace(R.id.main_panel_container, mMediaPicker)
1630 .commit();
1631 }
1632
1633 public void onMediaPickerResult(Uri selImg) {
1634 mFilterPresetSource = new FilterPresetSource(this);
1635 int id = nameFilter(mFilterPresetSource, tempFilterArray);
1636 FilterPresetRepresentation fp= new FilterPresetRepresentation(
1637 getString(R.string.filtershow_preset_title) + id, id, id);
1638 fp.setSerializationName("Custom");
1639 fp.setUri(selImg);
1640 ImagePreset preset = new ImagePreset();
1641 preset.addFilter(fp);
1642 SaveOption sp= new SaveOption();
1643 sp._id = id;
1644 sp.name = "Custom" + id;
1645 sp.Uri = selImg.toString();
1646 tempFilterArray.add(sp);
1647 FiltersManager.getManager().addRepresentation(fp);
1648 mCategoryLooksAdapter.add(new Action(this, fp, Action.FULL_VIEW, true));
1649 useFilterRepresentation(fp);
1650 int pos = mCategoryLooksAdapter.getPositionOfPresentation(fp);
1651 if (pos != -1)
1652 backAndSetCustomFilterSelected(pos);
1653 }
1654
1655 private void backAndSetCustomFilterSelected(int pos) {
1656 showComparisonButton();
1657 removeSeekBarPanel();
1658 showActionBar(true);
1659 loadMainPanel();
1660 if(mEditorPlaceHolder != null)
1661 mEditorPlaceHolder.hide();
1662 if(mImageShow != null)
1663 mImageShow.setVisibility(View.VISIBLE);
1664 updateCategories();
1665 mCategoryLooksAdapter.setSelected(pos);
1666 }
1667
1668 public void applyCustomFilterRepresentation(
1669 FilterRepresentation filterRep, FilterRepresentation oldfilterRep) {
1670 ImagePreset oldPreset = MasterImage.getImage().getPreset();
1671 ImagePreset copy = new ImagePreset(oldPreset);
1672 if (oldfilterRep != null)
1673 copy.removeFilter(oldfilterRep);
1674
1675 FilterRepresentation rep = copy.getRepresentation(filterRep);
1676 if (rep == null) {
1677 filterRep = filterRep.copy();
1678 copy.addFilter(filterRep);
1679 } else {
1680 if (filterRep.allowsSingleInstanceOnly()) {
1681 // Don't just update the filter representation. Centralize the
1682 // logic in the addFilter(), such that we can keep "None" as
1683 // null.
1684 if (!rep.equals(filterRep)) {
1685 // Only do this if the filter isn't the same
1686 // (state panel clicks can lead us here)
1687 copy.removeFilter(rep);
1688 copy.addFilter(filterRep);
1689 }
1690 }
1691 }
1692 MasterImage.getImage().setPreset(copy, filterRep, false);
1693 }
1694
1695 public FilterRepresentation createUserPresentaion(Uri selImg, int index) {
1696 FilterPresetRepresentation fp= new FilterPresetRepresentation(
1697 getString(R.string.filtershow_preset_title) + index, index, index);
1698 fp.setSerializationName("Custom");
1699 fp.setUri(selImg);
1700 return fp;
1701 }
1702
1703 public FilterRepresentation getCurrentPresentation() {
1704 ImagePreset preset = MasterImage.getImage().getPreset();
1705 return preset.getLastRepresentation();
1706 }
1707
nicolasroardbe843552013-07-02 15:02:43 -07001708 private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
1709 @Override
1710 protected Boolean doInBackground(Void... params) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001711 MasterImage master = MasterImage.getImage();
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001712 if (master.supportsHighRes()) {
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001713 int highresPreviewSize = Math.min(MasterImage.MAX_BITMAP_DIM, getScreenImageSize());
1714 Log.d(LOGTAG, "FilterShowActivity.LoadHighresBitmapTask.doInBackground(): after, highresPreviewSize is " + highresPreviewSize);
Ruben Brunk47886ac2013-07-12 17:23:39 -07001715 Rect bounds = new Rect();
1716 Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(),
1717 master.getActivity(), highresPreviewSize,
1718 master.getOrientation(), bounds);
Jay Wange0990322016-06-28 13:29:26 -07001719
1720 // Force the bitmap to even width and height which is required by beautification algo
1721 Bitmap tempBmp = MasterImage.convertToEvenNumberWidthImage(originalHires);
1722 if(tempBmp != null && originalHires != null) {
1723 if(!originalHires.isRecycled() && originalHires != tempBmp) {
1724 originalHires.recycle();
1725 }
1726 originalHires = tempBmp;
1727 }
1728
Ruben Brunk47886ac2013-07-12 17:23:39 -07001729 master.setOriginalBounds(bounds);
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001730 master.setOriginalBitmapHighres(originalHires);
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001731 Log.d(LOGTAG, "FilterShowActivity.LoadHighresBitmapTask.doInBackground(): originalHires.WH is (" + originalHires.getWidth()
1732 + ", " + originalHires.getHeight() +"), bounds is " + bounds.toString());
nicolasroarddb5d0602013-07-19 14:45:32 -07001733 mBoundService.setOriginalBitmapHighres(originalHires);
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001734 master.warnListeners();
1735 }
nicolasroardbe843552013-07-02 15:02:43 -07001736 return true;
1737 }
1738
1739 @Override
1740 protected void onPostExecute(Boolean result) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001741 Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
nicolasroardbe843552013-07-02 15:02:43 -07001742 if (highresBitmap != null) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001743 float highResPreviewScale = (float) highresBitmap.getWidth()
1744 / (float) MasterImage.getImage().getOriginalBounds().width();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001745 Log.d(LOGTAG, "FilterShowActivity.LoadHighresBitmapTask.onPostExecute(): highResPreviewScale is " + highResPreviewScale);
nicolasroarddb5d0602013-07-19 14:45:32 -07001746 mBoundService.setHighresPreviewScaleFactor(highResPreviewScale);
nicolasroardbe843552013-07-02 15:02:43 -07001747 }
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001748
nicolasroard80b216d2013-08-28 14:00:06 -07001749 MasterImage.getImage().warnListeners();
nicolasroardbe843552013-07-02 15:02:43 -07001750 }
1751 }
1752
Likai Dingb7c13c22017-02-16 14:54:04 +08001753 private class ParseDepthMapTask extends AsyncTask<Uri, Void, Boolean> {
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001754 @Override
Likai Dingb7c13c22017-02-16 14:54:04 +08001755 protected Boolean doInBackground(Uri... params) {
1756 return MasterImage.getImage().parseDepthMap(FilterShowActivity.this, params[0]);
Byunghun Jeonfa9e7452015-11-13 11:33:57 -08001757 }
1758
1759 @Override
1760 protected void onPostExecute(Boolean result) {
Likai Dingb7c13c22017-02-16 14:54:04 +08001761 showDualCameraButton(result);
Byunghun Jeonfa9e7452015-11-13 11:33:57 -08001762 stopLoadingIndicator();
1763 }
1764 }
1765
John Hofordf7f24e82013-09-13 16:02:09 -07001766 public boolean isLoadingVisible() {
Likai Dingb7c13c22017-02-16 14:54:04 +08001767 if (mLoadingDialog != null) {
Byunghun Jeon863bd522015-11-02 17:20:55 -08001768 return mLoadingDialog.isShowing();
1769 }
1770
1771 return false;
John Hofordf7f24e82013-09-13 16:02:09 -07001772 }
1773
1774 public void startLoadingIndicator() {
Byunghun Jeon863bd522015-11-02 17:20:55 -08001775 if(mLoadingDialog == null) {
1776 mLoadingDialog = new ProgressDialog(this);
1777 mLoadingDialog.setMessage(getString(R.string.loading_image));
1778 mLoadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
1779 mLoadingDialog.setIndeterminate(true);
1780 mLoadingDialog.setCancelable(true);
1781 mLoadingDialog.setCanceledOnTouchOutside(false);
1782 mLoadingDialog.setOnCancelListener(new OnCancelListener() {
1783 @Override
1784 public void onCancel(DialogInterface dialog) {
Jay Wang8f0f5c02015-11-06 14:35:17 -08001785 done();
Byunghun Jeon863bd522015-11-02 17:20:55 -08001786 }
1787 });
1788 }
1789
1790 mLoadingDialog.show();
John Hofordf7f24e82013-09-13 16:02:09 -07001791 }
1792
nicolasroard32cc4dd2013-09-06 17:21:55 -07001793 public void stopLoadingIndicator() {
Likai Dingb7c13c22017-02-16 14:54:04 +08001794 if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
Byunghun Jeon863bd522015-11-02 17:20:55 -08001795 mLoadingDialog.dismiss();
1796 }
Jay Wangf19b0702016-06-09 12:49:49 -07001797 }
1798
1799 private class LoadTruePortraitTask extends AsyncTask<Uri, Void, Boolean> {
1800
1801 @Override
1802 protected Boolean doInBackground(Uri... params) {
1803 boolean result = false;
1804 Bitmap src = ImageLoader.loadBitmap(FilterShowActivity.this, params[0], null);
jinwu4fafa7a2017-04-07 13:27:48 +08001805 if(src == null) {
1806 return false;
1807 }
jinwuc9060a82017-04-28 15:41:13 +08001808
1809 FaceInfo[] faceInfos = null;
jinwud1e64f42017-08-09 14:24:06 +08001810 FaceDetect fDetect = new FaceDetect();
jinwuc9060a82017-04-28 15:41:13 +08001811 if (fDetect.isLibLoaded()) {
1812 fDetect.initialize();
1813 faceInfos = fDetect.dectectFeatures(src);
1814 fDetect.uninitialize();
1815 }
Jay Wangf19b0702016-06-09 12:49:49 -07001816
1817 if(faceInfos != null && faceInfos.length > 0) {
1818 Rect[] faces = new Rect[faceInfos.length];
1819 for(int i=0; i<faceInfos.length; i++) {
1820 faces[i] = faceInfos[i].face;
1821 }
1822
1823 result = TruePortraitNativeEngine.getInstance().init(FilterShowActivity.this, src, faces);
1824 } else {
1825 TruePortraitNativeEngine.getInstance().setFacesDetected(false);
1826 }
1827
1828 src.recycle();
1829 src = null;
1830
1831 return result;
1832 }
1833
1834 @Override
1835 protected void onPostExecute(Boolean result) {
1836 }
1837 }
nicolasroard32cc4dd2013-09-06 17:21:55 -07001838
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001839 private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
John Reckd49d5322012-10-24 12:56:31 -07001840 int mBitmapSize;
1841
nicolasroardf5eedf12013-04-19 17:13:30 -07001842 public LoadBitmapTask() {
John Reckd49d5322012-10-24 12:56:31 -07001843 mBitmapSize = getScreenImageSize();
Chao Zhang7deb94a2016-03-14 11:10:20 +08001844 Log.d(LOGTAG, "FilterShowActivity.LoadBitmapTask(): mBitmapSize is " + mBitmapSize);
John Hoford3d4f2c72012-10-23 17:14:35 -07001845 }
1846
1847 @Override
John Reckd49d5322012-10-24 12:56:31 -07001848 protected Boolean doInBackground(Uri... params) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001849 if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) {
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001850 return false;
1851 }
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001852 publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity()));
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001853 return true;
John Hoford3d4f2c72012-10-23 17:14:35 -07001854 }
1855
1856 @Override
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001857 protected void onProgressUpdate(Boolean... values) {
John Reck00914f52012-10-25 10:08:37 -07001858 super.onProgressUpdate(values);
Ruben Brunk6416dd52012-11-28 14:00:30 -08001859 if (isCancelled()) {
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001860 return;
Ruben Brunk6416dd52012-11-28 14:00:30 -08001861 }
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001862 if (values[0]) {
John Hoford5300e0c2013-03-04 17:50:58 -08001863 mShowingTinyPlanet = true;
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001864 }
John Reck00914f52012-10-25 10:08:37 -07001865 }
1866
1867 @Override
John Hoford3d4f2c72012-10-23 17:14:35 -07001868 protected void onPostExecute(Boolean result) {
Ruben Brunk69f5d8c2013-04-24 15:46:15 -07001869 MasterImage.setMaster(mMasterImage);
John Hoford3d4f2c72012-10-23 17:14:35 -07001870 if (isCancelled()) {
1871 return;
1872 }
nicolasroard588c30c2013-02-08 14:06:33 -08001873
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001874 if (!result) {
John Hoford3759b2d2013-09-10 16:59:23 -07001875 if (mOriginalImageUri != null
1876 && !mOriginalImageUri.equals(mSelectedImageUri)) {
John Hoford441d7a82013-08-20 15:37:37 -07001877 mOriginalImageUri = mSelectedImageUri;
1878 mOriginalPreset = null;
1879 Toast.makeText(FilterShowActivity.this,
1880 R.string.cannot_edit_original, Toast.LENGTH_SHORT).show();
1881 startLoadBitmap(mOriginalImageUri);
1882 } else {
1883 cannotLoadImage();
1884 }
ztenghuia08fab52013-07-22 14:06:22 -07001885 return;
John Hoford3d4f2c72012-10-23 17:14:35 -07001886 }
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001887
Chao Zhang7deb94a2016-03-14 11:10:20 +08001888 if (null == CachingPipeline.getRenderScriptContext()) {
1889 Log.v(LOGTAG, "RenderScript context destroyed during load");
John Hoford52fa1102013-06-11 13:07:15 -07001890 return;
1891 }
nicolasroard733a0132013-02-08 17:00:42 -08001892 final View imageShow = findViewById(R.id.imageShow);
1893 imageShow.setVisibility(View.VISIBLE);
1894
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001895 Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
nicolasroarddb5d0602013-07-19 14:45:32 -07001896 mBoundService.setOriginalBitmap(largeBitmap);
1897
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001898 float previewScale = (float) largeBitmap.getWidth()
1899 / (float) MasterImage.getImage().getOriginalBounds().width();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001900 Log.d(LOGTAG, "FilterShowActivity.LoadBitmapTask.onPostExecute(): previewScale is " + previewScale);
nicolasroarddb5d0602013-07-19 14:45:32 -07001901 mBoundService.setPreviewScaleFactor(previewScale);
nicolasroardf5eedf12013-04-19 17:13:30 -07001902 if (!mShowingTinyPlanet) {
1903 mCategoryFiltersAdapter.removeTinyPlanet();
1904 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001905 mCategoryLooksAdapter.imageLoaded();
1906 mCategoryBordersAdapter.imageLoaded();
1907 mCategoryGeometryAdapter.imageLoaded();
1908 mCategoryFiltersAdapter.imageLoaded();
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001909 mCategoryDualCamAdapter.imageLoaded();
Jay Wangf19b0702016-06-09 12:49:49 -07001910 mCategoryTruePortraitAdapter.imageLoaded();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001911 if(mCategoryMakeupAdapter != null) {
1912 mCategoryMakeupAdapter.imageLoaded();
1913 }
John Reckd49d5322012-10-24 12:56:31 -07001914 mLoadBitmapTask = null;
Ruben Brunkab779de2013-02-14 16:18:22 -08001915
nicolasroard32cc4dd2013-09-06 17:21:55 -07001916 MasterImage.getImage().warnListeners();
1917 loadActions();
1918
John Hofordafa8ed92013-04-15 22:10:43 -07001919 if (mOriginalPreset != null) {
ztenghuid2e9ea02013-06-24 13:54:04 -07001920 MasterImage.getImage().setLoadedPreset(mOriginalPreset);
nicolasroarded609792013-06-26 16:56:31 -07001921 MasterImage.getImage().setPreset(mOriginalPreset,
1922 mOriginalPreset.getLastRepresentation(), true);
John Hofordafa8ed92013-04-15 22:10:43 -07001923 mOriginalPreset = null;
nicolasroard32cc4dd2013-09-06 17:21:55 -07001924 } else {
1925 setDefaultPreset();
John Hofordafa8ed92013-04-15 22:10:43 -07001926 }
nicolasroardc7b38f32013-04-25 08:47:11 -07001927
nicolasroard32cc4dd2013-09-06 17:21:55 -07001928 MasterImage.getImage().resetGeometryImages(true);
1929
Chao Zhang7deb94a2016-03-14 11:10:20 +08001930 if (mAction.equals(TINY_PLANET_ACTION)) {
nicolasroardf5eedf12013-04-19 17:13:30 -07001931 showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
Ruben Brunkab779de2013-02-14 16:18:22 -08001932 }
Jay Wang8f0f5c02015-11-06 14:35:17 -08001933 mHiResBitmapTask = new LoadHighresBitmapTask();
1934 mHiResBitmapTask.execute();
nicolasroard80b216d2013-08-28 14:00:06 -07001935 MasterImage.getImage().warnListeners();
John Hoford3d4f2c72012-10-23 17:14:35 -07001936 super.onPostExecute(result);
1937 }
1938
1939 }
1940
Ruben Brunkf07bb272013-03-11 12:00:06 -07001941 private void clearGalleryBitmapPool() {
1942 (new AsyncTask<Void, Void, Void>() {
1943 @Override
1944 protected Void doInBackground(Void... params) {
1945 // Free memory held in Gallery's Bitmap pool. May be O(n) for n bitmaps.
1946 GalleryBitmapPool.getInstance().clear();
1947 return null;
1948 }
1949 }).execute();
1950 }
1951
John Hoford3d4f2c72012-10-23 17:14:35 -07001952 @Override
1953 protected void onDestroy() {
John Reckd49d5322012-10-24 12:56:31 -07001954 if (mLoadBitmapTask != null) {
1955 mLoadBitmapTask.cancel(false);
John Hoford3d4f2c72012-10-23 17:14:35 -07001956 }
Jay Wang8f0f5c02015-11-06 14:35:17 -08001957
1958 if(mHiResBitmapTask != null) {
1959 mHiResBitmapTask.cancel(false);
1960 }
1961
Likai Dingb7c13c22017-02-16 14:54:04 +08001962 if(mParseDepthMapTask != null) {
1963 mParseDepthMapTask.cancel(false);
Jay Wang8f0f5c02015-11-06 14:35:17 -08001964 }
1965
Jay Wangf19b0702016-06-09 12:49:49 -07001966 if(mLoadTruePortraitTask != null) {
1967 mLoadTruePortraitTask.cancel(false);
1968 }
1969
nicolasroardfa474a12013-07-15 11:24:36 -07001970 mUserPresetsManager.close();
jinwu4fafa7a2017-04-07 13:27:48 +08001971 if (mFilterPresetSource !=null) {
1972 mFilterPresetSource.close();
1973 }
1974
1975 if (tempFilterArray != null) {
1976 tempFilterArray.clear();
1977 }
huiyan3de604e2016-04-27 15:28:45 +08001978 unregisterReceiver(mHandlerReceiver);
nicolasroard24d6ec72013-07-12 18:27:54 -07001979 doUnbindService();
Likai Dingb7c13c22017-02-16 14:54:04 +08001980 if (mReleaseDualCam && DualCameraEffect.isSupported())
1981 DualCameraEffect.getInstance().release();
John Hoford3d4f2c72012-10-23 17:14:35 -07001982 super.onDestroy();
1983 }
1984
Ruben Brunk47886ac2013-07-12 17:23:39 -07001985 // TODO: find a more robust way of handling image size selection
1986 // for high screen densities.
jinwu4fafa7a2017-04-07 13:27:48 +08001987 public int getScreenImageSize() {
Ruben Brunk47886ac2013-07-12 17:23:39 -07001988 DisplayMetrics outMetrics = new DisplayMetrics();
1989 getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
ztenghuia08fab52013-07-22 14:06:22 -07001990 return Math.max(outMetrics.heightPixels, outMetrics.widthPixels);
John Hofordfafb2ed2012-10-11 12:55:05 -07001991 }
1992
Doris Liu0addfc72012-10-17 16:15:51 -07001993 private void showSavingProgress(String albumName) {
Bobby Georgescuec29b732012-10-07 15:20:44 -07001994 ProgressDialog progress;
1995 if (mSavingProgressDialog != null) {
1996 progress = mSavingProgressDialog.get();
1997 if (progress != null) {
1998 progress.show();
1999 return;
2000 }
2001 }
2002 // TODO: Allow cancellation of the saving process
Doris Liu0addfc72012-10-17 16:15:51 -07002003 String progressText;
2004 if (albumName == null) {
2005 progressText = getString(R.string.saving_image);
2006 } else {
2007 progressText = getString(R.string.filtershow_saving_image, albumName);
2008 }
2009 progress = ProgressDialog.show(this, "", progressText, true, false);
Bobby Georgescuec29b732012-10-07 15:20:44 -07002010 mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
2011 }
2012
2013 private void hideSavingProgress() {
2014 if (mSavingProgressDialog != null) {
2015 ProgressDialog progress = mSavingProgressDialog.get();
nicolasroard08458dc2012-10-09 16:34:58 -07002016 if (progress != null)
2017 progress.dismiss();
Bobby Georgescuec29b732012-10-07 15:20:44 -07002018 }
2019 }
2020
jinwue99f7222017-05-15 17:25:46 +08002021 public void completeSaveImage(Uri saveUri) {
nicolasroard0ee91a22012-10-01 00:25:11 -07002022 if (mSharingImage && mSharedOutputFile != null) {
2023 // Image saved, we unblock the content provider
2024 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
2025 Uri.encode(mSharedOutputFile.getAbsolutePath()));
2026 ContentValues values = new ContentValues();
2027 values.put(SharedImageProvider.PREPARE, false);
2028 getContentResolver().insert(uri, values);
2029 }
2030 setResult(RESULT_OK, new Intent().setData(saveUri));
Likai Dingb7c13c22017-02-16 14:54:04 +08002031 if (mReleaseDualCam && DualCameraEffect.isSupported()) {
2032 DualCameraEffect.getInstance().release();
jinwue99f7222017-05-15 17:25:46 +08002033 mReleaseDualCam = false;
2034 }
Bobby Georgescuec29b732012-10-07 15:20:44 -07002035 hideSavingProgress();
nicolasroard0ee91a22012-10-01 00:25:11 -07002036 finish();
2037 }
2038
maxwend57f7232016-06-04 22:51:06 +02002039 private boolean onShareTargetSelected() {
nicolasroard92e23412012-10-05 03:48:34 -07002040 // First, let's tell the SharedImageProvider that it will need to wait
2041 // for the image
nicolasroard0ee91a22012-10-01 00:25:11 -07002042 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
2043 Uri.encode(mSharedOutputFile.getAbsolutePath()));
2044 ContentValues values = new ContentValues();
2045 values.put(SharedImageProvider.PREPARE, true);
2046 getContentResolver().insert(uri, values);
2047 mSharingImage = true;
2048
2049 // Process and save the image in the background.
Doris Liu0addfc72012-10-17 16:15:51 -07002050 showSavingProgress(null);
nicolasroard0ee91a22012-10-01 00:25:11 -07002051 mImageShow.saveImage(this, mSharedOutputFile);
2052 return true;
2053 }
2054
2055 private Intent getDefaultShareIntent() {
2056 Intent intent = new Intent(Intent.ACTION_SEND);
2057 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
2058 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
2059 intent.setType(SharedImageProvider.MIME_TYPE);
nicolasroard24d6ec72013-07-12 18:27:54 -07002060 mSharedOutputFile = SaveImage.getNewFile(this, MasterImage.getImage().getUri());
nicolasroard0ee91a22012-10-01 00:25:11 -07002061 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
2062 Uri.encode(mSharedOutputFile.getAbsolutePath()));
2063 intent.putExtra(Intent.EXTRA_STREAM, uri);
2064 return intent;
2065 }
2066
nicolasroard9594c8d2012-09-27 20:54:48 -07002067 @Override
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302068 public boolean onPrepareOptionsMenu(Menu menu) {
2069 menu.clear();
nicolasroard9594c8d2012-09-27 20:54:48 -07002070 getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
maxwend57f7232016-06-04 22:51:06 +02002071 MenuItem item = menu.findItem(R.id.menu_share);
2072 if (item != null) {
2073 item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2074 @Override
2075 public boolean onMenuItemClick(MenuItem item) {
2076 final Intent shareIntent = getDefaultShareIntent();
2077 onShareTargetSelected();
2078 Intent intent = Intent.createChooser(shareIntent, null);
2079 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2080 FilterShowActivity.this.startActivity(intent);
2081 return true;
2082 }
2083 });
2084 }
John Hoford3759b2d2013-09-10 16:59:23 -07002085 mMenu = menu;
John Hoford46868d02013-09-12 14:16:50 -07002086 setupMenu();
Jay Wangf19b0702016-06-09 12:49:49 -07002087
2088 if(mCurrentEditor != null) {
2089 mCurrentEditor.onPrepareOptionsMenu(menu);
2090 }
nicolasroard9594c8d2012-09-27 20:54:48 -07002091 return true;
2092 }
2093
John Hoford3759b2d2013-09-10 16:59:23 -07002094 private void setupMenu(){
John Hoford46868d02013-09-12 14:16:50 -07002095 if (mMenu == null || mMasterImage == null) {
2096 return;
2097 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302098 //MenuItem undoItem = mMenu.findItem(R.id.undoButton);
2099 //MenuItem redoItem = mMenu.findItem(R.id.redoButton);
John Hoford3759b2d2013-09-10 16:59:23 -07002100 MenuItem resetItem = mMenu.findItem(R.id.resetHistoryButton);
maxwend57f7232016-06-04 22:51:06 +02002101 MenuItem shareItem = mMenu.findItem(R.id.menu_share);
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302102 //mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
Chao Zhang9c0d4752016-04-14 18:04:44 +08002103 if (!mMasterImage.hasModifications()) {
2104 mMenu.removeItem(R.id.resetHistoryButton);
2105 }
John Hoford3759b2d2013-09-10 16:59:23 -07002106 }
2107
nicolasroard92e23412012-10-05 03:48:34 -07002108 @Override
Bobby Georgescu6e733b72012-10-09 11:02:38 -07002109 public void onPause() {
2110 super.onPause();
Bobby Georgescu6e733b72012-10-09 11:02:38 -07002111 }
2112
2113 @Override
2114 public void onResume() {
2115 super.onResume();
Chao Zhang7deb94a2016-03-14 11:10:20 +08002116 if (SimpleMakeupImageFilter.HAS_TS_MAKEUP) {
Jay Wang8f0f5c02015-11-06 14:35:17 -08002117 MakeupEngine.getMakeupObj();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08002118 }
Bobby Georgescu6e733b72012-10-09 11:02:38 -07002119 }
2120
2121 @Override
nicolasroard9594c8d2012-09-27 20:54:48 -07002122 public boolean onOptionsItemSelected(MenuItem item) {
2123 switch (item.getItemId()) {
Jay Wangf19b0702016-06-09 12:49:49 -07002124 /*case R.id.undoButton: {
nicolasroard6a502732013-06-27 14:41:58 -07002125 HistoryManager adapter = mMasterImage.getHistory();
nicolasroard9594c8d2012-09-27 20:54:48 -07002126 int position = adapter.undo();
John Hoford63a7dac2013-01-14 14:48:39 -08002127 mMasterImage.onHistoryItemClick(position);
John Hoforda7a6a3a2013-05-22 15:41:20 -07002128 backToMain();
nicolasroard9594c8d2012-09-27 20:54:48 -07002129 invalidateViews();
2130 return true;
2131 }
2132 case R.id.redoButton: {
nicolasroard6a502732013-06-27 14:41:58 -07002133 HistoryManager adapter = mMasterImage.getHistory();
nicolasroard9594c8d2012-09-27 20:54:48 -07002134 int position = adapter.redo();
John Hoford63a7dac2013-01-14 14:48:39 -08002135 mMasterImage.onHistoryItemClick(position);
nicolasroard9594c8d2012-09-27 20:54:48 -07002136 invalidateViews();
2137 return true;
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302138 }*/
Jay Wangf19b0702016-06-09 12:49:49 -07002139 case R.id.resetHistoryButton: {
jinwu4fafa7a2017-04-07 13:27:48 +08002140 clearWaterMark();
Jay Wangf19b0702016-06-09 12:49:49 -07002141 resetHistory();
2142 return true;
2143 }
2144 /*case R.id.showImageStateButton: {
nicolasroardbf93da72012-09-29 00:17:09 -07002145 toggleImageStatePanel();
2146 return true;
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302147 }*/
Jay Wangf19b0702016-06-09 12:49:49 -07002148 case R.id.exportFlattenButton: {
2149 showExportOptionsDialog();
2150 return true;
2151 }
2152 case android.R.id.home: {
2153 saveImage();
2154 return true;
2155 }
2156 case R.id.manageUserPresets: {
2157 manageUserPresets();
2158 return true;
2159 }
nicolasroard9594c8d2012-09-27 20:54:48 -07002160 }
2161 return false;
2162 }
2163
nicolasroard9c5d6702013-08-16 14:06:43 -07002164 public void print() {
2165 Bitmap bitmap = MasterImage.getImage().getHighresImage();
Svetoslav Ganov391e4a12013-10-06 20:03:32 -07002166 PrintHelper printer = new PrintHelper(this);
junjiez2e524362018-09-11 11:04:46 +08002167 try {
2168 printer.printBitmap("ImagePrint", bitmap);
2169 } catch (RuntimeException e) {
2170 Log.e(LOGTAG,"Print failure,",e);
2171 }
nicolasroard9c5d6702013-08-16 14:06:43 -07002172 }
2173
jinwuf23224f2017-06-19 11:16:06 +08002174 private void manageUserPresets() {
2175 if (mPresetDialog == null) {
2176 mPresetDialog = new PresetManagementDialog();
2177 mPresetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
2178 @Override
2179 public void onDismiss(DialogInterface dialog) {
2180 mPresetDialog = null;
2181 }
2182 });
2183 mPresetDialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
2184 }
2185 }
2186
nicolasroard55a02792013-08-13 17:36:00 -07002187 public void addNewPreset() {
jinwu4fafa7a2017-04-07 13:27:48 +08002188 boolean skipIntro = GalleryUtils.getBooleanPref(this,
2189 this.getString(R.string.pref_filtergenerator_intro_show_key), false);
2190 if (!skipIntro) {
jinwuf23224f2017-06-19 11:16:06 +08002191 manageUserPresets();
jinwu4fafa7a2017-04-07 13:27:48 +08002192 } else {
2193 onMediaPickerStarted();
2194 }
nicolasroard55a02792013-08-13 17:36:00 -07002195 }
2196
Ruben Brunk077e7182013-08-01 19:05:18 -07002197 private void showExportOptionsDialog() {
2198 DialogFragment dialog = new ExportDialog();
2199 dialog.show(getSupportFragmentManager(), "ExportDialogFragment");
2200 }
2201
nicolasroardfa474a12013-07-15 11:24:36 -07002202 public void updateUserPresetsFromAdapter(UserPresetsAdapter adapter) {
2203 ArrayList<FilterUserPresetRepresentation> representations =
2204 adapter.getDeletedRepresentations();
2205 for (FilterUserPresetRepresentation representation : representations) {
2206 deletePreset(representation.getId());
2207 }
2208 ArrayList<FilterUserPresetRepresentation> changedRepresentations =
2209 adapter.getChangedRepresentations();
2210 for (FilterUserPresetRepresentation representation : changedRepresentations) {
2211 updatePreset(representation);
2212 }
2213 adapter.clearDeletedRepresentations();
2214 adapter.clearChangedRepresentations();
2215 loadUserPresets();
2216 }
2217
2218 public void loadUserPresets() {
2219 mUserPresetsManager.load();
nicolasroard5af55f42013-08-14 10:34:08 -07002220 updateUserPresetsFromManager();
nicolasroardfa474a12013-07-15 11:24:36 -07002221 }
2222
2223 public void updateUserPresetsFromManager() {
2224 ArrayList<FilterUserPresetRepresentation> presets = mUserPresetsManager.getRepresentations();
2225 if (presets == null) {
2226 return;
2227 }
2228 if (mCategoryLooksAdapter != null) {
2229 fillLooks();
2230 }
jinwu4fafa7a2017-04-07 13:27:48 +08002231 /* if (presets.size() > 0) {
nicolasroard55a02792013-08-13 17:36:00 -07002232 mCategoryLooksAdapter.add(new Action(this, Action.SPACER));
jinwu4fafa7a2017-04-07 13:27:48 +08002233 } */
nicolasroardfa474a12013-07-15 11:24:36 -07002234 mUserPresetsAdapter.clear();
jinwu4fafa7a2017-04-07 13:27:48 +08002235 if (presets.size() > 0) {
2236 mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
2237 }
nicolasroardfa474a12013-07-15 11:24:36 -07002238 for (int i = 0; i < presets.size(); i++) {
2239 FilterUserPresetRepresentation representation = presets.get(i);
2240 mCategoryLooksAdapter.add(
nicolasroard0a24e522013-08-14 10:04:37 -07002241 new Action(this, representation, Action.FULL_VIEW, true));
nicolasroardfa474a12013-07-15 11:24:36 -07002242 mUserPresetsAdapter.add(new Action(this, representation, Action.FULL_VIEW));
2243 }
jinwu4fafa7a2017-04-07 13:27:48 +08002244
nicolasroard5af55f42013-08-14 10:34:08 -07002245 mCategoryLooksAdapter.notifyDataSetChanged();
nicolasroardfa474a12013-07-15 11:24:36 -07002246 mCategoryLooksAdapter.notifyDataSetInvalidated();
nicolasroardfa474a12013-07-15 11:24:36 -07002247 }
2248
nicolasroard0a24e522013-08-14 10:04:37 -07002249 public void saveCurrentImagePreset(String name) {
2250 mUserPresetsManager.save(MasterImage.getImage().getPreset(), name);
nicolasroardfa474a12013-07-15 11:24:36 -07002251 }
2252
2253 private void deletePreset(int id) {
2254 mUserPresetsManager.delete(id);
2255 }
2256
2257 private void updatePreset(FilterUserPresetRepresentation representation) {
2258 mUserPresetsManager.update(representation);
2259 }
2260
Doris Liubf1677a2012-10-29 13:11:10 -07002261 public void enableSave(boolean enable) {
ztenghui545eca12013-06-28 09:25:23 -07002262 if (mSaveButton != null) {
Doris Liubf1677a2012-10-29 13:11:10 -07002263 mSaveButton.setEnabled(enable);
ztenghui545eca12013-06-28 09:25:23 -07002264 }
Doris Liubf1677a2012-10-29 13:11:10 -07002265 }
2266
nicolasroard24d6ec72013-07-12 18:27:54 -07002267 private void fillLooks() {
2268 FiltersManager filtersManager = FiltersManager.getManager();
2269 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getLooks();
nicolasroardf6076042013-02-12 12:19:19 -08002270
nicolasroard32cc4dd2013-09-06 17:21:55 -07002271 if (mCategoryLooksAdapter != null) {
2272 mCategoryLooksAdapter.clear();
2273 }
nicolasroard1a1cb072013-08-10 17:23:38 -07002274 mCategoryLooksAdapter = new CategoryAdapter(this);
nicolasroardf5eedf12013-04-19 17:13:30 -07002275 int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
2276 mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
nicolasroardf5eedf12013-04-19 17:13:30 -07002277 for (FilterRepresentation representation : filtersRepresentations) {
2278 mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
2279 }
jinwu4fafa7a2017-04-07 13:27:48 +08002280 if (FilterGeneratorNativeEngine.getInstance().isLibLoaded()) {
2281 if (mUserPresetsManager.getRepresentations() == null
2282 || mUserPresetsManager.getRepresentations().size() == 0) {
2283 mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
2284 }
2285 }
2286
2287 fillPresetFilter();
nicolasroard5af55f42013-08-14 10:34:08 -07002288
2289 Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2290 if (panel != null) {
2291 if (panel instanceof MainPanel) {
2292 MainPanel mainPanel = (MainPanel) panel;
2293 mainPanel.loadCategoryLookPanel(true);
2294 }
2295 }
nicolasroard3a5556d2013-02-28 12:11:35 -08002296 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07002297
nicolasroard3a5556d2013-02-28 12:11:35 -08002298 public void setDefaultPreset() {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002299 // Default preset (original)
nicolasroarded609792013-06-26 16:56:31 -07002300 ImagePreset preset = new ImagePreset(); // empty
nicolasroarded609792013-06-26 16:56:31 -07002301 mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002302 }
2303
nicolasroard0d7cdf82012-09-25 14:27:56 -07002304 // //////////////////////////////////////////////////////////////////////////////
2305 // Some utility functions
nicolasroard92e23412012-10-05 03:48:34 -07002306 // TODO: finish the cleanup.
nicolasroard0d7cdf82012-09-25 14:27:56 -07002307
nicolasroard0d7cdf82012-09-25 14:27:56 -07002308 public void invalidateViews() {
2309 for (ImageShow views : mImageViews) {
Ruben Brunk8537d092012-09-27 12:38:08 -07002310 views.updateImage();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002311 }
2312 }
2313
nicolasroard0d7cdf82012-09-25 14:27:56 -07002314 public void hideImageViews() {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002315 for (View view : mImageViews) {
2316 view.setVisibility(View.GONE);
2317 }
nicolasroard5b85b092013-02-05 13:43:45 -08002318 mEditorPlaceHolder.hide();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002319 }
2320
nicolasroard0d7cdf82012-09-25 14:27:56 -07002321 // //////////////////////////////////////////////////////////////////////////////
nicolasroardbf93da72012-09-29 00:17:09 -07002322 // imageState panel...
2323
nicolasroardf5eedf12013-04-19 17:13:30 -07002324 public void toggleImageStatePanel() {
nicolasroardbf93da72012-09-29 00:17:09 -07002325 invalidateOptionsMenu();
nicolasroardf5eedf12013-04-19 17:13:30 -07002326 mShowingImageStatePanel = !mShowingImageStatePanel;
2327 Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2328 if (panel != null) {
2329 if (panel instanceof EditorPanel) {
2330 EditorPanel editorPanel = (EditorPanel) panel;
2331 editorPanel.showImageStatePanel(mShowingImageStatePanel);
2332 } else if (panel instanceof MainPanel) {
2333 MainPanel mainPanel = (MainPanel) panel;
2334 mainPanel.showImageStatePanel(mShowingImageStatePanel);
2335 }
nicolasroardfb6a8e12013-04-15 14:41:00 -07002336 }
2337 }
2338
nicolasroard860af322013-08-08 20:47:28 -07002339 public void toggleVersionsPanel() {
2340 mShowingVersionsPanel = !mShowingVersionsPanel;
2341 Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2342 if (panel != null && panel instanceof MainPanel) {
2343 MainPanel mainPanel = (MainPanel) panel;
2344 mainPanel.loadCategoryVersionsPanel();
2345 }
2346 }
2347
nicolasroarda9bc8ef2012-10-23 14:09:53 -07002348 @Override
jinwu4fafa7a2017-04-07 13:27:48 +08002349 public void onConfigurationChanged(Configuration newConfig) {
nicolasroarda9bc8ef2012-10-23 14:09:53 -07002350 super.onConfigurationChanged(newConfig);
John Hofordf7f24e82013-09-13 16:02:09 -07002351
nicolasroard3a5556d2013-02-28 12:11:35 -08002352 setDefaultValues();
jinwu4fafa7a2017-04-07 13:27:48 +08002353 if (mOrientation != newConfig.orientation) {
2354 TrueScannerActs.setRotating(true);
2355 mOrientation = newConfig.orientation;
2356 }
2357 switch (newConfig.orientation) {
2358 case (Configuration.ORIENTATION_LANDSCAPE):
2359 if (mPresetDialog != null) {
jinwu3721f9b2017-08-23 15:26:32 +08002360 mPresetDialog.setDismissFlag(false);
jinwu4fafa7a2017-04-07 13:27:48 +08002361 mPresetDialog.dismiss();
2362 mPresetDialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
2363 }
2364 break;
2365 case (Configuration.ORIENTATION_PORTRAIT):
2366 if (mPresetDialog != null) {
jinwu3721f9b2017-08-23 15:26:32 +08002367 mPresetDialog.setDismissFlag(false);
jinwu4fafa7a2017-04-07 13:27:48 +08002368 mPresetDialog.dismiss();
2369 mPresetDialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
2370 }
2371 break;
2372 }
wqi99b35c12016-05-03 17:17:10 +08002373 if (isShowEditCropPanel()) {
2374 mIsReloadByConfigurationChanged = true;
2375 loadEditorCropPanel();
2376 }
John Hofordf7f24e82013-09-13 16:02:09 -07002377 if (mMasterImage == null) {
2378 return;
2379 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302380 //loadXML();
2381 //fillCategories();
2382 //loadMainPanel();
nicolasroardf5eedf12013-04-19 17:13:30 -07002383
jinwu4fafa7a2017-04-07 13:27:48 +08002384 if (isWaterMarked()) {
2385 DisplayMetrics dm = getResources().getDisplayMetrics();
2386 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(dm.widthPixels,
2387 dm.heightPixels);
2388 rlImageContainer.updateViewLayout(mWaterMarkView, params);
2389 }
John Hoford64fc2ed2013-10-09 13:54:45 -07002390 if (mCurrentMenu != null) {
2391 mCurrentMenu.dismiss();
2392 mCurrentMenu = null;
2393 }
John Hoford6125a082013-09-12 07:49:24 -07002394 if (mCurrentDialog != null) {
2395 mCurrentDialog.dismiss();
2396 mCurrentDialog = null;
2397 }
John Hofordf57e5882013-05-20 18:24:12 -07002398 // mLoadBitmapTask==null implies you have looked at the intent
2399 if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
nicolasroardf5eedf12013-04-19 17:13:30 -07002400 mCategoryFiltersAdapter.removeTinyPlanet();
John Hoford5300e0c2013-03-04 17:50:58 -08002401 }
nicolasroard32cc4dd2013-09-06 17:21:55 -07002402 stopLoadingIndicator();
nicolasroarda9bc8ef2012-10-23 14:09:53 -07002403 }
2404
John Hoford63a7dac2013-01-14 14:48:39 -08002405 public void setupMasterImage() {
nicolasroard3a5556d2013-02-28 12:11:35 -08002406
nicolasroardffc6aea2013-07-10 16:14:51 -07002407 HistoryManager historyManager = new HistoryManager();
2408 StateAdapter imageStateAdapter = new StateAdapter(this, 0);
Jay Wang8f0f5c02015-11-06 14:35:17 -08002409 MasterImage.setMaster(null);
nicolasroard588c30c2013-02-08 14:06:33 -08002410 mMasterImage = MasterImage.getImage();
nicolasroardffc6aea2013-07-10 16:14:51 -07002411 mMasterImage.setHistoryManager(historyManager);
2412 mMasterImage.setStateAdapter(imageStateAdapter);
John Hoford63a7dac2013-01-14 14:48:39 -08002413 mMasterImage.setActivity(this);
nicolasroard4dad1a92013-03-29 14:41:38 -07002414
2415 if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
2416 mMasterImage.setSupportsHighRes(true);
2417 } else {
2418 mMasterImage.setSupportsHighRes(false);
2419 }
John Hoford63a7dac2013-01-14 14:48:39 -08002420 }
2421
Ruben Brunk2e1a6442012-12-19 10:47:49 -08002422 void resetHistory() {
wqi794da4e2016-06-02 15:47:02 +08002423 if (mMasterImage == null) {
2424 return;
2425 }
nicolasroard6a502732013-06-27 14:41:58 -07002426 HistoryManager adapter = mMasterImage.getHistory();
nicolasroard9594c8d2012-09-27 20:54:48 -07002427 adapter.reset();
nicolasroarded609792013-06-26 16:56:31 -07002428 HistoryItem historyItem = adapter.getItem(0);
nicolasroard32646aa2013-09-20 19:00:33 -07002429 ImagePreset original = null;
jinwu5487ffb2017-09-04 16:07:25 +08002430 original = new ImagePreset();
nicolasroard32646aa2013-09-20 19:00:33 -07002431 FilterRepresentation rep = null;
2432 if (historyItem != null) {
2433 rep = historyItem.getFilterRepresentation();
2434 }
2435 mMasterImage.setPreset(original, rep, true);
jinwu4fafa7a2017-04-07 13:27:48 +08002436 mMasterImage.setFusionUnderlay(null);
2437 mMasterImage.resetTranslation();
2438 mMasterImage.setScaleFactor(1);
zhuw1360a252017-09-18 09:57:04 +08002439 mMasterImage.setCurrentFilterRepresentation(null);
zhuwd1776b22017-09-18 09:52:59 +08002440 ArrayList<FilterRepresentation> frList = FiltersManager.getManager().getTools();
2441 for (FilterRepresentation fr : frList) {
2442 if (fr instanceof FilterRotateRepresentation) {
2443 ((FilterRotateRepresentation) fr).resetRotation();
2444 }
2445 }
jinwu5487ffb2017-09-04 16:07:25 +08002446 showDefaultImageView();
Chao Zhang9c0d4752016-04-14 18:04:44 +08002447 showSaveButtonIfNeed();
jinwu5487ffb2017-09-04 16:07:25 +08002448 invalidateViews();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002449 }
2450
nicolasroardf5eedf12013-04-19 17:13:30 -07002451 public void showDefaultImageView() {
Jack Yoo66d21442015-10-27 16:27:49 -07002452 if(mEditorPlaceHolder != null)
2453 mEditorPlaceHolder.hide();
2454 if(mImageShow != null)
2455 mImageShow.setVisibility(View.VISIBLE);
2456 if(MasterImage.getImage() != null) {
2457 MasterImage.getImage().setCurrentFilter(null);
2458 MasterImage.getImage().setCurrentFilterRepresentation(null);
2459 }
zhuwabf30792018-04-20 17:18:03 +08002460 showWatermarkButton(true);
2461 }
2462
2463 private void showWatermarkButton(boolean visible) {
2464 Fragment currentPanel = getSupportFragmentManager()
2465 .findFragmentByTag(MainPanel.FRAGMENT_TAG);
2466 if (currentPanel instanceof MainPanel) {
2467 ((MainPanel) currentPanel).showWatermarkButton(visible);
2468 }
nicolasroardf5eedf12013-04-19 17:13:30 -07002469 }
2470
2471 public void backToMain() {
Chao Zhang80516ca2016-04-25 15:37:33 +08002472 removeSeekBarPanel();
Chao Zhang9c0d4752016-04-14 18:04:44 +08002473 showActionBar(true);
nicolasroardf5eedf12013-04-19 17:13:30 -07002474 Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2475 if (currentPanel instanceof MainPanel) {
2476 return;
2477 }
wqi99b35c12016-05-03 17:17:10 +08002478 mIsReloadByConfigurationChanged = false;
nicolasroardf5eedf12013-04-19 17:13:30 -07002479 loadMainPanel();
2480 showDefaultImageView();
Chao Zhang4dbacef2016-04-20 11:08:03 +08002481 showComparisonButton();
2482 }
2483
2484 private void showComparisonButton() {
2485 if (imgComparison != null && imgComparison.getVisibility() == View.GONE) {
2486 imgComparison.setVisibility(View.VISIBLE);
2487 }
nicolasroardf5eedf12013-04-19 17:13:30 -07002488 }
2489
nicolasroard75608162012-10-12 00:18:51 -07002490 @Override
2491 public void onBackPressed() {
Chao Zhang4dbacef2016-04-20 11:08:03 +08002492 showComparisonButton();
wqi07055372016-04-13 09:57:51 +08002493 Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302494 MainPanel.FRAGMENT_TAG);
2495
nicolasroardf5eedf12013-04-19 17:13:30 -07002496 if (currentPanel instanceof MainPanel) {
Chao Zhang7deb94a2016-03-14 11:10:20 +08002497 if (mImageShow.hasModifications()) {
wqi07055372016-04-13 09:57:51 +08002498 if (mBackAlertDialogBuilder == null) {
2499 createBackDialog();
2500 }
2501 mBackAlertDialogBuilder.show();
Ruben Brunka3dbbd72013-03-29 12:36:30 -07002502 } else {
Chao Zhang7deb94a2016-03-14 11:10:20 +08002503 done();
Ruben Brunka3dbbd72013-03-29 12:36:30 -07002504 }
wqi07055372016-04-13 09:57:51 +08002505 setActionBar();
Chao Zhang7deb94a2016-03-14 11:10:20 +08002506 invalidateOptionsMenu();
2507 if (MasterImage.getImage().getScaleFactor() < 1)
2508 setScaleImage(false);
2509 adjustCompareButton(false);
nicolasroardf5eedf12013-04-19 17:13:30 -07002510 } else {
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302511 isComingFromEditorScreen = true;
nicolasroardf5eedf12013-04-19 17:13:30 -07002512 backToMain();
nicolasroard75608162012-10-12 00:18:51 -07002513 }
2514 }
nicolasroarde34a5a52012-10-16 14:25:09 -07002515
wqi07055372016-04-13 09:57:51 +08002516 private void createBackDialog() {
2517 mBackAlertDialogBuilder = new AlertDialog.Builder(this);
Michael Bestasf4f030b2016-06-07 00:06:53 +03002518 mBackAlertDialogBuilder.setMessage(R.string.discard_message).setTitle(
2519 R.string.discard_title);
wqi07055372016-04-13 09:57:51 +08002520 mBackAlertDialogBuilder.setPositiveButton(mPopUpText,
2521 new DialogInterface.OnClickListener() {
Jay Wangf19b0702016-06-09 12:49:49 -07002522 @Override
2523 public void onClick(DialogInterface dialog, int id) {
2524 done();
2525 }
2526 });
wqi07055372016-04-13 09:57:51 +08002527 mBackAlertDialogBuilder.setNegativeButton(mCancel,
2528 new DialogInterface.OnClickListener() {
Jay Wangf19b0702016-06-09 12:49:49 -07002529 @Override
2530 public void onClick(DialogInterface dialog, int id) {
2531 dialog.dismiss();
2532 }
2533 });
wqi07055372016-04-13 09:57:51 +08002534 }
2535
nicolasroarde34a5a52012-10-16 14:25:09 -07002536 public void cannotLoadImage() {
Ruben Brunka2c4bda2013-05-29 11:18:31 -07002537 Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
nicolasroarde34a5a52012-10-16 14:25:09 -07002538 finish();
2539 }
2540
nicolasroard0d7cdf82012-09-25 14:27:56 -07002541 // //////////////////////////////////////////////////////////////////////////////
nicolasroard0d7cdf82012-09-25 14:27:56 -07002542
2543 public float getPixelsFromDip(float value) {
2544 Resources r = getResources();
2545 return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
2546 r.getDisplayMetrics());
2547 }
2548
nicolasroard0d7cdf82012-09-25 14:27:56 -07002549 @Override
2550 public void onItemClick(AdapterView<?> parent, View view, int position,
2551 long id) {
John Hoford63a7dac2013-01-14 14:48:39 -08002552 mMasterImage.onHistoryItemClick(position);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002553 invalidateViews();
2554 }
2555
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002556 public void pickImage(int requestCode) {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002557 Intent intent = new Intent();
2558 intent.setType("image/*");
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002559 intent.setAction(Intent.ACTION_PICK);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002560 startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002561 requestCode);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002562 }
2563
nicolasroard92e23412012-10-05 03:48:34 -07002564 @Override
nicolasroard0d7cdf82012-09-25 14:27:56 -07002565 public void onActivityResult(int requestCode, int resultCode, Intent data) {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002566 if (resultCode == RESULT_OK) {
2567 if (requestCode == SELECT_PICTURE) {
2568 Uri selectedImageUri = data.getData();
zhuwa674df52018-01-30 13:49:15 +08002569 if (selectedImageUri != null) {
2570 startLoadBitmap(selectedImageUri);
2571 }
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002572 } else if (requestCode == SELECT_FUSION_UNDERLAY) {
2573 Uri underlayImageUri = data.getData();
2574 // find fusion representation
Jay Wangf19b0702016-06-09 12:49:49 -07002575 if(mCurrentEditor instanceof EditorDualCamFusion) {
2576 EditorDualCamFusion editor = (EditorDualCamFusion)mCurrentEditor;
2577 editor.setUnderlayImageUri(underlayImageUri);
2578 } else if (mCurrentEditor instanceof EditorTruePortraitFusion) {
zhuwf4f10df2017-09-18 09:23:03 +08002579 if (checkExtensionValidity(this, underlayImageUri)) {
2580 Toast.makeText(getApplicationContext(), getString(R.string.not_support_gif),
2581 Toast.LENGTH_SHORT).show();
2582 pickImage(SELECT_FUSION_UNDERLAY);
2583 } else {
2584 EditorTruePortraitFusion editor = (EditorTruePortraitFusion)mCurrentEditor;
2585 editor.setUnderlayImageUri(underlayImageUri);
2586 }
Jay Wangf19b0702016-06-09 12:49:49 -07002587 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07002588 }
2589 }
2590 }
2591
zhuwf4f10df2017-09-18 09:23:03 +08002592 /**
2593 * check whether the extension of the given uri is supported to be underlay
2594 * @param context context for get ContentResolver
2595 * @param uri uri need to check
2596 * @return validity of uri's extension, true means unsupported, false means supported
2597 */
2598 private boolean checkExtensionValidity(final Context context, final Uri uri) {
2599 if (uri == null) {
2600 return false;
2601 }
2602 // get file path from uri
2603 String filePath = null;
2604 final String scheme = uri.getScheme();
2605 if (scheme == null || ContentResolver.SCHEME_FILE.equals(scheme)) {
2606 filePath = uri.getPath();
2607 } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
2608 Cursor cursor = context.getContentResolver().query(
2609 uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
2610 if (null != cursor) {
2611 if (cursor.moveToFirst()) {
2612 int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
2613 if (index > -1) {
2614 filePath = cursor.getString(index);
2615 }
2616 }
2617 cursor.close();
2618 }
2619 }
2620
2621 //get extension from filepath
2622 String extension = MimeTypeMap.getFileExtensionFromUrl(filePath);
2623
2624 //check validity of extension
2625 boolean notSupported = false;
2626 //if have new unsupported extension, add it below
2627 notSupported |= (extension.equals("gif") || extension.equals("GIF"));
2628 return notSupported;
2629 }
Ruben Brunk6416dd52012-11-28 14:00:30 -08002630
jinwu4fafa7a2017-04-07 13:27:48 +08002631 private int nameFilter(FilterPresetSource source,
2632 ArrayList <SaveOption> tempFilterArray) {
2633 String s,s1,s2;
2634 ArrayList<SaveOption> sp = source.getAllUserPresets();
2635 ArrayList<Integer> temp = new ArrayList<Integer>();
2636 if (sp != null) {
2637 for (int i = 0; i < sp.size(); i++) {
2638 s = sp.get(i).name;
2639 if (s.length() > "Custom".length()) {
2640 s1 = s.substring(0, 6);
2641 if (s1.equals("Custom")) {
2642 s2 = s.substring(6);
2643 int tem;
2644 try {
2645 tem = Integer.parseInt(s2);
2646 } catch (NumberFormatException e) {
2647 continue;
2648 }
2649 temp.add(tem);
2650 }
2651 }
2652 }
2653 }
2654
2655 if (tempFilterArray.size() != 0 ){
2656 for (int i = 0; i < tempFilterArray.size(); i++) {
2657 s = tempFilterArray.get(i).name;
2658 if (s.length() > "Custom".length()) {
2659 s1 = s.substring(0, 6);
2660 if (s1.equals("Custom")) {
2661 s2 = s.substring(6);
2662 int tem;
2663 try {
2664 tem = Integer.parseInt(s2);
2665 } catch (NumberFormatException e) {
2666 continue;
2667 }
2668 temp.add(tem);
2669 }
2670 }
2671 }
2672
2673 }
2674
2675 if (temp != null) {
2676 Collections.sort(temp);
2677 for (int i = 1; i <= temp.size(); i++){
2678 if (temp.get(i-1)!= i){
2679 return i;
2680 }
2681 }
2682 }
2683 return temp.size()+1;
2684 }
2685
2686
2687 public static boolean completeSaveFilters (FilterPresetSource mFilterPresetSource,
2688 ArrayList<SaveOption> tempFilterArray) {
2689
2690 for (int i = 0; i < tempFilterArray.size(); i++){
2691 String name = tempFilterArray.get(i).name;
2692 String filteredUri = tempFilterArray.get(i).Uri;
2693 if (mFilterPresetSource.insertPreset(name,filteredUri) == false) return false;
2694 }
2695 tempFilterArray.clear();
2696 return true;
2697 }
2698
nicolasroard0d7cdf82012-09-25 14:27:56 -07002699 public void saveImage() {
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002700 if (mImageShow.hasModifications()) {
2701 // Get the name of the album, to which the image will be saved
nicolasroard24d6ec72013-07-12 18:27:54 -07002702 File saveDir = SaveImage.getFinalSaveDirectory(this, mSelectedImageUri);
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002703 int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
2704 String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
2705 showSavingProgress(albumName);
jinwu4fafa7a2017-04-07 13:27:48 +08002706 if (mWaterMarkView == null) {
2707 mImageShow.saveImage(this, null);
2708 } else {
2709 mSaveWaterMark.saveImage(this, mMasterImage.getHighresImage(),
2710 mSelectedImageUri, handler);
2711 }
2712 if (tempFilterArray.size() != 0) {
2713 completeSaveFilters(mFilterPresetSource, tempFilterArray);
2714 }
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002715 } else {
Ruben Brunk6416dd52012-11-28 14:00:30 -08002716 done();
2717 }
2718 }
2719
Ruben Brunka2414582013-02-21 20:13:20 -08002720
Ruben Brunk6416dd52012-11-28 14:00:30 -08002721 public void done() {
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002722 hideSavingProgress();
John Hoford52fa1102013-06-11 13:07:15 -07002723 if (mLoadBitmapTask != null) {
2724 mLoadBitmapTask.cancel(false);
2725 }
Ruben Brunk6416dd52012-11-28 14:00:30 -08002726 finish();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002727 }
2728
John Hofordafa8ed92013-04-15 22:10:43 -07002729 private void extractXMPData() {
2730 XMresults res = XmpPresets.extractXMPData(
2731 getBaseContext(), mMasterImage, getIntent().getData());
2732 if (res == null)
2733 return;
2734
2735 mOriginalImageUri = res.originalimage;
2736 mOriginalPreset = res.preset;
2737 }
ztenghuib3f62e42013-06-10 15:51:42 -07002738
2739 public Uri getSelectedImageUri() {
2740 return mSelectedImageUri;
2741 }
2742
nicolasroard9737f3a2013-08-14 11:14:47 -07002743 public void setHandlesSwipeForView(View view, float startX, float startY) {
nicolasroard860af322013-08-08 20:47:28 -07002744 if (view != null) {
2745 mHandlingSwipeButton = true;
2746 } else {
2747 mHandlingSwipeButton = false;
2748 }
2749 mHandledSwipeView = view;
2750 int[] location = new int[2];
2751 view.getLocationInWindow(location);
nicolasroard9737f3a2013-08-14 11:14:47 -07002752 mSwipeStartX = location[0] + startX;
nicolasroard860af322013-08-08 20:47:28 -07002753 mSwipeStartY = location[1] + startY;
2754 }
2755
2756 public boolean dispatchTouchEvent (MotionEvent ev) {
2757 if (mHandlingSwipeButton) {
nicolasroard9737f3a2013-08-14 11:14:47 -07002758 int direction = CategoryView.HORIZONTAL;
2759 if (mHandledSwipeView instanceof CategoryView) {
2760 direction = ((CategoryView) mHandledSwipeView).getOrientation();
2761 }
nicolasroard860af322013-08-08 20:47:28 -07002762 if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
2763 float delta = ev.getY() - mSwipeStartY;
nicolasroard9737f3a2013-08-14 11:14:47 -07002764 float distance = mHandledSwipeView.getHeight();
2765 if (direction == CategoryView.VERTICAL) {
2766 delta = ev.getX() - mSwipeStartX;
2767 mHandledSwipeView.setTranslationX(delta);
2768 distance = mHandledSwipeView.getWidth();
2769 } else {
2770 mHandledSwipeView.setTranslationY(delta);
2771 }
nicolasroard860af322013-08-08 20:47:28 -07002772 delta = Math.abs(delta);
nicolasroard9737f3a2013-08-14 11:14:47 -07002773 float transparency = Math.min(1, delta / distance);
nicolasroard860af322013-08-08 20:47:28 -07002774 mHandledSwipeView.setAlpha(1.f - transparency);
2775 mHandledSwipeViewLastDelta = delta;
2776 }
2777 if (ev.getActionMasked() == MotionEvent.ACTION_CANCEL
2778 || ev.getActionMasked() == MotionEvent.ACTION_UP) {
nicolasroard9737f3a2013-08-14 11:14:47 -07002779 mHandledSwipeView.setTranslationX(0);
nicolasroard860af322013-08-08 20:47:28 -07002780 mHandledSwipeView.setTranslationY(0);
2781 mHandledSwipeView.setAlpha(1.f);
2782 mHandlingSwipeButton = false;
nicolasroard9737f3a2013-08-14 11:14:47 -07002783 float distance = mHandledSwipeView.getHeight();
2784 if (direction == CategoryView.VERTICAL) {
2785 distance = mHandledSwipeView.getWidth();
2786 }
2787 if (mHandledSwipeViewLastDelta > distance) {
nicolasroard860af322013-08-08 20:47:28 -07002788 ((SwipableView) mHandledSwipeView).delete();
2789 }
jinwu4fafa7a2017-04-07 13:27:48 +08002790 }
nicolasroard860af322013-08-08 20:47:28 -07002791 return true;
2792 }
2793 return super.dispatchTouchEvent(ev);
2794 }
nicolasroard9f452e02013-08-23 00:10:01 -07002795
nicolasroard32cc4dd2013-09-06 17:21:55 -07002796 public Point mHintTouchPoint = new Point();
2797
2798 public Point hintTouchPoint(View view) {
2799 int location[] = new int[2];
2800 view.getLocationOnScreen(location);
2801 int x = mHintTouchPoint.x - location[0];
2802 int y = mHintTouchPoint.y - location[1];
2803 return new Point(x, y);
2804 }
2805
nicolasroard9f452e02013-08-23 00:10:01 -07002806 public void startTouchAnimation(View target, float x, float y) {
nicolasroard9f452e02013-08-23 00:10:01 -07002807 int location[] = new int[2];
2808 target.getLocationOnScreen(location);
nicolasroard32cc4dd2013-09-06 17:21:55 -07002809 mHintTouchPoint.x = (int) (location[0] + x);
2810 mHintTouchPoint.y = (int) (location[1] + y);
nicolasroard9f452e02013-08-23 00:10:01 -07002811 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302812
2813 public void setScaleImage(boolean isScaled) {
Chao Zhang7deb94a2016-03-14 11:10:20 +08002814 mImageShow.scaleImage(isScaled, getBaseContext());
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302815 }
wqi99b35c12016-05-03 17:17:10 +08002816
2817 public void saveEditorCropState(int select) {
2818 mEditrCropButtonSelect = select;
2819 }
2820
2821 public boolean isReloadByConfigurationChanged() {
2822 return mIsReloadByConfigurationChanged;
2823 }
2824
2825 public boolean isShowEditCropPanel() {
2826 if (mCurrentEditor == null) {
2827 return false;
2828 }
2829 Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(
2830 MainPanel.FRAGMENT_TAG);
2831 if (currentPanel instanceof MainPanel) {
2832 return false;
2833 }
2834 return mCurrentEditor.getID() == EditorCrop.ID;
2835 }
2836
2837 public int getEditorCropButtonSelect() {
2838 return mEditrCropButtonSelect;
2839 }
2840
zhuwad6505d2017-07-26 15:09:37 +08002841 @Override
2842 protected void onGetPermissionsFailure() {
2843 finish();
2844 }
2845
2846 @Override
2847 protected void onGetPermissionsSuccess() {
2848 if (canUpdataUI) {
2849 updateUIAfterServiceStarted();
2850 }
2851 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07002852}