Add LENGTH_INDEFINITE to Snackbar

BUG: 21802300

Change-Id: Id7b519b0ea08760dea12d1f1b1bb3fcf202b4c6e
diff --git a/design/api/current.txt b/design/api/current.txt
index 9dc6e20..e630e17 100644
--- a/design/api/current.txt
+++ b/design/api/current.txt
@@ -229,6 +229,7 @@
     method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
     method public android.support.design.widget.Snackbar setText(int);
     method public void show();
+    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
     field public static final int LENGTH_LONG = 0; // 0x0
     field public static final int LENGTH_SHORT = -1; // 0xffffffff
   }
diff --git a/design/src/android/support/design/widget/Snackbar.java b/design/src/android/support/design/widget/Snackbar.java
index f3df4f9..83888ce 100644
--- a/design/src/android/support/design/widget/Snackbar.java
+++ b/design/src/android/support/design/widget/Snackbar.java
@@ -95,11 +95,19 @@
     /**
      * @hide
      */
-    @IntDef({LENGTH_SHORT, LENGTH_LONG})
+    @IntDef({LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG})
     @Retention(RetentionPolicy.SOURCE)
     public @interface Duration {}
 
     /**
+     * Show the Snackbar indefinitely. This means that the Snackbar will be displayed from the time
+     * that is {@link #show() shown} until either it is dismissed, or another Snackbar is shown.
+     *
+     * @see #setDuration
+     */
+    public static final int LENGTH_INDEFINITE = -2;
+
+    /**
      * Show the Snackbar for a short period of time.
      *
      * @see #setDuration
diff --git a/design/src/android/support/design/widget/SnackbarManager.java b/design/src/android/support/design/widget/SnackbarManager.java
index c6b8f18..c4c54a2 100644
--- a/design/src/android/support/design/widget/SnackbarManager.java
+++ b/design/src/android/support/design/widget/SnackbarManager.java
@@ -200,6 +200,11 @@
     }
 
     private void scheduleTimeoutLocked(SnackbarRecord r) {
+        if (r.duration == Snackbar.LENGTH_INDEFINITE) {
+            // If we're set to indefinite, we don't want to set a timeout
+            return;
+        }
+
         int durationMs = LONG_DURATION_MS;
         if (r.duration > 0) {
             durationMs = r.duration;