Merge "Remove testing of dispatchHoverEvent"
diff --git a/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png
index 94016f4..a7084c5 100644
--- a/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png
index 17811ae..ed3c3b0 100644
--- a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
index 97fed92..be42712 100644
--- a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
+++ b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
index f874955..d7bc4e3 100644
--- a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
+++ b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png
index cb6a422..dcc1f3c 100644
--- a/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 956b6cd..2cfe61a 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -41,6 +41,7 @@
         <item name="listPreferredItemPaddingRight">?attr/suwMarginSides</item>
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonFontFamily">sans-serif</item>
+        <item name="suwButtonHighlightAlpha">0.24</item>
         <item name="suwCardBackground">@drawable/suw_card_bg_dark</item>
         <item name="suwDividerInsetEnd">0dp</item>
         <item name="suwDividerInsetStart">@dimen/suw_items_icon_divider_inset</item>
@@ -75,6 +76,7 @@
         <item name="listPreferredItemPaddingRight">?attr/suwMarginSides</item>
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonFontFamily">sans-serif</item>
+        <item name="suwButtonHighlightAlpha">0.24</item>
         <item name="suwCardBackground">@drawable/suw_card_bg_light</item>
         <item name="suwDividerInsetEnd">0dp</item>
         <item name="suwDividerInsetStart">@dimen/suw_items_icon_divider_inset</item>
@@ -110,6 +112,7 @@
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonCornerRadius">@dimen/suw_glif_button_corner_radius</item>
         <item name="suwButtonFontFamily">sans-serif-medium</item>
+        <item name="suwButtonHighlightAlpha">0.24</item>
         <item name="suwColorPrimary">?attr/colorPrimary</item>
         <item name="suwFillContentLayoutStyle">@style/SuwFillContentLayout</item>
         <item name="suwDividerInsetEnd">0dp</item>
@@ -149,6 +152,7 @@
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonCornerRadius">@dimen/suw_glif_button_corner_radius</item>
         <item name="suwButtonFontFamily">sans-serif-medium</item>
+        <item name="suwButtonHighlightAlpha">0.12</item>
         <item name="suwColorPrimary">?attr/colorPrimary</item>
         <item name="suwFillContentLayoutStyle">@style/SuwFillContentLayout</item>
         <item name="suwDividerInsetEnd">0dp</item>
diff --git a/library/main/res/color-v23/suw_flat_button_highlight.xml b/library/main/res/color-v23/suw_flat_button_highlight.xml
index c5be14f..cdb1305 100644
--- a/library/main/res/color-v23/suw_flat_button_highlight.xml
+++ b/library/main/res/color-v23/suw_flat_button_highlight.xml
@@ -17,5 +17,5 @@
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:color="?android:attr/colorAccent"
-        android:alpha="0.24" />
+        android:alpha="?attr/suwButtonHighlightAlpha" />
 </selector>
diff --git a/library/main/res/values/attrs.xml b/library/main/res/values/attrs.xml
index b3fcfe9..86b27fa 100644
--- a/library/main/res/values/attrs.xml
+++ b/library/main/res/values/attrs.xml
@@ -21,6 +21,7 @@
     <attr name="suwLayoutTheme" format="reference" />
     <attr name="suwMarginSides" format="dimension|reference" />
     <attr name="suwEditTextBackgroundColor" format="color" />
+    <attr name="suwButtonHighlightAlpha" format="float" />
 
     <!-- Subset of values in "gravity" in frameworks/base/core/res/res/values/attrs.xml. Only
          horizontal values are listed here as the header does not support vertical gravity. -->
diff --git a/library/main/res/values/dimens.xml b/library/main/res/values/dimens.xml
index 1a8b516..9aadcd3 100644
--- a/library/main/res/values/dimens.xml
+++ b/library/main/res/values/dimens.xml
@@ -31,7 +31,7 @@
     <dimen name="suw_glif_footer_padding_vertical">8dp</dimen>
     <dimen name="suw_glif_footer_min_height">72dp</dimen>
     <dimen name="suw_glif_margin_sides">24dp</dimen>
-    <dimen name="suw_glif_margin_top">48dp</dimen>
+    <dimen name="suw_glif_margin_top">56dp</dimen>
 
     <dimen name="suw_glif_v3_button_corner_radius">4dp</dimen>
 
@@ -98,7 +98,7 @@
     <!-- This is the extra spacing required to make the leading exactly 32sp -->
     <dimen name="suw_header_title_line_spacing_extra">3.67sp</dimen>
 
-    <dimen name="suw_glif_header_title_margin_top">15dp</dimen>
+    <dimen name="suw_glif_header_title_margin_top">16dp</dimen>
     <dimen name="suw_glif_header_title_margin_bottom">2dp</dimen>
 
     <dimen name="suw_glif_icon_max_height">32dp</dimen>
diff --git a/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java b/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java
index 6d31583..53149ea 100644
--- a/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java
+++ b/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java
@@ -65,6 +65,8 @@
 
     @VisibleForTesting Surface mSurface;
 
+    protected int mWindowVisibility;
+
     public IllustrationVideoView(Context context, AttributeSet attrs) {
         super(context, attrs);
         final TypedArray a = context.obtainStyledAttributes(attrs,
@@ -125,7 +127,7 @@
      * Creates a media player for the current URI. The media player will be started immediately if
      * the view's window is visible. If there is an existing media player, it will be released.
      */
-    private void createMediaPlayer() {
+    protected void createMediaPlayer() {
         if (mMediaPlayer != null) {
             mMediaPlayer.release();
         }
@@ -150,11 +152,35 @@
         } else {
             Log.wtf(TAG, "Unable to initialize media player for video view");
         }
-        if (getWindowVisibility() == View.VISIBLE) {
+        if (mWindowVisibility == View.VISIBLE) {
             start();
         }
     }
 
+    protected void createSurface() {
+        if (mSurface != null) {
+            mSurface.release();
+            mSurface = null;
+        }
+        // Reattach only if it has been previously released
+        SurfaceTexture surfaceTexture = getSurfaceTexture();
+        if (surfaceTexture != null) {
+            setVisibility(View.INVISIBLE);
+            mSurface = new Surface(surfaceTexture);
+        }
+    }
+
+    @Override
+    protected void onWindowVisibilityChanged(int visibility) {
+        super.onWindowVisibilityChanged(visibility);
+        mWindowVisibility = visibility;
+        if (visibility == View.VISIBLE) {
+            reattach();
+        } else {
+            release();
+        }
+    }
+
     /**
      * Whether the media player should play the video in a continuous loop. The default value is
      * true.
@@ -179,14 +205,34 @@
         }
     }
 
+    private void reattach() {
+        if (mSurface == null) {
+            initVideo();
+        }
+    }
+
+    private void initVideo() {
+        if (mWindowVisibility != View.VISIBLE) {
+            return;
+        }
+        createSurface();
+        if (mSurface != null) {
+            createMediaPlayer();
+        } else {
+            Log.w("IllustrationVideoView", "Surface creation failed");
+        }
+    }
+
+    protected void onRenderingStart() {
+    }
+
     /* SurfaceTextureListener methods */
 
     @Override
     public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
         // Keep the view hidden until video starts
         setVisibility(View.INVISIBLE);
-        mSurface = new Surface(surfaceTexture);
-        createMediaPlayer();
+        initVideo();
     }
 
     @Override
@@ -231,6 +277,7 @@
         if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
             // Video available, show view now
             setVisibility(View.VISIBLE);
+            onRenderingStart();
         }
         return false;
     }
diff --git a/library/platform/res/values-v27/styles.xml b/library/platform/res/values-v27/styles.xml
index 4739e24..e52fb09 100644
--- a/library/platform/res/values-v27/styles.xml
+++ b/library/platform/res/values-v27/styles.xml
@@ -44,6 +44,7 @@
 
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonFontFamily">sans-serif</item>
+        <item name="suwButtonHighlightAlpha">0.24</item>
         <item name="suwCardBackground">@drawable/suw_card_bg</item>
         <item name="suwFillContentLayoutStyle">@style/SuwFillContentLayout</item>
         <item name="suwDividerInsetEnd">0dp</item>
@@ -75,6 +76,7 @@
 
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonFontFamily">sans-serif</item>
+        <item name="suwButtonHighlightAlpha">0.24</item>
         <item name="suwCardBackground">@drawable/suw_card_bg</item>
         <item name="suwFillContentLayoutStyle">@style/SuwFillContentLayout</item>
         <item name="suwDividerInsetEnd">0dp</item>
@@ -110,6 +112,7 @@
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonCornerRadius">@dimen/suw_glif_button_corner_radius</item>
         <item name="suwButtonFontFamily">sans-serif-medium</item>
+        <item name="suwButtonHighlightAlpha">0.24</item>
         <item name="suwColorPrimary">?android:attr/colorPrimary</item>
         <item name="suwFillContentLayoutStyle">@style/SuwFillContentLayout</item>
         <item name="suwDividerInsetEnd">0dp</item>
@@ -146,6 +149,7 @@
         <item name="suwButtonAllCaps">true</item>
         <item name="suwButtonCornerRadius">@dimen/suw_glif_button_corner_radius</item>
         <item name="suwButtonFontFamily">sans-serif-medium</item>
+        <item name="suwButtonHighlightAlpha">0.12</item>
         <item name="suwColorPrimary">?android:attr/colorPrimary</item>
         <item name="suwFillContentLayoutStyle">@style/SuwFillContentLayout</item>
         <item name="suwDividerInsetEnd">0dp</item>
diff --git a/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java
index 1be822d..2a2c638 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java
@@ -16,6 +16,8 @@
 
 package com.android.setupwizardlib.view;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
@@ -30,6 +32,7 @@
 import android.media.MediaPlayer;
 import android.os.Build.VERSION_CODES;
 import android.view.Surface;
+import android.view.View;
 
 import androidx.annotation.RawRes;
 
@@ -92,6 +95,30 @@
     }
 
     @Test
+    public void onVisibilityChanged_notVisible_shouldRelease() {
+        createDefaultView();
+        mView.onWindowVisibilityChanged(View.GONE);
+
+        verify(ShadowMockMediaPlayer.sMediaPlayer).release();
+        assertThat(mView.mSurface).isNull();
+        assertThat(mView.mMediaPlayer).isNull();
+    }
+
+    @Test
+    public void onVisibilityChanged_visible_shouldPlay() {
+        createDefaultView();
+
+        mView.onWindowVisibilityChanged(View.GONE);
+        assertThat(mView.mSurface).isNull();
+        assertThat(mView.mMediaPlayer).isNull();
+
+        mView.onWindowVisibilityChanged(View.VISIBLE);
+
+        assertThat(mView.mSurface).isNotNull();
+        assertThat(mView.mMediaPlayer).isNotNull();
+    }
+
+    @Test
     public void testPausedWhenWindowFocusLost() {
         createDefaultView();
         mView.start();
@@ -149,6 +176,7 @@
                         // Any resource attribute should work, since the media player is mocked
                         .addAttribute(R.attr.suwVideo, "@android:color/white")
                         .build());
+        mView.setSurfaceTexture(mock(SurfaceTexture.class));
         mView.onSurfaceTextureAvailable(mSurfaceTexture, 500, 500);
     }
 
@@ -181,6 +209,7 @@
         @RealObject
         private Surface mRealSurface;
 
+        @Override
         public void __constructor__(SurfaceTexture surfaceTexture) {
             // Call the constructor on the real object, so that critical fields such as mLock is
             // initialized properly.