From e94e766335f3689d2bbee84c7c003207149cbc8f Mon Sep 17 00:00:00 2001 From: Jack Yoo Date: Wed, 18 May 2016 11:34:04 -0700 Subject: Gallery2: Adjusting TrueScanner UI interaction To make it work with new UI frame. Change-Id: Ib538d7921835c0f5231d3f4fba18dd9c8e4f35b4 CRs-Fixed: 1020968 --- res/drawable/ic_glare_remove_button_off.xml | 42 +++++ res/drawable/ic_glare_remove_button_on.xml | 42 +++++ res/values/strings.xml | 2 + .../gallery3d/filtershow/FilterShowActivity.java | 20 ++- .../filtershow/category/TrueScannerPanel.java | 97 +++++++++++ .../filtershow/editors/TrueScannerEditor.java | 26 ++- .../filtershow/filters/BaseFiltersManager.java | 2 - .../filtershow/filters/SeeStraightActs.java | 18 ++- .../filtershow/filters/TrueScannerActs.java | 81 +++++----- .../filters/TrueScannerWhiteBoardActs.java | 1 + .../filtershow/imageshow/ImageTrueScanner.java | 177 +++++++++++++++++---- 11 files changed, 424 insertions(+), 84 deletions(-) create mode 100644 res/drawable/ic_glare_remove_button_off.xml create mode 100644 res/drawable/ic_glare_remove_button_on.xml create mode 100644 src/com/android/gallery3d/filtershow/category/TrueScannerPanel.java diff --git a/res/drawable/ic_glare_remove_button_off.xml b/res/drawable/ic_glare_remove_button_off.xml new file mode 100644 index 000000000..0a07b4572 --- /dev/null +++ b/res/drawable/ic_glare_remove_button_off.xml @@ -0,0 +1,42 @@ + + + + + + diff --git a/res/drawable/ic_glare_remove_button_on.xml b/res/drawable/ic_glare_remove_button_on.xml new file mode 100644 index 000000000..59ea03b5c --- /dev/null +++ b/res/drawable/ic_glare_remove_button_on.xml @@ -0,0 +1,42 @@ + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 424d89e24..52016e301 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1189,6 +1189,8 @@ CHAR LIMIT = NONE] --> drawer Normal WhiteBoard + TrueScanner + Remove Glare Haze Buster See Straight Input image is too small to process. diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index b5c4b4a91..f0af615c0 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -90,6 +90,7 @@ import com.android.gallery3d.filtershow.category.EditorCropPanel; import com.android.gallery3d.filtershow.category.MainPanel; import com.android.gallery3d.filtershow.category.StraightenPanel; import com.android.gallery3d.filtershow.category.SwipableView; +import com.android.gallery3d.filtershow.category.TrueScannerPanel; import com.android.gallery3d.filtershow.data.UserPresetsManager; import com.android.gallery3d.filtershow.editors.BasicEditor; import com.android.gallery3d.filtershow.editors.Editor; @@ -410,6 +411,22 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL }.run(); return; } + if (currentId == TrueScannerEditor.ID) { + new Runnable() { + @Override + public void run() { + TrueScannerPanel panel = new TrueScannerPanel(); + FragmentTransaction transaction = + getSupportFragmentManager().beginTransaction(); + transaction.remove(getSupportFragmentManager().findFragmentByTag( + MainPanel.FRAGMENT_TAG)); + transaction.replace(R.id.main_panel_container, panel, + MainPanel.FRAGMENT_TAG); + transaction.commit(); + } + }.run(); + return; + } Runnable showEditor = new Runnable() { @Override public void run() { @@ -444,8 +461,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL } private boolean useStraightenPanel(int EditorID) { - return (EditorID == EditorStraighten.ID || EditorID == TrueScannerEditor.ID - || EditorID == HazeBusterEditor.ID || EditorID == SeeStraightEditor.ID); + return (EditorID == EditorStraighten.ID || EditorID == HazeBusterEditor.ID || EditorID == SeeStraightEditor.ID); } public void leaveSeekBarPanel() { diff --git a/src/com/android/gallery3d/filtershow/category/TrueScannerPanel.java b/src/com/android/gallery3d/filtershow/category/TrueScannerPanel.java new file mode 100644 index 000000000..535273da9 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/category/TrueScannerPanel.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.gallery3d.filtershow.category; + + +import android.app.Activity; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.view.View; +import android.support.annotation.Nullable; +import com.android.gallery3d.filtershow.FilterShowActivity; +import com.android.gallery3d.filtershow.editors.TrueScannerEditor; + +import org.codeaurora.gallery.R; + +public class TrueScannerPanel extends BasicGeometryPanel { + private TrueScannerEditor mTrueScannerEditor; + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + FilterShowActivity filterShowActivity = (FilterShowActivity) activity; + mTrueScannerEditor = (TrueScannerEditor) filterShowActivity.getEditor(TrueScannerEditor.ID); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mEditorName.setText(R.string.truescanner); + + mBottomPanel.setVisibility(View.VISIBLE); + mTrueScannerEditor.initCords(); + final FilterShowActivity activity = (FilterShowActivity) getActivity(); + mExitButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + activity.cancelCurrentFilter(); + activity.backToMain(); + activity.setActionBar(); + } + }); + mApplyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mTrueScannerEditor.finalApplyCalled(); + activity.backToMain(); + activity.setActionBar(); + } + }); + } + + @Override + protected void initPanels() { + super.initPanels(); + int size = mPanels.length; + for (int i = 0; i < size; i++) { + View view = mPanels[i]; + view.setVisibility(View.GONE); + } + } + + @Override + public void onDetach() { + if (mTrueScannerEditor != null) { + mTrueScannerEditor.detach(); + } + super.onDetach(); + } + +} diff --git a/src/com/android/gallery3d/filtershow/editors/TrueScannerEditor.java b/src/com/android/gallery3d/filtershow/editors/TrueScannerEditor.java index 5ecee6997..d184a3cdf 100644 --- a/src/com/android/gallery3d/filtershow/editors/TrueScannerEditor.java +++ b/src/com/android/gallery3d/filtershow/editors/TrueScannerEditor.java @@ -30,19 +30,27 @@ package com.android.gallery3d.filtershow.editors; import android.content.Context; +import android.graphics.Bitmap; +import android.util.Log; +import android.view.View; import android.widget.FrameLayout; +import android.widget.SeekBar; -import org.codeaurora.gallery.R; +import com.android.gallery3d.filtershow.controller.Parameter; import com.android.gallery3d.filtershow.filters.FilterBasicRepresentation; +import com.android.gallery3d.filtershow.filters.FilterRepresentation; +import com.android.gallery3d.filtershow.filters.FilterStraightenRepresentation; import com.android.gallery3d.filtershow.filters.TrueScannerActs; import com.android.gallery3d.filtershow.imageshow.ImageShow; import com.android.gallery3d.filtershow.imageshow.ImageTrueScanner; import com.android.gallery3d.filtershow.imageshow.MasterImage; +import org.codeaurora.gallery.R; + /** * The editor with no slider for filters without UI */ -public class TrueScannerEditor extends Editor { +public class TrueScannerEditor extends Editor{ public final static int ID = R.id.trueScannerEditor; private final String LOGTAG = "TrueScannerEditor"; protected ImageTrueScanner mImageTrueScanner; @@ -51,12 +59,11 @@ public class TrueScannerEditor extends Editor { super(ID); } - protected TrueScannerEditor(int id) { - super(id); - } - - public boolean useUtilityPanel() { - return true; + public void initCords() { + mImageTrueScanner.setDetectedPoints(getPoints(MasterImage.getImage().getHighresImage()), + MasterImage.getImage().getHighresImage().getWidth(), + MasterImage.getImage().getHighresImage().getHeight()); + mImageTrueScanner.invalidate(); } @Override @@ -64,10 +71,12 @@ public class TrueScannerEditor extends Editor { super.createEditor(context, frameLayout); mView = mImageShow = mImageTrueScanner = new ImageTrueScanner(context); mImageTrueScanner.setEditor(this); + mImageTrueScanner.setCordsUI(true); } @Override public void finalApplyCalled() { + mImageTrueScanner.setCordsUI(false); super.finalApplyCalled(); } @@ -81,4 +90,5 @@ public class TrueScannerEditor extends Editor { return false; } + private native int[] getPoints(Bitmap orgBitmap); } diff --git a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java index 4a2e2d830..e6ac0a6ef 100644 --- a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java +++ b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java @@ -163,7 +163,6 @@ public abstract class BaseFiltersManager implements FiltersManagerInterface { protected void addTrueScannerClasses(Vector filters) { filters.add(TrueScannerActs.class); - filters.add(TrueScannerWhiteBoardActs.class); } protected void addHazeBusterClasses(Vector filters) { @@ -368,7 +367,6 @@ public abstract class BaseFiltersManager implements FiltersManagerInterface { public void addTrueScanner() { mTrueScanner.add(getRepresentation(TrueScannerActs.class)); - mTrueScanner.add(getRepresentation(TrueScannerWhiteBoardActs.class)); } public void addHazeBuster() { diff --git a/src/com/android/gallery3d/filtershow/filters/SeeStraightActs.java b/src/com/android/gallery3d/filtershow/filters/SeeStraightActs.java index 664b7b8b5..047c036f7 100644 --- a/src/com/android/gallery3d/filtershow/filters/SeeStraightActs.java +++ b/src/com/android/gallery3d/filtershow/filters/SeeStraightActs.java @@ -40,7 +40,8 @@ public class SeeStraightActs extends SimpleImageFilter { public static final String SERIALIZATION_NAME = "SeeStraightActs"; private static final int MIN_WIDTH = 512; private static final int MIN_HEIGHT = 512; - private static final int MIN_INPUT_REQUIREMENT = 640; + private static final int MIN_WIDTH_REQUIREMENT = 640; + private static final int MIN_HEIGHT_REQUIREMENT = 480; private static final boolean DEBUG = true; private static boolean isSeeStraightEnabled = true; @@ -75,6 +76,19 @@ public class SeeStraightActs extends SimpleImageFilter { private native int[] processImage(int width, int height, Bitmap srcBitmap, Bitmap dstBitmap); + private boolean checkSize(int w, int h) { + int t; + if(w < h) { + t = w; + w = h; + h = t; + } + if(w >= MIN_WIDTH_REQUIREMENT && h >= MIN_HEIGHT_REQUIREMENT) { + return true; + } + return false; + } + @Override public Bitmap apply(Bitmap bitmap, float not_use, int quality) { if(bitmap == null) @@ -85,7 +99,7 @@ public class SeeStraightActs extends SimpleImageFilter { if(width <= MIN_WIDTH && height <= MIN_HEIGHT) return bitmap; - if(width <= MIN_INPUT_REQUIREMENT || height <= MIN_INPUT_REQUIREMENT) { + if(!checkSize(width, height)) { sActivity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(sActivity, sActivity.getResources().getString(R.string.seestraight_input_image_is_small), Toast.LENGTH_SHORT).show(); diff --git a/src/com/android/gallery3d/filtershow/filters/TrueScannerActs.java b/src/com/android/gallery3d/filtershow/filters/TrueScannerActs.java index 143d4ddf6..da6e538ab 100644 --- a/src/com/android/gallery3d/filtershow/filters/TrueScannerActs.java +++ b/src/com/android/gallery3d/filtershow/filters/TrueScannerActs.java @@ -29,17 +29,21 @@ package com.android.gallery3d.filtershow.filters; +import android.app.ProgressDialog; import android.graphics.Bitmap; import android.util.Log; +import android.view.View; +import android.widget.SeekBar; import android.widget.Toast; import org.codeaurora.gallery.R; import com.android.gallery3d.app.GalleryActivity; import com.android.gallery3d.filtershow.FilterShowActivity; +import com.android.gallery3d.filtershow.controller.Parameter; import com.android.gallery3d.filtershow.editors.TrueScannerEditor; import com.android.gallery3d.filtershow.imageshow.ImageTrueScanner; import com.android.gallery3d.filtershow.imageshow.MasterImage; - +import com.android.gallery3d.ui.MenuExecutor; import static com.android.gallery3d.filtershow.imageshow.ImageTrueScanner.*; public class TrueScannerActs extends SimpleImageFilter { @@ -54,8 +58,8 @@ public class TrueScannerActs extends SimpleImageFilter { protected boolean isWhiteBoard = false; private boolean mLocked = false; private Bitmap rectifiedImage = null; - private Bitmap whiteboardImage = null; private int[] oldPts = new int[POINTS_LEN]; + private ProgressDialog mProgressDialog; private void printDebug(String str) { if(DEBUG) @@ -87,14 +91,8 @@ public class TrueScannerActs extends SimpleImageFilter { return representation; } - private native int[] processImage(Bitmap orgBitmap, Bitmap rectifiedBitmap, Bitmap whiteboardBitmap, int[] cornerPts); - private native int[] getPoints(Bitmap orgBitmap); - - public static int[] getPoints() { - if(!isPointsAcquired) - return null; - return mAcquiredPoints; - } + private native int[] processImage(Bitmap orgBitmap, Bitmap rectifiedBitmap, int[] cornerPts); + private native int enhanceImage(Bitmap orgBitmap, Bitmap rectifiedBitmap); private synchronized boolean acquireLock(boolean isAcquiring) { if(mLocked != isAcquiring) { @@ -104,28 +102,35 @@ public class TrueScannerActs extends SimpleImageFilter { return false; } - private boolean isReNewed(int pts[]) { - if(rectifiedImage == null || whiteboardImage == null) { - return true; - } else { - for(int i=0; i mGlareButtonX - CHECK_RADIUS*2 && x < mGlareButtonX + CHECK_RADIUS*2 && + y > mGlareButtonY - CHECK_RADIUS*2 && y < mGlareButtonY + CHECK_RADIUS*2) { + mIsGlareButtonPressed = !mIsGlareButtonPressed; + } } private void moveTouch(float x, float y) { @@ -116,36 +160,36 @@ public class ImageTrueScanner extends ImageShow { switch(i) { case 0: - if(mSegPoints[0] < mBitmapBound.left) mSegPoints[0] = (int)mBitmapBound.left; if(mSegPoints[0] >= mSegPoints[2]-mMarginalGapX) mSegPoints[0] = mSegPoints[2]-mMarginalGapX; - if(mSegPoints[1] < mBitmapBound.top) mSegPoints[1] = (int)mBitmapBound.top; if(mSegPoints[1] >= mSegPoints[7]-mMarginalGapY) mSegPoints[1] = mSegPoints[7]-mMarginalGapY; + if(mSegPoints[0] < mBitmapBound.left) mSegPoints[0] = (int)mBitmapBound.left; + if(mSegPoints[1] < mBitmapBound.top) mSegPoints[1] = (int)mBitmapBound.top; break; case 1: - if(mSegPoints[2] > mBitmapBound.right) mSegPoints[2] = (int)mBitmapBound.right; if(mSegPoints[2] <= mSegPoints[0]+mMarginalGapX) mSegPoints[2] = mSegPoints[0]+mMarginalGapX; - if(mSegPoints[3] < mBitmapBound.top) mSegPoints[3] = (int)mBitmapBound.top; if(mSegPoints[3] >= mSegPoints[5]-mMarginalGapY) mSegPoints[3] = mSegPoints[5]-mMarginalGapY; + if(mSegPoints[2] > mBitmapBound.right) mSegPoints[2] = (int)mBitmapBound.right; + if(mSegPoints[3] < mBitmapBound.top) mSegPoints[3] = (int)mBitmapBound.top; break; case 2: - if(mSegPoints[4] > mBitmapBound.right) mSegPoints[4] = (int)mBitmapBound.right; if(mSegPoints[4] <= mSegPoints[6]+mMarginalGapX) mSegPoints[4] = mSegPoints[6]+mMarginalGapX; - if(mSegPoints[5] > mBitmapBound.bottom) mSegPoints[5] = (int)mBitmapBound.bottom; if(mSegPoints[5] <= mSegPoints[3]+mMarginalGapY) mSegPoints[5] = mSegPoints[3]+mMarginalGapY; + if(mSegPoints[4] > mBitmapBound.right) mSegPoints[4] = (int)mBitmapBound.right; + if(mSegPoints[5] > mBitmapBound.bottom) mSegPoints[5] = (int)mBitmapBound.bottom; break; case 3: - if(mSegPoints[6] < mBitmapBound.left) mSegPoints[6] = (int)mBitmapBound.left; if(mSegPoints[6] >= mSegPoints[4]-mMarginalGapX) mSegPoints[6] = mSegPoints[4]-mMarginalGapX; - if(mSegPoints[7] > mBitmapBound.bottom) mSegPoints[7] = (int)mBitmapBound.bottom; if(mSegPoints[7] <= mSegPoints[1]+mMarginalGapY) mSegPoints[7] = mSegPoints[1]+mMarginalGapY; + if(mSegPoints[6] < mBitmapBound.left) mSegPoints[6] = (int)mBitmapBound.left; + if(mSegPoints[7] > mBitmapBound.bottom) mSegPoints[7] = (int)mBitmapBound.bottom; break; } } @@ -185,17 +229,36 @@ public class ImageTrueScanner extends ImageShow { mDisplayMatrix.mapRect(mBitmapBound); } + public void setDetectedPoints(int[] pts, int width, int height) { + synchronized (this) { + mDetectedPoints = new int[10]; + for (int i = 0; i < 8; i++) { + mDetectedPoints[i] = pts[i]; + } + mDetectedPoints[8] = width; + mDetectedPoints[9] = height; + } + isDetectedPointsApplied = false; + invalidate(); + } + + private int[] getDetectedPoints() { + synchronized (this) { + return mDetectedPoints; + } + } + private void getInitialInput() { - int[] points = TrueScannerActs.getPoints(); + int[] points = getDetectedPoints(); if (points == null) { - mSegPoints[0] = (int) mBitmapBound.left; - mSegPoints[1] = (int) mBitmapBound.top; - mSegPoints[2] = (int) mBitmapBound.right; - mSegPoints[3] = (int) mBitmapBound.top; - mSegPoints[4] = (int) mBitmapBound.right; - mSegPoints[5] = (int) mBitmapBound.bottom; - mSegPoints[6] = (int) mBitmapBound.left; - mSegPoints[7] = (int) mBitmapBound.bottom; + mSegPoints[0] = (int) (mBitmapBound.centerX() - mBitmapBound.width()/4); + mSegPoints[1] = (int) (mBitmapBound.centerY() - mBitmapBound.height()/4); + mSegPoints[2] = (int) (mBitmapBound.centerX() + mBitmapBound.width()/4); + mSegPoints[3] = (int) (mBitmapBound.centerY() - mBitmapBound.height()/4); + mSegPoints[4] = (int) (mBitmapBound.centerX() + mBitmapBound.width()/4); + mSegPoints[5] = (int) (mBitmapBound.centerY() + mBitmapBound.height()/4); + mSegPoints[6] = (int) (mBitmapBound.centerX() - mBitmapBound.width()/4); + mSegPoints[7] = (int) (mBitmapBound.centerY() + mBitmapBound.height()/4); } else { float xScale = mBitmapBound.width()/points[8]; float yScale = mBitmapBound.height()/points[9]; @@ -207,7 +270,6 @@ public class ImageTrueScanner extends ImageShow { mSegPoints[5] = (int) (mBitmapBound.top + points[5]*yScale); mSegPoints[6] = (int) (mBitmapBound.left + points[6]*xScale); mSegPoints[7] = (int) (mBitmapBound.top + points[7]*yScale); - isPointsAcquired = true; } mSegPoints[8] = (int)mBitmapBound.width(); mSegPoints[9] = (int)mBitmapBound.height(); @@ -226,17 +288,78 @@ public class ImageTrueScanner extends ImageShow { mBitmap.getWidth(), mBitmap.getHeight(), canvas.getWidth(), canvas.getHeight()); getBitmapBound(); } - if(!isPointsAcquired) { + if(!isDetectedPointsApplied) { getInitialInput(); + isDetectedPointsApplied = true; } canvas.drawBitmap(mBitmap, mDisplayMatrix, null); - drawSegments(canvas); + if(mIsCordsUIShowing) { + drawSegments(canvas); + } + drawGlareRemovalButton(canvas); } - private void drawSegments(Canvas canvas) - { - for(int i=0; i