From af70c5243dadf2d2e64896b590218756abb74614 Mon Sep 17 00:00:00 2001 From: dnldsht Date: Wed, 19 Oct 2016 17:56:22 +0200 Subject: [PATCH] clean --- app/build.gradle | 7 +- .../leafpic/util/inapppurchase/IabHelper.java | 0 build.gradle | 2 +- gradlew | 0 gradlew.bat | 90 -- photoview/.gitignore | 1 - photoview/build.gradle | 25 - photoview/proguard-rules.pro | 17 - photoview/src/main/AndroidManifest.xml | 11 - .../java/uk/co/senab/photoview/Compat.java | 60 - .../photoview/DefaultOnDoubleTapListener.java | 100 -- .../uk/co/senab/photoview/IPhotoView.java | 269 ---- .../java/uk/co/senab/photoview/PhotoView.java | 273 ---- .../co/senab/photoview/PhotoViewAttacher.java | 1192 ----------------- .../gestures/CupcakeGestureDetector.java | 149 --- .../gestures/EclairGestureDetector.java | 91 -- .../gestures/FroyoGestureDetector.java | 72 - .../photoview/gestures/GestureDetector.java | 30 - .../photoview/gestures/OnGestureListener.java | 27 - .../gestures/VersionedGestureDetector.java | 42 - .../uk/co/senab/photoview/log/LogManager.java | 35 - .../uk/co/senab/photoview/log/Logger.java | 42 - .../co/senab/photoview/log/LoggerDefault.java | 76 -- .../scrollerproxy/GingerScroller.java | 61 - .../photoview/scrollerproxy/IcsScroller.java | 33 - .../scrollerproxy/PreGingerScroller.java | 58 - .../scrollerproxy/ScrollerProxy.java | 48 - photoview/src/main/res/values/strings.xml | 3 - scripts/crowdin.sh | 0 settings.gradle | 2 +- 30 files changed, 6 insertions(+), 2810 deletions(-) mode change 100755 => 100644 app/src/main/java/org/horaapps/leafpic/util/inapppurchase/IabHelper.java mode change 100755 => 100644 gradlew delete mode 100644 gradlew.bat delete mode 100644 photoview/.gitignore delete mode 100644 photoview/build.gradle delete mode 100644 photoview/proguard-rules.pro delete mode 100644 photoview/src/main/AndroidManifest.xml delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/Compat.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/DefaultOnDoubleTapListener.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/IPhotoView.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/PhotoView.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/PhotoViewAttacher.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/gestures/CupcakeGestureDetector.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/gestures/EclairGestureDetector.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/gestures/FroyoGestureDetector.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/gestures/GestureDetector.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/gestures/OnGestureListener.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/gestures/VersionedGestureDetector.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/log/LogManager.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/log/Logger.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/log/LoggerDefault.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/GingerScroller.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/IcsScroller.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/PreGingerScroller.java delete mode 100755 photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/ScrollerProxy.java delete mode 100644 photoview/src/main/res/values/strings.xml mode change 100755 => 100644 scripts/crowdin.sh diff --git a/app/build.gradle b/app/build.gradle index d2fdf9019..f3334e7a5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,13 +4,14 @@ repositories { jcenter() maven { url "http://repo1.maven.org/maven2" } maven { url "http://dl.bintray.com/dasar/maven" } + maven { url "https://jitpack.io" } } -project.ext.supportLib = "24.1.1" +project.ext.supportLib = "24.2.1" android { compileSdkVersion 24 - buildToolsVersion "24.0.1" + buildToolsVersion "24.0.3" defaultConfig { applicationId "org.horaapps.leafpic" minSdkVersion 19 @@ -76,6 +77,6 @@ dependencies { compile 'com.drewnoakes:metadata-extractor:2.9.1' compile 'org.jetbrains:annotations-java5:15.0' compile 'com.turingtechnologies.materialscrollbar:lib:10.0.3' - compile project(':photoview') + compile 'com.github.chrisbanes:PhotoView:1.3.0' compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0' } diff --git a/app/src/main/java/org/horaapps/leafpic/util/inapppurchase/IabHelper.java b/app/src/main/java/org/horaapps/leafpic/util/inapppurchase/IabHelper.java old mode 100755 new mode 100644 diff --git a/build.gradle b/build.gradle index a984351db..5acdc8953 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.1' classpath "gradle.plugin.com.gladed.gradle.androidgitversion:gradle-android-git-version:0.2.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index aec99730b..000000000 --- a/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/photoview/.gitignore b/photoview/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/photoview/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/photoview/build.gradle b/photoview/build.gradle deleted file mode 100644 index 2ade8f7c1..000000000 --- a/photoview/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 24 - buildToolsVersion "24.0.0" - - defaultConfig { - minSdkVersion 15 - targetSdkVersion 24 - versionCode 1 - versionName "1.0" - - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:24.1.1' -} diff --git a/photoview/proguard-rules.pro b/photoview/proguard-rules.pro deleted file mode 100644 index 8dfdd72e4..000000000 --- a/photoview/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /home/dnld/Android/android-sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/photoview/src/main/AndroidManifest.xml b/photoview/src/main/AndroidManifest.xml deleted file mode 100644 index 26d46ff88..000000000 --- a/photoview/src/main/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/photoview/src/main/java/uk/co/senab/photoview/Compat.java b/photoview/src/main/java/uk/co/senab/photoview/Compat.java deleted file mode 100755 index b541f4492..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/Compat.java +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview; - -import android.annotation.TargetApi; -import android.os.Build; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.view.MotionEvent; -import android.view.View; - -public class Compat { - - private static final int SIXTY_FPS_INTERVAL = 1000 / 60; - - public static void postOnAnimation(View view, Runnable runnable) { - if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { - postOnAnimationJellyBean(view, runnable); - } else { - view.postDelayed(runnable, SIXTY_FPS_INTERVAL); - } - } - - @TargetApi(16) - private static void postOnAnimationJellyBean(View view, Runnable runnable) { - view.postOnAnimation(runnable); - } - - public static int getPointerIndex(int action) { - if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) - return getPointerIndexHoneyComb(action); - else - return getPointerIndexEclair(action); - } - - @SuppressWarnings("deprecation") - @TargetApi(VERSION_CODES.ECLAIR) - private static int getPointerIndexEclair(int action) { - return (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; - } - - @TargetApi(VERSION_CODES.HONEYCOMB) - private static int getPointerIndexHoneyComb(int action) { - return (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - } - -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/DefaultOnDoubleTapListener.java b/photoview/src/main/java/uk/co/senab/photoview/DefaultOnDoubleTapListener.java deleted file mode 100755 index ca6144598..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/DefaultOnDoubleTapListener.java +++ /dev/null @@ -1,100 +0,0 @@ -package uk.co.senab.photoview; - -import android.graphics.RectF; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.widget.ImageView; - -/** - * Provided default implementation of GestureDetector.OnDoubleTapListener, to be overridden with custom behavior, if needed - *

 

- * To be used via {@link uk.co.senab.photoview.PhotoViewAttacher#setOnDoubleTapListener(GestureDetector.OnDoubleTapListener)} - */ -public class DefaultOnDoubleTapListener implements GestureDetector.OnDoubleTapListener { - - private PhotoViewAttacher photoViewAttacher; - - /** - * Default constructor - * - * @param photoViewAttacher PhotoViewAttacher to bind to - */ - public DefaultOnDoubleTapListener(PhotoViewAttacher photoViewAttacher) { - setPhotoViewAttacher(photoViewAttacher); - } - - /** - * Allows to change PhotoViewAttacher within range of single instance - * - * @param newPhotoViewAttacher PhotoViewAttacher to bind to - */ - public void setPhotoViewAttacher(PhotoViewAttacher newPhotoViewAttacher) { - this.photoViewAttacher = newPhotoViewAttacher; - } - - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - if (this.photoViewAttacher == null) - return false; - - ImageView imageView = photoViewAttacher.getImageView(); - - if (null != photoViewAttacher.getOnPhotoTapListener()) { - final RectF displayRect = photoViewAttacher.getDisplayRect(); - - if (null != displayRect) { - final float x = e.getX(), y = e.getY(); - - // Check to see if the user tapped on the photo - if (displayRect.contains(x, y)) { - - float xResult = (x - displayRect.left) - / displayRect.width(); - float yResult = (y - displayRect.top) - / displayRect.height(); - - photoViewAttacher.getOnPhotoTapListener().onPhotoTap(imageView, xResult, yResult); - return true; - }else{ - photoViewAttacher.getOnPhotoTapListener().onOutsidePhotoTap(); - } - } - } - if (null != photoViewAttacher.getOnViewTapListener()) { - photoViewAttacher.getOnViewTapListener().onViewTap(imageView, e.getX(), e.getY()); - } - - return false; - } - - @Override - public boolean onDoubleTap(MotionEvent ev) { - if (photoViewAttacher == null) - return false; - - try { - float scale = photoViewAttacher.getScale(); - float x = ev.getX(); - float y = ev.getY(); - - if (scale < photoViewAttacher.getMediumScale()) { - photoViewAttacher.setScale(photoViewAttacher.getMediumScale(), x, y, true); - } else if (scale >= photoViewAttacher.getMediumScale() && scale < photoViewAttacher.getMaximumScale()) { - photoViewAttacher.setScale(photoViewAttacher.getMaximumScale(), x, y, true); - } else { - photoViewAttacher.setScale(photoViewAttacher.getMinimumScale(), x, y, true); - } - } catch (ArrayIndexOutOfBoundsException e) { - // Can sometimes happen when getX() and getY() is called - } - - return true; - } - - @Override - public boolean onDoubleTapEvent(MotionEvent e) { - // Wait for the confirmed onDoubleTap() instead - return false; - } - -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/IPhotoView.java b/photoview/src/main/java/uk/co/senab/photoview/IPhotoView.java deleted file mode 100755 index 162081f26..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/IPhotoView.java +++ /dev/null @@ -1,269 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview; - -import android.graphics.Bitmap; -import android.graphics.Matrix; -import android.graphics.RectF; -import android.view.GestureDetector; -import android.view.View; -import android.widget.ImageView; - - -public interface IPhotoView { - - float DEFAULT_MAX_SCALE = 3.0f; - float DEFAULT_MID_SCALE = 1.75f; - float DEFAULT_MIN_SCALE = 1.0f; - int DEFAULT_ZOOM_DURATION = 200; - - /** - * Returns true if the PhotoView is set to allow zooming of Photos. - * - * @return true if the PhotoView allows zooming. - */ - boolean canZoom(); - - /** - * Gets the Display Rectangle of the currently displayed Drawable. The Rectangle is relative to - * this View and includes all scaling and translations. - * - * @return - RectF of Displayed Drawable - */ - RectF getDisplayRect(); - - /** - * Sets the Display Matrix of the currently displayed Drawable. The Rectangle is considered - * relative to this View and includes all scaling and translations. - * - * @param finalMatrix target matrix to set PhotoView to - * @return - true if rectangle was applied successfully - */ - boolean setDisplayMatrix(Matrix finalMatrix); - - /** - * Copies the Display Matrix of the currently displayed Drawable. The Rectangle is considered - * relative to this View and includes all scaling and translations. - * - * @param matrix target matrix to copy to - */ - void getDisplayMatrix(Matrix matrix); - - /** - * @return The current minimum scale level. What this value represents depends on the current - * {@link ImageView.ScaleType}. - */ - float getMinimumScale(); - - /** - * @return The current medium scale level. What this value represents depends on the current - * {@link ImageView.ScaleType}. - */ - float getMediumScale(); - - /** - * @return The current maximum scale level. What this value represents depends on the current - * {@link ImageView.ScaleType}. - */ - float getMaximumScale(); - - /** - * Returns the current scale value - * - * @return float - current scale value - */ - float getScale(); - - /** - * Return the current scale type in use by the ImageView. - * - * @return current ImageView.ScaleType - */ - ImageView.ScaleType getScaleType(); - - /** - * Whether to allow the ImageView's parent to intercept the touch event when the photo is scroll - * to it's horizontal edge. - * - * @param allow whether to allow intercepting by parent element or not - */ - void setAllowParentInterceptOnEdge(boolean allow); - - /** - * Sets the minimum scale level. What this value represents depends on the current {@link - * ImageView.ScaleType}. - * - * @param minimumScale minimum allowed scale - */ - void setMinimumScale(float minimumScale); - - /** - * Sets the medium scale level. What this value represents depends on the current {@link ImageView.ScaleType}. - * - * @param mediumScale medium scale preset - */ - void setMediumScale(float mediumScale); - - /** - * Sets the maximum scale level. What this value represents depends on the current {@link - * ImageView.ScaleType}. - * - * @param maximumScale maximum allowed scale preset - */ - void setMaximumScale(float maximumScale); - - /** - * Allows to set all three scale levels at once, so you don't run into problem with setting - * medium/minimum scale before the maximum one - * - * @param minimumScale minimum allowed scale - * @param mediumScale medium allowed scale - * @param maximumScale maximum allowed scale preset - */ - void setScaleLevels(float minimumScale, float mediumScale, float maximumScale); - - /** - * Register a callback to be invoked when the Photo displayed by this view is long-pressed. - * - * @param listener - Listener to be registered. - */ - void setOnLongClickListener(View.OnLongClickListener listener); - - /** - * Register a callback to be invoked when the Matrix has changed for this View. An example would - * be the user panning or scaling the Photo. - * - * @param listener - Listener to be registered. - */ - void setOnMatrixChangeListener(PhotoViewAttacher.OnMatrixChangedListener listener); - - /** - * Register a callback to be invoked when the Photo displayed by this View is tapped with a - * single tap. - * - * @param listener - Listener to be registered. - */ - void setOnPhotoTapListener(PhotoViewAttacher.OnPhotoTapListener listener); - - /** - * Register a callback to be invoked when the View is tapped with a single tap. - * - * @param listener - Listener to be registered. - */ - void setOnViewTapListener(PhotoViewAttacher.OnViewTapListener listener); - - /** - * Enables rotation via PhotoView internal functions. - * - * @param rotationDegree - Degree to rotate PhotoView to, should be in range 0 to 360 - */ - void setRotationTo(float rotationDegree); - - /** - * Enables rotation via PhotoView internal functions. - * - * @param rotationDegree - Degree to rotate PhotoView by, should be in range 0 to 360 - */ - void setRotationBy(float rotationDegree); - - /** - * Changes the current scale to the specified value. - * - * @param scale - Value to scale to - */ - void setScale(float scale); - - /** - * Changes the current scale to the specified value. - * - * @param scale - Value to scale to - * @param animate - Whether to animate the scale - */ - void setScale(float scale, boolean animate); - - /** - * Changes the current scale to the specified value, around the given focal point. - * - * @param scale - Value to scale to - * @param focalX - X Focus Point - * @param focalY - Y Focus Point - * @param animate - Whether to animate the scale - */ - void setScale(float scale, float focalX, float focalY, boolean animate); - - /** - * Controls how the image should be resized or moved to match the size of the ImageView. Any - * scaling or panning will happen within the confines of this {@link - * ImageView.ScaleType}. - * - * @param scaleType - The desired scaling mode. - */ - void setScaleType(ImageView.ScaleType scaleType); - - /** - * Allows you to enable/disable the zoom functionality on the ImageView. When disable the - * ImageView reverts to using the FIT_CENTER matrix. - * - * @param zoomable - Whether the zoom functionality is enabled. - */ - void setZoomable(boolean zoomable); - - /** - * Extracts currently visible area to Bitmap object, if there is no image loaded yet or the - * ImageView is already destroyed, returns {@code null} - * - * @return currently visible area as bitmap or null - */ - Bitmap getVisibleRectangleBitmap(); - - /** - * Allows to change zoom transition speed, default value is 200 (PhotoViewAttacher.DEFAULT_ZOOM_DURATION). - * Will default to 200 if provided negative value - * - * @param milliseconds duration of zoom interpolation - */ - void setZoomTransitionDuration(int milliseconds); - - /** - * Will return instance of IPhotoView (eg. PhotoViewAttacher), can be used to provide better - * integration - * - * @return IPhotoView implementation instance if available, null if not - */ - IPhotoView getIPhotoViewImplementation(); - - /** - * Sets custom double tap listener, to intercept default given functions. To reset behavior to - * default, you can just pass in "null" or public field of PhotoViewAttacher.defaultOnDoubleTapListener - * - * @param newOnDoubleTapListener custom OnDoubleTapListener to be set on ImageView - */ - void setOnDoubleTapListener(GestureDetector.OnDoubleTapListener newOnDoubleTapListener); - - /** - * Will report back about scale changes - * - * @param onScaleChangeListener OnScaleChangeListener instance - */ - void setOnScaleChangeListener(PhotoViewAttacher.OnScaleChangeListener onScaleChangeListener); - - /** - * Will report back about fling(single touch) - * - * @param onSingleFlingListener OnSingleFlingListener instance - */ - void setOnSingleFlingListener(PhotoViewAttacher.OnSingleFlingListener onSingleFlingListener); -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/PhotoView.java b/photoview/src/main/java/uk/co/senab/photoview/PhotoView.java deleted file mode 100755 index f71f5c9eb..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/PhotoView.java +++ /dev/null @@ -1,273 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Matrix; -import android.graphics.RectF; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.util.AttributeSet; -import android.view.GestureDetector; -import android.widget.ImageView; - -import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener; -import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener; -import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener; - -public class PhotoView extends ImageView implements IPhotoView { - - private PhotoViewAttacher mAttacher; - - private ScaleType mPendingScaleType; - - public PhotoView(Context context) { - this(context, null); - } - - public PhotoView(Context context, AttributeSet attr) { - this(context, attr, 0); - } - - public PhotoView(Context context, AttributeSet attr, int defStyle) { - super(context, attr, defStyle); - super.setScaleType(ScaleType.MATRIX); - init(); - } - - protected void init() { - if (null == mAttacher || null == mAttacher.getImageView()) { - mAttacher = new PhotoViewAttacher(this); - } - - if (null != mPendingScaleType) { - setScaleType(mPendingScaleType); - mPendingScaleType = null; - } - } - - @Override - public void setRotationTo(float rotationDegree) { - mAttacher.setRotationTo(rotationDegree); - } - - @Override - public void setRotationBy(float rotationDegree) { - mAttacher.setRotationBy(rotationDegree); - } - - @Override - public boolean canZoom() { - return mAttacher.canZoom(); - } - - @Override - public RectF getDisplayRect() { - return mAttacher.getDisplayRect(); - } - - @Override - public void getDisplayMatrix(Matrix matrix) { - mAttacher.getDisplayMatrix(matrix); - } - - @Override - public boolean setDisplayMatrix(Matrix finalRectangle) { - return mAttacher.setDisplayMatrix(finalRectangle); - } - - @Override - public float getMinimumScale() { - return mAttacher.getMinimumScale(); - } - - @Override - public float getMediumScale() { - return mAttacher.getMediumScale(); - } - - @Override - public float getMaximumScale() { - return mAttacher.getMaximumScale(); - } - - @Override - public float getScale() { - return mAttacher.getScale(); - } - - @Override - public ScaleType getScaleType() { - return mAttacher.getScaleType(); - } - - @Override - public Matrix getImageMatrix() { - return mAttacher.getImageMatrix(); - } - - @Override - public void setAllowParentInterceptOnEdge(boolean allow) { - mAttacher.setAllowParentInterceptOnEdge(allow); - } - - @Override - public void setMinimumScale(float minimumScale) { - mAttacher.setMinimumScale(minimumScale); - } - - @Override - public void setMediumScale(float mediumScale) { - mAttacher.setMediumScale(mediumScale); - } - - @Override - public void setMaximumScale(float maximumScale) { - mAttacher.setMaximumScale(maximumScale); - } - - @Override - public void setScaleLevels(float minimumScale, float mediumScale, float maximumScale) { - mAttacher.setScaleLevels(minimumScale, mediumScale, maximumScale); - } - - @Override - // setImageBitmap calls through to this method - public void setImageDrawable(Drawable drawable) { - super.setImageDrawable(drawable); - if (null != mAttacher) { - mAttacher.update(); - } - } - - @Override - public void setImageResource(int resId) { - super.setImageResource(resId); - if (null != mAttacher) { - mAttacher.update(); - } - } - - @Override - public void setImageURI(Uri uri) { - super.setImageURI(uri); - if (null != mAttacher) { - mAttacher.update(); - } - } - - @Override - protected boolean setFrame(int l, int t, int r, int b) { - boolean changed = super.setFrame(l, t, r, b); - if (null != mAttacher) { - mAttacher.update(); - } - return changed; - } - - @Override - public void setOnMatrixChangeListener(OnMatrixChangedListener listener) { - mAttacher.setOnMatrixChangeListener(listener); - } - - @Override - public void setOnLongClickListener(OnLongClickListener l) { - mAttacher.setOnLongClickListener(l); - } - - @Override - public void setOnPhotoTapListener(OnPhotoTapListener listener) { - mAttacher.setOnPhotoTapListener(listener); - } - - @Override - public void setOnViewTapListener(OnViewTapListener listener) { - mAttacher.setOnViewTapListener(listener); - } - - @Override - public void setScale(float scale) { - mAttacher.setScale(scale); - } - - @Override - public void setScale(float scale, boolean animate) { - mAttacher.setScale(scale, animate); - } - - @Override - public void setScale(float scale, float focalX, float focalY, boolean animate) { - mAttacher.setScale(scale, focalX, focalY, animate); - } - - @Override - public void setScaleType(ScaleType scaleType) { - if (null != mAttacher) { - mAttacher.setScaleType(scaleType); - } else { - mPendingScaleType = scaleType; - } - } - - @Override - public void setZoomable(boolean zoomable) { - mAttacher.setZoomable(zoomable); - } - - @Override - public Bitmap getVisibleRectangleBitmap() { - return mAttacher.getVisibleRectangleBitmap(); - } - - @Override - public void setZoomTransitionDuration(int milliseconds) { - mAttacher.setZoomTransitionDuration(milliseconds); - } - - @Override - public IPhotoView getIPhotoViewImplementation() { - return mAttacher; - } - - @Override - public void setOnDoubleTapListener(GestureDetector.OnDoubleTapListener newOnDoubleTapListener) { - mAttacher.setOnDoubleTapListener(newOnDoubleTapListener); - } - - @Override - public void setOnScaleChangeListener(PhotoViewAttacher.OnScaleChangeListener onScaleChangeListener) { - mAttacher.setOnScaleChangeListener(onScaleChangeListener); - } - - @Override - public void setOnSingleFlingListener(PhotoViewAttacher.OnSingleFlingListener onSingleFlingListener) { - mAttacher.setOnSingleFlingListener(onSingleFlingListener); - } - - @Override - protected void onDetachedFromWindow() { - mAttacher.cleanup(); - mAttacher = null; - super.onDetachedFromWindow(); - } - - @Override - protected void onAttachedToWindow() { - init(); - super.onAttachedToWindow(); - } -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/PhotoViewAttacher.java b/photoview/src/main/java/uk/co/senab/photoview/PhotoViewAttacher.java deleted file mode 100755 index c93c370a7..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/PhotoViewAttacher.java +++ /dev/null @@ -1,1192 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Matrix; -import android.graphics.Matrix.ScaleToFit; -import android.graphics.RectF; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.v4.view.MotionEventCompat; -import android.util.Log; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnLongClickListener; -import android.view.ViewParent; -import android.view.ViewTreeObserver; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.Interpolator; -import android.widget.ImageView; -import android.widget.ImageView.ScaleType; - -import java.lang.ref.WeakReference; - -import uk.co.senab.photoview.gestures.OnGestureListener; -import uk.co.senab.photoview.gestures.VersionedGestureDetector; -import uk.co.senab.photoview.log.LogManager; -import uk.co.senab.photoview.scrollerproxy.ScrollerProxy; - -import static android.view.MotionEvent.ACTION_CANCEL; -import static android.view.MotionEvent.ACTION_DOWN; -import static android.view.MotionEvent.ACTION_UP; - -public class PhotoViewAttacher implements IPhotoView, View.OnTouchListener, - OnGestureListener, - ViewTreeObserver.OnGlobalLayoutListener { - - private static final String LOG_TAG = "PhotoViewAttacher"; - - // let debug flag be dynamic, but still Proguard can be used to remove from - // release builds - private static final boolean DEBUG = Log.isLoggable(LOG_TAG, Log.DEBUG); - - private Interpolator mInterpolator = new AccelerateDecelerateInterpolator(); - private int ZOOM_DURATION = DEFAULT_ZOOM_DURATION; - - private static final int EDGE_NONE = -1; - private static final int EDGE_LEFT = 0; - private static final int EDGE_RIGHT = 1; - private static final int EDGE_BOTH = 2; - - private static int SINGLE_TOUCH = 1; - - private float mMinScale = DEFAULT_MIN_SCALE; - private float mMidScale = DEFAULT_MID_SCALE; - private float mMaxScale = DEFAULT_MAX_SCALE; - - private boolean mAllowParentInterceptOnEdge = true; - private boolean mBlockParentIntercept = false; - - private static void checkZoomLevels(float minZoom, float midZoom, - float maxZoom) { - if (minZoom >= midZoom) { - throw new IllegalArgumentException( - "Minimum zoom has to be less than Medium zoom. Call setMinimumZoom() with a more appropriate value"); - } else if (midZoom >= maxZoom) { - throw new IllegalArgumentException( - "Medium zoom has to be less than Maximum zoom. Call setMaximumZoom() with a more appropriate value"); - } - } - - /** - * @return true if the ImageView exists, and it's Drawable exists - */ - private static boolean hasDrawable(ImageView imageView) { - return null != imageView && null != imageView.getDrawable(); - } - - /** - * @return true if the ScaleType is supported. - */ - private static boolean isSupportedScaleType(final ScaleType scaleType) { - if (null == scaleType) { - return false; - } - - switch (scaleType) { - case MATRIX: - throw new IllegalArgumentException(scaleType.name() - + " is not supported in PhotoView"); - - default: - return true; - } - } - - /** - * Set's the ImageView's ScaleType to Matrix. - */ - private static void setImageViewScaleTypeMatrix(ImageView imageView) { - /** - * PhotoView sets it's own ScaleType to Matrix, then diverts all calls - * setScaleType to this.setScaleType automatically. - */ - if (null != imageView && !(imageView instanceof IPhotoView)) { - if (!ScaleType.MATRIX.equals(imageView.getScaleType())) { - imageView.setScaleType(ScaleType.MATRIX); - } - } - } - - private WeakReference mImageView; - - // Gesture Detectors - private GestureDetector mGestureDetector; - private uk.co.senab.photoview.gestures.GestureDetector mScaleDragDetector; - - // These are set so we don't keep allocating them on the heap - private final Matrix mBaseMatrix = new Matrix(); - private final Matrix mDrawMatrix = new Matrix(); - private final Matrix mSuppMatrix = new Matrix(); - private final RectF mDisplayRect = new RectF(); - private final float[] mMatrixValues = new float[9]; - - // Listeners - private OnMatrixChangedListener mMatrixChangeListener; - private OnPhotoTapListener mPhotoTapListener; - private OnViewTapListener mViewTapListener; - private OnLongClickListener mLongClickListener; - private OnScaleChangeListener mScaleChangeListener; - private OnSingleFlingListener mSingleFlingListener; - - private int mIvTop, mIvRight, mIvBottom, mIvLeft; - private FlingRunnable mCurrentFlingRunnable; - private int mScrollEdge = EDGE_BOTH; - private float mBaseRotation; - - private boolean mZoomEnabled; - private ScaleType mScaleType = ScaleType.FIT_CENTER; - - PhotoViewAttacher(ImageView imageView) { - this(imageView, true); - } - - private PhotoViewAttacher(ImageView imageView, boolean zoomable) { - mImageView = new WeakReference<>(imageView); - - imageView.setDrawingCacheEnabled(true); - imageView.setOnTouchListener(this); - - ViewTreeObserver observer = imageView.getViewTreeObserver(); - if (null != observer) - observer.addOnGlobalLayoutListener(this); - - // Make sure we using MATRIX Scale Type - setImageViewScaleTypeMatrix(imageView); - - if (imageView.isInEditMode()) { - return; - } - // Create Gesture Detectors... - mScaleDragDetector = VersionedGestureDetector.newInstance( - imageView.getContext(), this); - - mGestureDetector = new GestureDetector(imageView.getContext(), - new GestureDetector.SimpleOnGestureListener() { - - // forward long click listener - @Override - public void onLongPress(MotionEvent e) { - if (null != mLongClickListener) { - mLongClickListener.onLongClick(getImageView()); - } - } - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, - float velocityX, float velocityY) { - if (mSingleFlingListener != null) { - if (getScale() > DEFAULT_MIN_SCALE) { - return false; - } - - if (MotionEventCompat.getPointerCount(e1) > SINGLE_TOUCH - || MotionEventCompat.getPointerCount(e2) > SINGLE_TOUCH) { - return false; - } - - return mSingleFlingListener.onFling(e1, e2, velocityX, velocityY); - } - return false; - } - }); - - mGestureDetector.setOnDoubleTapListener(new DefaultOnDoubleTapListener(this)); - mBaseRotation = 0.0f; - - // Finally, update the UI so that we're zoomable - setZoomable(zoomable); - } - - @Override - public void setOnDoubleTapListener(GestureDetector.OnDoubleTapListener newOnDoubleTapListener) { - if (newOnDoubleTapListener != null) { - this.mGestureDetector.setOnDoubleTapListener(newOnDoubleTapListener); - } else { - this.mGestureDetector.setOnDoubleTapListener(new DefaultOnDoubleTapListener(this)); - } - } - - @Override - public void setOnScaleChangeListener(OnScaleChangeListener onScaleChangeListener) { - this.mScaleChangeListener = onScaleChangeListener; - } - - @Override - public void setOnSingleFlingListener(OnSingleFlingListener onSingleFlingListener) { - this.mSingleFlingListener = onSingleFlingListener; - } - - @Override - public boolean canZoom() { - return mZoomEnabled; - } - - /** - * Clean-up the resources attached to this object. This needs to be called when the ImageView is - * no longer used. A good example is from {@link View#onDetachedFromWindow()} or - * from {@link android.app.Activity#onDestroy()}. This is automatically called if you are using - * {@link PhotoView}. - */ - @SuppressWarnings("deprecation") - public void cleanup() { - if (null == mImageView) { - return; // cleanup already done - } - - final ImageView imageView = mImageView.get(); - - if (null != imageView) { - // Remove this as a global layout listener - ViewTreeObserver observer = imageView.getViewTreeObserver(); - if (null != observer && observer.isAlive()) { - observer.removeGlobalOnLayoutListener(this); - } - - // Remove the ImageView's reference to this - imageView.setOnTouchListener(null); - - // make sure a pending fling runnable won't be run - cancelFling(); - } - - if (null != mGestureDetector) { - mGestureDetector.setOnDoubleTapListener(null); - } - - // Clear listeners too - mMatrixChangeListener = null; - mPhotoTapListener = null; - mViewTapListener = null; - - // Finally, clear ImageView - mImageView = null; - } - - @Override - public RectF getDisplayRect() { - checkMatrixBounds(); - return getDisplayRect(getDrawMatrix()); - } - - @Override - public boolean setDisplayMatrix(Matrix finalMatrix) { - if (finalMatrix == null) { - throw new IllegalArgumentException("Matrix cannot be null"); - } - - ImageView imageView = getImageView(); - if (null == imageView) { - return false; - } - - if (null == imageView.getDrawable()) { - return false; - } - - mSuppMatrix.set(finalMatrix); - setImageViewMatrix(getDrawMatrix()); - checkMatrixBounds(); - - return true; - } - - public void setBaseRotation(final float degrees) { - mBaseRotation = degrees % 360; - update(); - setRotationBy(mBaseRotation); - checkAndDisplayMatrix(); - } - - @Override - public void setRotationTo(float degrees) { - mSuppMatrix.setRotate(degrees % 360); - checkAndDisplayMatrix(); - } - - @Override - public void setRotationBy(float degrees) { - mSuppMatrix.postRotate(degrees % 360); - checkAndDisplayMatrix(); - } - - public ImageView getImageView() { - ImageView imageView = null; - - if (null != mImageView) { - imageView = mImageView.get(); - } - - // If we don't have an ImageView, call cleanup() - if (null == imageView) { - cleanup(); - LogManager.getLogger().i(LOG_TAG, - "ImageView no longer exists. You should not use this PhotoViewAttacher any more."); - } - - return imageView; - } - - @Override - public float getMinimumScale() { - return mMinScale; - } - - @Override - public float getMediumScale() { - return mMidScale; - } - - @Override - public float getMaximumScale() { - return mMaxScale; - } - - @Override - public float getScale() { - return (float) Math.sqrt((float) Math.pow(getValue(mSuppMatrix, Matrix.MSCALE_X), 2) + (float) Math.pow(getValue(mSuppMatrix, Matrix.MSKEW_Y), 2)); - } - - @Override - public ScaleType getScaleType() { - return mScaleType; - } - - @Override - public void onDrag(float dx, float dy) { - if (mScaleDragDetector.isScaling()) { - return; // Do not drag if we are already scaling - } - - if (DEBUG) { - LogManager.getLogger().d(LOG_TAG, - String.format("onDrag: dx: %.2f. dy: %.2f", dx, dy)); - } - - ImageView imageView = getImageView(); - mSuppMatrix.postTranslate(dx, dy); - checkAndDisplayMatrix(); - - /** - * Here we decide whether to let the ImageView's parent to start taking - * over the touch event. - * - * First we check whether this function is enabled. We never want the - * parent to take over if we're scaling. We then check the edge we're - * on, and the direction of the scroll (i.e. if we're pulling against - * the edge, aka 'overscrolling', let the parent take over). - */ - ViewParent parent = imageView.getParent(); - if (mAllowParentInterceptOnEdge && !mScaleDragDetector.isScaling() && !mBlockParentIntercept) { - if (mScrollEdge == EDGE_BOTH - || (mScrollEdge == EDGE_LEFT && dx >= 1f) - || (mScrollEdge == EDGE_RIGHT && dx <= -1f)) { - if (null != parent) { - parent.requestDisallowInterceptTouchEvent(false); - } - } - } else { - if (null != parent) { - parent.requestDisallowInterceptTouchEvent(true); - } - } - } - - @Override - public void onFling(float startX, float startY, float velocityX, - float velocityY) { - if (DEBUG) { - LogManager.getLogger().d( - LOG_TAG, - "onFling. sX: " + startX + " sY: " + startY + " Vx: " - + velocityX + " Vy: " + velocityY); - } - ImageView imageView = getImageView(); - mCurrentFlingRunnable = new FlingRunnable(imageView.getContext()); - mCurrentFlingRunnable.fling(getImageViewWidth(imageView), - getImageViewHeight(imageView), (int) velocityX, (int) velocityY); - imageView.post(mCurrentFlingRunnable); - } - - @Override - public void onGlobalLayout() { - ImageView imageView = getImageView(); - - if (null != imageView) { - if (mZoomEnabled) { - final int top = imageView.getTop(); - final int right = imageView.getRight(); - final int bottom = imageView.getBottom(); - final int left = imageView.getLeft(); - - /** - * We need to check whether the ImageView's bounds have changed. - * This would be easier if we targeted API 11+ as we could just use - * View.OnLayoutChangeListener. Instead we have to replicate the - * work, keeping track of the ImageView's bounds and then checking - * if the values change. - */ - if (top != mIvTop || bottom != mIvBottom || left != mIvLeft - || right != mIvRight) { - // Update our base matrix, as the bounds have changed - updateBaseMatrix(imageView.getDrawable()); - - // Update values as something has changed - mIvTop = top; - mIvRight = right; - mIvBottom = bottom; - mIvLeft = left; - } - } else { - updateBaseMatrix(imageView.getDrawable()); - } - } - } - - @Override - public void onScale(float scaleFactor, float focusX, float focusY) { - if (DEBUG) { - LogManager.getLogger().d( - LOG_TAG, - String.format("onScale: scale: %.2f. fX: %.2f. fY: %.2f", - scaleFactor, focusX, focusY)); - } - - if ((getScale() < mMaxScale || scaleFactor < 1f) && (getScale() > mMinScale || scaleFactor > 1f)) { - if (null != mScaleChangeListener) { - mScaleChangeListener.onScaleChange(scaleFactor, focusX, focusY); - } - mSuppMatrix.postScale(scaleFactor, scaleFactor, focusX, focusY); - checkAndDisplayMatrix(); - } - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouch(View v, MotionEvent ev) { - boolean handled = false; - - if (mZoomEnabled && hasDrawable((ImageView) v)) { - ViewParent parent = v.getParent(); - switch (ev.getAction()) { - case ACTION_DOWN: - // First, disable the Parent from intercepting the touch - // event - if (null != parent) { - parent.requestDisallowInterceptTouchEvent(true); - } else { - LogManager.getLogger().i(LOG_TAG, "onTouch getParent() returned null"); - } - - // If we're flinging, and the user presses down, cancel - // fling - cancelFling(); - break; - - case ACTION_CANCEL: - case ACTION_UP: - // If the user has zoomed less than min scale, zoom back - // to min scale - if (getScale() < mMinScale) { - RectF rect = getDisplayRect(); - if (null != rect) { - v.post(new AnimatedZoomRunnable(getScale(), mMinScale, - rect.centerX(), rect.centerY())); - handled = true; - } - } - break; - } - - // Try the Scale/Drag detector - if (null != mScaleDragDetector) { - boolean wasScaling = mScaleDragDetector.isScaling(); - boolean wasDragging = mScaleDragDetector.isDragging(); - - handled = mScaleDragDetector.onTouchEvent(ev); - - boolean didntScale = !wasScaling && !mScaleDragDetector.isScaling(); - boolean didntDrag = !wasDragging && !mScaleDragDetector.isDragging(); - - mBlockParentIntercept = didntScale && didntDrag; - } - - // Check to see if the user double tapped - if (null != mGestureDetector && mGestureDetector.onTouchEvent(ev)) { - handled = true; - } - - } - - return handled; - } - - @Override - public void setAllowParentInterceptOnEdge(boolean allow) { - mAllowParentInterceptOnEdge = allow; - } - - @Override - public void setMinimumScale(float minimumScale) { - checkZoomLevels(minimumScale, mMidScale, mMaxScale); - mMinScale = minimumScale; - } - - @Override - public void setMediumScale(float mediumScale) { - checkZoomLevels(mMinScale, mediumScale, mMaxScale); - mMidScale = mediumScale; - } - - @Override - public void setMaximumScale(float maximumScale) { - checkZoomLevels(mMinScale, mMidScale, maximumScale); - mMaxScale = maximumScale; - } - - @Override - public void setScaleLevels(float minimumScale, float mediumScale, float maximumScale) { - checkZoomLevels(minimumScale, mediumScale, maximumScale); - mMinScale = minimumScale; - mMidScale = mediumScale; - mMaxScale = maximumScale; - } - - @Override - public void setOnLongClickListener(OnLongClickListener listener) { - mLongClickListener = listener; - } - - @Override - public void setOnMatrixChangeListener(OnMatrixChangedListener listener) { - mMatrixChangeListener = listener; - } - - @Override - public void setOnPhotoTapListener(OnPhotoTapListener listener) { - mPhotoTapListener = listener; - } - - @Nullable - OnPhotoTapListener getOnPhotoTapListener() { - return mPhotoTapListener; - } - - @Override - public void setOnViewTapListener(OnViewTapListener listener) { - mViewTapListener = listener; - } - - @Nullable - OnViewTapListener getOnViewTapListener() { - return mViewTapListener; - } - - @Override - public void setScale(float scale) { - setScale(scale, false); - } - - @Override - public void setScale(float scale, boolean animate) { - ImageView imageView = getImageView(); - - if (null != imageView) { - setScale(scale, - (imageView.getRight()) / 2, - (imageView.getBottom()) / 2, - animate); - } - } - - @Override - public void setScale(float scale, float focalX, float focalY, - boolean animate) { - ImageView imageView = getImageView(); - - if (null != imageView) { - // Check to see if the scale is within bounds - if (scale < mMinScale || scale > mMaxScale) { - LogManager - .getLogger() - .i(LOG_TAG, - "Scale must be within the range of minScale and maxScale"); - return; - } - - if (animate) { - imageView.post(new AnimatedZoomRunnable(getScale(), scale, - focalX, focalY)); - } else { - mSuppMatrix.setScale(scale, scale, focalX, focalY); - checkAndDisplayMatrix(); - } - } - } - - /** - * Set the zoom interpolator - * @param interpolator the zoom interpolator - */ - public void setZoomInterpolator(Interpolator interpolator) { - mInterpolator = interpolator; - } - - @Override - public void setScaleType(ScaleType scaleType) { - if (isSupportedScaleType(scaleType) && scaleType != mScaleType) { - mScaleType = scaleType; - - // Finally update - update(); - } - } - - @Override - public void setZoomable(boolean zoomable) { - mZoomEnabled = zoomable; - update(); - } - - public void update() { - ImageView imageView = getImageView(); - - if (null != imageView) { - if (mZoomEnabled) { - // Make sure we using MATRIX Scale Type - setImageViewScaleTypeMatrix(imageView); - - // Update the base matrix using the current drawable - updateBaseMatrix(imageView.getDrawable()); - } else { - // Reset the Matrix... - resetMatrix(); - } - } - } - - /** - * Get the display matrix - * @param matrix target matrix to copy to - */ - @Override - public void getDisplayMatrix(Matrix matrix) { - matrix.set(getDrawMatrix()); - } - - /** - * Get the current support matrix - */ - public void getSuppMatrix(Matrix matrix) { - matrix.set(mSuppMatrix); - } - - private Matrix getDrawMatrix() { - mDrawMatrix.set(mBaseMatrix); - mDrawMatrix.postConcat(mSuppMatrix); - return mDrawMatrix; - } - - private void cancelFling() { - if (null != mCurrentFlingRunnable) { - mCurrentFlingRunnable.cancelFling(); - mCurrentFlingRunnable = null; - } - } - - public Matrix getImageMatrix() { - return mDrawMatrix; - } - - /** - * Helper method that simply checks the Matrix, and then displays the result - */ - private void checkAndDisplayMatrix() { - if (checkMatrixBounds()) { - setImageViewMatrix(getDrawMatrix()); - } - } - - private void checkImageViewScaleType() { - ImageView imageView = getImageView(); - - /** - * PhotoView's getScaleType() will just divert to this.getScaleType() so - * only call if we're not attached to a PhotoView. - */ - if (null != imageView && !(imageView instanceof IPhotoView)) { - if (!ScaleType.MATRIX.equals(imageView.getScaleType())) { - throw new IllegalStateException( - "The ImageView's ScaleType has been changed since attaching a PhotoViewAttacher. You should call setScaleType on the PhotoViewAttacher instead of on the ImageView" ); - } - } - } - - private boolean checkMatrixBounds() { - final ImageView imageView = getImageView(); - if (null == imageView) { - return false; - } - - final RectF rect = getDisplayRect(getDrawMatrix()); - if (null == rect) { - return false; - } - - final float height = rect.height(), width = rect.width(); - float deltaX = 0, deltaY = 0; - - final int viewHeight = getImageViewHeight(imageView); - if (height <= viewHeight) { - switch (mScaleType) { - case FIT_START: - deltaY = -rect.top; - break; - case FIT_END: - deltaY = viewHeight - height - rect.top; - break; - default: - deltaY = (viewHeight - height) / 2 - rect.top; - break; - } - } else if (rect.top > 0) { - deltaY = -rect.top; - } else if (rect.bottom < viewHeight) { - deltaY = viewHeight - rect.bottom; - } - - final int viewWidth = getImageViewWidth(imageView); - if (width <= viewWidth) { - switch (mScaleType) { - case FIT_START: - deltaX = -rect.left; - break; - case FIT_END: - deltaX = viewWidth - width - rect.left; - break; - default: - deltaX = (viewWidth - width) / 2 - rect.left; - break; - } - mScrollEdge = EDGE_BOTH; - } else if (rect.left > 0) { - mScrollEdge = EDGE_LEFT; - deltaX = -rect.left; - } else if (rect.right < viewWidth) { - deltaX = viewWidth - rect.right; - mScrollEdge = EDGE_RIGHT; - } else { - mScrollEdge = EDGE_NONE; - } - - // Finally actually translate the matrix - mSuppMatrix.postTranslate(deltaX, deltaY); - return true; - } - - /** - * Helper method that maps the supplied Matrix to the current Drawable - * - * @param matrix - Matrix to map Drawable against - * @return RectF - Displayed Rectangle - */ - private RectF getDisplayRect(Matrix matrix) { - ImageView imageView = getImageView(); - - if (null != imageView) { - Drawable d = imageView.getDrawable(); - if (null != d) { - mDisplayRect.set(0, 0, d.getIntrinsicWidth(), - d.getIntrinsicHeight()); - matrix.mapRect(mDisplayRect); - return mDisplayRect; - } - } - return null; - } - - public Bitmap getVisibleRectangleBitmap() { - ImageView imageView = getImageView(); - return imageView == null ? null : imageView.getDrawingCache(); - } - - @Override - public void setZoomTransitionDuration(int milliseconds) { - if (milliseconds < 0) - milliseconds = DEFAULT_ZOOM_DURATION; - this.ZOOM_DURATION = milliseconds; - } - - @Override - public IPhotoView getIPhotoViewImplementation() { - return this; - } - - /** - * Helper method that 'unpacks' a Matrix and returns the required value - * - * @param matrix - Matrix to unpack - * @param whichValue - Which value from Matrix.M* to return - * @return float - returned value - */ - private float getValue(Matrix matrix, int whichValue) { - matrix.getValues(mMatrixValues); - return mMatrixValues[whichValue]; - } - - /** - * Resets the Matrix back to FIT_CENTER, and then displays it.s - */ - private void resetMatrix() { - mSuppMatrix.reset(); - setRotationBy(mBaseRotation); - setImageViewMatrix(getDrawMatrix()); - checkMatrixBounds(); - } - - private void setImageViewMatrix(Matrix matrix) { - ImageView imageView = getImageView(); - if (null != imageView) { - - checkImageViewScaleType(); - imageView.setImageMatrix(matrix); - - // Call MatrixChangedListener if needed - if (null != mMatrixChangeListener) { - RectF displayRect = getDisplayRect(matrix); - if (null != displayRect) { - mMatrixChangeListener.onMatrixChanged(displayRect); - } - } - } - } - - /** - * Calculate Matrix for FIT_CENTER - * - * @param d - Drawable being displayed - */ - private void updateBaseMatrix(Drawable d) { - ImageView imageView = getImageView(); - if (null == imageView || null == d) { - return; - } - - final float viewWidth = getImageViewWidth(imageView); - final float viewHeight = getImageViewHeight(imageView); - final int drawableWidth = d.getIntrinsicWidth(); - final int drawableHeight = d.getIntrinsicHeight(); - - mBaseMatrix.reset(); - - final float widthScale = viewWidth / drawableWidth; - final float heightScale = viewHeight / drawableHeight; - - if (mScaleType == ScaleType.CENTER) { - mBaseMatrix.postTranslate((viewWidth - drawableWidth) / 2F, - (viewHeight - drawableHeight) / 2F); - - } else if (mScaleType == ScaleType.CENTER_CROP) { - float scale = Math.max(widthScale, heightScale); - mBaseMatrix.postScale(scale, scale); - mBaseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2F, - (viewHeight - drawableHeight * scale) / 2F); - - } else if (mScaleType == ScaleType.CENTER_INSIDE) { - float scale = Math.min(1.0f, Math.min(widthScale, heightScale)); - mBaseMatrix.postScale(scale, scale); - mBaseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2F, - (viewHeight - drawableHeight * scale) / 2F); - - } else { - RectF mTempSrc = new RectF(0, 0, drawableWidth, drawableHeight); - RectF mTempDst = new RectF(0, 0, viewWidth, viewHeight); - - if ((int) mBaseRotation % 180 != 0) { - mTempSrc = new RectF(0, 0, drawableHeight, drawableWidth); - } - - switch (mScaleType) { - case FIT_CENTER: - mBaseMatrix - .setRectToRect(mTempSrc, mTempDst, ScaleToFit.CENTER); - break; - - case FIT_START: - mBaseMatrix.setRectToRect(mTempSrc, mTempDst, ScaleToFit.START); - break; - - case FIT_END: - mBaseMatrix.setRectToRect(mTempSrc, mTempDst, ScaleToFit.END); - break; - - case FIT_XY: - mBaseMatrix.setRectToRect(mTempSrc, mTempDst, ScaleToFit.FILL); - break; - - default: - break; - } - } - - resetMatrix(); - } - - private int getImageViewWidth(ImageView imageView) { - if (null == imageView) - return 0; - return imageView.getWidth() - imageView.getPaddingLeft() - imageView.getPaddingRight(); - } - - private int getImageViewHeight(ImageView imageView) { - if (null == imageView) - return 0; - return imageView.getHeight() - imageView.getPaddingTop() - imageView.getPaddingBottom(); - } - - /** - * Interface definition for a callback to be invoked when the internal Matrix has changed for - * this View. - * - * @author Chris Banes - */ - public interface OnMatrixChangedListener { - /** - * Callback for when the Matrix displaying the Drawable has changed. This could be because - * the View's bounds have changed, or the user has zoomed. - * - * @param rect - Rectangle displaying the Drawable's new bounds. - */ - void onMatrixChanged(RectF rect); - } - - /** - * Interface definition for callback to be invoked when attached ImageView scale changes - * - * @author Marek Sebera - */ - public interface OnScaleChangeListener { - /** - * Callback for when the scale changes - * - * @param scaleFactor the scale factor (less than 1 for zoom out, greater than 1 for zoom in) - * @param focusX focal point X position - * @param focusY focal point Y position - */ - void onScaleChange(float scaleFactor, float focusX, float focusY); - } - - /** - * Interface definition for a callback to be invoked when the Photo is tapped with a single - * tap. - * - * @author Chris Banes - */ - public interface OnPhotoTapListener { - - /** - * A callback to receive where the user taps on a photo. You will only receive a callback if - * the user taps on the actual photo, tapping on 'whitespace' will be ignored. - * - * @param view - View the user tapped. - * @param x - where the user tapped from the of the Drawable, as percentage of the - * Drawable width. - * @param y - where the user tapped from the top of the Drawable, as percentage of the - * Drawable height. - */ - void onPhotoTap(View view, float x, float y); - - /** - * A simple callback where out of photo happened; - * */ - void onOutsidePhotoTap(); - } - - /** - * Interface definition for a callback to be invoked when the ImageView is tapped with a single - * tap. - * - * @author Chris Banes - */ - public interface OnViewTapListener { - - /** - * A callback to receive where the user taps on a ImageView. You will receive a callback if - * the user taps anywhere on the view, tapping on 'whitespace' will not be ignored. - * - * @param view - View the user tapped. - * @param x - where the user tapped from the left of the View. - * @param y - where the user tapped from the top of the View. - */ - void onViewTap(View view, float x, float y); - } - - /** - * Interface definition for a callback to be invoked when the ImageView is fling with a single - * touch - * - * @author tonyjs - */ - public interface OnSingleFlingListener { - - /** - * A callback to receive where the user flings on a ImageView. You will receive a callback if - * the user flings anywhere on the view. - * - * @param e1 - MotionEvent the user first touch. - * @param e2 - MotionEvent the user last touch. - * @param velocityX - distance of user's horizontal fling. - * @param velocityY - distance of user's vertical fling. - */ - boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); - } - - private class AnimatedZoomRunnable implements Runnable { - - private final float mFocalX, mFocalY; - private final long mStartTime; - private final float mZoomStart, mZoomEnd; - - public AnimatedZoomRunnable(final float currentZoom, final float targetZoom, - final float focalX, final float focalY) { - mFocalX = focalX; - mFocalY = focalY; - mStartTime = System.currentTimeMillis(); - mZoomStart = currentZoom; - mZoomEnd = targetZoom; - } - - @Override - public void run() { - ImageView imageView = getImageView(); - if (imageView == null) { - return; - } - - float t = interpolate(); - float scale = mZoomStart + t * (mZoomEnd - mZoomStart); - float deltaScale = scale / getScale(); - - onScale(deltaScale, mFocalX, mFocalY); - - // We haven't hit our target scale yet, so post ourselves again - if (t < 1f) { - Compat.postOnAnimation(imageView, this); - } - } - - private float interpolate() { - float t = 1f * (System.currentTimeMillis() - mStartTime) / ZOOM_DURATION; - t = Math.min(1f, t); - t = mInterpolator.getInterpolation(t); - return t; - } - } - - private class FlingRunnable implements Runnable { - - private final ScrollerProxy mScroller; - private int mCurrentX, mCurrentY; - - public FlingRunnable(Context context) { - mScroller = ScrollerProxy.getScroller(context); - } - - public void cancelFling() { - if (DEBUG) { - LogManager.getLogger().d(LOG_TAG, "Cancel Fling"); - } - mScroller.forceFinished(true); - } - - public void fling(int viewWidth, int viewHeight, int velocityX, - int velocityY) { - final RectF rect = getDisplayRect(); - if (null == rect) { - return; - } - - final int startX = Math.round(-rect.left); - final int minX, maxX, minY, maxY; - - if (viewWidth < rect.width()) { - minX = 0; - maxX = Math.round(rect.width() - viewWidth); - } else { - minX = maxX = startX; - } - - final int startY = Math.round(-rect.top); - if (viewHeight < rect.height()) { - minY = 0; - maxY = Math.round(rect.height() - viewHeight); - } else { - minY = maxY = startY; - } - - mCurrentX = startX; - mCurrentY = startY; - - if (DEBUG) { - LogManager.getLogger().d( - LOG_TAG, - "fling. StartX:" + startX + " StartY:" + startY - + " MaxX:" + maxX + " MaxY:" + maxY); - } - - // If we actually can move, fling the scroller - if (startX != maxX || startY != maxY) { - mScroller.fling(startX, startY, velocityX, velocityY, minX, - maxX, minY, maxY, 0, 0); - } - } - - @Override - public void run() { - if (mScroller.isFinished()) { - return; // remaining post that should not be handled - } - - ImageView imageView = getImageView(); - if (null != imageView && mScroller.computeScrollOffset()) { - - final int newX = mScroller.getCurrX(); - final int newY = mScroller.getCurrY(); - - if (DEBUG) { - LogManager.getLogger().d( - LOG_TAG, - "fling run(). CurrentX:" + mCurrentX + " CurrentY:" - + mCurrentY + " NewX:" + newX + " NewY:" - + newY); - } - - mSuppMatrix.postTranslate(mCurrentX - newX, mCurrentY - newY); - setImageViewMatrix(getDrawMatrix()); - - mCurrentX = newX; - mCurrentY = newY; - - // Post On animation - Compat.postOnAnimation(imageView, this); - } - } - } -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/gestures/CupcakeGestureDetector.java b/photoview/src/main/java/uk/co/senab/photoview/gestures/CupcakeGestureDetector.java deleted file mode 100755 index e14f463bc..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/gestures/CupcakeGestureDetector.java +++ /dev/null @@ -1,149 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.gestures; - -import android.content.Context; -import android.view.MotionEvent; -import android.view.VelocityTracker; -import android.view.ViewConfiguration; - -import uk.co.senab.photoview.log.LogManager; - -public class CupcakeGestureDetector implements GestureDetector { - - protected OnGestureListener mListener; - private static final String LOG_TAG = "CupcakeGestureDetector"; - float mLastTouchX; - float mLastTouchY; - final float mTouchSlop; - final float mMinimumVelocity; - - @Override - public void setOnGestureListener(OnGestureListener listener) { - this.mListener = listener; - } - - public CupcakeGestureDetector(Context context) { - final ViewConfiguration configuration = ViewConfiguration - .get(context); - mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); - mTouchSlop = configuration.getScaledTouchSlop(); - } - - private VelocityTracker mVelocityTracker; - private boolean mIsDragging; - - float getActiveX(MotionEvent ev) { - return ev.getX(); - } - - float getActiveY(MotionEvent ev) { - return ev.getY(); - } - - @Override - public boolean isScaling() { - return false; - } - - @Override - public boolean isDragging() { - return mIsDragging; - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - switch (ev.getAction()) { - case MotionEvent.ACTION_DOWN: { - mVelocityTracker = VelocityTracker.obtain(); - if (null != mVelocityTracker) { - mVelocityTracker.addMovement(ev); - } else { - LogManager.getLogger().i(LOG_TAG, "Velocity tracker is null"); - } - - mLastTouchX = getActiveX(ev); - mLastTouchY = getActiveY(ev); - mIsDragging = false; - break; - } - - case MotionEvent.ACTION_MOVE: { - final float x = getActiveX(ev); - final float y = getActiveY(ev); - final float dx = x - mLastTouchX, dy = y - mLastTouchY; - - if (!mIsDragging) { - // Use Pythagoras to see if drag length is larger than - // touch slop - mIsDragging = Math.sqrt((dx * dx) + (dy * dy)) >= mTouchSlop; - } - - if (mIsDragging) { - mListener.onDrag(dx, dy); - mLastTouchX = x; - mLastTouchY = y; - - if (null != mVelocityTracker) { - mVelocityTracker.addMovement(ev); - } - } - break; - } - - case MotionEvent.ACTION_CANCEL: { - // Recycle Velocity Tracker - if (null != mVelocityTracker) { - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - break; - } - - case MotionEvent.ACTION_UP: { - if (mIsDragging) { - if (null != mVelocityTracker) { - mLastTouchX = getActiveX(ev); - mLastTouchY = getActiveY(ev); - - // Compute velocity within the last 1000ms - mVelocityTracker.addMovement(ev); - mVelocityTracker.computeCurrentVelocity(1000); - - final float vX = mVelocityTracker.getXVelocity(), vY = mVelocityTracker - .getYVelocity(); - - // If the velocity is greater than minVelocity, call - // listener - if (Math.max(Math.abs(vX), Math.abs(vY)) >= mMinimumVelocity) { - mListener.onFling(mLastTouchX, mLastTouchY, -vX, - -vY); - } - } - } - - // Recycle Velocity Tracker - if (null != mVelocityTracker) { - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - break; - } - } - - return true; - } -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/gestures/EclairGestureDetector.java b/photoview/src/main/java/uk/co/senab/photoview/gestures/EclairGestureDetector.java deleted file mode 100755 index c467e1c8d..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/gestures/EclairGestureDetector.java +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.gestures; - -import android.annotation.TargetApi; -import android.content.Context; -import android.view.MotionEvent; - -import uk.co.senab.photoview.Compat; - -@TargetApi(5) -public class EclairGestureDetector extends CupcakeGestureDetector { - - private static final int INVALID_POINTER_ID = -1; - private int mActivePointerId = INVALID_POINTER_ID; - private int mActivePointerIndex = 0; - - public EclairGestureDetector(Context context) { - super(context); - } - - @Override - float getActiveX(MotionEvent ev) { - try { - return ev.getX(mActivePointerIndex); - } catch (Exception e) { - return ev.getX(); - } - } - - @Override - float getActiveY(MotionEvent ev) { - try { - return ev.getY(mActivePointerIndex); - } catch (Exception e) { - return ev.getY(); - } - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - final int action = ev.getAction(); - switch (action & MotionEvent.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: - mActivePointerId = ev.getPointerId(0); - break; - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - mActivePointerId = INVALID_POINTER_ID; - break; - case MotionEvent.ACTION_POINTER_UP: - // Ignore deprecation, ACTION_POINTER_ID_MASK and - // ACTION_POINTER_ID_SHIFT has same value and are deprecated - // You can have either deprecation or lint target api warning - final int pointerIndex = Compat.getPointerIndex(ev.getAction()); - final int pointerId = ev.getPointerId(pointerIndex); - if (pointerId == mActivePointerId) { - // This was our active pointer going up. Choose a new - // active pointer and adjust accordingly. - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - mActivePointerId = ev.getPointerId(newPointerIndex); - mLastTouchX = ev.getX(newPointerIndex); - mLastTouchY = ev.getY(newPointerIndex); - } - break; - } - - mActivePointerIndex = ev - .findPointerIndex(mActivePointerId != INVALID_POINTER_ID ? mActivePointerId - : 0); - try { - return super.onTouchEvent(ev); - } catch (IllegalArgumentException e) { - // Fix for support lib bug, happening when onDestroy is - return true; - } - } -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/gestures/FroyoGestureDetector.java b/photoview/src/main/java/uk/co/senab/photoview/gestures/FroyoGestureDetector.java deleted file mode 100755 index 7343e3c0f..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/gestures/FroyoGestureDetector.java +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.gestures; - -import android.annotation.TargetApi; -import android.content.Context; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; - -@TargetApi(8) -public class FroyoGestureDetector extends EclairGestureDetector { - - protected final ScaleGestureDetector mDetector; - - public FroyoGestureDetector(Context context) { - super(context); - ScaleGestureDetector.OnScaleGestureListener mScaleListener = new ScaleGestureDetector.OnScaleGestureListener() { - - @Override - public boolean onScale(ScaleGestureDetector detector) { - float scaleFactor = detector.getScaleFactor(); - - if (Float.isNaN(scaleFactor) || Float.isInfinite(scaleFactor)) - return false; - - mListener.onScale(scaleFactor, - detector.getFocusX(), detector.getFocusY()); - return true; - } - - @Override - public boolean onScaleBegin(ScaleGestureDetector detector) { - return true; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - // NO-OP - } - }; - mDetector = new ScaleGestureDetector(context, mScaleListener); - } - - @Override - public boolean isScaling() { - return mDetector.isInProgress(); - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - try { - mDetector.onTouchEvent(ev); - return super.onTouchEvent(ev); - } catch (IllegalArgumentException e) { - // Fix for support lib bug, happening when onDestroy is - return true; - } - } -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/gestures/GestureDetector.java b/photoview/src/main/java/uk/co/senab/photoview/gestures/GestureDetector.java deleted file mode 100755 index 3c9177ece..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/gestures/GestureDetector.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.gestures; - -import android.view.MotionEvent; - -public interface GestureDetector { - - boolean onTouchEvent(MotionEvent ev); - - boolean isScaling(); - - boolean isDragging(); - - void setOnGestureListener(OnGestureListener listener); - -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/gestures/OnGestureListener.java b/photoview/src/main/java/uk/co/senab/photoview/gestures/OnGestureListener.java deleted file mode 100755 index 4c124d1e0..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/gestures/OnGestureListener.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.gestures; - -public interface OnGestureListener { - - void onDrag(float dx, float dy); - - void onFling(float startX, float startY, float velocityX, - float velocityY); - - void onScale(float scaleFactor, float focusX, float focusY); - -} \ No newline at end of file diff --git a/photoview/src/main/java/uk/co/senab/photoview/gestures/VersionedGestureDetector.java b/photoview/src/main/java/uk/co/senab/photoview/gestures/VersionedGestureDetector.java deleted file mode 100755 index c1550ce36..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/gestures/VersionedGestureDetector.java +++ /dev/null @@ -1,42 +0,0 @@ -package uk.co.senab.photoview.gestures; - -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ - -import android.content.Context; -import android.os.Build; - -public final class VersionedGestureDetector { - - public static GestureDetector newInstance(Context context, - OnGestureListener listener) { - final int sdkVersion = Build.VERSION.SDK_INT; - GestureDetector detector; - - if (sdkVersion < Build.VERSION_CODES.ECLAIR) { - detector = new CupcakeGestureDetector(context); - } else if (sdkVersion < Build.VERSION_CODES.FROYO) { - detector = new EclairGestureDetector(context); - } else { - detector = new FroyoGestureDetector(context); - } - - detector.setOnGestureListener(listener); - - return detector; - } - -} \ No newline at end of file diff --git a/photoview/src/main/java/uk/co/senab/photoview/log/LogManager.java b/photoview/src/main/java/uk/co/senab/photoview/log/LogManager.java deleted file mode 100755 index eefdde391..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/log/LogManager.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.log; - -import android.util.Log; - -/** - * class that holds the {@link Logger} for this library, defaults to {@link LoggerDefault} to send logs to android {@link Log} - */ -public final class LogManager { - - private static Logger logger = new LoggerDefault(); - - public static void setLogger(Logger newLogger) { - logger = newLogger; - } - - public static Logger getLogger() { - return logger; - } - -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/log/Logger.java b/photoview/src/main/java/uk/co/senab/photoview/log/Logger.java deleted file mode 100755 index 56295ec46..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/log/Logger.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.log; - -/** - * interface for a logger class to replace the static calls to {@link android.util.Log} - */ -public interface Logger { - - int v(String tag, String msg); - - int v(String tag, String msg, Throwable tr); - - int d(String tag, String msg); - - int d(String tag, String msg, Throwable tr); - - int i(String tag, String msg); - - int i(String tag, String msg, Throwable tr); - - int w(String tag, String msg); - - int w(String tag, String msg, Throwable tr); - - int e(String tag, String msg); - - int e(String tag, String msg, Throwable tr); -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/log/LoggerDefault.java b/photoview/src/main/java/uk/co/senab/photoview/log/LoggerDefault.java deleted file mode 100755 index f827f4a82..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/log/LoggerDefault.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.log; - -import android.util.Log; - -/** - * Helper class to redirect {@link LogManager#logger} to {@link Log} - */ -public class LoggerDefault implements Logger { - - @Override - public int v(String tag, String msg) { - return Log.v(tag, msg); - } - - @Override - public int v(String tag, String msg, Throwable tr) { - return Log.v(tag, msg, tr); - } - - @Override - public int d(String tag, String msg) { - return Log.d(tag, msg); - } - - @Override - public int d(String tag, String msg, Throwable tr) { - return Log.d(tag, msg, tr); - } - - @Override - public int i(String tag, String msg) { - return Log.i(tag, msg); - } - - @Override - public int i(String tag, String msg, Throwable tr) { - return Log.i(tag, msg, tr); - } - - @Override - public int w(String tag, String msg) { - return Log.w(tag, msg); - } - - @Override - public int w(String tag, String msg, Throwable tr) { - return Log.w(tag, msg, tr); - } - - @Override - public int e(String tag, String msg) { - return Log.e(tag, msg); - } - - @Override - public int e(String tag, String msg, Throwable tr) { - return Log.e(tag, msg, tr); - } - - -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/GingerScroller.java b/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/GingerScroller.java deleted file mode 100755 index e831ce365..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/GingerScroller.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.scrollerproxy; - -import android.annotation.TargetApi; -import android.content.Context; -import android.widget.OverScroller; - -@TargetApi(9) -public class GingerScroller extends ScrollerProxy { - - protected final OverScroller mScroller; - - public GingerScroller(Context context) { - mScroller = new OverScroller(context); - } - - @Override - public boolean computeScrollOffset() { - return mScroller.computeScrollOffset(); - } - - @Override - public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY, - int overX, int overY) { - mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, overX, overY); - } - - @Override - public void forceFinished(boolean finished) { - mScroller.forceFinished(finished); - } - - @Override - public boolean isFinished() { - return mScroller.isFinished(); - } - - @Override - public int getCurrX() { - return mScroller.getCurrX(); - } - - @Override - public int getCurrY() { - return mScroller.getCurrY(); - } -} \ No newline at end of file diff --git a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/IcsScroller.java b/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/IcsScroller.java deleted file mode 100755 index 10f9eab8c..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/IcsScroller.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.scrollerproxy; - -import android.annotation.TargetApi; -import android.content.Context; - -@TargetApi(14) -public class IcsScroller extends GingerScroller { - - public IcsScroller(Context context) { - super(context); - } - - @Override - public boolean computeScrollOffset() { - return mScroller.computeScrollOffset(); - } - -} diff --git a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/PreGingerScroller.java b/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/PreGingerScroller.java deleted file mode 100755 index 2cd91b3f9..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/PreGingerScroller.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.scrollerproxy; - -import android.content.Context; -import android.widget.Scroller; - -public class PreGingerScroller extends ScrollerProxy { - - private final Scroller mScroller; - - public PreGingerScroller(Context context) { - mScroller = new Scroller(context); - } - - @Override - public boolean computeScrollOffset() { - return mScroller.computeScrollOffset(); - } - - @Override - public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY, - int overX, int overY) { - mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); - } - - @Override - public void forceFinished(boolean finished) { - mScroller.forceFinished(finished); - } - - public boolean isFinished() { - return mScroller.isFinished(); - } - - @Override - public int getCurrX() { - return mScroller.getCurrX(); - } - - @Override - public int getCurrY() { - return mScroller.getCurrY(); - } -} \ No newline at end of file diff --git a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/ScrollerProxy.java b/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/ScrollerProxy.java deleted file mode 100755 index ce39ef19b..000000000 --- a/photoview/src/main/java/uk/co/senab/photoview/scrollerproxy/ScrollerProxy.java +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************************* - * Copyright 2011, 2012 Chris Banes. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *******************************************************************************/ -package uk.co.senab.photoview.scrollerproxy; - -import android.content.Context; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; - -public abstract class ScrollerProxy { - - public static ScrollerProxy getScroller(Context context) { - if (VERSION.SDK_INT < VERSION_CODES.GINGERBREAD) { - return new PreGingerScroller(context); - } else if (VERSION.SDK_INT < VERSION_CODES.ICE_CREAM_SANDWICH) { - return new GingerScroller(context); - } else { - return new IcsScroller(context); - } - } - - public abstract boolean computeScrollOffset(); - - public abstract void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, - int maxY, int overX, int overY); - - public abstract void forceFinished(boolean finished); - - public abstract boolean isFinished(); - - public abstract int getCurrX(); - - public abstract int getCurrY(); - - -} diff --git a/photoview/src/main/res/values/strings.xml b/photoview/src/main/res/values/strings.xml deleted file mode 100644 index 0eb821c3f..000000000 --- a/photoview/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - PhotoView - diff --git a/scripts/crowdin.sh b/scripts/crowdin.sh old mode 100755 new mode 100644 diff --git a/settings.gradle b/settings.gradle index 3af2359f6..e7b4def49 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':photoview' +include ':app'