Snap for 12637843 from 6932537215b4202828c07a1db251d1981a02b6ed to 25Q1-release

Change-Id: I86c011327fc780e58f6cde19f59908540c3b3bee
diff --git a/METADATA b/METADATA
index 0df2df7..4177a52 100644
--- a/METADATA
+++ b/METADATA
@@ -1,15 +1,19 @@
+# This project was upgraded with external_updater.
+# Usage: tools/external_updater/updater.sh update external/subsampling-scale-image-view
+# For more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md
+
 name: "subsampling-scale-image-view"
 description: "Android library (AAR). Highly configurable, easily extendable deep zoom view for displaying huge images without loss of detail. Perfect for photo galleries, maps, building plans etc."
 third_party {
   license_type: NOTICE
   last_upgrade_date {
-    year: 2018
-    month: 2
-    day: 7
+    year: 2024
+    month: 11
+    day: 8
   }
   identifier {
     type: "Git"
     value: "https://github.com/davemorrissey/subsampling-scale-image-view"
-    version: "cb93ba0b35cf4c48f86a8d0af599b8baaf008973"
+    version: "v3.10.0"
   }
 }
diff --git a/README.md b/README.md
index 63a41ae..c6de894 100644
--- a/README.md
+++ b/README.md
@@ -82,7 +82,11 @@
 
 ## Quick start
 
-**1)** Add `com.davemorrissey.labs:subsampling-scale-image-view:3.9.0` as a dependency in your build.gradle file.
+**1)** Add this library as a dependency in your app's build.gradle file.
+
+    dependencies {
+        implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0'
+    }
 
 **2)** Add the view to your layout XML.
 
diff --git a/docs/javadoc/allclasses-frame.html b/docs/javadoc/allclasses-frame.html
index 082d8ac..ec58d56 100644
--- a/docs/javadoc/allclasses-frame.html
+++ b/docs/javadoc/allclasses-frame.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>All Classes (library 3.9.0 API)</title>
+<title>All Classes (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
diff --git a/docs/javadoc/allclasses-noframe.html b/docs/javadoc/allclasses-noframe.html
index 8e809e3..b038beb 100644
--- a/docs/javadoc/allclasses-noframe.html
+++ b/docs/javadoc/allclasses-noframe.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>All Classes (library 3.9.0 API)</title>
+<title>All Classes (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageSource.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageSource.html
index 0ad82ee..8cd1d50 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageSource.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageSource.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>ImageSource (library 3.9.0 API)</title>
+<title>ImageSource (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="ImageSource (library 3.9.0 API)";
+            parent.document.title="ImageSource (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -259,7 +259,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>resource</h4>
-<pre>public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;resource(int&nbsp;resId)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;resource(int&nbsp;resId)</pre>
 <div class="block">Create an instance from a resource. The correct resource for the device screen resolution will be used.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -275,7 +276,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>asset</h4>
-<pre>public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;asset(<a href="https://developer.android.com/reference/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;assetName)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;asset(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                         <a href="https://developer.android.com/reference/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;assetName)</pre>
 <div class="block">Create an instance from an asset name.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -291,7 +294,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>uri</h4>
-<pre>public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;uri(<a href="https://developer.android.com/reference/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;uri)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;uri(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                       <a href="https://developer.android.com/reference/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;uri)</pre>
 <div class="block">Create an instance from a URI. If the URI does not start with a scheme, it's assumed to be the URI
  of a file.</div>
 <dl>
@@ -308,7 +313,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>uri</h4>
-<pre>public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;uri(<a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;uri(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                       <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)</pre>
 <div class="block">Create an instance from a URI.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -324,7 +331,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>bitmap</h4>
-<pre>public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;bitmap(<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;bitmap)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;bitmap(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                          <a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;bitmap)</pre>
 <div class="block">Provide a loaded bitmap for display.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -340,7 +349,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>cachedBitmap</h4>
-<pre>public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;cachedBitmap(<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;bitmap)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public static&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;cachedBitmap(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                                <a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;bitmap)</pre>
 <div class="block">Provide a loaded and cached bitmap for display. This bitmap will not be recycled when it is no
  longer needed. Use this method if you loaded the bitmap with an image loader such as Picasso
  or Volley.</div>
@@ -358,7 +369,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>tilingEnabled</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;tilingEnabled()</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;tilingEnabled()</pre>
 <div class="block">Enable tiling of the image. This does not apply to preview images which are always loaded as a single bitmap.,
  and tiling cannot be disabled when displaying a region of the source image.</div>
 <dl>
@@ -373,7 +385,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>tilingDisabled</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;tilingDisabled()</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;tilingDisabled()</pre>
 <div class="block">Disable tiling of the image. This does not apply to preview images which are always loaded as a single bitmap,
  and tiling cannot be disabled when displaying a region of the source image.</div>
 <dl>
@@ -388,7 +401,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>tiling</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;tiling(boolean&nbsp;tile)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;tiling(boolean&nbsp;tile)</pre>
 <div class="block">Enable or disable tiling of the image. This does not apply to preview images which are always loaded as a single bitmap,
  and tiling cannot be disabled when displaying a region of the source image.</div>
 <dl>
@@ -405,7 +419,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;region(<a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRegion)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;region(<a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRegion)</pre>
 <div class="block">Use a region of the source image. Region must be set independently for the full size image and the preview if
  you are using one.</div>
 <dl>
@@ -422,8 +437,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>dimensions</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;dimensions(int&nbsp;sWidth,
-                              int&nbsp;sHeight)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;dimensions(int&nbsp;sWidth,
+                                       int&nbsp;sHeight)</pre>
 <div class="block">Declare the dimensions of the image. This is only required for a full size image, when you are specifying a URI
  and also a preview image. When displaying a bitmap object, or not using a preview, you do not need to declare
  the image dimensions. Note if the declared dimensions are found to be incorrect, the view will reset.</div>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageViewState.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageViewState.html
index a5075a9..65887b6 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageViewState.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/ImageViewState.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>ImageViewState (library 3.9.0 API)</title>
+<title>ImageViewState (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="ImageViewState (library 3.9.0 API)";
+            parent.document.title="ImageViewState (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -197,6 +197,7 @@
 <li class="blockList">
 <h4>ImageViewState</h4>
 <pre>public&nbsp;ImageViewState(float&nbsp;scale,
+                      <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
                       <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;center,
                       int&nbsp;orientation)</pre>
 </li>
@@ -224,7 +225,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCenter</h4>
-<pre>public&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;getCenter()</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;getCenter()</pre>
 </li>
 </ul>
 <a name="getOrientation--">
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html
index 37c7b87..402ef87 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.AnimationBuilder (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.AnimationBuilder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.AnimationBuilder (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.AnimationBuilder (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -191,7 +191,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withDuration</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withDuration(long&nbsp;duration)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withDuration(long&nbsp;duration)</pre>
 <div class="block">Desired duration of the anim in milliseconds. Default is 500.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -207,7 +208,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withInterruptible</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withInterruptible(boolean&nbsp;interruptible)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withInterruptible(boolean&nbsp;interruptible)</pre>
 <div class="block">Whether the animation can be interrupted with a touch. Default is true.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -223,7 +225,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withEasing</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withEasing(int&nbsp;easing)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withEasing(int&nbsp;easing)</pre>
 <div class="block">Set the easing style. See static fields. <a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html#EASE_IN_OUT_QUAD"><code>SubsamplingScaleImageView.EASE_IN_OUT_QUAD</code></a> is recommended, and the default.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -239,7 +242,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withOnAnimationEventListener</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withOnAnimationEventListener(<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnAnimationEventListener.html" title="interface in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.OnAnimationEventListener</a>&nbsp;listener)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;withOnAnimationEventListener(<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnAnimationEventListener.html" title="interface in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.OnAnimationEventListener</a>&nbsp;listener)</pre>
 <div class="block">Add an animation event listener.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnAnimationEventListener.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnAnimationEventListener.html
index 1c2b1d0..b1437d9 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnAnimationEventListener.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnAnimationEventListener.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.DefaultOnAnimationEventListener (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.DefaultOnAnimationEventListener (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.DefaultOnAnimationEventListener (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.DefaultOnAnimationEventListener (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnImageEventListener.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnImageEventListener.html
index cc298e4..c0a3fbd 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnImageEventListener.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnImageEventListener.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.DefaultOnImageEventListener (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.DefaultOnImageEventListener (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.DefaultOnImageEventListener (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.DefaultOnImageEventListener (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnStateChangedListener.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnStateChangedListener.html
index f038090..7fc7864 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnStateChangedListener.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.DefaultOnStateChangedListener.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.DefaultOnStateChangedListener (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.DefaultOnStateChangedListener (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.DefaultOnStateChangedListener (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.DefaultOnStateChangedListener (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnAnimationEventListener.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnAnimationEventListener.html
index 5e7ede3..ebe3204 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnAnimationEventListener.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnAnimationEventListener.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.OnAnimationEventListener (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.OnAnimationEventListener (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.OnAnimationEventListener (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.OnAnimationEventListener (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnImageEventListener.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnImageEventListener.html
index dba187f..4884834 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnImageEventListener.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnImageEventListener.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.OnImageEventListener (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.OnImageEventListener (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.OnImageEventListener (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.OnImageEventListener (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnStateChangedListener.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnStateChangedListener.html
index 65e9f10..db33a6b 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnStateChangedListener.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.OnStateChangedListener.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView.OnStateChangedListener (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView.OnStateChangedListener (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView.OnStateChangedListener (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView.OnStateChangedListener (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html
index 0a1ba3e..d730e75 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SubsamplingScaleImageView (library 3.9.0 API)</title>
+<title>SubsamplingScaleImageView (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SubsamplingScaleImageView (library 3.9.0 API)";
+            parent.document.title="SubsamplingScaleImageView (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -1184,7 +1184,11 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TILE_SIZE_AUTO</h4>
-<pre>public static&nbsp;int TILE_SIZE_AUTO</pre>
+<pre>public static final&nbsp;int TILE_SIZE_AUTO</pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../constant-values.html#com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.TILE_SIZE_AUTO">Constant Field Values</a></dd>
+</dl>
 </li>
 </ul>
 </li>
@@ -1275,7 +1279,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setImage</h4>
-<pre>public final&nbsp;void&nbsp;setImage(<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource)</pre>
+<pre>public final&nbsp;void&nbsp;setImage(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                           <a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource)</pre>
 <div class="block">Set the image source from a bitmap, resource, asset, file or other URI.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1289,7 +1294,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setImage</h4>
-<pre>public final&nbsp;void&nbsp;setImage(<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource,
+<pre>public final&nbsp;void&nbsp;setImage(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                           <a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource,
                            <a href="../../../../com/davemorrissey/labs/subscaleview/ImageViewState.html" title="class in com.davemorrissey.labs.subscaleview">ImageViewState</a>&nbsp;state)</pre>
 <div class="block">Set the image source from a bitmap, resource, asset, file or other URI, starting with a given orientation
  setting, scale and center. This is the best method to use when you want scale and center to be restored
@@ -1307,7 +1313,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setImage</h4>
-<pre>public final&nbsp;void&nbsp;setImage(<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource,
+<pre>public final&nbsp;void&nbsp;setImage(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                           <a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource,
                            <a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;previewSource)</pre>
 <div class="block">Set the image source from a bitmap, resource, asset, file or other URI, providing a preview image to be
  displayed until the full size image is loaded.
@@ -1328,7 +1335,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setImage</h4>
-<pre>public final&nbsp;void&nbsp;setImage(<a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource,
+<pre>public final&nbsp;void&nbsp;setImage(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                           <a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;imageSource,
                            <a href="../../../../com/davemorrissey/labs/subscaleview/ImageSource.html" title="class in com.davemorrissey.labs.subscaleview">ImageSource</a>&nbsp;previewSource,
                            <a href="../../../../com/davemorrissey/labs/subscaleview/ImageViewState.html" title="class in com.davemorrissey.labs.subscaleview">ImageViewState</a>&nbsp;state)</pre>
 <div class="block">Set the image source from a bitmap, resource, asset, file or other URI, providing a preview image to be
@@ -1497,7 +1505,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>viewToSourceCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vxy)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vxy)</pre>
 <div class="block">Convert screen coordinate to source coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1513,8 +1522,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>viewToSourceCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(float&nbsp;vx,
-                                      float&nbsp;vy)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(float&nbsp;vx,
+                                                float&nbsp;vy)</pre>
 <div class="block">Convert screen coordinate to source coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1531,8 +1541,10 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>viewToSourceCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vxy,
-                                      <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sTarget)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vxy,
+                                                <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                                <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sTarget)</pre>
 <div class="block">Convert screen coordinate to source coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1549,9 +1561,11 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>viewToSourceCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(float&nbsp;vx,
-                                      float&nbsp;vy,
-                                      <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sTarget)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;viewToSourceCoord(float&nbsp;vx,
+                                                float&nbsp;vy,
+                                                <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                                <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sTarget)</pre>
 <div class="block">Convert screen coordinate to source coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1569,7 +1583,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sourceToViewCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sxy)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sxy)</pre>
 <div class="block">Convert source coordinate to view coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1585,8 +1600,9 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sourceToViewCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(float&nbsp;sx,
-                                      float&nbsp;sy)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(float&nbsp;sx,
+                                                float&nbsp;sy)</pre>
 <div class="block">Convert source coordinate to view coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1603,8 +1619,10 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sourceToViewCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sxy,
-                                      <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vTarget)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sxy,
+                                                <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                                <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vTarget)</pre>
 <div class="block">Convert source coordinate to view coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1621,9 +1639,11 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sourceToViewCoord</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(float&nbsp;sx,
-                                      float&nbsp;sy,
-                                      <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vTarget)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sourceToViewCoord(float&nbsp;sx,
+                                                float&nbsp;sy,
+                                                <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                                <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;vTarget)</pre>
 <div class="block">Convert source coordinate to view coordinate.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1641,7 +1661,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setRegionDecoderClass</h4>
-<pre>public final&nbsp;void&nbsp;setRegionDecoderClass(<a href="https://developer.android.com/reference/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageRegionDecoder</a>&gt;&nbsp;regionDecoderClass)</pre>
+<pre>public final&nbsp;void&nbsp;setRegionDecoderClass(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                        <a href="https://developer.android.com/reference/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageRegionDecoder</a>&gt;&nbsp;regionDecoderClass)</pre>
 <div class="block">Swap the default region decoder implementation for one of your own. You must do this before setting the image file or
  asset, and you cannot use a custom decoder when using layout XML to set an asset name. Your class must have a
  public default constructor.</div>
@@ -1657,7 +1678,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setRegionDecoderFactory</h4>
-<pre>public final&nbsp;void&nbsp;setRegionDecoderFactory(<a href="../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">DecoderFactory</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageRegionDecoder</a>&gt;&nbsp;regionDecoderFactory)</pre>
+<pre>public final&nbsp;void&nbsp;setRegionDecoderFactory(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                          <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">DecoderFactory</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageRegionDecoder</a>&gt;&nbsp;regionDecoderFactory)</pre>
 <div class="block">Swap the default region decoder implementation for one of your own. You must do this before setting the image file or
  asset, and you cannot use a custom decoder when using layout XML to set an asset name.</div>
 <dl>
@@ -1673,7 +1695,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setBitmapDecoderClass</h4>
-<pre>public final&nbsp;void&nbsp;setBitmapDecoderClass(<a href="https://developer.android.com/reference/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageDecoder</a>&gt;&nbsp;bitmapDecoderClass)</pre>
+<pre>public final&nbsp;void&nbsp;setBitmapDecoderClass(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                        <a href="https://developer.android.com/reference/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageDecoder</a>&gt;&nbsp;bitmapDecoderClass)</pre>
 <div class="block">Swap the default bitmap decoder implementation for one of your own. You must do this before setting the image file or
  asset, and you cannot use a custom decoder when using layout XML to set an asset name. Your class must have a
  public default constructor.</div>
@@ -1689,7 +1712,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setBitmapDecoderFactory</h4>
-<pre>public final&nbsp;void&nbsp;setBitmapDecoderFactory(<a href="../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">DecoderFactory</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageDecoder</a>&gt;&nbsp;bitmapDecoderFactory)</pre>
+<pre>public final&nbsp;void&nbsp;setBitmapDecoderFactory(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                          <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">DecoderFactory</a>&lt;? extends <a href="../../../../com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html" title="interface in com.davemorrissey.labs.subscaleview.decoder">ImageDecoder</a>&gt;&nbsp;bitmapDecoderFactory)</pre>
 <div class="block">Swap the default bitmap decoder implementation for one of your own. You must do this before setting the image file or
  asset, and you cannot use a custom decoder when using layout XML to set an asset name.</div>
 <dl>
@@ -1856,7 +1880,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCenter</h4>
-<pre>public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;getCenter()</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;getCenter()</pre>
 <div class="block">Returns the source point at the center of the view.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1885,6 +1910,7 @@
 <li class="blockList">
 <h4>setScaleAndCenter</h4>
 <pre>public final&nbsp;void&nbsp;setScaleAndCenter(float&nbsp;scale,
+                                    <a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
                                     <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sCenter)</pre>
 <div class="block">Externally change the scale and translation of the source image. This may be used with getCenter() and getScale()
  to restore the scale and zoom after a screen rotate.</div>
@@ -2026,7 +2052,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>public final&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageViewState.html" title="class in com.davemorrissey.labs.subscaleview">ImageViewState</a>&nbsp;getState()</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public final&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/ImageViewState.html" title="class in com.davemorrissey.labs.subscaleview">ImageViewState</a>&nbsp;getState()</pre>
 <div class="block">Get the current state of the view (scale, center, orientation) for restoration after rotate. Will return null if
  the view is not ready.</div>
 <dl>
@@ -2200,7 +2227,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setExecutor</h4>
-<pre>public&nbsp;void&nbsp;setExecutor(<a href="https://developer.android.com/reference/java/util/concurrent/Executor.html?is-external=true" title="class or interface in java.util.concurrent">Executor</a>&nbsp;executor)</pre>
+<pre>public&nbsp;void&nbsp;setExecutor(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                        <a href="https://developer.android.com/reference/java/util/concurrent/Executor.html?is-external=true" title="class or interface in java.util.concurrent">Executor</a>&nbsp;executor)</pre>
 <div class="block"><p>
  Provide an <a href="https://developer.android.com/reference/java/util/concurrent/Executor.html?is-external=true" title="class or interface in java.util.concurrent"><code>Executor</code></a> to be used for loading images. By default, <a href="https://developer.android.com/reference/android/os/AsyncTask.html?is-external=true#THREAD_POOL_EXECUTOR" title="class or interface in android.os"><code>AsyncTask.THREAD_POOL_EXECUTOR</code></a>
  is used to minimise contention with other background work the app is doing. You can also choose
@@ -2317,7 +2345,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>animateCenter</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;animateCenter(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sCenter)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;animateCenter(<a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sCenter)</pre>
 <div class="block">Creates a panning animation builder, that when started will animate the image to place the given coordinates of
  the image in the center of the screen. If doing this would move the image beyond the edges of the screen, the
  image is instead animated to move the center point as near to the center of the screen as is allowed - it's
@@ -2336,7 +2365,8 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>animateScale</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;animateScale(float&nbsp;scale)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;animateScale(float&nbsp;scale)</pre>
 <div class="block">Creates a scale animation builder, that when started will animate a zoom in or out. If this would move the image
  beyond the panning limits, the image is automatically panned during the animation.</div>
 <dl>
@@ -2353,8 +2383,9 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>animateScaleAndCenter</h4>
-<pre>public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;animateScaleAndCenter(float&nbsp;scale,
-                                                                        <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sCenter)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+public&nbsp;<a href="../../../../com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.AnimationBuilder.html" title="class in com.davemorrissey.labs.subscaleview">SubsamplingScaleImageView.AnimationBuilder</a>&nbsp;animateScaleAndCenter(float&nbsp;scale,
+                                                                                  <a href="https://developer.android.com/reference/android/graphics/PointF.html?is-external=true" title="class or interface in android.graphics">PointF</a>&nbsp;sCenter)</pre>
 <div class="block">Creates a scale animation builder, that when started will animate a zoom in or out. If this would move the image
  beyond the panning limits, the image is automatically panned during the animation.</div>
 <dl>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.html
index ac7c814..cb7a14c 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>CompatDecoderFactory (library 3.9.0 API)</title>
+<title>CompatDecoderFactory (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="CompatDecoderFactory (library 3.9.0 API)";
+            parent.document.title="CompatDecoderFactory (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -236,11 +236,12 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>make</h4>
-<pre>public&nbsp;<a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.html" title="type parameter in CompatDecoderFactory">T</a>&nbsp;make()
-       throws <a href="https://developer.android.com/reference/java/lang/IllegalAccessException.html?is-external=true" title="class or interface in java.lang">IllegalAccessException</a>,
-              <a href="https://developer.android.com/reference/java/lang/InstantiationException.html?is-external=true" title="class or interface in java.lang">InstantiationException</a>,
-              <a href="https://developer.android.com/reference/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a>,
-              <a href="https://developer.android.com/reference/java/lang/reflect/InvocationTargetException.html?is-external=true" title="class or interface in java.lang.reflect">InvocationTargetException</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.html" title="type parameter in CompatDecoderFactory">T</a>&nbsp;make()
+                throws <a href="https://developer.android.com/reference/java/lang/IllegalAccessException.html?is-external=true" title="class or interface in java.lang">IllegalAccessException</a>,
+                       <a href="https://developer.android.com/reference/java/lang/InstantiationException.html?is-external=true" title="class or interface in java.lang">InstantiationException</a>,
+                       <a href="https://developer.android.com/reference/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a>,
+                       <a href="https://developer.android.com/reference/java/lang/reflect/InvocationTargetException.html?is-external=true" title="class or interface in java.lang.reflect">InvocationTargetException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html#make--">DecoderFactory</a></code></span></div>
 <div class="block">Produce a new instance of a decoder with type <code>T</code>.</div>
 <dl>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html
index 09e82dc..7e9542b 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>DecoderFactory (library 3.9.0 API)</title>
+<title>DecoderFactory (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="DecoderFactory (library 3.9.0 API)";
+            parent.document.title="DecoderFactory (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -154,11 +154,12 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>make</h4>
-<pre><a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html" title="type parameter in DecoderFactory">T</a>&nbsp;make()
-throws <a href="https://developer.android.com/reference/java/lang/IllegalAccessException.html?is-external=true" title="class or interface in java.lang">IllegalAccessException</a>,
-       <a href="https://developer.android.com/reference/java/lang/InstantiationException.html?is-external=true" title="class or interface in java.lang">InstantiationException</a>,
-       <a href="https://developer.android.com/reference/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a>,
-       <a href="https://developer.android.com/reference/java/lang/reflect/InvocationTargetException.html?is-external=true" title="class or interface in java.lang.reflect">InvocationTargetException</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+<a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.html" title="type parameter in DecoderFactory">T</a>&nbsp;make()
+         throws <a href="https://developer.android.com/reference/java/lang/IllegalAccessException.html?is-external=true" title="class or interface in java.lang">IllegalAccessException</a>,
+                <a href="https://developer.android.com/reference/java/lang/InstantiationException.html?is-external=true" title="class or interface in java.lang">InstantiationException</a>,
+                <a href="https://developer.android.com/reference/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a>,
+                <a href="https://developer.android.com/reference/java/lang/reflect/InvocationTargetException.html?is-external=true" title="class or interface in java.lang.reflect">InvocationTargetException</a></pre>
 <div class="block">Produce a new instance of a decoder with type <code>T</code>.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html
index a9a8b4e..9b41c8c 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>ImageDecoder (library 3.9.0 API)</title>
+<title>ImageDecoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="ImageDecoder (library 3.9.0 API)";
+            parent.document.title="ImageDecoder (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -152,9 +152,11 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>decode</h4>
-<pre><a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decode(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
-              <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
-       throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decode(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
+                       <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                       <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
+                throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Decode an image. The URI can be in one of the following formats:
  <br>
  File: <code>file:///scard/picture.jpg</code>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html
index 74c783e..6a63738 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>ImageRegionDecoder (library 3.9.0 API)</title>
+<title>ImageRegionDecoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="ImageRegionDecoder (library 3.9.0 API)";
+            parent.document.title="ImageRegionDecoder (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -172,9 +172,11 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre><a href="https://developer.android.com/reference/android/graphics/Point.html?is-external=true" title="class or interface in android.graphics">Point</a>&nbsp;init(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
-           <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
-    throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+<a href="https://developer.android.com/reference/android/graphics/Point.html?is-external=true" title="class or interface in android.graphics">Point</a>&nbsp;init(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
+                    <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                    <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
+             throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Initialise the decoder. When possible, perform initial setup work once in this method. The
  dimensions of the image must be returned. The URI can be in one of the following formats:
  <br>
@@ -200,8 +202,10 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>decodeRegion</h4>
-<pre><a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decodeRegion(<a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRect,
-                    int&nbsp;sampleSize)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decodeRegion(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                             <a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRect,
+                             int&nbsp;sampleSize)</pre>
 <div class="block"><p>
  Decode a region of the image with the given sample size. This method is called off the UI
  thread so it can safely load the image on the current thread. It is called from
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.html
index 695bb18..25a2d50 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SkiaImageDecoder (library 3.9.0 API)</title>
+<title>SkiaImageDecoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SkiaImageDecoder (library 3.9.0 API)";
+            parent.document.title="SkiaImageDecoder (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -200,7 +200,8 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SkiaImageDecoder</h4>
-<pre>public&nbsp;SkiaImageDecoder(<a href="https://developer.android.com/reference/android/graphics/Bitmap.Config.html?is-external=true" title="class or interface in android.graphics">Bitmap.Config</a>&nbsp;bitmapConfig)</pre>
+<pre>public&nbsp;SkiaImageDecoder(<a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+                        <a href="https://developer.android.com/reference/android/graphics/Bitmap.Config.html?is-external=true" title="class or interface in android.graphics">Bitmap.Config</a>&nbsp;bitmapConfig)</pre>
 </li>
 </ul>
 </li>
@@ -217,9 +218,11 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>decode</h4>
-<pre>public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decode(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
-                     <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
-              throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decode(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
+                              <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                              <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
+                       throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.html#decode-android.content.Context-android.net.Uri-">ImageDecoder</a></code></span></div>
 <div class="block">Decode an image. The URI can be in one of the following formats:
  <br>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.html
index 455c994..b8fa78c 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SkiaImageRegionDecoder (library 3.9.0 API)</title>
+<title>SkiaImageRegionDecoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SkiaImageRegionDecoder (library 3.9.0 API)";
+            parent.document.title="SkiaImageRegionDecoder (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -225,7 +225,8 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SkiaImageRegionDecoder</h4>
-<pre>public&nbsp;SkiaImageRegionDecoder(<a href="https://developer.android.com/reference/android/graphics/Bitmap.Config.html?is-external=true" title="class or interface in android.graphics">Bitmap.Config</a>&nbsp;bitmapConfig)</pre>
+<pre>public&nbsp;SkiaImageRegionDecoder(<a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+                              <a href="https://developer.android.com/reference/android/graphics/Bitmap.Config.html?is-external=true" title="class or interface in android.graphics">Bitmap.Config</a>&nbsp;bitmapConfig)</pre>
 </li>
 </ul>
 </li>
@@ -242,9 +243,11 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Point.html?is-external=true" title="class or interface in android.graphics">Point</a>&nbsp;init(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
-                  <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
-           throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Point.html?is-external=true" title="class or interface in android.graphics">Point</a>&nbsp;init(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
+                           <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                           <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
+                    throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html#init-android.content.Context-android.net.Uri-">ImageRegionDecoder</a></code></span></div>
 <div class="block">Initialise the decoder. When possible, perform initial setup work once in this method. The
  dimensions of the image must be returned. The URI can be in one of the following formats:
@@ -273,8 +276,10 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>decodeRegion</h4>
-<pre>public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decodeRegion(<a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRect,
-                           int&nbsp;sampleSize)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decodeRegion(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                    <a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRect,
+                                    int&nbsp;sampleSize)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.html#decodeRegion-android.graphics.Rect-int-">ImageRegionDecoder</a></code></span></div>
 <div class="block"><p>
  Decode a region of the image with the given sample size. This method is called off the UI
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.html
index 5eb294e..3e93d57 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>SkiaPooledImageRegionDecoder (library 3.9.0 API)</title>
+<title>SkiaPooledImageRegionDecoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="SkiaPooledImageRegionDecoder (library 3.9.0 API)";
+            parent.document.title="SkiaPooledImageRegionDecoder (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -247,7 +247,8 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SkiaPooledImageRegionDecoder</h4>
-<pre>public&nbsp;SkiaPooledImageRegionDecoder(<a href="https://developer.android.com/reference/android/graphics/Bitmap.Config.html?is-external=true" title="class or interface in android.graphics">Bitmap.Config</a>&nbsp;bitmapConfig)</pre>
+<pre>public&nbsp;SkiaPooledImageRegionDecoder(<a href="https://developer.android.com/reference/android/support.annotation.Nullable.html?is-external=true" title="class or interface in android">@Nullable</a>
+                                    <a href="https://developer.android.com/reference/android/graphics/Bitmap.Config.html?is-external=true" title="class or interface in android.graphics">Bitmap.Config</a>&nbsp;bitmapConfig)</pre>
 </li>
 </ul>
 </li>
@@ -278,9 +279,11 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Point.html?is-external=true" title="class or interface in android.graphics">Point</a>&nbsp;init(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
-                  <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
-           throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Point.html?is-external=true" title="class or interface in android.graphics">Point</a>&nbsp;init(<a href="https://developer.android.com/reference/android/content/Context.html?is-external=true" title="class or interface in android.content">Context</a>&nbsp;context,
+                           <a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                           <a href="https://developer.android.com/reference/android/net/Uri.html?is-external=true" title="class or interface in android.net">Uri</a>&nbsp;uri)
+                    throws <a href="https://developer.android.com/reference/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Initialises the decoder pool. This method creates one decoder on the current thread and uses
  it to decode the bounds, then spawns an independent thread to populate the pool with an
  additional three decoders. The thread will abort if <a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.html#recycle--"><code>recycle()</code></a> is called.</div>
@@ -303,8 +306,10 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>decodeRegion</h4>
-<pre>public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decodeRegion(<a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRect,
-                           int&nbsp;sampleSize)</pre>
+<pre><a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+public&nbsp;<a href="https://developer.android.com/reference/android/graphics/Bitmap.html?is-external=true" title="class or interface in android.graphics">Bitmap</a>&nbsp;decodeRegion(<a href="https://developer.android.com/reference/android/support.annotation.NonNull.html?is-external=true" title="class or interface in android">@NonNull</a>
+                                    <a href="https://developer.android.com/reference/android/graphics/Rect.html?is-external=true" title="class or interface in android.graphics">Rect</a>&nbsp;sRect,
+                                    int&nbsp;sampleSize)</pre>
 <div class="block">Acquire a read lock to prevent decoding overlapping with recycling, then check the pool still
  exists and acquire a decoder to load the requested region. There is no check whether the pool
  currently has decoders, because it's guaranteed to have one decoder after <a href="../../../../../com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.html#init-android.content.Context-android.net.Uri-"><code>init(Context, Uri)</code></a>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-frame.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-frame.html
index e824cf3..732b584 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-frame.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-frame.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>com.davemorrissey.labs.subscaleview.decoder (library 3.9.0 API)</title>
+<title>com.davemorrissey.labs.subscaleview.decoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-summary.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-summary.html
index 1fefa75..ec8d55e 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-summary.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-summary.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>com.davemorrissey.labs.subscaleview.decoder (library 3.9.0 API)</title>
+<title>com.davemorrissey.labs.subscaleview.decoder (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="com.davemorrissey.labs.subscaleview.decoder (library 3.9.0 API)";
+            parent.document.title="com.davemorrissey.labs.subscaleview.decoder (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-tree.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-tree.html
index 0c02afe..6d2e6cd 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-tree.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/decoder/package-tree.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>com.davemorrissey.labs.subscaleview.decoder Class Hierarchy (library 3.9.0 API)</title>
+<title>com.davemorrissey.labs.subscaleview.decoder Class Hierarchy (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="com.davemorrissey.labs.subscaleview.decoder Class Hierarchy (library 3.9.0 API)";
+            parent.document.title="com.davemorrissey.labs.subscaleview.decoder Class Hierarchy (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/package-frame.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/package-frame.html
index dc8cdd0..2266539 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/package-frame.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/package-frame.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>com.davemorrissey.labs.subscaleview (library 3.9.0 API)</title>
+<title>com.davemorrissey.labs.subscaleview (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/package-summary.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/package-summary.html
index 8b8d758..35d8dcb 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/package-summary.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/package-summary.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>com.davemorrissey.labs.subscaleview (library 3.9.0 API)</title>
+<title>com.davemorrissey.labs.subscaleview (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="com.davemorrissey.labs.subscaleview (library 3.9.0 API)";
+            parent.document.title="com.davemorrissey.labs.subscaleview (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/com/davemorrissey/labs/subscaleview/package-tree.html b/docs/javadoc/com/davemorrissey/labs/subscaleview/package-tree.html
index 67ce13c..1c76a9f 100644
--- a/docs/javadoc/com/davemorrissey/labs/subscaleview/package-tree.html
+++ b/docs/javadoc/com/davemorrissey/labs/subscaleview/package-tree.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>com.davemorrissey.labs.subscaleview Class Hierarchy (library 3.9.0 API)</title>
+<title>com.davemorrissey.labs.subscaleview Class Hierarchy (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="com.davemorrissey.labs.subscaleview Class Hierarchy (library 3.9.0 API)";
+            parent.document.title="com.davemorrissey.labs.subscaleview Class Hierarchy (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/constant-values.html b/docs/javadoc/constant-values.html
index 3f4b782..4371d37 100644
--- a/docs/javadoc/constant-values.html
+++ b/docs/javadoc/constant-values.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Constant Field Values (library 3.9.0 API)</title>
+<title>Constant Field Values (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Constant Field Values (library 3.9.0 API)";
+            parent.document.title="Constant Field Values (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -215,20 +215,27 @@
 <td class="colLast"><code>4</code></td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a name="com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.TILE_SIZE_AUTO">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html#TILE_SIZE_AUTO">TILE_SIZE_AUTO</a></code></td>
+<td class="colLast"><code>2147483647</code></td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a name="com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.ZOOM_FOCUS_CENTER">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html#ZOOM_FOCUS_CENTER">ZOOM_FOCUS_CENTER</a></code></td>
 <td class="colLast"><code>2</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.ZOOM_FOCUS_CENTER_IMMEDIATE">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.html#ZOOM_FOCUS_CENTER_IMMEDIATE">ZOOM_FOCUS_CENTER_IMMEDIATE</a></code></td>
 <td class="colLast"><code>3</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView.ZOOM_FOCUS_FIXED">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
diff --git a/docs/javadoc/deprecated-list.html b/docs/javadoc/deprecated-list.html
index d058444..21f8e3d 100644
--- a/docs/javadoc/deprecated-list.html
+++ b/docs/javadoc/deprecated-list.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Deprecated List (library 3.9.0 API)</title>
+<title>Deprecated List (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Deprecated List (library 3.9.0 API)";
+            parent.document.title="Deprecated List (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/help-doc.html b/docs/javadoc/help-doc.html
index b5b1861..7085bdd 100644
--- a/docs/javadoc/help-doc.html
+++ b/docs/javadoc/help-doc.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>API Help (library 3.9.0 API)</title>
+<title>API Help (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="API Help (library 3.9.0 API)";
+            parent.document.title="API Help (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/index-all.html b/docs/javadoc/index-all.html
index d390e51..e55b0a8 100644
--- a/docs/javadoc/index-all.html
+++ b/docs/javadoc/index-all.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Index (library 3.9.0 API)</title>
+<title>Index (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Index (library 3.9.0 API)";
+            parent.document.title="Index (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/index.html b/docs/javadoc/index.html
index d6722a1..de6c10e 100644
--- a/docs/javadoc/index.html
+++ b/docs/javadoc/index.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>library 3.9.0 API</title>
+<title>library 3.10.0 API</title>
 <script type="text/javascript">
     targetPage = "" + window.location.search;
     if (targetPage != "" && targetPage != "undefined")
diff --git a/docs/javadoc/overview-frame.html b/docs/javadoc/overview-frame.html
index 6451df0..b795984 100644
--- a/docs/javadoc/overview-frame.html
+++ b/docs/javadoc/overview-frame.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Overview List (library 3.9.0 API)</title>
+<title>Overview List (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
diff --git a/docs/javadoc/overview-summary.html b/docs/javadoc/overview-summary.html
index f6c7ffb..ed0f57d 100644
--- a/docs/javadoc/overview-summary.html
+++ b/docs/javadoc/overview-summary.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Overview (library 3.9.0 API)</title>
+<title>Overview (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Overview (library 3.9.0 API)";
+            parent.document.title="Overview (library 3.10.0 API)";
         }
     }
     catch(err) {
@@ -68,7 +68,7 @@
 </a></div>
 <!-- ========= END OF TOP NAVBAR ========= -->
 <div class="header">
-<h1 class="title">library 3.9.0 API</h1>
+<h1 class="title">library 3.10.0 API</h1>
 </div>
 <div class="contentContainer">
 <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Packages table, listing packages, and an explanation">
diff --git a/docs/javadoc/overview-tree.html b/docs/javadoc/overview-tree.html
index aa89c78..16b262b 100644
--- a/docs/javadoc/overview-tree.html
+++ b/docs/javadoc/overview-tree.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Class Hierarchy (library 3.9.0 API)</title>
+<title>Class Hierarchy (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Class Hierarchy (library 3.9.0 API)";
+            parent.document.title="Class Hierarchy (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/docs/javadoc/serialized-form.html b/docs/javadoc/serialized-form.html
index 2bbc3cc..84e957b 100644
--- a/docs/javadoc/serialized-form.html
+++ b/docs/javadoc/serialized-form.html
@@ -3,7 +3,7 @@
 <html lang="en">
 <head>
 <!-- Generated by javadoc -->
-<title>Serialized Form (library 3.9.0 API)</title>
+<title>Serialized Form (library 3.10.0 API)</title>
 <link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
 <script type="text/javascript" src="script.js"></script>
 </head>
@@ -11,7 +11,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Serialized Form (library 3.9.0 API)";
+            parent.document.title="Serialized Form (library 3.10.0 API)";
         }
     }
     catch(err) {
diff --git a/library/build.gradle b/library/build.gradle
index f83d595..60d7171 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -2,7 +2,7 @@
 
 group = 'com.davemorrissey.labs'
 archivesBaseName = 'subsampling-scale-image-view'
-version = '3.9.0'
+version = '3.10.0'
 
 android {
     compileSdkVersion 27
@@ -17,10 +17,10 @@
 }
 
 dependencies {
-    javadocs 'com.android.support:support-annotations:27.0.2'
-    javadocs 'com.android.support:exifinterface:27.0.2'
-    implementation 'com.android.support:support-annotations:27.0.2'
-    implementation 'com.android.support:exifinterface:27.0.2'
+    javadocs 'com.android.support:support-annotations:27.1.0'
+    javadocs 'com.android.support:exifinterface:27.1.0'
+    implementation 'com.android.support:support-annotations:27.1.0'
+    implementation 'com.android.support:exifinterface:27.1.0'
 }
 
 task javadoc(type: Javadoc) {
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageSource.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageSource.java
index de818ca..1314073 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageSource.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageSource.java
@@ -3,6 +3,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.net.Uri;
+import android.support.annotation.NonNull;
 
 import java.io.File;
 import java.io.UnsupportedEncodingException;
@@ -40,7 +41,7 @@
         this.cached = cached;
     }
 
-    private ImageSource(Uri uri) {
+    private ImageSource(@NonNull Uri uri) {
         // #114 If file doesn't exist, attempt to url decode the URI and try again
         String uriString = uri.toString();
         if (uriString.startsWith(FILE_SCHEME)) {
@@ -71,6 +72,7 @@
      * @param resId resource ID.
      * @return an {@link ImageSource} instance.
      */
+    @NonNull
     public static ImageSource resource(int resId) {
         return new ImageSource(resId);
     }
@@ -80,7 +82,9 @@
      * @param assetName asset name.
      * @return an {@link ImageSource} instance.
      */
-    public static ImageSource asset(String assetName) {
+    @NonNull
+    public static ImageSource asset(@NonNull String assetName) {
+        //noinspection ConstantConditions
         if (assetName == null) {
             throw new NullPointerException("Asset name must not be null");
         }
@@ -93,7 +97,9 @@
      * @param uri image URI.
      * @return an {@link ImageSource} instance.
      */
-    public static ImageSource uri(String uri) {
+    @NonNull
+    public static ImageSource uri(@NonNull String uri) {
+        //noinspection ConstantConditions
         if (uri == null) {
             throw new NullPointerException("Uri must not be null");
         }
@@ -111,7 +117,9 @@
      * @param uri image URI.
      * @return an {@link ImageSource} instance.
      */
-    public static ImageSource uri(Uri uri) {
+    @NonNull
+    public static ImageSource uri(@NonNull Uri uri) {
+        //noinspection ConstantConditions
         if (uri == null) {
             throw new NullPointerException("Uri must not be null");
         }
@@ -123,7 +131,9 @@
      * @param bitmap bitmap to be displayed.
      * @return an {@link ImageSource} instance.
      */
-    public static ImageSource bitmap(Bitmap bitmap) {
+    @NonNull
+    public static ImageSource bitmap(@NonNull Bitmap bitmap) {
+        //noinspection ConstantConditions
         if (bitmap == null) {
             throw new NullPointerException("Bitmap must not be null");
         }
@@ -137,7 +147,9 @@
      * @param bitmap bitmap to be displayed.
      * @return an {@link ImageSource} instance.
      */
-    public static ImageSource cachedBitmap(Bitmap bitmap) {
+    @NonNull
+    public static ImageSource cachedBitmap(@NonNull Bitmap bitmap) {
+        //noinspection ConstantConditions
         if (bitmap == null) {
             throw new NullPointerException("Bitmap must not be null");
         }
@@ -149,6 +161,7 @@
      * and tiling cannot be disabled when displaying a region of the source image.
      * @return this instance for chaining.
      */
+    @NonNull
     public ImageSource tilingEnabled() {
         return tiling(true);
     }
@@ -158,6 +171,7 @@
      * and tiling cannot be disabled when displaying a region of the source image.
      * @return this instance for chaining.
      */
+    @NonNull
     public ImageSource tilingDisabled() {
         return tiling(false);
     }
@@ -168,6 +182,7 @@
      * @param tile whether tiling should be enabled.
      * @return this instance for chaining.
      */
+    @NonNull
     public ImageSource tiling(boolean tile) {
         this.tile = tile;
         return this;
@@ -179,6 +194,7 @@
      * @param sRegion the region of the source image to be displayed.
      * @return this instance for chaining.
      */
+    @NonNull
     public ImageSource region(Rect sRegion) {
         this.sRegion = sRegion;
         setInvariants();
@@ -193,6 +209,7 @@
      * @param sHeight height of the source image.
      * @return this instance for chaining.
      */
+    @NonNull
     public ImageSource dimensions(int sWidth, int sHeight) {
         if (bitmap == null) {
             this.sWidth = sWidth;
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageViewState.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageViewState.java
index a5b8aaf..4b463c9 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageViewState.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/ImageViewState.java
@@ -1,6 +1,7 @@
 package com.davemorrissey.labs.subscaleview;
 
 import android.graphics.PointF;
+import android.support.annotation.NonNull;
 
 import java.io.Serializable;
 
@@ -18,7 +19,7 @@
 
     private final int orientation;
 
-    public ImageViewState(float scale, PointF center, int orientation) {
+    public ImageViewState(float scale, @NonNull PointF center, int orientation) {
         this.scale = scale;
         this.centerX = center.x;
         this.centerY = center.y;
@@ -29,7 +30,7 @@
         return scale;
     }
 
-    public PointF getCenter() {
+    @NonNull public PointF getCenter() {
         return new PointF(centerX, centerY);
     }
 
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
index 3a1410e..6aa084c 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
@@ -14,6 +14,7 @@
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.support.annotation.Nullable;
 import android.support.media.ExifInterface;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -376,7 +377,7 @@
      * Set the image source from a bitmap, resource, asset, file or other URI.
      * @param imageSource Image source.
      */
-    public final void setImage(ImageSource imageSource) {
+    public final void setImage(@NonNull ImageSource imageSource) {
         setImage(imageSource, null, null);
     }
 
@@ -387,7 +388,7 @@
      * @param imageSource Image source.
      * @param state State to be restored. Nullable.
      */
-    public final void setImage(ImageSource imageSource, ImageViewState state) {
+    public final void setImage(@NonNull ImageSource imageSource, ImageViewState state) {
         setImage(imageSource, null, state);
     }
 
@@ -401,7 +402,7 @@
      * @param imageSource Image source. Dimensions must be declared.
      * @param previewSource Optional source for a preview image to be displayed and allow interaction while the full size image loads.
      */
-    public final void setImage(ImageSource imageSource, ImageSource previewSource) {
+    public final void setImage(@NonNull ImageSource imageSource, ImageSource previewSource) {
         setImage(imageSource, previewSource, null);
     }
 
@@ -418,7 +419,8 @@
      * @param previewSource Optional source for a preview image to be displayed and allow interaction while the full size image loads.
      * @param state State to be restored. Nullable.
      */
-    public final void setImage(ImageSource imageSource, ImageSource previewSource, ImageViewState state) {
+    public final void setImage(@NonNull ImageSource imageSource, ImageSource previewSource, ImageViewState state) {
+        //noinspection ConstantConditions
         if (imageSource == null) {
             throw new NullPointerException("imageSource must not be null");
         }
@@ -1114,15 +1116,19 @@
             canvas.drawText("Scale: " + String.format(Locale.ENGLISH, "%.2f", scale) + " (" + String.format(Locale.ENGLISH, "%.2f", minScale()) + " - " + String.format(Locale.ENGLISH, "%.2f", maxScale) + ")", px(5), px(15), debugTextPaint);
             canvas.drawText("Translate: " + String.format(Locale.ENGLISH, "%.2f", vTranslate.x) + ":" + String.format(Locale.ENGLISH, "%.2f", vTranslate.y), px(5), px(30), debugTextPaint);
             PointF center = getCenter();
+            //noinspection ConstantConditions
             canvas.drawText("Source center: " + String.format(Locale.ENGLISH, "%.2f", center.x) + ":" + String.format(Locale.ENGLISH, "%.2f", center.y), px(5), px(45), debugTextPaint);
             if (anim != null) {
                 PointF vCenterStart = sourceToViewCoord(anim.sCenterStart);
                 PointF vCenterEndRequested = sourceToViewCoord(anim.sCenterEndRequested);
                 PointF vCenterEnd = sourceToViewCoord(anim.sCenterEnd);
+                //noinspection ConstantConditions
                 canvas.drawCircle(vCenterStart.x, vCenterStart.y, px(10), debugLinePaint);
                 debugLinePaint.setColor(Color.RED);
+                //noinspection ConstantConditions
                 canvas.drawCircle(vCenterEndRequested.x, vCenterEndRequested.y, px(20), debugLinePaint);
                 debugLinePaint.setColor(Color.BLUE);
+                //noinspection ConstantConditions
                 canvas.drawCircle(vCenterEnd.x, vCenterEnd.y, px(25), debugLinePaint);
                 debugLinePaint.setColor(Color.CYAN);
                 canvas.drawCircle(getWidth() / 2, getHeight() / 2, px(30), debugLinePaint);
@@ -1240,7 +1246,7 @@
      * Called on first draw when the view has dimensions. Calculates the initial sample size and starts async loading of
      * the base layer image - the whole source subsampled as necessary.
      */
-    private synchronized void initialiseBaseLayer(Point maxTileDimensions) {
+    private synchronized void initialiseBaseLayer(@NonNull Point maxTileDimensions) {
         debug("initialiseBaseLayer maxTileDimensions=%dx%d", maxTileDimensions.x, maxTileDimensions.y);
 
         satTemp = new ScaleAndTranslate(0f, new PointF(0, 0));
@@ -1920,7 +1926,7 @@
      * Set scale, center and orientation from saved state.
      */
     private void restoreState(ImageViewState state) {
-        if (state != null && state.getCenter() != null && VALID_ORIENTATIONS.contains(state.getOrientation())) {
+        if (state != null && VALID_ORIENTATIONS.contains(state.getOrientation())) {
             this.orientation = state.getOrientation();
             this.pendingScale = state.getScale();
             this.sPendingCenter = state.getCenter();
@@ -1952,6 +1958,7 @@
     /**
      * Use canvas max bitmap width and height instead of the default 2048, to avoid redundant tiling.
      */
+    @NonNull
     private Point getMaxBitmapDimensions(Canvas canvas) {
         return new Point(Math.min(canvas.getMaximumBitmapWidth(), maxTileWidth), Math.min(canvas.getMaximumBitmapHeight(), maxTileHeight));
     }
@@ -2102,6 +2109,7 @@
      * @param vxy view X/Y coordinate.
      * @return a coordinate representing the corresponding source coordinate.
      */
+    @Nullable
     public final PointF viewToSourceCoord(PointF vxy) {
         return viewToSourceCoord(vxy.x, vxy.y, new PointF());
     }
@@ -2112,6 +2120,7 @@
      * @param vy view Y coordinate.
      * @return a coordinate representing the corresponding source coordinate.
      */
+    @Nullable
     public final PointF viewToSourceCoord(float vx, float vy) {
         return viewToSourceCoord(vx, vy, new PointF());
     }
@@ -2122,7 +2131,8 @@
      * @param sTarget target object for result. The same instance is also returned.
      * @return source coordinates. This is the same instance passed to the sTarget param.
      */
-    public final PointF viewToSourceCoord(PointF vxy, PointF sTarget) {
+    @Nullable
+    public final PointF viewToSourceCoord(PointF vxy, @NonNull PointF sTarget) {
         return viewToSourceCoord(vxy.x, vxy.y, sTarget);
     }
 
@@ -2133,7 +2143,8 @@
      * @param sTarget target object for result. The same instance is also returned.
      * @return source coordinates. This is the same instance passed to the sTarget param.
      */
-    public final PointF viewToSourceCoord(float vx, float vy, PointF sTarget) {
+    @Nullable
+    public final PointF viewToSourceCoord(float vx, float vy, @NonNull PointF sTarget) {
         if (vTranslate == null) {
             return null;
         }
@@ -2162,6 +2173,7 @@
      * @param sxy source coordinates to convert.
      * @return view coordinates.
      */
+    @Nullable
     public final PointF sourceToViewCoord(PointF sxy) {
         return sourceToViewCoord(sxy.x, sxy.y, new PointF());
     }
@@ -2172,6 +2184,7 @@
      * @param sy source Y coordinate.
      * @return view coordinates.
      */
+    @Nullable
     public final PointF sourceToViewCoord(float sx, float sy) {
         return sourceToViewCoord(sx, sy, new PointF());
     }
@@ -2183,7 +2196,8 @@
      * @return view coordinates. This is the same instance passed to the vTarget param.
      */
     @SuppressWarnings("UnusedReturnValue")
-    public final PointF sourceToViewCoord(PointF sxy, PointF vTarget) {
+    @Nullable
+    public final PointF sourceToViewCoord(PointF sxy, @NonNull PointF vTarget) {
         return sourceToViewCoord(sxy.x, sxy.y, vTarget);
     }
 
@@ -2194,7 +2208,8 @@
      * @param vTarget target object for result. The same instance is also returned.
      * @return view coordinates. This is the same instance passed to the vTarget param.
      */
-    public final PointF sourceToViewCoord(float sx, float sy, PointF vTarget) {
+    @Nullable
+    public final PointF sourceToViewCoord(float sx, float sy, @NonNull PointF vTarget) {
         if (vTranslate == null) {
             return null;
         }
@@ -2205,7 +2220,7 @@
     /**
      * Convert source rect to screen rect, integer values.
      */
-    private void sourceToViewRect(Rect sRect, Rect vTarget) {
+    private void sourceToViewRect(@NonNull Rect sRect, @NonNull Rect vTarget) {
         vTarget.set(
             (int)sourceToViewX(sRect.left),
             (int)sourceToViewY(sRect.top),
@@ -2219,6 +2234,7 @@
      * adjusted for asymmetric padding. Accepts the desired scale as an argument, so this is independent of current
      * translate and scale. The result is fitted to bounds, putting the image point as near to the screen center as permitted.
      */
+    @NonNull
     private PointF vTranslateForSCenter(float sCenterX, float sCenterY, float scale) {
         int vxCenter = getPaddingLeft() + (getWidth() - getPaddingRight() - getPaddingLeft())/2;
         int vyCenter = getPaddingTop() + (getHeight() - getPaddingBottom() - getPaddingTop())/2;
@@ -2235,7 +2251,8 @@
      * Given a requested source center and scale, calculate what the actual center will have to be to keep the image in
      * pan limits, keeping the requested center as near to the middle of the screen as allowed.
      */
-    private PointF limitedSCenter(float sCenterX, float sCenterY, float scale, PointF sTarget) {
+    @NonNull
+    private PointF limitedSCenter(float sCenterX, float sCenterY, float scale, @NonNull PointF sTarget) {
         PointF vTranslate = vTranslateForSCenter(sCenterX, sCenterY, scale);
         int vxCenter = getPaddingLeft() + (getWidth() - getPaddingRight() - getPaddingLeft())/2;
         int vyCenter = getPaddingTop() + (getHeight() - getPaddingBottom() - getPaddingTop())/2;
@@ -2344,7 +2361,8 @@
      * public default constructor.
      * @param regionDecoderClass The {@link ImageRegionDecoder} implementation to use.
      */
-    public final void setRegionDecoderClass(Class<? extends ImageRegionDecoder> regionDecoderClass) {
+    public final void setRegionDecoderClass(@NonNull Class<? extends ImageRegionDecoder> regionDecoderClass) {
+        //noinspection ConstantConditions
         if (regionDecoderClass == null) {
             throw new IllegalArgumentException("Decoder class cannot be set to null");
         }
@@ -2357,7 +2375,8 @@
      * @param regionDecoderFactory The {@link DecoderFactory} implementation that produces {@link ImageRegionDecoder}
      *                             instances.
      */
-    public final void setRegionDecoderFactory(DecoderFactory<? extends ImageRegionDecoder> regionDecoderFactory) {
+    public final void setRegionDecoderFactory(@NonNull DecoderFactory<? extends ImageRegionDecoder> regionDecoderFactory) {
+        //noinspection ConstantConditions
         if (regionDecoderFactory == null) {
             throw new IllegalArgumentException("Decoder factory cannot be set to null");
         }
@@ -2370,7 +2389,8 @@
      * public default constructor.
      * @param bitmapDecoderClass The {@link ImageDecoder} implementation to use.
      */
-    public final void setBitmapDecoderClass(Class<? extends ImageDecoder> bitmapDecoderClass) {
+    public final void setBitmapDecoderClass(@NonNull Class<? extends ImageDecoder> bitmapDecoderClass) {
+        //noinspection ConstantConditions
         if (bitmapDecoderClass == null) {
             throw new IllegalArgumentException("Decoder class cannot be set to null");
         }
@@ -2382,7 +2402,8 @@
      * asset, and you cannot use a custom decoder when using layout XML to set an asset name.
      * @param bitmapDecoderFactory The {@link DecoderFactory} implementation that produces {@link ImageDecoder} instances.
      */
-    public final void setBitmapDecoderFactory(DecoderFactory<? extends ImageDecoder> bitmapDecoderFactory) {
+    public final void setBitmapDecoderFactory(@NonNull DecoderFactory<? extends ImageDecoder> bitmapDecoderFactory) {
+        //noinspection ConstantConditions
         if (bitmapDecoderFactory == null) {
             throw new IllegalArgumentException("Decoder factory cannot be set to null");
         }
@@ -2531,6 +2552,7 @@
      * Returns the source point at the center of the view.
      * @return the source coordinates current at the center of the view.
      */
+    @Nullable
     public final PointF getCenter() {
         int mX = getWidth()/2;
         int mY = getHeight()/2;
@@ -2551,7 +2573,7 @@
      * @param scale New scale to set.
      * @param sCenter New source image coordinate to center on the screen, subject to boundaries.
      */
-    public final void setScaleAndCenter(float scale, PointF sCenter) {
+    public final void setScaleAndCenter(float scale, @Nullable PointF sCenter) {
         this.anim = null;
         this.pendingScale = scale;
         this.sPendingCenter = sCenter;
@@ -2653,8 +2675,10 @@
      * the view is not ready.
      * @return an {@link ImageViewState} instance representing the current position of the image. null if the view isn't ready.
      */
+    @Nullable
     public final ImageViewState getState() {
         if (vTranslate != null && sWidth > 0 && sHeight > 0) {
+            //noinspection ConstantConditions
             return new ImageViewState(getScale(), getCenter(), getOrientation());
         }
         return null;
@@ -2790,7 +2814,8 @@
      * </p>
      * @param executor an {@link Executor} for image loading.
      */
-    public void setExecutor(Executor executor) {
+    public void setExecutor(@NonNull Executor executor) {
+        //noinspection ConstantConditions
         if (executor == null) {
             throw new NullPointerException("Executor must not be null");
         }
@@ -2869,6 +2894,7 @@
      * @param sCenter Target center point
      * @return {@link AnimationBuilder} instance. Call {@link SubsamplingScaleImageView.AnimationBuilder#start()} to start the anim.
      */
+    @Nullable
     public AnimationBuilder animateCenter(PointF sCenter) {
         if (!isReady()) {
             return null;
@@ -2882,6 +2908,7 @@
      * @param scale Target scale.
      * @return {@link AnimationBuilder} instance. Call {@link SubsamplingScaleImageView.AnimationBuilder#start()} to start the anim.
      */
+    @Nullable
     public AnimationBuilder animateScale(float scale) {
         if (!isReady()) {
             return null;
@@ -2896,6 +2923,7 @@
      * @param sCenter Target source center.
      * @return {@link AnimationBuilder} instance. Call {@link SubsamplingScaleImageView.AnimationBuilder#start()} to start the anim.
      */
+    @Nullable
     public AnimationBuilder animateScaleAndCenter(float scale, PointF sCenter) {
         if (!isReady()) {
             return null;
@@ -2948,6 +2976,7 @@
          * @param duration duration in milliseconds.
          * @return this builder for method chaining.
          */
+        @NonNull
         public AnimationBuilder withDuration(long duration) {
             this.duration = duration;
             return this;
@@ -2958,6 +2987,7 @@
          * @param interruptible interruptible flag.
          * @return this builder for method chaining.
          */
+        @NonNull
         public AnimationBuilder withInterruptible(boolean interruptible) {
             this.interruptible = interruptible;
             return this;
@@ -2968,6 +2998,7 @@
          * @param easing easing style.
          * @return this builder for method chaining.
          */
+        @NonNull
         public AnimationBuilder withEasing(int easing) {
             if (!VALID_EASING_STYLES.contains(easing)) {
                 throw new IllegalArgumentException("Unknown easing type: " + easing);
@@ -2981,6 +3012,7 @@
          * @param listener The listener.
          * @return this builder for method chaining.
          */
+        @NonNull
         public AnimationBuilder withOnAnimationEventListener(OnAnimationEventListener listener) {
             this.listener = listener;
             return this;
@@ -2992,6 +3024,7 @@
          * point and is stopped when the limit for each axis is reached. The latter behaviour is used for flings but
          * nothing else.
          */
+        @NonNull
         private AnimationBuilder withPanLimited(boolean panLimited) {
             this.panLimited = panLimited;
             return this;
@@ -3000,6 +3033,7 @@
         /**
          * Only for internal use. Indicates what caused the animation.
          */
+        @NonNull
         private AnimationBuilder withOrigin(int origin) {
             this.origin = origin;
             return this;
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java
index 870489f..d829c9d 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java
@@ -35,6 +35,7 @@
     }
 
     @Override
+    @NonNull
     public T make() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
         if (bitmapConfig == null) {
             return clazz.newInstance();
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java
index 4b521c8..0df8be8 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java
@@ -1,5 +1,7 @@
 package com.davemorrissey.labs.subscaleview.decoder;
 
+import android.support.annotation.NonNull;
+
 import java.lang.reflect.InvocationTargetException;
 
 /**
@@ -16,6 +18,6 @@
      * @throws NoSuchMethodException if the factory class cannot be instantiated.
      * @throws InvocationTargetException if the factory class cannot be instantiated.
      */
-    T make() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException;
+    @NonNull T make() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException;
 
 }
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.java
index 004f875..d5ba623 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageDecoder.java
@@ -3,6 +3,7 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.net.Uri;
+import android.support.annotation.NonNull;
 
 /**
  * Interface for image decoding classes, allowing the default {@link android.graphics.BitmapFactory}
@@ -24,6 +25,6 @@
      * @return the decoded bitmap
      * @throws Exception if decoding fails.
      */
-    Bitmap decode(Context context, Uri uri) throws Exception;
+    @NonNull Bitmap decode(Context context, @NonNull Uri uri) throws Exception;
 
 }
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.java
index 22ee955..a9bdeb5 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/ImageRegionDecoder.java
@@ -5,6 +5,7 @@
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.net.Uri;
+import android.support.annotation.NonNull;
 
 /**
  * Interface for image decoding classes, allowing the default {@link android.graphics.BitmapRegionDecoder}
@@ -26,7 +27,7 @@
      * @return Dimensions of the image.
      * @throws Exception if initialisation fails.
      */
-    Point init(Context context, Uri uri) throws Exception;
+    @NonNull Point init(Context context, @NonNull Uri uri) throws Exception;
 
     /**
      * <p>
@@ -44,7 +45,7 @@
      * @param sampleSize Sample size.
      * @return The decoded region. It is safe to return null if decoding fails.
      */
-    Bitmap decodeRegion(Rect sRect, int sampleSize);
+    @NonNull Bitmap decodeRegion(@NonNull Rect sRect, int sampleSize);
 
     /**
      * Status check. Should return false before initialisation and after recycle.
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java
index be1cd32..4e9124b 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java
@@ -8,6 +8,8 @@
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.support.annotation.Keep;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
 import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
@@ -36,7 +38,7 @@
     }
 
     @SuppressWarnings({"WeakerAccess", "SameParameterValue"})
-    public SkiaImageDecoder(Bitmap.Config bitmapConfig) {
+    public SkiaImageDecoder(@Nullable Bitmap.Config bitmapConfig) {
         Bitmap.Config globalBitmapConfig = SubsamplingScaleImageView.getPreferredBitmapConfig();
         if (bitmapConfig != null) {
             this.bitmapConfig = bitmapConfig;
@@ -48,7 +50,8 @@
     }
 
     @Override
-    public Bitmap decode(Context context, Uri uri) throws Exception {
+    @NonNull
+    public Bitmap decode(Context context, @NonNull Uri uri) throws Exception {
         String uriString = uri.toString();
         BitmapFactory.Options options = new BitmapFactory.Options();
         Bitmap bitmap;
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java
index eebe2bb..d2634c2 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java
@@ -9,6 +9,8 @@
 import android.net.Uri;
 import android.os.Build;
 import android.support.annotation.Keep;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
 import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
@@ -48,7 +50,7 @@
     }
 
     @SuppressWarnings({"WeakerAccess", "SameParameterValue"})
-    public SkiaImageRegionDecoder(Bitmap.Config bitmapConfig) {
+    public SkiaImageRegionDecoder(@Nullable Bitmap.Config bitmapConfig) {
         Bitmap.Config globalBitmapConfig = SubsamplingScaleImageView.getPreferredBitmapConfig();
         if (bitmapConfig != null) {
             this.bitmapConfig = bitmapConfig;
@@ -60,7 +62,8 @@
     }
 
     @Override
-    public Point init(Context context, Uri uri) throws Exception {
+    @NonNull
+    public Point init(Context context, @NonNull Uri uri) throws Exception {
         String uriString = uri.toString();
         if (uriString.startsWith(RESOURCE_PREFIX)) {
             Resources res;
@@ -107,7 +110,8 @@
     }
 
     @Override
-    public Bitmap decodeRegion(Rect sRect, int sampleSize) {
+    @NonNull
+    public Bitmap decodeRegion(@NonNull Rect sRect, int sampleSize) {
         getDecodeLock().lock();
         try {
             if (decoder != null && !decoder.isRecycled()) {
diff --git a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.java b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.java
index 80e415b..b1e9678 100644
--- a/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.java
+++ b/library/src/main/java/com/davemorrissey/labs/subscaleview/decoder/SkiaPooledImageRegionDecoder.java
@@ -15,6 +15,8 @@
 import android.net.Uri;
 import android.os.Build;
 import android.support.annotation.Keep;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -82,7 +84,7 @@
     }
 
     @SuppressWarnings({"WeakerAccess", "SameParameterValue"})
-    public SkiaPooledImageRegionDecoder(Bitmap.Config bitmapConfig) {
+    public SkiaPooledImageRegionDecoder(@Nullable Bitmap.Config bitmapConfig) {
         Bitmap.Config globalBitmapConfig = SubsamplingScaleImageView.getPreferredBitmapConfig();
         if (bitmapConfig != null) {
             this.bitmapConfig = bitmapConfig;
@@ -109,7 +111,8 @@
      * additional three decoders. The thread will abort if {@link #recycle()} is called.
      */
     @Override
-    public Point init(final Context context, final Uri uri) throws Exception {
+    @NonNull
+    public Point init(final Context context, @NonNull final Uri uri) throws Exception {
         this.context = context;
         this.uri = uri;
         initialiseDecoder();
@@ -245,7 +248,8 @@
      * method until after {@link #init(Context, Uri)}, so there will be no blocking on an empty pool.
      */
     @Override
-    public Bitmap decodeRegion(Rect sRect, int sampleSize) {
+    @NonNull
+    public Bitmap decodeRegion(@NonNull Rect sRect, int sampleSize) {
         debug("Decode region " + sRect + " on thread " + Thread.currentThread().getName());
         if (sRect.width() < imageDimensions.x || sRect.height() < imageDimensions.y) {
             lazyInit();
diff --git a/release.gradle b/release.gradle
index 409eda6..3d7b0a3 100644
--- a/release.gradle
+++ b/release.gradle
@@ -36,7 +36,7 @@
             pom.project {
                 name 'SubsamplingScaleImageView'
                 packaging 'aar'
-                description 'Custom image views for Android with pinch to zoom, panning, rotation and animation support, with easy extension so you can add your own overlays and touch event detection.'
+                description 'Highly configurable, easily extendable deep zoom view for displaying huge images without loss of detail. Perfect for photo galleries, maps, building plans etc.'
                 url 'https://github.com/davemorrissey/subsampling-scale-image-view'
 
                 scm {
@@ -63,4 +63,30 @@
         }
     }
 
+    task androidJavadocs(type: Javadoc) {
+        onlyIf { gradle.taskGraph.hasTask("uploadArchives") }
+        source = android.sourceSets.main.java.sourceFiles
+        destinationDir = rootProject.file("docs/javadoc")
+        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
+        classpath += configurations.compile
+        classpath += configurations.javadocs
+        options.noTimestamp = true
+        options.links = ['https://developer.android.com/reference/']
+    }
+
+    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
+        classifier = 'javadoc'
+        from androidJavadocs.destinationDir
+    }
+
+    task androidSourcesJar(type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.sourceFiles
+    }
+
+    artifacts {
+        archives androidSourcesJar
+        archives androidJavadocsJar
+    }
+
 }
diff --git a/sample/build.gradle b/sample/build.gradle
index f1096a7..8e536fc 100644
--- a/sample/build.gradle
+++ b/sample/build.gradle
@@ -15,5 +15,5 @@
 
 dependencies {
     implementation project(':library')
-    implementation 'com.android.support:support-v4:27.0.2'
+    implementation 'com.android.support:support-v4:27.1.0'
 }