blob: 5b1aa844c460a2ac1f96c2ebe924ccb096087961 [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);
Chao Zhang9c0d4752016-04-14 18:04:44 +0800439 }
440
jinwu4fafa7a2017-04-07 13:27:48 +0800441 if (representation.getFilterType() == FilterRepresentation.TYPE_WATERMARK_CATEGORY) {
442 loadWaterMarkPanel((FilterWatermarkRepresentation) representation);
jinwu523164f2017-05-23 15:32:00 +0800443 return;
jinwu4fafa7a2017-04-07 13:27:48 +0800444 }
445
Jay Wangf19b0702016-06-09 12:49:49 -0700446 if (currentId == ImageOnlyEditor.ID) {
447 mCurrentEditor.reflectCurrentFilter();
nicolasroardf5eedf12013-04-19 17:13:30 -0700448 return;
449 }
Jay Wangf19b0702016-06-09 12:49:49 -0700450 if (currentId == EditorTruePortraitImageOnly.ID) {
451 mCurrentEditor.reflectCurrentFilter();
452 setActionBarForEffects(mCurrentEditor);
453 return;
454 }
wqi6c5a2dd2016-04-14 11:25:23 +0800455 if (currentId == EditorCrop.ID) {
wqi99b35c12016-05-03 17:17:10 +0800456 loadEditorCropPanel();
wqi6c5a2dd2016-04-14 11:25:23 +0800457 return;
458 }
Chao Zhang7362c022016-05-23 14:31:39 +0800459 if (useStraightenPanel(currentId)) {
wqi6c5a2dd2016-04-14 11:25:23 +0800460 new Runnable() {
461 @Override
462 public void run() {
463 StraightenPanel panel = new StraightenPanel();
Chao Zhang7362c022016-05-23 14:31:39 +0800464 Bundle bundle = new Bundle();
465 bundle.putInt(StraightenPanel.EDITOR_ID, currentId);
466 bundle.putString(StraightenPanel.EDITOR_NAME, representation.getName());
467 panel.setArguments(bundle);
wqi6c5a2dd2016-04-14 11:25:23 +0800468 FragmentTransaction transaction =
469 getSupportFragmentManager().beginTransaction();
470 transaction.remove(getSupportFragmentManager().findFragmentByTag(
471 MainPanel.FRAGMENT_TAG));
472 transaction.replace(R.id.main_panel_container, panel,
473 MainPanel.FRAGMENT_TAG);
474 transaction.commit();
475 }
476 }.run();
477 return;
478 }
Jack Yooe94e7662016-05-18 11:34:04 -0700479 if (currentId == TrueScannerEditor.ID) {
480 new Runnable() {
481 @Override
482 public void run() {
483 TrueScannerPanel panel = new TrueScannerPanel();
484 FragmentTransaction transaction =
485 getSupportFragmentManager().beginTransaction();
486 transaction.remove(getSupportFragmentManager().findFragmentByTag(
487 MainPanel.FRAGMENT_TAG));
488 transaction.replace(R.id.main_panel_container, panel,
489 MainPanel.FRAGMENT_TAG);
490 transaction.commit();
491 }
492 }.run();
493 return;
494 }
Jay Wangf19b0702016-06-09 12:49:49 -0700495 if(currentId == EditorTruePortraitMask.ID) {
496 new Runnable() {
497 @Override
498 public void run() {
499 setActionBarForEffects(mCurrentEditor);
500 TruePortraitMaskEditorPanel panel = new TruePortraitMaskEditorPanel();
501 FragmentTransaction transaction =
502 getSupportFragmentManager().beginTransaction();
503 transaction.remove(getSupportFragmentManager().findFragmentByTag(
504 MainPanel.FRAGMENT_TAG));
505 transaction.replace(R.id.main_panel_container, panel,
506 MainPanel.FRAGMENT_TAG);
507 transaction.commit();
508 }
509 }.run();
510 return;
511 }
512
nicolasroard00259462013-04-30 20:50:03 -0700513 Runnable showEditor = new Runnable() {
514 @Override
515 public void run() {
516 EditorPanel panel = new EditorPanel();
517 panel.setEditor(currentId);
Jay Wangf19b0702016-06-09 12:49:49 -0700518 setActionBarForEffects(mCurrentEditor);
Chao Zhang80516ca2016-04-25 15:37:33 +0800519 Fragment main =
520 getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
521 if (main instanceof MainPanel) {
522 ((MainPanel) main).setEditorPanelFragment(panel);
523 }
nicolasroard00259462013-04-30 20:50:03 -0700524 }
525 };
526 Fragment main = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
527 boolean doAnimation = false;
528 if (mShowingImageStatePanel
529 && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
530 doAnimation = true;
531 }
532 if (doAnimation && main != null && main instanceof MainPanel) {
533 MainPanel mainPanel = (MainPanel) main;
534 View container = mainPanel.getView().findViewById(R.id.category_panel_container);
535 View bottom = mainPanel.getView().findViewById(R.id.bottom_panel);
536 int panelHeight = container.getHeight() + bottom.getHeight();
nicolasroardaf593222013-06-10 18:33:11 -0700537 ViewPropertyAnimator anim = mainPanel.getView().animate();
538 anim.translationY(panelHeight).start();
539 final Handler handler = new Handler();
540 handler.postDelayed(showEditor, anim.getDuration());
nicolasroard00259462013-04-30 20:50:03 -0700541 } else {
542 showEditor.run();
543 }
nicolasroardf5eedf12013-04-19 17:13:30 -0700544 }
545
Chao Zhang7362c022016-05-23 14:31:39 +0800546 private boolean useStraightenPanel(int EditorID) {
Jack Yooe94e7662016-05-18 11:34:04 -0700547 return (EditorID == EditorStraighten.ID || EditorID == HazeBusterEditor.ID || EditorID == SeeStraightEditor.ID);
Chao Zhang7362c022016-05-23 14:31:39 +0800548 }
549
wqi99b35c12016-05-03 17:17:10 +0800550 private void loadEditorCropPanel() {
551 new Runnable() {
552 @Override
553 public void run() {
554 EditorCropPanel panel = new EditorCropPanel();
555 FragmentTransaction transaction =
556 getSupportFragmentManager().beginTransaction();
557 transaction.remove(getSupportFragmentManager().findFragmentByTag(
558 MainPanel.FRAGMENT_TAG));
559 transaction.replace(R.id.main_panel_container, panel,
560 MainPanel.FRAGMENT_TAG);
Kedi Xu5db68ed2016-08-10 17:48:13 +0800561 transaction.commitAllowingStateLoss();
wqi99b35c12016-05-03 17:17:10 +0800562 }
563 }.run();
564 }
565
jinwu4fafa7a2017-04-07 13:27:48 +0800566 private void loadWaterMarkPanel(final FilterWatermarkRepresentation representation) {
567 new Runnable() {
568 @Override
569 public void run() {
570 CategoryPanelLevelTwo panel = new CategoryPanelLevelTwo(representation.getAdapterId());
571 FragmentTransaction transaction =
572 getSupportFragmentManager().beginTransaction();
573 transaction.remove(getSupportFragmentManager().findFragmentByTag(
574 MainPanel.FRAGMENT_TAG));
575 transaction.replace(R.id.main_panel_container, panel,
576 MainPanel.FRAGMENT_TAG);
577 transaction.commitAllowingStateLoss();
578 }
579 }.run();
580 }
581
582 public void setLocation(String location) {
583 locationStr = location;
584 }
585
586 public void setTemperature(String temperature) {
587 this.temperature = temperature;
588 }
589
Chao Zhang80516ca2016-04-25 15:37:33 +0800590 public void leaveSeekBarPanel() {
591 removeSeekBarPanel();
592 showDefaultImageView();
593 setActionBar();
594 showActionBar(true);
595 }
596
597 private void removeSeekBarPanel() {
598 Fragment currentPanel =
599 getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
600 if (currentPanel instanceof MainPanel) {
601 ((MainPanel) currentPanel).removeEditorPanelFragment();
Jay Wangf19b0702016-06-09 12:49:49 -0700602 if (mCurrentEditor != null) {
603 mCurrentEditor.detach();
604 }
605 mCurrentEditor = null;
Chao Zhang80516ca2016-04-25 15:37:33 +0800606 }
607 }
608
John Hoford5d1cf1f2013-08-14 12:14:54 -0700609 public void toggleInformationPanel() {
nicolasroard860af322013-08-08 20:47:28 -0700610 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
611 transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
nicolasroard860af322013-08-08 20:47:28 -0700612
613 InfoPanel panel = new InfoPanel();
nicolasroardb2039682013-09-11 17:46:38 -0700614 panel.show(transaction, InfoPanel.FRAGMENT_TAG);
nicolasroard860af322013-08-08 20:47:28 -0700615 }
616
nicolasroard3a5556d2013-02-28 12:11:35 -0800617 private void loadXML() {
nicolasroard0d7cdf82012-09-25 14:27:56 -0700618 setContentView(R.layout.filtershow_activity);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530619 Resources r = getResources();
wqi07055372016-04-13 09:57:51 +0800620 setActionBar();
wqi85875ab2016-03-10 11:54:20 +0800621 mPopUpText = r.getString(R.string.discard).toUpperCase(
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530622 Locale.getDefault());
Chao Zhanga731e092016-04-01 10:49:29 +0800623 mCancel = r.getString(R.string.cancel).toUpperCase(Locale.getDefault());
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530624 int marginTop = r.getDimensionPixelSize(R.dimen.compare_margin_top);
625 int marginRight = r.getDimensionPixelSize(R.dimen.compare_margin_right);
626 imgComparison = (ImageButton) findViewById(R.id.imgComparison);
627 rlImageContainer = (RelativeLayout) findViewById(R.id.imageContainer);
nicolasroard0d7cdf82012-09-25 14:27:56 -0700628
nicolasroard0d7cdf82012-09-25 14:27:56 -0700629 mImageShow = (ImageShow) findViewById(R.id.imageShow);
nicolasroard0d7cdf82012-09-25 14:27:56 -0700630 mImageViews.add(mImageShow);
nicolasroard0d7cdf82012-09-25 14:27:56 -0700631
nicolasroard3a5556d2013-02-28 12:11:35 -0800632 setupEditors();
John Hoford5aa08942013-01-18 08:59:35 -0800633
nicolasroard733a0132013-02-08 17:00:42 -0800634 mEditorPlaceHolder.hide();
nicolasroard32cc4dd2013-09-06 17:21:55 -0700635 mImageShow.attach();
John Hoforddb947252013-01-08 14:15:19 -0800636
nicolasroard6019ad92013-03-09 11:18:43 -0800637 setupStatePanel();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530638
639 imgComparison.setOnTouchListener(new OnTouchListener() {
640
641 @Override
642 public boolean onTouch(View v, MotionEvent event) {
643 int action = event.getAction();
644 action = action & MotionEvent.ACTION_MASK;
645 if (action == MotionEvent.ACTION_DOWN) {
Chao Zhang7362c022016-05-23 14:31:39 +0800646 MasterImage.getImage().setShowsOriginal(true);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530647 v.setPressed(true);
jinwu4fafa7a2017-04-07 13:27:48 +0800648 if (mWaterMarkView != null) {
649 mWaterMarkView.setVisibility(View.GONE);
650 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530651 }
652 if (action == MotionEvent.ACTION_UP
653 || action == MotionEvent.ACTION_CANCEL
654 || action == MotionEvent.ACTION_OUTSIDE) {
655 v.setPressed(false);
Chao Zhang7362c022016-05-23 14:31:39 +0800656 MasterImage.getImage().setShowsOriginal(false);
jinwu4fafa7a2017-04-07 13:27:48 +0800657 if (mWaterMarkView != null) {
658 mWaterMarkView.setVisibility(View.VISIBLE);
659 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530660 }
661
662 return false;
663 }
664 });
665 }
666
667 public void toggleComparisonButtonVisibility() {
Jay Wangf19b0702016-06-09 12:49:49 -0700668 if (imgComparison.getVisibility() == View.VISIBLE)
669 imgComparison.setVisibility(View.GONE);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530670 }
671
Chao Zhang9c0d4752016-04-14 18:04:44 +0800672 private void showSaveButtonIfNeed() {
673 if (MasterImage.getImage().hasModifications()) {
674 mSaveButton.setVisibility(View.VISIBLE);
675 } else {
676 mSaveButton.setVisibility(View.GONE);
677 }
678 }
679
wqi07055372016-04-13 09:57:51 +0800680 public void setActionBar() {
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530681 ActionBar actionBar = getActionBar();
682 actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
683 actionBar.setBackgroundDrawable(new ColorDrawable(getResources()
684 .getColor(R.color.edit_actionbar_background)));
wqi07055372016-04-13 09:57:51 +0800685 ActionBar.LayoutParams lp = new ActionBar.LayoutParams(
686 ActionBar.LayoutParams.MATCH_PARENT,
687 ActionBar.LayoutParams.MATCH_PARENT,
688 Gravity.CENTER);
689 View customView = getLayoutInflater().inflate(R.layout.filtershow_actionbar, null);
690 actionBar.setCustomView(customView, lp);
691 mSaveButton = actionBar.getCustomView().findViewById(R.id.filtershow_done);
692 mSaveButton.setOnClickListener(new OnClickListener() {
693 @Override
694 public void onClick(View view) {
695 saveImage();
zdica9299d2016-02-25 11:14:33 +0800696 }
wqi07055372016-04-13 09:57:51 +0800697 });
Chao Zhang9c0d4752016-04-14 18:04:44 +0800698
699 showSaveButtonIfNeed();
700
Chao Zhang80516ca2016-04-25 15:37:33 +0800701 View exitButton = actionBar.getCustomView().findViewById(R.id.filtershow_exit);
702 exitButton.setOnClickListener(new OnClickListener() {
wqi07055372016-04-13 09:57:51 +0800703 @Override
704 public void onClick(View v) {
705 if (mImageShow.hasModifications()) {
706 if (mBackAlertDialogBuilder == null) {
707 createBackDialog();
708 }
709 mBackAlertDialogBuilder.show();
710 } else {
711 done();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530712 }
wqi07055372016-04-13 09:57:51 +0800713 }
714 });
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530715
wqi07055372016-04-13 09:57:51 +0800716 invalidateOptionsMenu();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530717 }
718
719 public void setActionBarForEffects(final Editor currentEditor) {
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530720 ActionBar actionBar = getActionBar();
721 actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
722 actionBar.setBackgroundDrawable(new ColorDrawable(getResources()
723 .getColor(R.color.edit_actionbar_background)));
724 actionBar.setCustomView(R.layout.filtershow_actionbar_effects);
725 ImageButton cancelButton = (ImageButton) actionBar.getCustomView()
726 .findViewById(R.id.cancelFilter);
727 ImageButton applyButton = (ImageButton) actionBar.getCustomView()
728 .findViewById(R.id.applyFilter);
729 Button editTitle = (Button) actionBar.getCustomView().findViewById(
730 R.id.applyEffect);
731 editTitle.setTransformationMethod(null);
732 View actionControl = actionBar.getCustomView().findViewById(
733 R.id.panelAccessoryViewList);
734 cancelButton.setOnClickListener(new View.OnClickListener() {
735 @Override
736 public void onClick(View v) {
737 cancelCurrentFilter();
738 FilterShowActivity.this.backToMain();
wqi07055372016-04-13 09:57:51 +0800739 setActionBar();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530740 }
741 });
742 applyButton.setOnClickListener(new View.OnClickListener() {
743 @Override
744 public void onClick(View v) {
745 currentEditor.finalApplyCalled();
746 FilterShowActivity.this.backToMain();
wqi07055372016-04-13 09:57:51 +0800747 setActionBar();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530748 }
749 });
750
751 if (currentEditor != null) {
Jay Wangf19b0702016-06-09 12:49:49 -0700752 if(!currentEditor.showsActionBarControls()) {
753 cancelButton.setVisibility(View.GONE);
754 applyButton.setVisibility(View.GONE);
755 }
756 currentEditor.setEditorTitle(editTitle);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530757 currentEditor.reflectCurrentFilter();
758 if (currentEditor.useUtilityPanel()) {
759 currentEditor.openUtilityPanel((LinearLayout) actionControl);
760 }
761 }
762 }
763
Chao Zhang9c0d4752016-04-14 18:04:44 +0800764 private void showActionBar(boolean show) {
765 ActionBar actionBar = getActionBar();
766 if (actionBar != null ) {
767 if (show) {
768 if (!actionBar.isShowing()) {
769 actionBar.show();
770 }
771 } else {
772 if (actionBar.isShowing()) {
773 actionBar.hide();
774 }
775 }
776 }
777 }
778
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530779 public void cancelCurrentFilter() {
780 MasterImage masterImage = MasterImage.getImage();
781 HistoryManager adapter = masterImage.getHistory();
782
783 int position = adapter.undo();
784 masterImage.onHistoryItemClick(position);
785 invalidateViews();
Jay Wangf19b0702016-06-09 12:49:49 -0700786
787 if(!masterImage.hasFusionApplied()) {
788 masterImage.setFusionUnderlay(null);
789 masterImage.setScaleFactor(1);
790 masterImage.resetTranslation();
791 }
jinwu4fafa7a2017-04-07 13:27:48 +0800792 clearWaterMark();
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530793 }
794
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530795 public void adjustCompareButton(boolean scaled) {
Chao Zhanga731e092016-04-01 10:49:29 +0800796 if (imgComparison == null) {
797 return;
798 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530799 Resources r = getResources();
800 int marginTop, marginRight;
Chao Zhanga731e092016-04-01 10:49:29 +0800801 marginTop = r.getDimensionPixelSize(R.dimen.compare_margin_top);
802 marginRight = r.getDimensionPixelSize(R.dimen.compare_margin_right);
Ravi Banuri49f14dd2015-10-21 15:54:59 +0530803 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) imgComparison
804 .getLayoutParams();
805 params.setMargins(0, marginTop, marginRight, 0);
806 imgComparison.setLayoutParams(params);
nicolasroard3a5556d2013-02-28 12:11:35 -0800807 }
808
nicolasroard24d6ec72013-07-12 18:27:54 -0700809 public void fillCategories() {
810 fillLooks();
nicolasroardfa474a12013-07-15 11:24:36 -0700811 loadUserPresets();
nicolasroard24d6ec72013-07-12 18:27:54 -0700812 fillBorders();
813 fillTools();
814 fillEffects();
Jack Yoo66d21442015-10-27 16:27:49 -0700815 fillTrueScanner();
Jack Yoo1d415cf2016-01-18 15:49:46 -0800816 fillHazeBuster();
Jack Yoo813c89e2016-01-21 15:28:31 -0800817 fillSeeStraight();
nicolasroard860af322013-08-08 20:47:28 -0700818 fillVersions();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +0800819 fillMakeup();
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -0700820 fillDualCamera();
Jay Wangf19b0702016-06-09 12:49:49 -0700821 fillTruePortrait();
jinwu4fafa7a2017-04-07 13:27:48 +0800822 fillWaterMarks();
nicolasroard24d6ec72013-07-12 18:27:54 -0700823 }
824
nicolasroard6019ad92013-03-09 11:18:43 -0800825 public void setupStatePanel() {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -0700826 MasterImage.getImage().setHistoryManager(mMasterImage.getHistory());
nicolasroard3a5556d2013-02-28 12:11:35 -0800827 }
828
nicolasroard860af322013-08-08 20:47:28 -0700829 private void fillVersions() {
nicolasroard32cc4dd2013-09-06 17:21:55 -0700830 if (mCategoryVersionsAdapter != null) {
831 mCategoryVersionsAdapter.clear();
832 }
nicolasroard860af322013-08-08 20:47:28 -0700833 mCategoryVersionsAdapter = new CategoryAdapter(this);
834 mCategoryVersionsAdapter.setShowAddButton(true);
835 }
836
nicolasroard32cc4dd2013-09-06 17:21:55 -0700837 public void registerAction(Action action) {
838 if (mActions.contains(action)) {
839 return;
840 }
841 mActions.add(action);
842 }
843
844 private void loadActions() {
845 for (int i = 0; i < mActions.size(); i++) {
846 Action action = mActions.get(i);
847 action.setImageFrame(new Rect(0, 0, 96, 96), 0);
848 }
849 }
850
nicolasroard860af322013-08-08 20:47:28 -0700851 public void updateVersions() {
852 mCategoryVersionsAdapter.clear();
853 FilterUserPresetRepresentation originalRep = new FilterUserPresetRepresentation(
854 getString(R.string.filtershow_version_original), new ImagePreset(), -1);
855 mCategoryVersionsAdapter.add(
856 new Action(this, originalRep, Action.FULL_VIEW));
857 ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
858 FilterUserPresetRepresentation currentRep = new FilterUserPresetRepresentation(
859 getString(R.string.filtershow_version_current), current, -1);
860 mCategoryVersionsAdapter.add(
861 new Action(this, currentRep, Action.FULL_VIEW));
nicolasroard55a02792013-08-13 17:36:00 -0700862 if (mVersions.size() > 0) {
863 mCategoryVersionsAdapter.add(new Action(this, Action.SPACER));
864 }
nicolasroard860af322013-08-08 20:47:28 -0700865 for (FilterUserPresetRepresentation rep : mVersions) {
866 mCategoryVersionsAdapter.add(
nicolasroard55a02792013-08-13 17:36:00 -0700867 new Action(this, rep, Action.FULL_VIEW, true));
nicolasroard860af322013-08-08 20:47:28 -0700868 }
869 mCategoryVersionsAdapter.notifyDataSetInvalidated();
870 }
871
872 public void addCurrentVersion() {
873 ImagePreset current = new ImagePreset(MasterImage.getImage().getPreset());
874 mVersionsCounter++;
875 FilterUserPresetRepresentation rep = new FilterUserPresetRepresentation(
876 "" + mVersionsCounter, current, -1);
877 mVersions.add(rep);
878 updateVersions();
879 }
880
881 public void removeVersion(Action action) {
882 mVersions.remove(action.getRepresentation());
883 updateVersions();
884 }
885
nicolasroard0a24e522013-08-14 10:04:37 -0700886 public void removeLook(Action action) {
nicolasroard5af55f42013-08-14 10:34:08 -0700887 FilterUserPresetRepresentation rep =
888 (FilterUserPresetRepresentation) action.getRepresentation();
nicolasroard0a24e522013-08-14 10:04:37 -0700889 if (rep == null) {
890 return;
891 }
892 mUserPresetsManager.delete(rep.getId());
nicolasroard5af55f42013-08-14 10:34:08 -0700893 updateUserPresetsFromManager();
jinwu4fafa7a2017-04-07 13:27:48 +0800894 }
895
896 public void handlePreset(Action action,View view,int i) {
897 mChangeable = true;
898 mHandledSwipeView = view;
899 final Action ac = action;
900 mFilterPresetSource = new FilterPresetSource(this);
901 switch (i) {
902 case R.id.renameButton:
903 final View layout = View.inflate(this,R.layout.filtershow_default_edittext,null);
904 AlertDialog.Builder renameAlertDialogBuilder = new AlertDialog.Builder(this);
905 renameAlertDialogBuilder.setTitle(R.string.rename_before_exit);
906 renameAlertDialogBuilder.setView(layout);
907 renameAlertDialogBuilder.setPositiveButton(R.string.ok,
908 new DialogInterface.OnClickListener(){
909 @Override
910 public void onClick(DialogInterface dialog, int id){
911 EditText mEditText = (EditText) layout.findViewById(
912 R.id.filtershow_default_edit);
913 String name = String.valueOf(mEditText.getText());
914 if ( (name.trim().length() == 0)|| name.isEmpty()) {
915 Toast.makeText(getApplicationContext(),
916 getString(R.string.filter_name_notification),
917 Toast.LENGTH_SHORT).show();
918 } else if (isDuplicateName(name)) {
919 Toast.makeText(getApplicationContext(),
920 getString(R.string.filter_name_duplicate),
921 Toast.LENGTH_SHORT).show();
922 } else {
923 renamePreset(ac, name);
924 }
925 dialog.dismiss();
926 }
927 }
928 );
929 renameAlertDialogBuilder.setNegativeButton(mCancel,
930 new DialogInterface.OnClickListener() {
931 @Override
932 public void onClick (DialogInterface dialog, int id){
933
934 }
935 }
936 );
937 renameAlertDialogBuilder.create().show();
938 break;
939
940 case R.id.deleteButton:
941 String name = action.getName();
942 AlertDialog.Builder deleteAlertDialogBuilder = new AlertDialog.Builder(this);
943 String textview ="Do you want to delete "+name+"?";
944 deleteAlertDialogBuilder.setMessage(textview)
945 .setTitle(R.string.delete_before_exit);
946 deleteAlertDialogBuilder.setPositiveButton(R.string.ok,
947 new DialogInterface.OnClickListener(){
948 @Override
949 public void onClick(DialogInterface dialog, int id){
950 ((SwipableView) mHandledSwipeView).delete();
951 dialog.dismiss();
952 }
953 }
954 );
955 deleteAlertDialogBuilder.setNegativeButton(mCancel,
956 new DialogInterface.OnClickListener() {
957 @Override
958 public void onClick (DialogInterface dialog, int id){
959 dialog.dismiss();
960
961 }
962 }
963 );
964 deleteAlertDialogBuilder.create().show();
965 break;
966 }
967 }
968
969 public void removePreset(Action action) {
970 FilterPresetRepresentation rep =
971 (FilterPresetRepresentation)action.getRepresentation();
972 if (rep == null) {
973 return;
974 }
975 if (tempFilterArray.size() != 0) {
976 for (int i = 0; i < tempFilterArray.size(); i++) {
977 if (rep.getId() == tempFilterArray.get(i)._id) {
978 tempFilterArray.remove(i);
979 fillLooks();
980 return;
981 }
982 }
983 }
984 mFilterPresetSource.removePreset(rep.getId());
985 fillLooks();
986 }
987
988 public void renamePreset(Action action, String name) {
989 FilterPresetRepresentation rep =
990 (FilterPresetRepresentation)action.getRepresentation();
991 if (rep == null) {
992 return;
993 }
994 if (tempFilterArray.size() != 0) {
995 for (int i = 0; i < tempFilterArray.size(); i++) {
996 if (rep.getId() == tempFilterArray.get(i)._id) {
997 tempFilterArray.get(i).name = name;
998 fillLooks();
999 return;
1000 }
1001 }
1002 }
1003 mFilterPresetSource.updatePresetName(rep.getId(),name);
1004 fillLooks();
1005 }
1006
1007 public boolean isDuplicateName(String name) {
1008 ArrayList<String> nameSum = new ArrayList<String>();
1009 if (tempFilterArray.size() != 0) {
1010 for (int i = 0; i < tempFilterArray.size(); i++)
1011 nameSum.add(tempFilterArray.get(i).name);
1012 }
1013
1014 ArrayList<SaveOption> ret = mFilterPresetSource.getAllUserPresets();
1015 if (ret != null) {
1016 for (int id = 0; id < ret.size(); id++)
1017 nameSum.add(ret.get(id).name);
1018 }
1019
1020 for (int i = 0; i < nameSum.size(); i++) {
1021 if (name.equals(nameSum.get(i))) return true;
1022 }
1023 return false;
nicolasroard0a24e522013-08-14 10:04:37 -07001024 }
1025
nicolasroard24d6ec72013-07-12 18:27:54 -07001026 private void fillEffects() {
nicolasroard38fc0442013-03-04 16:01:24 -08001027 FiltersManager filtersManager = FiltersManager.getManager();
nicolasroard24d6ec72013-07-12 18:27:54 -07001028 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getEffects();
nicolasroard32cc4dd2013-09-06 17:21:55 -07001029 if (mCategoryFiltersAdapter != null) {
1030 mCategoryFiltersAdapter.clear();
1031 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001032 mCategoryFiltersAdapter = new CategoryAdapter(this);
1033 for (FilterRepresentation representation : filtersRepresentations) {
1034 if (representation.getTextId() != 0) {
1035 representation.setName(getString(representation.getTextId()));
1036 }
1037 mCategoryFiltersAdapter.add(new Action(this, representation));
1038 }
nicolasroard38fc0442013-03-04 16:01:24 -08001039 }
1040
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001041 private void fillMakeup() {
1042 if(!SimpleMakeupImageFilter.HAS_TS_MAKEUP) {
1043 return;
1044 }
1045
1046 FiltersManager filtersManager = FiltersManager.getManager();
1047 ArrayList<FilterRepresentation> makeups = filtersManager.getMakeup();
1048 if (mCategoryMakeupAdapter != null) {
1049 mCategoryMakeupAdapter.clear();
1050 }
1051 mCategoryMakeupAdapter = new CategoryAdapter(this);
1052 for (FilterRepresentation makeup : makeups) {
1053 if (makeup.getTextId() != 0) {
1054 makeup.setName(getString(makeup.getTextId()));
1055 }
1056 mCategoryMakeupAdapter.add(new Action(this, makeup));
1057 }
1058 }
1059
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001060 private void fillDualCamera() {
1061 FiltersManager filtersManager = FiltersManager.getManager();
1062 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getDualCamera();
1063 if (mCategoryDualCamAdapter != null) {
1064 mCategoryDualCamAdapter.clear();
1065 }
1066 mCategoryDualCamAdapter = new CategoryAdapter(this);
1067 for (FilterRepresentation representation : filtersRepresentations) {
1068 if (representation.getTextId() != 0) {
1069 representation.setName(getString(representation.getTextId()));
1070 }
1071 mCategoryDualCamAdapter.add(new Action(this, representation));
1072 }
1073 }
1074
Jay Wangf19b0702016-06-09 12:49:49 -07001075 private void fillTruePortrait() {
1076 FiltersManager filtersManager = FiltersManager.getManager();
1077 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTruePortrait();
1078 if (mCategoryTruePortraitAdapter != null) {
1079 mCategoryTruePortraitAdapter.clear();
1080 }
1081 mCategoryTruePortraitAdapter = new CategoryAdapter(this);
1082 for (FilterRepresentation representation : filtersRepresentations) {
1083 if (representation.getTextId() != 0) {
1084 representation.setName(getString(representation.getTextId()));
1085 }
1086 mCategoryTruePortraitAdapter.add(new Action(this, representation));
1087 }
1088 }
1089
jinwu4fafa7a2017-04-07 13:27:48 +08001090 private void fillPresetFilter() {
1091 FiltersManager filtersManager = FiltersManager.getManager();
1092 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getFilterPreset();
1093 if(mChangeable) {
1094 ArrayList<FilterRepresentation> mFilterPreset = new ArrayList<FilterRepresentation>();
1095 ArrayList<SaveOption> ret = mFilterPresetSource.getAllUserPresets();
1096 if (ret == null) return;
1097 for (int id = 0; id < ret.size(); id ++) {
1098 FilterPresetRepresentation representation = new FilterPresetRepresentation(
1099 ret.get(id).name, ret.get(id)._id, id + 1);
1100 Uri filteredUri = Uri.parse(ret.get(id).Uri);
1101 representation.setUri(filteredUri);
1102 representation.setSerializationName("Custom");
1103 mFilterPreset.add(representation);
1104 }
1105 if (tempFilterArray.size() != 0){
1106 for (int id = 0; id < tempFilterArray.size(); id ++) {
1107 FilterPresetRepresentation representation = new FilterPresetRepresentation(
1108 tempFilterArray.get(id).name, tempFilterArray.get(id)._id, id + 1);
1109 Uri filteredUri = Uri.parse(tempFilterArray.get(id).Uri);
1110 representation.setUri(filteredUri);
1111 representation.setSerializationName("Custom");
1112 mFilterPreset.add(representation);
1113 }
1114 }
1115 filtersRepresentations = mFilterPreset;
1116 mChangeable = false;
1117 }
1118
1119 if (filtersRepresentations == null) return;
1120 for (FilterRepresentation representation : filtersRepresentations) {
1121 mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW,true));
1122 }
1123 }
1124
Jack Yoo66d21442015-10-27 16:27:49 -07001125 private void fillTrueScanner() {
1126 FiltersManager filtersManager = FiltersManager.getManager();
1127 ArrayList<FilterRepresentation> trueScannerRepresentations = filtersManager.getTrueScanner();
1128 if (mCategoryTrueScannerAdapter != null) {
1129 mCategoryTrueScannerAdapter.clear();
1130 }
1131 mCategoryTrueScannerAdapter = new CategoryAdapter(this);
1132 for (FilterRepresentation representation : trueScannerRepresentations) {
1133 if (representation.getTextId() != 0) {
1134 representation.setName(getString(representation.getTextId()));
1135 }
1136 mCategoryTrueScannerAdapter.add(new Action(this, representation));
1137 }
1138 }
1139
Jack Yoo1d415cf2016-01-18 15:49:46 -08001140 private void fillHazeBuster() {
1141 FiltersManager filtersManager = FiltersManager.getManager();
1142 ArrayList<FilterRepresentation> hazeBusterRepresentations = filtersManager.getHazeBuster();
1143 if (mCategoryHazeBusterAdapter != null) {
1144 mCategoryHazeBusterAdapter.clear();
1145 }
1146 mCategoryHazeBusterAdapter = new CategoryAdapter(this);
1147 for (FilterRepresentation representation : hazeBusterRepresentations) {
1148 if (representation.getTextId() != 0) {
1149 representation.setName(getString(representation.getTextId()));
1150 }
1151 mCategoryHazeBusterAdapter.add(new Action(this, representation));
1152 }
1153 }
1154
Jack Yoo813c89e2016-01-21 15:28:31 -08001155 private void fillSeeStraight() {
1156 FiltersManager filtersManager = FiltersManager.getManager();
1157 ArrayList<FilterRepresentation> hazeBusterRepresentations = filtersManager.getSeeStraight();
1158 if (mCategorySeeStraightAdapter != null) {
1159 mCategorySeeStraightAdapter.clear();
1160 }
1161 mCategorySeeStraightAdapter = new CategoryAdapter(this);
1162 for (FilterRepresentation representation : hazeBusterRepresentations) {
1163 if (representation.getTextId() != 0) {
1164 representation.setName(getString(representation.getTextId()));
1165 }
1166 mCategorySeeStraightAdapter.add(new Action(this, representation));
1167 }
1168 }
1169
nicolasroard24d6ec72013-07-12 18:27:54 -07001170 private void fillTools() {
nicolasroard38fc0442013-03-04 16:01:24 -08001171 FiltersManager filtersManager = FiltersManager.getManager();
nicolasroard24d6ec72013-07-12 18:27:54 -07001172 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getTools();
nicolasroard32cc4dd2013-09-06 17:21:55 -07001173 if (mCategoryGeometryAdapter != null) {
1174 mCategoryGeometryAdapter.clear();
1175 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001176 mCategoryGeometryAdapter = new CategoryAdapter(this);
1177 for (FilterRepresentation representation : filtersRepresentations) {
1178 mCategoryGeometryAdapter.add(new Action(this, representation));
1179 }
nicolasroard3a5556d2013-02-28 12:11:35 -08001180 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07001181
jinwu4fafa7a2017-04-07 13:27:48 +08001182 private void fillWaterMarks() {
1183 FiltersManager filtersManager = FiltersManager.getManager();
1184 ArrayList<ArrayList<FilterRepresentation>> filters = new ArrayList<>();
1185 filters.add(filtersManager.getWaterMarks());
1186 filters.add(filtersManager.getLocations());
1187 filters.add(filtersManager.getTimes());
1188 filters.add(filtersManager.getWeathers());
1189 filters.add(filtersManager.getEmotions());
1190 filters.add(filtersManager.getFoods());
1191 if (mCategoryWatermarkAdapters != null) {
1192 mCategoryWatermarkAdapters.clear();
1193 }
1194 mCategoryWatermarkAdapters = new ArrayList<>();
1195 for (int i = 0; i < filters.size(); i++) {
1196 mCategoryWatermarkAdapters.add(new CategoryAdapter(this));
1197 for (FilterRepresentation representation : filters.get(i)) {
1198 mCategoryWatermarkAdapters.get(i).add(new Action(this, representation));
1199 }
1200 }
1201 }
1202
nicolasroard3a5556d2013-02-28 12:11:35 -08001203 private void processIntent() {
nicolasroard0d7cdf82012-09-25 14:27:56 -07001204 Intent intent = getIntent();
Bobby Georgescua850a542012-10-23 15:40:06 -07001205 if (intent.getBooleanExtra(LAUNCH_FULLSCREEN, false)) {
1206 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
1207 }
1208
Ruben Brunkab779de2013-02-14 16:18:22 -08001209 mAction = intent.getAction();
ztenghuib3f62e42013-06-10 15:51:42 -07001210 mSelectedImageUri = intent.getData();
1211 Uri loadUri = mSelectedImageUri;
John Hofordafa8ed92013-04-15 22:10:43 -07001212 if (mOriginalImageUri != null) {
ztenghuib3f62e42013-06-10 15:51:42 -07001213 loadUri = mOriginalImageUri;
John Hofordafa8ed92013-04-15 22:10:43 -07001214 }
ztenghuib3f62e42013-06-10 15:51:42 -07001215 if (loadUri != null) {
1216 startLoadBitmap(loadUri);
nicolasroard0d7cdf82012-09-25 14:27:56 -07001217 } else {
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001218 pickImage(SELECT_PICTURE);
nicolasroard0d7cdf82012-09-25 14:27:56 -07001219 }
1220 }
1221
nicolasroard3a5556d2013-02-28 12:11:35 -08001222 private void setupEditors() {
Chao Zhang0316f862016-01-28 20:55:00 +08001223 FrameLayout editorContainer = (FrameLayout) findViewById(R.id.editorContainer);
Chao Zhang0316f862016-01-28 20:55:00 +08001224 mEditorPlaceHolder.setContainer(editorContainer);
nicolasroard3a5556d2013-02-28 12:11:35 -08001225 EditorManager.addEditors(mEditorPlaceHolder);
1226 mEditorPlaceHolder.setOldViews(mImageViews);
nicolasroard3a5556d2013-02-28 12:11:35 -08001227 }
1228
nicolasroard3a5556d2013-02-28 12:11:35 -08001229 private void setDefaultValues() {
nicolasroard3a5556d2013-02-28 12:11:35 -08001230 Resources res = getResources();
nicolasroard3a5556d2013-02-28 12:11:35 -08001231
nicolasroard3a5556d2013-02-28 12:11:35 -08001232 // TODO: get those values from XML.
nicolasroard3a5556d2013-02-28 12:11:35 -08001233 FramedTextButton.setTextSize((int) getPixelsFromDip(14));
1234 FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
1235 FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
nicolasroard3a5556d2013-02-28 12:11:35 -08001236
1237 Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
1238 int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
1239 Spline.setCurveHandle(curveHandle, curveHandleSize);
1240 Spline.setCurveWidth((int) getPixelsFromDip(3));
John Hoford3759b2d2013-09-10 16:59:23 -07001241
1242 mOriginalImageUri = null;
nicolasroard3a5556d2013-02-28 12:11:35 -08001243 }
1244
John Reckd49d5322012-10-24 12:56:31 -07001245 private void startLoadBitmap(Uri uri) {
nicolasroard733a0132013-02-08 17:00:42 -08001246 final View imageShow = findViewById(R.id.imageShow);
1247 imageShow.setVisibility(View.INVISIBLE);
John Hofordf7f24e82013-09-13 16:02:09 -07001248 startLoadingIndicator();
nicolasroardf5eedf12013-04-19 17:13:30 -07001249 mShowingTinyPlanet = false;
1250 mLoadBitmapTask = new LoadBitmapTask();
John Reckd49d5322012-10-24 12:56:31 -07001251 mLoadBitmapTask.execute(uri);
Byunghun Jeon863bd522015-11-02 17:20:55 -08001252
Likai Dingb7c13c22017-02-16 14:54:04 +08001253 mParseDepthMapTask = new ParseDepthMapTask();
1254 mParseDepthMapTask.execute(uri);
Jay Wangf19b0702016-06-09 12:49:49 -07001255
1256 if(TruePortraitNativeEngine.getInstance().isLibLoaded()) {
1257 mLoadTruePortraitTask = new LoadTruePortraitTask();
1258 mLoadTruePortraitTask.execute(uri);
1259 }
John Reckd49d5322012-10-24 12:56:31 -07001260 }
John Hoford3d4f2c72012-10-23 17:14:35 -07001261
Likai Dingb7c13c22017-02-16 14:54:04 +08001262 private void showDualCameraButton(boolean visible) {
1263 if (DualCameraEffect.isSupported())
1264 mReleaseDualCam = true;
1265 Fragment currentPanel = getSupportFragmentManager()
1266 .findFragmentByTag(MainPanel.FRAGMENT_TAG);
1267 if (currentPanel instanceof MainPanel) {
1268 ((MainPanel) currentPanel).showDualCameraButton(visible && mReleaseDualCam);
1269 }
1270 }
1271
nicolasroardf5eedf12013-04-19 17:13:30 -07001272 private void fillBorders() {
nicolasroard24d6ec72013-07-12 18:27:54 -07001273 FiltersManager filtersManager = FiltersManager.getManager();
1274 ArrayList<FilterRepresentation> borders = filtersManager.getBorders();
kaiyiz6e4a5cc2014-10-20 11:43:17 +08001275 mCategoryBordersAdapter = new CategoryAdapter(this);
Ruben Brunkd88683e2013-04-01 16:55:05 -07001276
Ruben Brunkf79f9542013-03-18 22:23:43 -07001277 for (int i = 0; i < borders.size(); i++) {
nicolasroard24d6ec72013-07-12 18:27:54 -07001278 FilterRepresentation filter = borders.get(i);
Michael Bestasf4f030b2016-06-07 00:06:53 +03001279 filter.setName(getString(R.string.frame, i));
Ruben Brunkf79f9542013-03-18 22:23:43 -07001280 if (i == 0) {
Ruben Brunk3cb106d2013-06-03 15:41:36 -07001281 filter.setName(getString(R.string.none));
nicolasroard90901412013-02-01 13:48:21 -08001282 }
kaiyiz6e4a5cc2014-10-20 11:43:17 +08001283 mCategoryBordersAdapter.add(new Action(this, filter, Action.FULL_VIEW));
nicolasroard90901412013-02-01 13:48:21 -08001284 }
1285 }
1286
nicolasroardfa474a12013-07-15 11:24:36 -07001287 public UserPresetsAdapter getUserPresetsAdapter() {
1288 return mUserPresetsAdapter;
1289 }
1290
nicolasroardf5eedf12013-04-19 17:13:30 -07001291 public CategoryAdapter getCategoryLooksAdapter() {
1292 return mCategoryLooksAdapter;
1293 }
1294
1295 public CategoryAdapter getCategoryBordersAdapter() {
1296 return mCategoryBordersAdapter;
1297 }
1298
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001299 public CategoryAdapter getCategoryMakeupAdapter() {
1300 return mCategoryMakeupAdapter;
1301 }
1302
nicolasroardf5eedf12013-04-19 17:13:30 -07001303 public CategoryAdapter getCategoryGeometryAdapter() {
1304 return mCategoryGeometryAdapter;
1305 }
1306
1307 public CategoryAdapter getCategoryFiltersAdapter() {
1308 return mCategoryFiltersAdapter;
1309 }
1310
Jack Yoo66d21442015-10-27 16:27:49 -07001311 public CategoryAdapter getCategoryTrueScannerAdapter() {
1312 return mCategoryTrueScannerAdapter;
1313 }
1314
Jack Yoo1d415cf2016-01-18 15:49:46 -08001315 public CategoryAdapter getCategoryHazeBusterAdapter() {
1316 return mCategoryHazeBusterAdapter;
1317 }
1318
Jack Yoo813c89e2016-01-21 15:28:31 -08001319 public CategoryAdapter getCategorySeeStraightAdapter() {
1320 return mCategorySeeStraightAdapter;
1321 }
1322
nicolasroard860af322013-08-08 20:47:28 -07001323 public CategoryAdapter getCategoryVersionsAdapter() {
1324 return mCategoryVersionsAdapter;
1325 }
1326
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001327 public CategoryAdapter getCategoryDualCamAdapter() {
1328 return mCategoryDualCamAdapter;
1329 }
1330
Jay Wangf19b0702016-06-09 12:49:49 -07001331 public CategoryAdapter getCategoryTruePortraitAdapter() {
1332 return mCategoryTruePortraitAdapter;
1333 }
1334
jinwu4fafa7a2017-04-07 13:27:48 +08001335 public CategoryAdapter getCategoryWatermarkAdapter() {
1336 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(0) : null;
1337 }
1338
1339 public CategoryAdapter getCategoryLocationAdapter() {
1340 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(1) : null;
1341 }
1342
1343 public CategoryAdapter getCategoryTimeAdapter() {
1344 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(2) : null;
1345 }
1346
1347 public CategoryAdapter getCategoryWeatherAdapter() {
1348 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(3) : null;
1349 }
1350
1351 public CategoryAdapter getCategoryEmotionAdapter() {
1352 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(4) : null;
1353 }
1354
1355 public CategoryAdapter getCategoryFoodAdapter() {
1356 return (mCategoryWatermarkAdapters != null) ? mCategoryWatermarkAdapters.get(5) : null;
1357 }
1358
nicolasroardf5eedf12013-04-19 17:13:30 -07001359 public void removeFilterRepresentation(FilterRepresentation filterRepresentation) {
1360 if (filterRepresentation == null) {
1361 return;
1362 }
1363 ImagePreset oldPreset = MasterImage.getImage().getPreset();
1364 ImagePreset copy = new ImagePreset(oldPreset);
1365 copy.removeFilter(filterRepresentation);
nicolasroarded609792013-06-26 16:56:31 -07001366 MasterImage.getImage().setPreset(copy, copy.getLastRepresentation(), true);
nicolasroardf5eedf12013-04-19 17:13:30 -07001367 if (MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
1368 FilterRepresentation lastRepresentation = copy.getLastRepresentation();
1369 MasterImage.getImage().setCurrentFilterRepresentation(lastRepresentation);
1370 }
1371 }
1372
1373 public void useFilterRepresentation(FilterRepresentation filterRepresentation) {
1374 if (filterRepresentation == null) {
1375 return;
1376 }
nicolasroard57bd0922013-08-12 14:04:11 -07001377 if (!(filterRepresentation instanceof FilterRotateRepresentation)
Jay Wangf19b0702016-06-09 12:49:49 -07001378 && !(filterRepresentation instanceof FilterMirrorRepresentation)
1379 && MasterImage.getImage().getCurrentFilterRepresentation() == filterRepresentation) {
nicolasroardf5eedf12013-04-19 17:13:30 -07001380 return;
1381 }
jinwu4fafa7a2017-04-07 13:27:48 +08001382 if (filterRepresentation.getFilterType() == FilterWatermarkRepresentation.TYPE_WATERMARK_CATEGORY) {
1383 return;
1384 }
zhuwfa5ddff2017-11-23 11:33:33 +08001385 boolean addToHistory = filterRepresentation.getFilterType()
1386 != FilterWatermarkRepresentation.TYPE_WATERMARK;
nicolasroard9f452e02013-08-23 00:10:01 -07001387 if (filterRepresentation instanceof FilterUserPresetRepresentation
1388 || filterRepresentation instanceof FilterRotateRepresentation
1389 || filterRepresentation instanceof FilterMirrorRepresentation) {
1390 MasterImage.getImage().onNewLook(filterRepresentation);
1391 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001392 ImagePreset oldPreset = MasterImage.getImage().getPreset();
1393 ImagePreset copy = new ImagePreset(oldPreset);
1394 FilterRepresentation representation = copy.getRepresentation(filterRepresentation);
1395 if (representation == null) {
nicolasroard3cd6fc82013-08-15 15:35:53 -07001396 filterRepresentation = filterRepresentation.copy();
nicolasroardf5eedf12013-04-19 17:13:30 -07001397 copy.addFilter(filterRepresentation);
1398 } else {
ztenghuic9ca6d12013-06-26 13:54:17 -07001399 if (filterRepresentation.allowsSingleInstanceOnly()) {
ztenghuid2e9ea02013-06-24 13:54:04 -07001400 // Don't just update the filter representation. Centralize the
1401 // logic in the addFilter(), such that we can keep "None" as
1402 // null.
nicolasroard20667d22013-08-14 16:43:07 -07001403 if (!representation.equals(filterRepresentation)) {
1404 // Only do this if the filter isn't the same
1405 // (state panel clicks can lead us here)
1406 copy.removeFilter(representation);
1407 copy.addFilter(filterRepresentation);
1408 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001409 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001410 }
zhuwfa5ddff2017-11-23 11:33:33 +08001411 MasterImage.getImage().setPreset(copy, filterRepresentation, addToHistory);
nicolasroardf5eedf12013-04-19 17:13:30 -07001412 MasterImage.getImage().setCurrentFilterRepresentation(filterRepresentation);
1413 }
1414
1415 public void showRepresentation(FilterRepresentation representation) {
John Hofordf57e5882013-05-20 18:24:12 -07001416 if (representation == null) {
1417 return;
1418 }
zhuwabf30792018-04-20 17:18:03 +08001419 if (hasWaterMark && representation.getFilterType() != FilterRepresentation.TYPE_WATERMARK &&
1420 representation.getFilterType() !=
1421 FilterWatermarkRepresentation.TYPE_WATERMARK_CATEGORY) {
1422 clearWaterMark();
1423 resetHistory();
1424 showWatermarkButton(false);
1425 }
nicolasroarde5f4b782013-06-26 14:33:15 -07001426
Chao Zhang80516ca2016-04-25 15:37:33 +08001427 Fragment currentPanel =
1428 getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
1429 if (currentPanel instanceof MainPanel && ((MainPanel) currentPanel).hasEditorPanel()) {
1430 if (representation.equals(MasterImage.getImage().getCurrentFilterRepresentation())) {
1431 return;
1432 }
1433 // cancel previous filter.
1434 cancelCurrentFilter();
1435 showDefaultImageView();
1436 removeSeekBarPanel();
1437 }
1438
nicolasroard57bd0922013-08-12 14:04:11 -07001439 if (representation instanceof FilterRotateRepresentation) {
1440 FilterRotateRepresentation r = (FilterRotateRepresentation) representation;
1441 r.rotateCW();
1442 }
1443 if (representation instanceof FilterMirrorRepresentation) {
1444 FilterMirrorRepresentation r = (FilterMirrorRepresentation) representation;
1445 r.cycle();
1446 }
nicolasroardedf4b092013-09-13 16:37:43 -07001447 if (representation.isBooleanFilter()) {
1448 ImagePreset preset = MasterImage.getImage().getPreset();
1449 if (preset.getRepresentation(representation) != null) {
1450 // remove
1451 ImagePreset copy = new ImagePreset(preset);
1452 copy.removeFilter(representation);
1453 FilterRepresentation filterRepresentation = representation.copy();
1454 MasterImage.getImage().setPreset(copy, filterRepresentation, true);
1455 MasterImage.getImage().setCurrentFilterRepresentation(null);
Chao Zhang80516ca2016-04-25 15:37:33 +08001456
1457 setActionBar();
1458 showActionBar(true);
nicolasroardedf4b092013-09-13 16:37:43 -07001459 return;
1460 }
1461 }
jinwu4fafa7a2017-04-07 13:27:48 +08001462 if (representation.getFilterType() == FilterRepresentation.TYPE_DUALCAM) {
1463 DisplayMetrics dm = getResources().getDisplayMetrics();
1464 float[] mTmpPoint = new float[2];
1465 mTmpPoint[0] = dm.widthPixels/2;
1466 mTmpPoint[1] = dm.heightPixels/2;
1467 Matrix m = MasterImage.getImage().getScreenToImageMatrix(true);
1468 m.mapPoints(mTmpPoint);
1469 if (representation instanceof FilterDualCamBasicRepresentation) {
1470 ((FilterDualCamBasicRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]);
1471 }
1472 if (representation instanceof FilterDualCamFusionRepresentation) {
1473 ((FilterDualCamFusionRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]);
1474 }
jinwu4fafa7a2017-04-07 13:27:48 +08001475 }
1476 if (representation.getFilterType() == FilterRepresentation.TYPE_WATERMARK) {
zhuwfa5ddff2017-11-23 11:33:33 +08001477 if (MasterImage.getImage().getCurrentFilterRepresentation() != null
1478 && representation.getSerializationName().equals(MasterImage.getImage()
1479 .getCurrentFilterRepresentation().getSerializationName())) {
1480 return;
1481 }
jinwu4fafa7a2017-04-07 13:27:48 +08001482 showWaterMark(representation);
1483 }
1484 if (TrueScannerActs.SERIALIZATION_NAME.equals(representation.getSerializationName())) {
1485 Bitmap b = MasterImage.getImage().getOriginalBitmapHighres();
1486 int w = b.getWidth();
1487 int h = b.getHeight();
1488 if (w < h) {
1489 w = h;
1490 h = b.getWidth();
1491 }
1492 if (w <= TrueScannerActs.MIN_WIDTH
1493 || h <= TrueScannerActs.MIN_HEIGHT) {
zhuw012ade82017-09-06 16:20:11 +08001494 Toast.makeText(this, getString(R.string.image_size_too_small),
1495 Toast.LENGTH_SHORT).show();
jinwu4fafa7a2017-04-07 13:27:48 +08001496 return;
1497 }
1498 }
Ruben Brunkb0f7a8f2013-07-18 16:37:30 -07001499 useFilterRepresentation(representation);
nicolasroardf5eedf12013-04-19 17:13:30 -07001500
Jay Wangf19b0702016-06-09 12:49:49 -07001501 loadEditorPanel(representation);
nicolasroardf5eedf12013-04-19 17:13:30 -07001502 }
1503
jinwu4fafa7a2017-04-07 13:27:48 +08001504 private void showWaterMark(FilterRepresentation representation) {
1505 FilterWatermarkRepresentation watermarkRepresentation =
1506 (FilterWatermarkRepresentation)representation;
1507 if (mWaterMarkView != null) {
1508 rlImageContainer.removeView(mWaterMarkView);
1509 hasWaterMark = false;
jinwu5a674072017-06-06 10:41:59 +08001510 watermarkRepresentation.reset();
jinwu4fafa7a2017-04-07 13:27:48 +08001511 }
1512 DisplayMetrics dm = getResources().getDisplayMetrics();
1513 RelativeLayout.LayoutParams params =
1514 new RelativeLayout.LayoutParams(dm.widthPixels,
1515 dm.heightPixels);
1516 String textHint;
1517 switch (watermarkRepresentation.getMarkType()) {
1518 case 0:
1519 textHint = locationStr;
1520 break;
1521 case 2:
1522 textHint = temperature;
1523 break;
1524 default:
1525 textHint = watermarkRepresentation.getTextHint();
1526 break;
1527 }
1528 WaterMarkView waterMarkView = watermarkRepresentation.getWaterMarkView(textHint);
1529 rlImageContainer.addView(waterMarkView, params);
1530 mWaterMarkView = waterMarkView;
1531 mSaveWaterMark.useRepresentation(representation);
1532 imgComparison.bringToFront();
1533 mSaveWaterMark.getExifData(this, mSelectedImageUri);
1534 mWaterMarkView.mTouchable = true;
1535 hasWaterMark = true;
1536 }
1537
1538 private void clearWaterMark() {
1539 if (mWaterMarkView != null) {
1540 rlImageContainer.removeView(mWaterMarkView);
1541 mWaterMarkView = null;
1542 hasWaterMark = false;
1543 }
1544 }
1545
1546 public void disableTouchEvent() {
1547 if (mWaterMarkView == null) return;
1548 mWaterMarkView.mTouchable = false;
1549 }
1550
1551 public boolean isWaterMarked() {
1552 return hasWaterMark;
1553 }
1554
1555 public SaveWaterMark getSaveWaterMark() {
1556 return mSaveWaterMark;
1557 }
1558
nicolasroardf5eedf12013-04-19 17:13:30 -07001559 public Editor getEditor(int editorID) {
1560 return mEditorPlaceHolder.getEditor(editorID);
1561 }
1562
1563 public void setCurrentPanel(int currentPanel) {
1564 mCurrentPanel = currentPanel;
Chao Zhanga731e092016-04-01 10:49:29 +08001565 if (mMasterImage == null) {
1566 return;
1567 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05301568 HistoryManager adapter = mMasterImage.getHistory();
1569 adapter.setActiveFilter(currentPanel);
nicolasroardf5eedf12013-04-19 17:13:30 -07001570 }
1571
1572 public int getCurrentPanel() {
1573 return mCurrentPanel;
1574 }
1575
nicolasroardacc00f82013-06-25 16:32:01 -07001576 public void updateCategories() {
nicolasroard26f23e62013-09-23 18:36:25 -07001577 if (mMasterImage == null) {
1578 return;
1579 }
nicolasroardacc00f82013-06-25 16:32:01 -07001580 ImagePreset preset = mMasterImage.getPreset();
1581 mCategoryLooksAdapter.reflectImagePreset(preset);
1582 mCategoryBordersAdapter.reflectImagePreset(preset);
Chao Zhang80516ca2016-04-25 15:37:33 +08001583 mCategoryFiltersAdapter.reflectImagePreset(preset);
Likai Ding49eee1c2016-06-17 15:30:06 +08001584 if (mCategoryMakeupAdapter != null) {
1585 mCategoryMakeupAdapter.reflectImagePreset(preset);
1586 }
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001587 mCategoryDualCamAdapter.reflectImagePreset(preset);
Jay Wangf19b0702016-06-09 12:49:49 -07001588 mCategoryTruePortraitAdapter.reflectImagePreset(preset);
nicolasroardacc00f82013-06-25 16:32:01 -07001589 }
1590
nicolasroarde7996262013-08-13 16:29:11 -07001591 public View getMainStatePanelContainer(int id) {
1592 return findViewById(id);
1593 }
1594
John Hoford64fc2ed2013-10-09 13:54:45 -07001595 public void onShowMenu(PopupMenu menu) {
1596 mCurrentMenu = menu;
1597 menu.setOnDismissListener(this);
1598 }
1599
1600 @Override
1601 public void onDismiss(PopupMenu popupMenu){
1602 if (mCurrentMenu == null) {
1603 return;
1604 }
1605 mCurrentMenu.setOnDismissListener(null);
1606 mCurrentMenu = null;
1607 }
1608
John Hoford6125a082013-09-12 07:49:24 -07001609 @Override
1610 public void onShow(DialogInterface dialog) {
1611 mCurrentDialog = dialog;
1612 }
1613
1614 @Override
1615 public void onDismiss(DialogInterface dialogInterface) {
1616 mCurrentDialog = null;
1617 }
1618
jinwu4fafa7a2017-04-07 13:27:48 +08001619 public void onMediaPickerStarted() {
jinwu4fafa7a2017-04-07 13:27:48 +08001620 toggleComparisonButtonVisibility();
1621 ActionBar actionBar = getActionBar();
1622 actionBar.hide();
1623 if (mMediaPicker == null)
1624 mMediaPicker = MediaPickerFragment.newInstance(getApplicationContext());
1625 getSupportFragmentManager()
1626 .beginTransaction()
1627 .replace(R.id.main_panel_container, mMediaPicker)
1628 .commit();
1629 }
1630
1631 public void onMediaPickerResult(Uri selImg) {
1632 mFilterPresetSource = new FilterPresetSource(this);
1633 int id = nameFilter(mFilterPresetSource, tempFilterArray);
1634 FilterPresetRepresentation fp= new FilterPresetRepresentation(
1635 getString(R.string.filtershow_preset_title) + id, id, id);
1636 fp.setSerializationName("Custom");
1637 fp.setUri(selImg);
1638 ImagePreset preset = new ImagePreset();
1639 preset.addFilter(fp);
1640 SaveOption sp= new SaveOption();
1641 sp._id = id;
1642 sp.name = "Custom" + id;
1643 sp.Uri = selImg.toString();
1644 tempFilterArray.add(sp);
1645 FiltersManager.getManager().addRepresentation(fp);
1646 mCategoryLooksAdapter.add(new Action(this, fp, Action.FULL_VIEW, true));
1647 useFilterRepresentation(fp);
1648 int pos = mCategoryLooksAdapter.getPositionOfPresentation(fp);
1649 if (pos != -1)
1650 backAndSetCustomFilterSelected(pos);
1651 }
1652
1653 private void backAndSetCustomFilterSelected(int pos) {
1654 showComparisonButton();
1655 removeSeekBarPanel();
1656 showActionBar(true);
1657 loadMainPanel();
1658 if(mEditorPlaceHolder != null)
1659 mEditorPlaceHolder.hide();
1660 if(mImageShow != null)
1661 mImageShow.setVisibility(View.VISIBLE);
1662 updateCategories();
1663 mCategoryLooksAdapter.setSelected(pos);
1664 }
1665
1666 public void applyCustomFilterRepresentation(
1667 FilterRepresentation filterRep, FilterRepresentation oldfilterRep) {
1668 ImagePreset oldPreset = MasterImage.getImage().getPreset();
1669 ImagePreset copy = new ImagePreset(oldPreset);
1670 if (oldfilterRep != null)
1671 copy.removeFilter(oldfilterRep);
1672
1673 FilterRepresentation rep = copy.getRepresentation(filterRep);
1674 if (rep == null) {
1675 filterRep = filterRep.copy();
1676 copy.addFilter(filterRep);
1677 } else {
1678 if (filterRep.allowsSingleInstanceOnly()) {
1679 // Don't just update the filter representation. Centralize the
1680 // logic in the addFilter(), such that we can keep "None" as
1681 // null.
1682 if (!rep.equals(filterRep)) {
1683 // Only do this if the filter isn't the same
1684 // (state panel clicks can lead us here)
1685 copy.removeFilter(rep);
1686 copy.addFilter(filterRep);
1687 }
1688 }
1689 }
1690 MasterImage.getImage().setPreset(copy, filterRep, false);
1691 }
1692
1693 public FilterRepresentation createUserPresentaion(Uri selImg, int index) {
1694 FilterPresetRepresentation fp= new FilterPresetRepresentation(
1695 getString(R.string.filtershow_preset_title) + index, index, index);
1696 fp.setSerializationName("Custom");
1697 fp.setUri(selImg);
1698 return fp;
1699 }
1700
1701 public FilterRepresentation getCurrentPresentation() {
1702 ImagePreset preset = MasterImage.getImage().getPreset();
1703 return preset.getLastRepresentation();
1704 }
1705
nicolasroardbe843552013-07-02 15:02:43 -07001706 private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
1707 @Override
1708 protected Boolean doInBackground(Void... params) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001709 MasterImage master = MasterImage.getImage();
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001710 if (master.supportsHighRes()) {
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001711 int highresPreviewSize = Math.min(MasterImage.MAX_BITMAP_DIM, getScreenImageSize());
1712 Log.d(LOGTAG, "FilterShowActivity.LoadHighresBitmapTask.doInBackground(): after, highresPreviewSize is " + highresPreviewSize);
Ruben Brunk47886ac2013-07-12 17:23:39 -07001713 Rect bounds = new Rect();
1714 Bitmap originalHires = ImageLoader.loadOrientedConstrainedBitmap(master.getUri(),
1715 master.getActivity(), highresPreviewSize,
1716 master.getOrientation(), bounds);
Jay Wange0990322016-06-28 13:29:26 -07001717
1718 // Force the bitmap to even width and height which is required by beautification algo
1719 Bitmap tempBmp = MasterImage.convertToEvenNumberWidthImage(originalHires);
1720 if(tempBmp != null && originalHires != null) {
1721 if(!originalHires.isRecycled() && originalHires != tempBmp) {
1722 originalHires.recycle();
1723 }
1724 originalHires = tempBmp;
1725 }
1726
Ruben Brunk47886ac2013-07-12 17:23:39 -07001727 master.setOriginalBounds(bounds);
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001728 master.setOriginalBitmapHighres(originalHires);
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001729 Log.d(LOGTAG, "FilterShowActivity.LoadHighresBitmapTask.doInBackground(): originalHires.WH is (" + originalHires.getWidth()
1730 + ", " + originalHires.getHeight() +"), bounds is " + bounds.toString());
nicolasroarddb5d0602013-07-19 14:45:32 -07001731 mBoundService.setOriginalBitmapHighres(originalHires);
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001732 master.warnListeners();
1733 }
nicolasroardbe843552013-07-02 15:02:43 -07001734 return true;
1735 }
1736
1737 @Override
1738 protected void onPostExecute(Boolean result) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001739 Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres();
nicolasroardbe843552013-07-02 15:02:43 -07001740 if (highresBitmap != null) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001741 float highResPreviewScale = (float) highresBitmap.getWidth()
1742 / (float) MasterImage.getImage().getOriginalBounds().width();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001743 Log.d(LOGTAG, "FilterShowActivity.LoadHighresBitmapTask.onPostExecute(): highResPreviewScale is " + highResPreviewScale);
nicolasroarddb5d0602013-07-19 14:45:32 -07001744 mBoundService.setHighresPreviewScaleFactor(highResPreviewScale);
nicolasroardbe843552013-07-02 15:02:43 -07001745 }
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001746
nicolasroard80b216d2013-08-28 14:00:06 -07001747 MasterImage.getImage().warnListeners();
nicolasroardbe843552013-07-02 15:02:43 -07001748 }
1749 }
1750
Likai Dingb7c13c22017-02-16 14:54:04 +08001751 private class ParseDepthMapTask extends AsyncTask<Uri, Void, Boolean> {
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001752 @Override
Likai Dingb7c13c22017-02-16 14:54:04 +08001753 protected Boolean doInBackground(Uri... params) {
1754 return MasterImage.getImage().parseDepthMap(FilterShowActivity.this, params[0]);
Byunghun Jeonfa9e7452015-11-13 11:33:57 -08001755 }
1756
1757 @Override
1758 protected void onPostExecute(Boolean result) {
Likai Dingb7c13c22017-02-16 14:54:04 +08001759 showDualCameraButton(result);
Byunghun Jeonfa9e7452015-11-13 11:33:57 -08001760 stopLoadingIndicator();
1761 }
1762 }
1763
John Hofordf7f24e82013-09-13 16:02:09 -07001764 public boolean isLoadingVisible() {
Likai Dingb7c13c22017-02-16 14:54:04 +08001765 if (mLoadingDialog != null) {
Byunghun Jeon863bd522015-11-02 17:20:55 -08001766 return mLoadingDialog.isShowing();
1767 }
1768
1769 return false;
John Hofordf7f24e82013-09-13 16:02:09 -07001770 }
1771
1772 public void startLoadingIndicator() {
Byunghun Jeon863bd522015-11-02 17:20:55 -08001773 if(mLoadingDialog == null) {
1774 mLoadingDialog = new ProgressDialog(this);
1775 mLoadingDialog.setMessage(getString(R.string.loading_image));
1776 mLoadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
1777 mLoadingDialog.setIndeterminate(true);
1778 mLoadingDialog.setCancelable(true);
1779 mLoadingDialog.setCanceledOnTouchOutside(false);
1780 mLoadingDialog.setOnCancelListener(new OnCancelListener() {
1781 @Override
1782 public void onCancel(DialogInterface dialog) {
Jay Wang8f0f5c02015-11-06 14:35:17 -08001783 done();
Byunghun Jeon863bd522015-11-02 17:20:55 -08001784 }
1785 });
1786 }
1787
1788 mLoadingDialog.show();
John Hofordf7f24e82013-09-13 16:02:09 -07001789 }
1790
nicolasroard32cc4dd2013-09-06 17:21:55 -07001791 public void stopLoadingIndicator() {
Likai Dingb7c13c22017-02-16 14:54:04 +08001792 if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
Byunghun Jeon863bd522015-11-02 17:20:55 -08001793 mLoadingDialog.dismiss();
1794 }
Jay Wangf19b0702016-06-09 12:49:49 -07001795 }
1796
1797 private class LoadTruePortraitTask extends AsyncTask<Uri, Void, Boolean> {
1798
1799 @Override
1800 protected Boolean doInBackground(Uri... params) {
1801 boolean result = false;
1802 Bitmap src = ImageLoader.loadBitmap(FilterShowActivity.this, params[0], null);
jinwu4fafa7a2017-04-07 13:27:48 +08001803 if(src == null) {
1804 return false;
1805 }
jinwuc9060a82017-04-28 15:41:13 +08001806
1807 FaceInfo[] faceInfos = null;
jinwud1e64f42017-08-09 14:24:06 +08001808 FaceDetect fDetect = new FaceDetect();
jinwuc9060a82017-04-28 15:41:13 +08001809 if (fDetect.isLibLoaded()) {
1810 fDetect.initialize();
1811 faceInfos = fDetect.dectectFeatures(src);
1812 fDetect.uninitialize();
1813 }
Jay Wangf19b0702016-06-09 12:49:49 -07001814
1815 if(faceInfos != null && faceInfos.length > 0) {
1816 Rect[] faces = new Rect[faceInfos.length];
1817 for(int i=0; i<faceInfos.length; i++) {
1818 faces[i] = faceInfos[i].face;
1819 }
1820
1821 result = TruePortraitNativeEngine.getInstance().init(FilterShowActivity.this, src, faces);
1822 } else {
1823 TruePortraitNativeEngine.getInstance().setFacesDetected(false);
1824 }
1825
1826 src.recycle();
1827 src = null;
1828
1829 return result;
1830 }
1831
1832 @Override
1833 protected void onPostExecute(Boolean result) {
1834 }
1835 }
nicolasroard32cc4dd2013-09-06 17:21:55 -07001836
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001837 private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
John Reckd49d5322012-10-24 12:56:31 -07001838 int mBitmapSize;
1839
nicolasroardf5eedf12013-04-19 17:13:30 -07001840 public LoadBitmapTask() {
John Reckd49d5322012-10-24 12:56:31 -07001841 mBitmapSize = getScreenImageSize();
Chao Zhang7deb94a2016-03-14 11:10:20 +08001842 Log.d(LOGTAG, "FilterShowActivity.LoadBitmapTask(): mBitmapSize is " + mBitmapSize);
John Hoford3d4f2c72012-10-23 17:14:35 -07001843 }
1844
1845 @Override
John Reckd49d5322012-10-24 12:56:31 -07001846 protected Boolean doInBackground(Uri... params) {
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001847 if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) {
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001848 return false;
1849 }
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001850 publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity()));
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001851 return true;
John Hoford3d4f2c72012-10-23 17:14:35 -07001852 }
1853
1854 @Override
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001855 protected void onProgressUpdate(Boolean... values) {
John Reck00914f52012-10-25 10:08:37 -07001856 super.onProgressUpdate(values);
Ruben Brunk6416dd52012-11-28 14:00:30 -08001857 if (isCancelled()) {
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001858 return;
Ruben Brunk6416dd52012-11-28 14:00:30 -08001859 }
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001860 if (values[0]) {
John Hoford5300e0c2013-03-04 17:50:58 -08001861 mShowingTinyPlanet = true;
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001862 }
John Reck00914f52012-10-25 10:08:37 -07001863 }
1864
1865 @Override
John Hoford3d4f2c72012-10-23 17:14:35 -07001866 protected void onPostExecute(Boolean result) {
Ruben Brunk69f5d8c2013-04-24 15:46:15 -07001867 MasterImage.setMaster(mMasterImage);
John Hoford3d4f2c72012-10-23 17:14:35 -07001868 if (isCancelled()) {
1869 return;
1870 }
nicolasroard588c30c2013-02-08 14:06:33 -08001871
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001872 if (!result) {
John Hoford3759b2d2013-09-10 16:59:23 -07001873 if (mOriginalImageUri != null
1874 && !mOriginalImageUri.equals(mSelectedImageUri)) {
John Hoford441d7a82013-08-20 15:37:37 -07001875 mOriginalImageUri = mSelectedImageUri;
1876 mOriginalPreset = null;
1877 Toast.makeText(FilterShowActivity.this,
1878 R.string.cannot_edit_original, Toast.LENGTH_SHORT).show();
1879 startLoadBitmap(mOriginalImageUri);
1880 } else {
1881 cannotLoadImage();
1882 }
ztenghuia08fab52013-07-22 14:06:22 -07001883 return;
John Hoford3d4f2c72012-10-23 17:14:35 -07001884 }
Ruben Brunk8965d1f2012-12-03 12:18:56 -08001885
Chao Zhang7deb94a2016-03-14 11:10:20 +08001886 if (null == CachingPipeline.getRenderScriptContext()) {
1887 Log.v(LOGTAG, "RenderScript context destroyed during load");
John Hoford52fa1102013-06-11 13:07:15 -07001888 return;
1889 }
nicolasroard733a0132013-02-08 17:00:42 -08001890 final View imageShow = findViewById(R.id.imageShow);
1891 imageShow.setVisibility(View.VISIBLE);
1892
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001893 Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge();
nicolasroarddb5d0602013-07-19 14:45:32 -07001894 mBoundService.setOriginalBitmap(largeBitmap);
1895
Ruben Brunk0c1b4c62013-07-08 18:11:49 -07001896 float previewScale = (float) largeBitmap.getWidth()
1897 / (float) MasterImage.getImage().getOriginalBounds().width();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001898 Log.d(LOGTAG, "FilterShowActivity.LoadBitmapTask.onPostExecute(): previewScale is " + previewScale);
nicolasroarddb5d0602013-07-19 14:45:32 -07001899 mBoundService.setPreviewScaleFactor(previewScale);
nicolasroardf5eedf12013-04-19 17:13:30 -07001900 if (!mShowingTinyPlanet) {
1901 mCategoryFiltersAdapter.removeTinyPlanet();
1902 }
nicolasroardf5eedf12013-04-19 17:13:30 -07001903 mCategoryLooksAdapter.imageLoaded();
1904 mCategoryBordersAdapter.imageLoaded();
1905 mCategoryGeometryAdapter.imageLoaded();
1906 mCategoryFiltersAdapter.imageLoaded();
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07001907 mCategoryDualCamAdapter.imageLoaded();
Jay Wangf19b0702016-06-09 12:49:49 -07001908 mCategoryTruePortraitAdapter.imageLoaded();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08001909 if(mCategoryMakeupAdapter != null) {
1910 mCategoryMakeupAdapter.imageLoaded();
1911 }
John Reckd49d5322012-10-24 12:56:31 -07001912 mLoadBitmapTask = null;
Ruben Brunkab779de2013-02-14 16:18:22 -08001913
nicolasroard32cc4dd2013-09-06 17:21:55 -07001914 MasterImage.getImage().warnListeners();
1915 loadActions();
1916
John Hofordafa8ed92013-04-15 22:10:43 -07001917 if (mOriginalPreset != null) {
ztenghuid2e9ea02013-06-24 13:54:04 -07001918 MasterImage.getImage().setLoadedPreset(mOriginalPreset);
nicolasroarded609792013-06-26 16:56:31 -07001919 MasterImage.getImage().setPreset(mOriginalPreset,
1920 mOriginalPreset.getLastRepresentation(), true);
John Hofordafa8ed92013-04-15 22:10:43 -07001921 mOriginalPreset = null;
nicolasroard32cc4dd2013-09-06 17:21:55 -07001922 } else {
1923 setDefaultPreset();
John Hofordafa8ed92013-04-15 22:10:43 -07001924 }
nicolasroardc7b38f32013-04-25 08:47:11 -07001925
nicolasroard32cc4dd2013-09-06 17:21:55 -07001926 MasterImage.getImage().resetGeometryImages(true);
1927
Chao Zhang7deb94a2016-03-14 11:10:20 +08001928 if (mAction.equals(TINY_PLANET_ACTION)) {
nicolasroardf5eedf12013-04-19 17:13:30 -07001929 showRepresentation(mCategoryFiltersAdapter.getTinyPlanet());
Ruben Brunkab779de2013-02-14 16:18:22 -08001930 }
Jay Wang8f0f5c02015-11-06 14:35:17 -08001931 mHiResBitmapTask = new LoadHighresBitmapTask();
1932 mHiResBitmapTask.execute();
nicolasroard80b216d2013-08-28 14:00:06 -07001933 MasterImage.getImage().warnListeners();
John Hoford3d4f2c72012-10-23 17:14:35 -07001934 super.onPostExecute(result);
1935 }
1936
1937 }
1938
Ruben Brunkf07bb272013-03-11 12:00:06 -07001939 private void clearGalleryBitmapPool() {
1940 (new AsyncTask<Void, Void, Void>() {
1941 @Override
1942 protected Void doInBackground(Void... params) {
1943 // Free memory held in Gallery's Bitmap pool. May be O(n) for n bitmaps.
1944 GalleryBitmapPool.getInstance().clear();
1945 return null;
1946 }
1947 }).execute();
1948 }
1949
John Hoford3d4f2c72012-10-23 17:14:35 -07001950 @Override
1951 protected void onDestroy() {
John Reckd49d5322012-10-24 12:56:31 -07001952 if (mLoadBitmapTask != null) {
1953 mLoadBitmapTask.cancel(false);
John Hoford3d4f2c72012-10-23 17:14:35 -07001954 }
Jay Wang8f0f5c02015-11-06 14:35:17 -08001955
1956 if(mHiResBitmapTask != null) {
1957 mHiResBitmapTask.cancel(false);
1958 }
1959
Likai Dingb7c13c22017-02-16 14:54:04 +08001960 if(mParseDepthMapTask != null) {
1961 mParseDepthMapTask.cancel(false);
Jay Wang8f0f5c02015-11-06 14:35:17 -08001962 }
1963
Jay Wangf19b0702016-06-09 12:49:49 -07001964 if(mLoadTruePortraitTask != null) {
1965 mLoadTruePortraitTask.cancel(false);
1966 }
1967
nicolasroardfa474a12013-07-15 11:24:36 -07001968 mUserPresetsManager.close();
jinwu4fafa7a2017-04-07 13:27:48 +08001969 if (mFilterPresetSource !=null) {
1970 mFilterPresetSource.close();
1971 }
1972
1973 if (tempFilterArray != null) {
1974 tempFilterArray.clear();
1975 }
huiyan3de604e2016-04-27 15:28:45 +08001976 unregisterReceiver(mHandlerReceiver);
nicolasroard24d6ec72013-07-12 18:27:54 -07001977 doUnbindService();
Likai Dingb7c13c22017-02-16 14:54:04 +08001978 if (mReleaseDualCam && DualCameraEffect.isSupported())
1979 DualCameraEffect.getInstance().release();
John Hoford3d4f2c72012-10-23 17:14:35 -07001980 super.onDestroy();
1981 }
1982
Ruben Brunk47886ac2013-07-12 17:23:39 -07001983 // TODO: find a more robust way of handling image size selection
1984 // for high screen densities.
jinwu4fafa7a2017-04-07 13:27:48 +08001985 public int getScreenImageSize() {
Ruben Brunk47886ac2013-07-12 17:23:39 -07001986 DisplayMetrics outMetrics = new DisplayMetrics();
1987 getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
ztenghuia08fab52013-07-22 14:06:22 -07001988 return Math.max(outMetrics.heightPixels, outMetrics.widthPixels);
John Hofordfafb2ed2012-10-11 12:55:05 -07001989 }
1990
Doris Liu0addfc72012-10-17 16:15:51 -07001991 private void showSavingProgress(String albumName) {
Bobby Georgescuec29b732012-10-07 15:20:44 -07001992 ProgressDialog progress;
1993 if (mSavingProgressDialog != null) {
1994 progress = mSavingProgressDialog.get();
1995 if (progress != null) {
1996 progress.show();
1997 return;
1998 }
1999 }
2000 // TODO: Allow cancellation of the saving process
Doris Liu0addfc72012-10-17 16:15:51 -07002001 String progressText;
2002 if (albumName == null) {
2003 progressText = getString(R.string.saving_image);
2004 } else {
2005 progressText = getString(R.string.filtershow_saving_image, albumName);
2006 }
2007 progress = ProgressDialog.show(this, "", progressText, true, false);
Bobby Georgescuec29b732012-10-07 15:20:44 -07002008 mSavingProgressDialog = new WeakReference<ProgressDialog>(progress);
2009 }
2010
2011 private void hideSavingProgress() {
2012 if (mSavingProgressDialog != null) {
2013 ProgressDialog progress = mSavingProgressDialog.get();
nicolasroard08458dc2012-10-09 16:34:58 -07002014 if (progress != null)
2015 progress.dismiss();
Bobby Georgescuec29b732012-10-07 15:20:44 -07002016 }
2017 }
2018
jinwue99f7222017-05-15 17:25:46 +08002019 public void completeSaveImage(Uri saveUri) {
nicolasroard0ee91a22012-10-01 00:25:11 -07002020 if (mSharingImage && mSharedOutputFile != null) {
2021 // Image saved, we unblock the content provider
2022 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
2023 Uri.encode(mSharedOutputFile.getAbsolutePath()));
2024 ContentValues values = new ContentValues();
2025 values.put(SharedImageProvider.PREPARE, false);
2026 getContentResolver().insert(uri, values);
2027 }
2028 setResult(RESULT_OK, new Intent().setData(saveUri));
Likai Dingb7c13c22017-02-16 14:54:04 +08002029 if (mReleaseDualCam && DualCameraEffect.isSupported()) {
2030 DualCameraEffect.getInstance().release();
jinwue99f7222017-05-15 17:25:46 +08002031 mReleaseDualCam = false;
2032 }
Bobby Georgescuec29b732012-10-07 15:20:44 -07002033 hideSavingProgress();
nicolasroard0ee91a22012-10-01 00:25:11 -07002034 finish();
2035 }
2036
maxwend57f7232016-06-04 22:51:06 +02002037 private boolean onShareTargetSelected() {
nicolasroard92e23412012-10-05 03:48:34 -07002038 // First, let's tell the SharedImageProvider that it will need to wait
2039 // for the image
nicolasroard0ee91a22012-10-01 00:25:11 -07002040 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
2041 Uri.encode(mSharedOutputFile.getAbsolutePath()));
2042 ContentValues values = new ContentValues();
2043 values.put(SharedImageProvider.PREPARE, true);
2044 getContentResolver().insert(uri, values);
2045 mSharingImage = true;
2046
2047 // Process and save the image in the background.
Doris Liu0addfc72012-10-17 16:15:51 -07002048 showSavingProgress(null);
nicolasroard0ee91a22012-10-01 00:25:11 -07002049 mImageShow.saveImage(this, mSharedOutputFile);
2050 return true;
2051 }
2052
2053 private Intent getDefaultShareIntent() {
2054 Intent intent = new Intent(Intent.ACTION_SEND);
2055 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
2056 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
2057 intent.setType(SharedImageProvider.MIME_TYPE);
nicolasroard24d6ec72013-07-12 18:27:54 -07002058 mSharedOutputFile = SaveImage.getNewFile(this, MasterImage.getImage().getUri());
nicolasroard0ee91a22012-10-01 00:25:11 -07002059 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI,
2060 Uri.encode(mSharedOutputFile.getAbsolutePath()));
2061 intent.putExtra(Intent.EXTRA_STREAM, uri);
2062 return intent;
2063 }
2064
nicolasroard9594c8d2012-09-27 20:54:48 -07002065 @Override
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302066 public boolean onPrepareOptionsMenu(Menu menu) {
2067 menu.clear();
nicolasroard9594c8d2012-09-27 20:54:48 -07002068 getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu);
maxwend57f7232016-06-04 22:51:06 +02002069 MenuItem item = menu.findItem(R.id.menu_share);
2070 if (item != null) {
2071 item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2072 @Override
2073 public boolean onMenuItemClick(MenuItem item) {
2074 final Intent shareIntent = getDefaultShareIntent();
2075 onShareTargetSelected();
2076 Intent intent = Intent.createChooser(shareIntent, null);
2077 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2078 FilterShowActivity.this.startActivity(intent);
2079 return true;
2080 }
2081 });
2082 }
John Hoford3759b2d2013-09-10 16:59:23 -07002083 mMenu = menu;
John Hoford46868d02013-09-12 14:16:50 -07002084 setupMenu();
Jay Wangf19b0702016-06-09 12:49:49 -07002085
2086 if(mCurrentEditor != null) {
2087 mCurrentEditor.onPrepareOptionsMenu(menu);
2088 }
nicolasroard9594c8d2012-09-27 20:54:48 -07002089 return true;
2090 }
2091
John Hoford3759b2d2013-09-10 16:59:23 -07002092 private void setupMenu(){
John Hoford46868d02013-09-12 14:16:50 -07002093 if (mMenu == null || mMasterImage == null) {
2094 return;
2095 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302096 //MenuItem undoItem = mMenu.findItem(R.id.undoButton);
2097 //MenuItem redoItem = mMenu.findItem(R.id.redoButton);
John Hoford3759b2d2013-09-10 16:59:23 -07002098 MenuItem resetItem = mMenu.findItem(R.id.resetHistoryButton);
maxwend57f7232016-06-04 22:51:06 +02002099 MenuItem shareItem = mMenu.findItem(R.id.menu_share);
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302100 //mMasterImage.getHistory().setMenuItems(undoItem, redoItem, resetItem);
Chao Zhang9c0d4752016-04-14 18:04:44 +08002101 if (!mMasterImage.hasModifications()) {
2102 mMenu.removeItem(R.id.resetHistoryButton);
2103 }
John Hoford3759b2d2013-09-10 16:59:23 -07002104 }
2105
nicolasroard92e23412012-10-05 03:48:34 -07002106 @Override
Bobby Georgescu6e733b72012-10-09 11:02:38 -07002107 public void onPause() {
2108 super.onPause();
Bobby Georgescu6e733b72012-10-09 11:02:38 -07002109 }
2110
2111 @Override
2112 public void onResume() {
2113 super.onResume();
Chao Zhang7deb94a2016-03-14 11:10:20 +08002114 if (SimpleMakeupImageFilter.HAS_TS_MAKEUP) {
Jay Wang8f0f5c02015-11-06 14:35:17 -08002115 MakeupEngine.getMakeupObj();
Zhang Zhenzhen38478f22015-03-10 16:40:13 +08002116 }
Bobby Georgescu6e733b72012-10-09 11:02:38 -07002117 }
2118
2119 @Override
nicolasroard9594c8d2012-09-27 20:54:48 -07002120 public boolean onOptionsItemSelected(MenuItem item) {
2121 switch (item.getItemId()) {
Jay Wangf19b0702016-06-09 12:49:49 -07002122 /*case R.id.undoButton: {
nicolasroard6a502732013-06-27 14:41:58 -07002123 HistoryManager adapter = mMasterImage.getHistory();
nicolasroard9594c8d2012-09-27 20:54:48 -07002124 int position = adapter.undo();
John Hoford63a7dac2013-01-14 14:48:39 -08002125 mMasterImage.onHistoryItemClick(position);
John Hoforda7a6a3a2013-05-22 15:41:20 -07002126 backToMain();
nicolasroard9594c8d2012-09-27 20:54:48 -07002127 invalidateViews();
2128 return true;
2129 }
2130 case R.id.redoButton: {
nicolasroard6a502732013-06-27 14:41:58 -07002131 HistoryManager adapter = mMasterImage.getHistory();
nicolasroard9594c8d2012-09-27 20:54:48 -07002132 int position = adapter.redo();
John Hoford63a7dac2013-01-14 14:48:39 -08002133 mMasterImage.onHistoryItemClick(position);
nicolasroard9594c8d2012-09-27 20:54:48 -07002134 invalidateViews();
2135 return true;
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302136 }*/
Jay Wangf19b0702016-06-09 12:49:49 -07002137 case R.id.resetHistoryButton: {
jinwu4fafa7a2017-04-07 13:27:48 +08002138 clearWaterMark();
Jay Wangf19b0702016-06-09 12:49:49 -07002139 resetHistory();
2140 return true;
2141 }
2142 /*case R.id.showImageStateButton: {
nicolasroardbf93da72012-09-29 00:17:09 -07002143 toggleImageStatePanel();
2144 return true;
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302145 }*/
Jay Wangf19b0702016-06-09 12:49:49 -07002146 case R.id.exportFlattenButton: {
2147 showExportOptionsDialog();
2148 return true;
2149 }
2150 case android.R.id.home: {
2151 saveImage();
2152 return true;
2153 }
2154 case R.id.manageUserPresets: {
2155 manageUserPresets();
2156 return true;
2157 }
nicolasroard9594c8d2012-09-27 20:54:48 -07002158 }
2159 return false;
2160 }
2161
nicolasroard9c5d6702013-08-16 14:06:43 -07002162 public void print() {
2163 Bitmap bitmap = MasterImage.getImage().getHighresImage();
Svetoslav Ganov391e4a12013-10-06 20:03:32 -07002164 PrintHelper printer = new PrintHelper(this);
junjiez2e524362018-09-11 11:04:46 +08002165 try {
2166 printer.printBitmap("ImagePrint", bitmap);
2167 } catch (RuntimeException e) {
2168 Log.e(LOGTAG,"Print failure,",e);
2169 }
nicolasroard9c5d6702013-08-16 14:06:43 -07002170 }
2171
jinwuf23224f2017-06-19 11:16:06 +08002172 private void manageUserPresets() {
2173 if (mPresetDialog == null) {
2174 mPresetDialog = new PresetManagementDialog();
2175 mPresetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
2176 @Override
2177 public void onDismiss(DialogInterface dialog) {
2178 mPresetDialog = null;
2179 }
2180 });
2181 mPresetDialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
2182 }
2183 }
2184
nicolasroard55a02792013-08-13 17:36:00 -07002185 public void addNewPreset() {
jinwu4fafa7a2017-04-07 13:27:48 +08002186 boolean skipIntro = GalleryUtils.getBooleanPref(this,
2187 this.getString(R.string.pref_filtergenerator_intro_show_key), false);
2188 if (!skipIntro) {
jinwuf23224f2017-06-19 11:16:06 +08002189 manageUserPresets();
jinwu4fafa7a2017-04-07 13:27:48 +08002190 } else {
2191 onMediaPickerStarted();
2192 }
nicolasroard55a02792013-08-13 17:36:00 -07002193 }
2194
Ruben Brunk077e7182013-08-01 19:05:18 -07002195 private void showExportOptionsDialog() {
2196 DialogFragment dialog = new ExportDialog();
2197 dialog.show(getSupportFragmentManager(), "ExportDialogFragment");
2198 }
2199
nicolasroardfa474a12013-07-15 11:24:36 -07002200 public void updateUserPresetsFromAdapter(UserPresetsAdapter adapter) {
2201 ArrayList<FilterUserPresetRepresentation> representations =
2202 adapter.getDeletedRepresentations();
2203 for (FilterUserPresetRepresentation representation : representations) {
2204 deletePreset(representation.getId());
2205 }
2206 ArrayList<FilterUserPresetRepresentation> changedRepresentations =
2207 adapter.getChangedRepresentations();
2208 for (FilterUserPresetRepresentation representation : changedRepresentations) {
2209 updatePreset(representation);
2210 }
2211 adapter.clearDeletedRepresentations();
2212 adapter.clearChangedRepresentations();
2213 loadUserPresets();
2214 }
2215
2216 public void loadUserPresets() {
2217 mUserPresetsManager.load();
nicolasroard5af55f42013-08-14 10:34:08 -07002218 updateUserPresetsFromManager();
nicolasroardfa474a12013-07-15 11:24:36 -07002219 }
2220
2221 public void updateUserPresetsFromManager() {
2222 ArrayList<FilterUserPresetRepresentation> presets = mUserPresetsManager.getRepresentations();
2223 if (presets == null) {
2224 return;
2225 }
2226 if (mCategoryLooksAdapter != null) {
2227 fillLooks();
2228 }
jinwu4fafa7a2017-04-07 13:27:48 +08002229 /* if (presets.size() > 0) {
nicolasroard55a02792013-08-13 17:36:00 -07002230 mCategoryLooksAdapter.add(new Action(this, Action.SPACER));
jinwu4fafa7a2017-04-07 13:27:48 +08002231 } */
nicolasroardfa474a12013-07-15 11:24:36 -07002232 mUserPresetsAdapter.clear();
jinwu4fafa7a2017-04-07 13:27:48 +08002233 if (presets.size() > 0) {
2234 mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
2235 }
nicolasroardfa474a12013-07-15 11:24:36 -07002236 for (int i = 0; i < presets.size(); i++) {
2237 FilterUserPresetRepresentation representation = presets.get(i);
2238 mCategoryLooksAdapter.add(
nicolasroard0a24e522013-08-14 10:04:37 -07002239 new Action(this, representation, Action.FULL_VIEW, true));
nicolasroardfa474a12013-07-15 11:24:36 -07002240 mUserPresetsAdapter.add(new Action(this, representation, Action.FULL_VIEW));
2241 }
jinwu4fafa7a2017-04-07 13:27:48 +08002242
nicolasroard5af55f42013-08-14 10:34:08 -07002243 mCategoryLooksAdapter.notifyDataSetChanged();
nicolasroardfa474a12013-07-15 11:24:36 -07002244 mCategoryLooksAdapter.notifyDataSetInvalidated();
nicolasroardfa474a12013-07-15 11:24:36 -07002245 }
2246
nicolasroard0a24e522013-08-14 10:04:37 -07002247 public void saveCurrentImagePreset(String name) {
2248 mUserPresetsManager.save(MasterImage.getImage().getPreset(), name);
nicolasroardfa474a12013-07-15 11:24:36 -07002249 }
2250
2251 private void deletePreset(int id) {
2252 mUserPresetsManager.delete(id);
2253 }
2254
2255 private void updatePreset(FilterUserPresetRepresentation representation) {
2256 mUserPresetsManager.update(representation);
2257 }
2258
Doris Liubf1677a2012-10-29 13:11:10 -07002259 public void enableSave(boolean enable) {
ztenghui545eca12013-06-28 09:25:23 -07002260 if (mSaveButton != null) {
Doris Liubf1677a2012-10-29 13:11:10 -07002261 mSaveButton.setEnabled(enable);
ztenghui545eca12013-06-28 09:25:23 -07002262 }
Doris Liubf1677a2012-10-29 13:11:10 -07002263 }
2264
nicolasroard24d6ec72013-07-12 18:27:54 -07002265 private void fillLooks() {
2266 FiltersManager filtersManager = FiltersManager.getManager();
2267 ArrayList<FilterRepresentation> filtersRepresentations = filtersManager.getLooks();
nicolasroardf6076042013-02-12 12:19:19 -08002268
nicolasroard32cc4dd2013-09-06 17:21:55 -07002269 if (mCategoryLooksAdapter != null) {
2270 mCategoryLooksAdapter.clear();
2271 }
nicolasroard1a1cb072013-08-10 17:23:38 -07002272 mCategoryLooksAdapter = new CategoryAdapter(this);
nicolasroardf5eedf12013-04-19 17:13:30 -07002273 int verticalItemHeight = (int) getResources().getDimension(R.dimen.action_item_height);
2274 mCategoryLooksAdapter.setItemHeight(verticalItemHeight);
nicolasroardf5eedf12013-04-19 17:13:30 -07002275 for (FilterRepresentation representation : filtersRepresentations) {
2276 mCategoryLooksAdapter.add(new Action(this, representation, Action.FULL_VIEW));
2277 }
jinwu4fafa7a2017-04-07 13:27:48 +08002278 if (FilterGeneratorNativeEngine.getInstance().isLibLoaded()) {
2279 if (mUserPresetsManager.getRepresentations() == null
2280 || mUserPresetsManager.getRepresentations().size() == 0) {
2281 mCategoryLooksAdapter.add(new Action(this, Action.ADD_ACTION));
2282 }
2283 }
2284
2285 fillPresetFilter();
nicolasroard5af55f42013-08-14 10:34:08 -07002286
2287 Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2288 if (panel != null) {
2289 if (panel instanceof MainPanel) {
2290 MainPanel mainPanel = (MainPanel) panel;
2291 mainPanel.loadCategoryLookPanel(true);
2292 }
2293 }
nicolasroard3a5556d2013-02-28 12:11:35 -08002294 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07002295
nicolasroard3a5556d2013-02-28 12:11:35 -08002296 public void setDefaultPreset() {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002297 // Default preset (original)
nicolasroarded609792013-06-26 16:56:31 -07002298 ImagePreset preset = new ImagePreset(); // empty
nicolasroarded609792013-06-26 16:56:31 -07002299 mMasterImage.setPreset(preset, preset.getLastRepresentation(), true);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002300 }
2301
nicolasroard0d7cdf82012-09-25 14:27:56 -07002302 // //////////////////////////////////////////////////////////////////////////////
2303 // Some utility functions
nicolasroard92e23412012-10-05 03:48:34 -07002304 // TODO: finish the cleanup.
nicolasroard0d7cdf82012-09-25 14:27:56 -07002305
nicolasroard0d7cdf82012-09-25 14:27:56 -07002306 public void invalidateViews() {
2307 for (ImageShow views : mImageViews) {
Ruben Brunk8537d092012-09-27 12:38:08 -07002308 views.updateImage();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002309 }
2310 }
2311
nicolasroard0d7cdf82012-09-25 14:27:56 -07002312 public void hideImageViews() {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002313 for (View view : mImageViews) {
2314 view.setVisibility(View.GONE);
2315 }
nicolasroard5b85b092013-02-05 13:43:45 -08002316 mEditorPlaceHolder.hide();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002317 }
2318
nicolasroard0d7cdf82012-09-25 14:27:56 -07002319 // //////////////////////////////////////////////////////////////////////////////
nicolasroardbf93da72012-09-29 00:17:09 -07002320 // imageState panel...
2321
nicolasroardf5eedf12013-04-19 17:13:30 -07002322 public void toggleImageStatePanel() {
nicolasroardbf93da72012-09-29 00:17:09 -07002323 invalidateOptionsMenu();
nicolasroardf5eedf12013-04-19 17:13:30 -07002324 mShowingImageStatePanel = !mShowingImageStatePanel;
2325 Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2326 if (panel != null) {
2327 if (panel instanceof EditorPanel) {
2328 EditorPanel editorPanel = (EditorPanel) panel;
2329 editorPanel.showImageStatePanel(mShowingImageStatePanel);
2330 } else if (panel instanceof MainPanel) {
2331 MainPanel mainPanel = (MainPanel) panel;
2332 mainPanel.showImageStatePanel(mShowingImageStatePanel);
2333 }
nicolasroardfb6a8e12013-04-15 14:41:00 -07002334 }
2335 }
2336
nicolasroard860af322013-08-08 20:47:28 -07002337 public void toggleVersionsPanel() {
2338 mShowingVersionsPanel = !mShowingVersionsPanel;
2339 Fragment panel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2340 if (panel != null && panel instanceof MainPanel) {
2341 MainPanel mainPanel = (MainPanel) panel;
2342 mainPanel.loadCategoryVersionsPanel();
2343 }
2344 }
2345
nicolasroarda9bc8ef2012-10-23 14:09:53 -07002346 @Override
jinwu4fafa7a2017-04-07 13:27:48 +08002347 public void onConfigurationChanged(Configuration newConfig) {
nicolasroarda9bc8ef2012-10-23 14:09:53 -07002348 super.onConfigurationChanged(newConfig);
John Hofordf7f24e82013-09-13 16:02:09 -07002349
nicolasroard3a5556d2013-02-28 12:11:35 -08002350 setDefaultValues();
jinwu4fafa7a2017-04-07 13:27:48 +08002351 if (mOrientation != newConfig.orientation) {
2352 TrueScannerActs.setRotating(true);
2353 mOrientation = newConfig.orientation;
2354 }
2355 switch (newConfig.orientation) {
2356 case (Configuration.ORIENTATION_LANDSCAPE):
2357 if (mPresetDialog != null) {
jinwu3721f9b2017-08-23 15:26:32 +08002358 mPresetDialog.setDismissFlag(false);
jinwu4fafa7a2017-04-07 13:27:48 +08002359 mPresetDialog.dismiss();
2360 mPresetDialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
2361 }
2362 break;
2363 case (Configuration.ORIENTATION_PORTRAIT):
2364 if (mPresetDialog != null) {
jinwu3721f9b2017-08-23 15:26:32 +08002365 mPresetDialog.setDismissFlag(false);
jinwu4fafa7a2017-04-07 13:27:48 +08002366 mPresetDialog.dismiss();
2367 mPresetDialog.show(getSupportFragmentManager(), "NoticeDialogFragment");
2368 }
2369 break;
2370 }
wqi99b35c12016-05-03 17:17:10 +08002371 if (isShowEditCropPanel()) {
2372 mIsReloadByConfigurationChanged = true;
2373 loadEditorCropPanel();
2374 }
John Hofordf7f24e82013-09-13 16:02:09 -07002375 if (mMasterImage == null) {
2376 return;
2377 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302378 //loadXML();
2379 //fillCategories();
2380 //loadMainPanel();
nicolasroardf5eedf12013-04-19 17:13:30 -07002381
jinwu4fafa7a2017-04-07 13:27:48 +08002382 if (isWaterMarked()) {
2383 DisplayMetrics dm = getResources().getDisplayMetrics();
2384 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(dm.widthPixels,
2385 dm.heightPixels);
2386 rlImageContainer.updateViewLayout(mWaterMarkView, params);
2387 }
John Hoford64fc2ed2013-10-09 13:54:45 -07002388 if (mCurrentMenu != null) {
2389 mCurrentMenu.dismiss();
2390 mCurrentMenu = null;
2391 }
John Hoford6125a082013-09-12 07:49:24 -07002392 if (mCurrentDialog != null) {
2393 mCurrentDialog.dismiss();
2394 mCurrentDialog = null;
2395 }
John Hofordf57e5882013-05-20 18:24:12 -07002396 // mLoadBitmapTask==null implies you have looked at the intent
2397 if (!mShowingTinyPlanet && (mLoadBitmapTask == null)) {
nicolasroardf5eedf12013-04-19 17:13:30 -07002398 mCategoryFiltersAdapter.removeTinyPlanet();
John Hoford5300e0c2013-03-04 17:50:58 -08002399 }
nicolasroard32cc4dd2013-09-06 17:21:55 -07002400 stopLoadingIndicator();
nicolasroarda9bc8ef2012-10-23 14:09:53 -07002401 }
2402
John Hoford63a7dac2013-01-14 14:48:39 -08002403 public void setupMasterImage() {
nicolasroard3a5556d2013-02-28 12:11:35 -08002404
nicolasroardffc6aea2013-07-10 16:14:51 -07002405 HistoryManager historyManager = new HistoryManager();
2406 StateAdapter imageStateAdapter = new StateAdapter(this, 0);
Jay Wang8f0f5c02015-11-06 14:35:17 -08002407 MasterImage.setMaster(null);
nicolasroard588c30c2013-02-08 14:06:33 -08002408 mMasterImage = MasterImage.getImage();
nicolasroardffc6aea2013-07-10 16:14:51 -07002409 mMasterImage.setHistoryManager(historyManager);
2410 mMasterImage.setStateAdapter(imageStateAdapter);
John Hoford63a7dac2013-01-14 14:48:39 -08002411 mMasterImage.setActivity(this);
nicolasroard4dad1a92013-03-29 14:41:38 -07002412
2413 if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) {
2414 mMasterImage.setSupportsHighRes(true);
2415 } else {
2416 mMasterImage.setSupportsHighRes(false);
2417 }
John Hoford63a7dac2013-01-14 14:48:39 -08002418 }
2419
Ruben Brunk2e1a6442012-12-19 10:47:49 -08002420 void resetHistory() {
wqi794da4e2016-06-02 15:47:02 +08002421 if (mMasterImage == null) {
2422 return;
2423 }
nicolasroard6a502732013-06-27 14:41:58 -07002424 HistoryManager adapter = mMasterImage.getHistory();
nicolasroard9594c8d2012-09-27 20:54:48 -07002425 adapter.reset();
nicolasroarded609792013-06-26 16:56:31 -07002426 HistoryItem historyItem = adapter.getItem(0);
nicolasroard32646aa2013-09-20 19:00:33 -07002427 ImagePreset original = null;
jinwu5487ffb2017-09-04 16:07:25 +08002428 original = new ImagePreset();
nicolasroard32646aa2013-09-20 19:00:33 -07002429 FilterRepresentation rep = null;
2430 if (historyItem != null) {
2431 rep = historyItem.getFilterRepresentation();
2432 }
2433 mMasterImage.setPreset(original, rep, true);
jinwu4fafa7a2017-04-07 13:27:48 +08002434 mMasterImage.setFusionUnderlay(null);
2435 mMasterImage.resetTranslation();
2436 mMasterImage.setScaleFactor(1);
zhuw1360a252017-09-18 09:57:04 +08002437 mMasterImage.setCurrentFilterRepresentation(null);
zhuwd1776b22017-09-18 09:52:59 +08002438 ArrayList<FilterRepresentation> frList = FiltersManager.getManager().getTools();
2439 for (FilterRepresentation fr : frList) {
2440 if (fr instanceof FilterRotateRepresentation) {
2441 ((FilterRotateRepresentation) fr).resetRotation();
2442 }
2443 }
jinwu5487ffb2017-09-04 16:07:25 +08002444 showDefaultImageView();
Chao Zhang9c0d4752016-04-14 18:04:44 +08002445 showSaveButtonIfNeed();
jinwu5487ffb2017-09-04 16:07:25 +08002446 invalidateViews();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002447 }
2448
nicolasroardf5eedf12013-04-19 17:13:30 -07002449 public void showDefaultImageView() {
Jack Yoo66d21442015-10-27 16:27:49 -07002450 if(mEditorPlaceHolder != null)
2451 mEditorPlaceHolder.hide();
2452 if(mImageShow != null)
2453 mImageShow.setVisibility(View.VISIBLE);
2454 if(MasterImage.getImage() != null) {
2455 MasterImage.getImage().setCurrentFilter(null);
2456 MasterImage.getImage().setCurrentFilterRepresentation(null);
2457 }
zhuwabf30792018-04-20 17:18:03 +08002458 showWatermarkButton(true);
2459 }
2460
2461 private void showWatermarkButton(boolean visible) {
2462 Fragment currentPanel = getSupportFragmentManager()
2463 .findFragmentByTag(MainPanel.FRAGMENT_TAG);
2464 if (currentPanel instanceof MainPanel) {
2465 ((MainPanel) currentPanel).showWatermarkButton(visible);
2466 }
nicolasroardf5eedf12013-04-19 17:13:30 -07002467 }
2468
2469 public void backToMain() {
Chao Zhang80516ca2016-04-25 15:37:33 +08002470 removeSeekBarPanel();
Chao Zhang9c0d4752016-04-14 18:04:44 +08002471 showActionBar(true);
nicolasroardf5eedf12013-04-19 17:13:30 -07002472 Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG);
2473 if (currentPanel instanceof MainPanel) {
2474 return;
2475 }
wqi99b35c12016-05-03 17:17:10 +08002476 mIsReloadByConfigurationChanged = false;
nicolasroardf5eedf12013-04-19 17:13:30 -07002477 loadMainPanel();
2478 showDefaultImageView();
Chao Zhang4dbacef2016-04-20 11:08:03 +08002479 showComparisonButton();
2480 }
2481
2482 private void showComparisonButton() {
2483 if (imgComparison != null && imgComparison.getVisibility() == View.GONE) {
2484 imgComparison.setVisibility(View.VISIBLE);
2485 }
nicolasroardf5eedf12013-04-19 17:13:30 -07002486 }
2487
nicolasroard75608162012-10-12 00:18:51 -07002488 @Override
2489 public void onBackPressed() {
Chao Zhang4dbacef2016-04-20 11:08:03 +08002490 showComparisonButton();
wqi07055372016-04-13 09:57:51 +08002491 Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302492 MainPanel.FRAGMENT_TAG);
2493
nicolasroardf5eedf12013-04-19 17:13:30 -07002494 if (currentPanel instanceof MainPanel) {
Chao Zhang7deb94a2016-03-14 11:10:20 +08002495 if (mImageShow.hasModifications()) {
wqi07055372016-04-13 09:57:51 +08002496 if (mBackAlertDialogBuilder == null) {
2497 createBackDialog();
2498 }
2499 mBackAlertDialogBuilder.show();
Ruben Brunka3dbbd72013-03-29 12:36:30 -07002500 } else {
Chao Zhang7deb94a2016-03-14 11:10:20 +08002501 done();
Ruben Brunka3dbbd72013-03-29 12:36:30 -07002502 }
wqi07055372016-04-13 09:57:51 +08002503 setActionBar();
Chao Zhang7deb94a2016-03-14 11:10:20 +08002504 invalidateOptionsMenu();
2505 if (MasterImage.getImage().getScaleFactor() < 1)
2506 setScaleImage(false);
2507 adjustCompareButton(false);
nicolasroardf5eedf12013-04-19 17:13:30 -07002508 } else {
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302509 isComingFromEditorScreen = true;
nicolasroardf5eedf12013-04-19 17:13:30 -07002510 backToMain();
nicolasroard75608162012-10-12 00:18:51 -07002511 }
2512 }
nicolasroarde34a5a52012-10-16 14:25:09 -07002513
wqi07055372016-04-13 09:57:51 +08002514 private void createBackDialog() {
2515 mBackAlertDialogBuilder = new AlertDialog.Builder(this);
Michael Bestasf4f030b2016-06-07 00:06:53 +03002516 mBackAlertDialogBuilder.setMessage(R.string.discard_message).setTitle(
2517 R.string.discard_title);
wqi07055372016-04-13 09:57:51 +08002518 mBackAlertDialogBuilder.setPositiveButton(mPopUpText,
2519 new DialogInterface.OnClickListener() {
Jay Wangf19b0702016-06-09 12:49:49 -07002520 @Override
2521 public void onClick(DialogInterface dialog, int id) {
2522 done();
2523 }
2524 });
wqi07055372016-04-13 09:57:51 +08002525 mBackAlertDialogBuilder.setNegativeButton(mCancel,
2526 new DialogInterface.OnClickListener() {
Jay Wangf19b0702016-06-09 12:49:49 -07002527 @Override
2528 public void onClick(DialogInterface dialog, int id) {
2529 dialog.dismiss();
2530 }
2531 });
wqi07055372016-04-13 09:57:51 +08002532 }
2533
nicolasroarde34a5a52012-10-16 14:25:09 -07002534 public void cannotLoadImage() {
Ruben Brunka2c4bda2013-05-29 11:18:31 -07002535 Toast.makeText(this, R.string.cannot_load_image, Toast.LENGTH_SHORT).show();
nicolasroarde34a5a52012-10-16 14:25:09 -07002536 finish();
2537 }
2538
nicolasroard0d7cdf82012-09-25 14:27:56 -07002539 // //////////////////////////////////////////////////////////////////////////////
nicolasroard0d7cdf82012-09-25 14:27:56 -07002540
2541 public float getPixelsFromDip(float value) {
2542 Resources r = getResources();
2543 return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
2544 r.getDisplayMetrics());
2545 }
2546
nicolasroard0d7cdf82012-09-25 14:27:56 -07002547 @Override
2548 public void onItemClick(AdapterView<?> parent, View view, int position,
2549 long id) {
John Hoford63a7dac2013-01-14 14:48:39 -08002550 mMasterImage.onHistoryItemClick(position);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002551 invalidateViews();
2552 }
2553
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002554 public void pickImage(int requestCode) {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002555 Intent intent = new Intent();
2556 intent.setType("image/*");
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002557 intent.setAction(Intent.ACTION_PICK);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002558 startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)),
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002559 requestCode);
nicolasroard0d7cdf82012-09-25 14:27:56 -07002560 }
2561
nicolasroard92e23412012-10-05 03:48:34 -07002562 @Override
nicolasroard0d7cdf82012-09-25 14:27:56 -07002563 public void onActivityResult(int requestCode, int resultCode, Intent data) {
nicolasroard0d7cdf82012-09-25 14:27:56 -07002564 if (resultCode == RESULT_OK) {
2565 if (requestCode == SELECT_PICTURE) {
2566 Uri selectedImageUri = data.getData();
zhuwa674df52018-01-30 13:49:15 +08002567 if (selectedImageUri != null) {
2568 startLoadBitmap(selectedImageUri);
2569 }
Byunghun Jeon8ea62fb2015-08-03 16:50:11 -07002570 } else if (requestCode == SELECT_FUSION_UNDERLAY) {
2571 Uri underlayImageUri = data.getData();
2572 // find fusion representation
Jay Wangf19b0702016-06-09 12:49:49 -07002573 if(mCurrentEditor instanceof EditorDualCamFusion) {
2574 EditorDualCamFusion editor = (EditorDualCamFusion)mCurrentEditor;
2575 editor.setUnderlayImageUri(underlayImageUri);
2576 } else if (mCurrentEditor instanceof EditorTruePortraitFusion) {
zhuwf4f10df2017-09-18 09:23:03 +08002577 if (checkExtensionValidity(this, underlayImageUri)) {
2578 Toast.makeText(getApplicationContext(), getString(R.string.not_support_gif),
2579 Toast.LENGTH_SHORT).show();
2580 pickImage(SELECT_FUSION_UNDERLAY);
2581 } else {
2582 EditorTruePortraitFusion editor = (EditorTruePortraitFusion)mCurrentEditor;
2583 editor.setUnderlayImageUri(underlayImageUri);
2584 }
Jay Wangf19b0702016-06-09 12:49:49 -07002585 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07002586 }
2587 }
2588 }
2589
zhuwf4f10df2017-09-18 09:23:03 +08002590 /**
2591 * check whether the extension of the given uri is supported to be underlay
2592 * @param context context for get ContentResolver
2593 * @param uri uri need to check
2594 * @return validity of uri's extension, true means unsupported, false means supported
2595 */
2596 private boolean checkExtensionValidity(final Context context, final Uri uri) {
2597 if (uri == null) {
2598 return false;
2599 }
2600 // get file path from uri
2601 String filePath = null;
2602 final String scheme = uri.getScheme();
2603 if (scheme == null || ContentResolver.SCHEME_FILE.equals(scheme)) {
2604 filePath = uri.getPath();
2605 } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
2606 Cursor cursor = context.getContentResolver().query(
2607 uri, new String[] {MediaStore.Images.ImageColumns.DATA}, null, null, null);
2608 if (null != cursor) {
2609 if (cursor.moveToFirst()) {
2610 int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
2611 if (index > -1) {
2612 filePath = cursor.getString(index);
2613 }
2614 }
2615 cursor.close();
2616 }
2617 }
2618
2619 //get extension from filepath
2620 String extension = MimeTypeMap.getFileExtensionFromUrl(filePath);
2621
2622 //check validity of extension
2623 boolean notSupported = false;
2624 //if have new unsupported extension, add it below
2625 notSupported |= (extension.equals("gif") || extension.equals("GIF"));
2626 return notSupported;
2627 }
Ruben Brunk6416dd52012-11-28 14:00:30 -08002628
jinwu4fafa7a2017-04-07 13:27:48 +08002629 private int nameFilter(FilterPresetSource source,
2630 ArrayList <SaveOption> tempFilterArray) {
2631 String s,s1,s2;
2632 ArrayList<SaveOption> sp = source.getAllUserPresets();
2633 ArrayList<Integer> temp = new ArrayList<Integer>();
2634 if (sp != null) {
2635 for (int i = 0; i < sp.size(); i++) {
2636 s = sp.get(i).name;
2637 if (s.length() > "Custom".length()) {
2638 s1 = s.substring(0, 6);
2639 if (s1.equals("Custom")) {
2640 s2 = s.substring(6);
2641 int tem;
2642 try {
2643 tem = Integer.parseInt(s2);
2644 } catch (NumberFormatException e) {
2645 continue;
2646 }
2647 temp.add(tem);
2648 }
2649 }
2650 }
2651 }
2652
2653 if (tempFilterArray.size() != 0 ){
2654 for (int i = 0; i < tempFilterArray.size(); i++) {
2655 s = tempFilterArray.get(i).name;
2656 if (s.length() > "Custom".length()) {
2657 s1 = s.substring(0, 6);
2658 if (s1.equals("Custom")) {
2659 s2 = s.substring(6);
2660 int tem;
2661 try {
2662 tem = Integer.parseInt(s2);
2663 } catch (NumberFormatException e) {
2664 continue;
2665 }
2666 temp.add(tem);
2667 }
2668 }
2669 }
2670
2671 }
2672
2673 if (temp != null) {
2674 Collections.sort(temp);
2675 for (int i = 1; i <= temp.size(); i++){
2676 if (temp.get(i-1)!= i){
2677 return i;
2678 }
2679 }
2680 }
2681 return temp.size()+1;
2682 }
2683
2684
2685 public static boolean completeSaveFilters (FilterPresetSource mFilterPresetSource,
2686 ArrayList<SaveOption> tempFilterArray) {
2687
2688 for (int i = 0; i < tempFilterArray.size(); i++){
2689 String name = tempFilterArray.get(i).name;
2690 String filteredUri = tempFilterArray.get(i).Uri;
2691 if (mFilterPresetSource.insertPreset(name,filteredUri) == false) return false;
2692 }
2693 tempFilterArray.clear();
2694 return true;
2695 }
2696
nicolasroard0d7cdf82012-09-25 14:27:56 -07002697 public void saveImage() {
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002698 if (mImageShow.hasModifications()) {
2699 // Get the name of the album, to which the image will be saved
nicolasroard24d6ec72013-07-12 18:27:54 -07002700 File saveDir = SaveImage.getFinalSaveDirectory(this, mSelectedImageUri);
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002701 int bucketId = GalleryUtils.getBucketId(saveDir.getPath());
2702 String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null);
2703 showSavingProgress(albumName);
jinwu4fafa7a2017-04-07 13:27:48 +08002704 if (mWaterMarkView == null) {
2705 mImageShow.saveImage(this, null);
2706 } else {
2707 mSaveWaterMark.saveImage(this, mMasterImage.getHighresImage(),
2708 mSelectedImageUri, handler);
2709 }
2710 if (tempFilterArray.size() != 0) {
2711 completeSaveFilters(mFilterPresetSource, tempFilterArray);
2712 }
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002713 } else {
Ruben Brunk6416dd52012-11-28 14:00:30 -08002714 done();
2715 }
2716 }
2717
Ruben Brunka2414582013-02-21 20:13:20 -08002718
Ruben Brunk6416dd52012-11-28 14:00:30 -08002719 public void done() {
Ruben Brunkd25fdea2013-05-28 12:34:14 -07002720 hideSavingProgress();
John Hoford52fa1102013-06-11 13:07:15 -07002721 if (mLoadBitmapTask != null) {
2722 mLoadBitmapTask.cancel(false);
2723 }
Ruben Brunk6416dd52012-11-28 14:00:30 -08002724 finish();
nicolasroard0d7cdf82012-09-25 14:27:56 -07002725 }
2726
John Hofordafa8ed92013-04-15 22:10:43 -07002727 private void extractXMPData() {
2728 XMresults res = XmpPresets.extractXMPData(
2729 getBaseContext(), mMasterImage, getIntent().getData());
2730 if (res == null)
2731 return;
2732
2733 mOriginalImageUri = res.originalimage;
2734 mOriginalPreset = res.preset;
2735 }
ztenghuib3f62e42013-06-10 15:51:42 -07002736
2737 public Uri getSelectedImageUri() {
2738 return mSelectedImageUri;
2739 }
2740
nicolasroard9737f3a2013-08-14 11:14:47 -07002741 public void setHandlesSwipeForView(View view, float startX, float startY) {
nicolasroard860af322013-08-08 20:47:28 -07002742 if (view != null) {
2743 mHandlingSwipeButton = true;
2744 } else {
2745 mHandlingSwipeButton = false;
2746 }
2747 mHandledSwipeView = view;
2748 int[] location = new int[2];
2749 view.getLocationInWindow(location);
nicolasroard9737f3a2013-08-14 11:14:47 -07002750 mSwipeStartX = location[0] + startX;
nicolasroard860af322013-08-08 20:47:28 -07002751 mSwipeStartY = location[1] + startY;
2752 }
2753
2754 public boolean dispatchTouchEvent (MotionEvent ev) {
2755 if (mHandlingSwipeButton) {
nicolasroard9737f3a2013-08-14 11:14:47 -07002756 int direction = CategoryView.HORIZONTAL;
2757 if (mHandledSwipeView instanceof CategoryView) {
2758 direction = ((CategoryView) mHandledSwipeView).getOrientation();
2759 }
nicolasroard860af322013-08-08 20:47:28 -07002760 if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
2761 float delta = ev.getY() - mSwipeStartY;
nicolasroard9737f3a2013-08-14 11:14:47 -07002762 float distance = mHandledSwipeView.getHeight();
2763 if (direction == CategoryView.VERTICAL) {
2764 delta = ev.getX() - mSwipeStartX;
2765 mHandledSwipeView.setTranslationX(delta);
2766 distance = mHandledSwipeView.getWidth();
2767 } else {
2768 mHandledSwipeView.setTranslationY(delta);
2769 }
nicolasroard860af322013-08-08 20:47:28 -07002770 delta = Math.abs(delta);
nicolasroard9737f3a2013-08-14 11:14:47 -07002771 float transparency = Math.min(1, delta / distance);
nicolasroard860af322013-08-08 20:47:28 -07002772 mHandledSwipeView.setAlpha(1.f - transparency);
2773 mHandledSwipeViewLastDelta = delta;
2774 }
2775 if (ev.getActionMasked() == MotionEvent.ACTION_CANCEL
2776 || ev.getActionMasked() == MotionEvent.ACTION_UP) {
nicolasroard9737f3a2013-08-14 11:14:47 -07002777 mHandledSwipeView.setTranslationX(0);
nicolasroard860af322013-08-08 20:47:28 -07002778 mHandledSwipeView.setTranslationY(0);
2779 mHandledSwipeView.setAlpha(1.f);
2780 mHandlingSwipeButton = false;
nicolasroard9737f3a2013-08-14 11:14:47 -07002781 float distance = mHandledSwipeView.getHeight();
2782 if (direction == CategoryView.VERTICAL) {
2783 distance = mHandledSwipeView.getWidth();
2784 }
2785 if (mHandledSwipeViewLastDelta > distance) {
nicolasroard860af322013-08-08 20:47:28 -07002786 ((SwipableView) mHandledSwipeView).delete();
2787 }
jinwu4fafa7a2017-04-07 13:27:48 +08002788 }
nicolasroard860af322013-08-08 20:47:28 -07002789 return true;
2790 }
2791 return super.dispatchTouchEvent(ev);
2792 }
nicolasroard9f452e02013-08-23 00:10:01 -07002793
nicolasroard32cc4dd2013-09-06 17:21:55 -07002794 public Point mHintTouchPoint = new Point();
2795
2796 public Point hintTouchPoint(View view) {
2797 int location[] = new int[2];
2798 view.getLocationOnScreen(location);
2799 int x = mHintTouchPoint.x - location[0];
2800 int y = mHintTouchPoint.y - location[1];
2801 return new Point(x, y);
2802 }
2803
nicolasroard9f452e02013-08-23 00:10:01 -07002804 public void startTouchAnimation(View target, float x, float y) {
nicolasroard9f452e02013-08-23 00:10:01 -07002805 int location[] = new int[2];
2806 target.getLocationOnScreen(location);
nicolasroard32cc4dd2013-09-06 17:21:55 -07002807 mHintTouchPoint.x = (int) (location[0] + x);
2808 mHintTouchPoint.y = (int) (location[1] + y);
nicolasroard9f452e02013-08-23 00:10:01 -07002809 }
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302810
2811 public void setScaleImage(boolean isScaled) {
Chao Zhang7deb94a2016-03-14 11:10:20 +08002812 mImageShow.scaleImage(isScaled, getBaseContext());
Ravi Banuri49f14dd2015-10-21 15:54:59 +05302813 }
wqi99b35c12016-05-03 17:17:10 +08002814
2815 public void saveEditorCropState(int select) {
2816 mEditrCropButtonSelect = select;
2817 }
2818
2819 public boolean isReloadByConfigurationChanged() {
2820 return mIsReloadByConfigurationChanged;
2821 }
2822
2823 public boolean isShowEditCropPanel() {
2824 if (mCurrentEditor == null) {
2825 return false;
2826 }
2827 Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(
2828 MainPanel.FRAGMENT_TAG);
2829 if (currentPanel instanceof MainPanel) {
2830 return false;
2831 }
2832 return mCurrentEditor.getID() == EditorCrop.ID;
2833 }
2834
2835 public int getEditorCropButtonSelect() {
2836 return mEditrCropButtonSelect;
2837 }
2838
zhuwad6505d2017-07-26 15:09:37 +08002839 @Override
2840 protected void onGetPermissionsFailure() {
2841 finish();
2842 }
2843
2844 @Override
2845 protected void onGetPermissionsSuccess() {
2846 if (canUpdataUI) {
2847 updateUIAfterServiceStarted();
2848 }
2849 }
nicolasroard0d7cdf82012-09-25 14:27:56 -07002850}