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.