[Android] [PATCH 1/2] Video Player interface revamp

Geoffrey Métais geoffrey.metais at gmail.com
Tue Oct 21 18:08:14 CEST 2014


New layout is only for Android 4.0+
We keep the current one for older devices
---
 vlc-android/res/layout-v15/player.xml              | 226 +++++++++++++++++++++
 vlc-android/res/layout-v17/player_action_bar.xml   |   4 +-
 vlc-android/res/layout/player_overlay_header.xml   |   2 +
 vlc-android/res/values-land-v17/dimens.xml         |   3 +
 vlc-android/res/values-port-v17/dimens.xml         |   4 +
 vlc-android/res/values-sw600dp-v17/dimens.xml      |   3 +
 vlc-android/res/values-sw600dp/dimens.xml          |   4 +
 vlc-android/res/values-v19/styles.xml              |   1 +
 vlc-android/res/values/dimens.xml                  |  14 ++
 vlc-android/res/values/styles.xml                  |   3 +-
 .../vlc/gui/video/VideoPlayerActivity.java         |  35 +++-
 11 files changed, 289 insertions(+), 10 deletions(-)
 create mode 100644 vlc-android/res/layout-v15/player.xml
 create mode 100644 vlc-android/res/values-land-v17/dimens.xml
 create mode 100644 vlc-android/res/values-port-v17/dimens.xml
 create mode 100644 vlc-android/res/values-sw600dp-v17/dimens.xml
 create mode 100644 vlc-android/res/values-sw600dp/dimens.xml

diff --git a/vlc-android/res/layout-v15/player.xml b/vlc-android/res/layout-v15/player.xml
new file mode 100644
index 0000000..63a4dfb
--- /dev/null
+++ b/vlc-android/res/layout-v15/player.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <!--
+     the double FrameLayout is necessary here to do cropping on the bottom right
+     (which requires the surface not be centered), while keeping the result centered
+    -->
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="false" >
+
+        <FrameLayout
+            android:id="@+id/player_surface_frame"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:foregroundGravity="clip_horizontal|clip_vertical" >
+
+            <SurfaceView
+                android:id="@+id/player_surface"
+                android:layout_width="1dp"
+                android:layout_height="1dp" />
+
+            <SurfaceView
+                android:id="@+id/subtitles_surface"
+                android:layout_width="1dp"
+                android:layout_height="1dp"
+                android:visibility="invisible" />
+        </FrameLayout>
+    </FrameLayout>
+
+    <include layout="@layout/player_overlay_header" />
+
+    <include
+        android:id="@+id/player_overlay_tips"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        layout="@layout/player_tips" />
+
+    <ImageView
+        android:id="@+id/player_overlay_loading"
+        android:layout_width="80dp"
+        android:layout_height="80dp"
+        android:layout_centerInParent="true"
+        android:src="@drawable/ic_cone_o" />
+
+    <TextView
+        android:id="@+id/player_overlay_loading_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/player_overlay_loading"
+        android:layout_centerHorizontal="true"
+        android:textAppearance="@style/TextAppearance.AppCompat.SearchResult.Title" />
+
+    <TextView
+        android:id="@+id/player_overlay_info"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/player_overlay_loading_text"
+        android:layout_centerHorizontal="true"
+        android:layout_gravity="center"
+        android:background="@drawable/video_list_length_bg"
+        android:padding="5dp"
+        android:textColor="#ffffff"
+        android:textSize="36sp"
+        android:visibility="invisible" />
+
+    <!-- Media HUD -->
+
+    <RelativeLayout
+        android:id="@+id/progress_overlay"
+        android:layout_width="@dimen/overlay_width"
+        android:layout_height="@dimen/overlay_height"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginBottom="@dimen/overlay_margin_bottom"
+        android:alpha="0.5"
+        android:background="@android:color/black"
+        android:paddingBottom="@dimen/overlay_padding_bottom"
+        android:paddingLeft="@dimen/overlay_padding_sides"
+        android:paddingRight="@dimen/overlay_padding_sides"
+        android:paddingTop="@dimen/overlay_padding_top" >
+
+        <LinearLayout
+            android:id="@+id/player_overlay_progress"
+	            android:layout_width="match_parent"
+	            android:layout_height="wrap_content"
+	            android:layout_alignParentTop="true"
+	            android:layout_centerHorizontal="true"
+	            android:orientation="horizontal" >
+
+	        <TextView
+	            android:id="@+id/player_overlay_time"
+	            android:layout_width="wrap_content"
+	            android:layout_height="wrap_content"
+	            android:textAppearance="@style/TextAppearance.AppCompat.SearchResult.Title" />
+
+	        <SeekBar
+	            android:id="@+id/player_overlay_seekbar"
+	            android:layout_width="0dp"
+	            android:layout_height="wrap_content"
+	            android:layout_weight="1"
+	            android:maxHeight="@dimen/seekbar_height"
+	            android:minHeight="@dimen/seekbar_height"
+	            android:paddingLeft="@dimen/seekbar_padding_sides"
+	            android:paddingRight="@dimen/seekbar_padding_sides"
+	            android:progressDrawable="@drawable/po_seekbar"
+	            android:thumb="@drawable/seekbar_thumb" />
+
+	        <TextView
+	            android:id="@+id/player_overlay_length"
+	            android:layout_width="wrap_content"
+	            android:layout_height="wrap_content"
+	            android:textAppearance="@style/TextAppearance.AppCompat.SearchResult.Title" />
+	
+        </LinearLayout>
+
+        <!-- Media control buttons -->
+
+        <LinearLayout
+            android:id="@+id/media_controls"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:layout_centerVertical="true"
+            android:layout_marginTop="@dimen/media_ctrl_margin_top"
+            android:orientation="horizontal" >
+
+            <ImageButton
+                android:id="@+id/player_overlay_backward"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:clickable="true"
+                android:onClick="onClick"
+                android:background="@drawable/ic_backward_w" />
+
+            <ImageButton
+                android:id="@+id/player_overlay_play"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="20dp"
+                android:layout_marginRight="20dp"
+                android:clickable="true"
+                android:onClick="onClick"
+            	android:background="@drawable/ic_pause_circle"/>
+
+            <ImageButton
+                android:id="@+id/player_overlay_forward"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:clickable="true"
+                android:onClick="onClick"
+                android:background="@drawable/ic_forward_normal_w" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/option_overlay"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/media_controls"
+            android:layout_alignParentBottom="true"
+            android:layout_alignParentRight="true"
+            android:layout_alignParentEnd="true"
+            android:orientation="horizontal"
+            android:visibility="invisible" >
+
+            <ImageButton
+                android:id="@+id/lock_overlay_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/options_margin"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/ic_lock" />
+
+            <ImageButton
+                android:id="@+id/player_overlay_subtitle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/options_margin"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/ic_subtitle_circle" />
+
+            <ImageButton
+                android:id="@+id/player_overlay_audio"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/options_margin"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/ic_audio_circle" />
+
+            <ImageButton
+                android:id="@+id/player_overlay_navmenu"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/options_margin"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/ic_navmenu_circle"
+                android:visibility="visible" />
+
+            <ImageButton
+                android:id="@+id/player_overlay_size"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/options_margin"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/ic_crop_circle" />
+
+            <ImageButton
+                android:id="@+id/player_overlay_adv_function"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="@dimen/options_margin"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/dots"
+                android:onClick="showAdvancedOptions" />
+        </LinearLayout>
+    </RelativeLayout>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/vlc-android/res/layout-v17/player_action_bar.xml b/vlc-android/res/layout-v17/player_action_bar.xml
index c6ba0eb..72f5ba5 100644
--- a/vlc-android/res/layout-v17/player_action_bar.xml
+++ b/vlc-android/res/layout-v17/player_action_bar.xml
@@ -5,12 +5,14 @@
 
     <TextView
         android:id="@+id/player_overlay_title"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:gravity="center_horizontal"
         android:layout_gravity="top"
         android:background="?attr/status_bar_overlay"
         android:text="@string/title"
         android:textColor="#ffffff"
+        android:layout_marginTop="10dp"
         android:paddingLeft="5dp"
         android:paddingRight="5dp"
         android:textSize="15sp"
diff --git a/vlc-android/res/layout/player_overlay_header.xml b/vlc-android/res/layout/player_overlay_header.xml
index 07a7327..5a9a462 100644
--- a/vlc-android/res/layout/player_overlay_header.xml
+++ b/vlc-android/res/layout/player_overlay_header.xml
@@ -7,6 +7,7 @@
         android:layout_alignParentTop="true"
         android:layout_gravity="top"
         android:background="?attr/video_player_overlay"
+        android:layout_marginTop="10dp"
         android:paddingLeft="5dp"
         android:paddingRight="5dp"
         android:visibility="invisible" >
@@ -16,6 +17,7 @@
             android:layout_width="0dp"
             android:layout_height="fill_parent"
             android:layout_weight="1"
+            android:gravity="center_horizontal"
             android:text="@string/title"
             android:textColor="#ffffff"
             android:textSize="15sp" />
diff --git a/vlc-android/res/values-land-v17/dimens.xml b/vlc-android/res/values-land-v17/dimens.xml
new file mode 100644
index 0000000..0f27b26
--- /dev/null
+++ b/vlc-android/res/values-land-v17/dimens.xml
@@ -0,0 +1,3 @@
+<resources>
+    <dimen name="overlay_padding_sides">40dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/vlc-android/res/values-port-v17/dimens.xml b/vlc-android/res/values-port-v17/dimens.xml
new file mode 100644
index 0000000..0e33d5d
--- /dev/null
+++ b/vlc-android/res/values-port-v17/dimens.xml
@@ -0,0 +1,4 @@
+<resources>
+    <dimen name="overlay_margin_bottom">50dip</dimen>
+    <dimen name="overlay_padding_sides">20dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/vlc-android/res/values-sw600dp-v17/dimens.xml b/vlc-android/res/values-sw600dp-v17/dimens.xml
new file mode 100644
index 0000000..e7c62ca
--- /dev/null
+++ b/vlc-android/res/values-sw600dp-v17/dimens.xml
@@ -0,0 +1,3 @@
+<resources>
+    <dimen name="overlay_margin_bottom">10dip</dimen>
+</resources>
\ No newline at end of file
diff --git a/vlc-android/res/values-sw600dp/dimens.xml b/vlc-android/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000..ded8585
--- /dev/null
+++ b/vlc-android/res/values-sw600dp/dimens.xml
@@ -0,0 +1,4 @@
+<resources>
+    <!-- Video Player -->
+    <dimen name="overlay_height">250dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/vlc-android/res/values-v19/styles.xml b/vlc-android/res/values-v19/styles.xml
index 58513bc..6f1046f 100644
--- a/vlc-android/res/values-v19/styles.xml
+++ b/vlc-android/res/values-v19/styles.xml
@@ -4,6 +4,7 @@
         <item name="android:windowBackground">@color/black</item>
         <item name="android:windowActionBarOverlay">true</item>
         <item name="android:windowTranslucentStatus">true</item>
+        <item name="android:windowTranslucentNavigation">true</item>
 
         <item name="video_player_overlay">@color/transparent_gray</item>
         <item name="status_bar_overlay">@android:color/transparent</item>
diff --git a/vlc-android/res/values/dimens.xml b/vlc-android/res/values/dimens.xml
index ffdd68e..bde3575 100644
--- a/vlc-android/res/values/dimens.xml
+++ b/vlc-android/res/values/dimens.xml
@@ -3,4 +3,18 @@
     <dimen name="widget_margin">10dp</dimen>
     <dimen name="audio_browser_item_size">50dp</dimen>
     <dimen name="listview_bottom_padding">50dp</dimen>
+
+    <!-- Video Player -->
+    <dimen name="overlay_width">800dp</dimen>
+    <dimen name="overlay_height">200dp</dimen>
+    <dimen name="overlay_margin_bottom">10dip</dimen>
+    <dimen name="overlay_padding_bottom">10dip</dimen>
+    <dimen name="overlay_padding_top">20dip</dimen>
+    <dimen name="overlay_padding_sides">30dip</dimen>
+
+    <dimen name="seekbar_height">3dip</dimen>
+    <dimen name="seekbar_padding_sides">20dp</dimen>
+
+    <dimen name="media_ctrl_margin_top">20dp</dimen>
+    <dimen name="options_margin">10dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/vlc-android/res/values/styles.xml b/vlc-android/res/values/styles.xml
index ca844a0..6325889 100644
--- a/vlc-android/res/values/styles.xml
+++ b/vlc-android/res/values/styles.xml
@@ -153,7 +153,8 @@
 
     <style name="Theme.VLC.Player" parent="android:Theme.NoTitleBar.Fullscreen">
         <item name="android:windowBackground">@color/black</item>
-        <item name="video_player_overlay">@color/transparent_gray</item>
+        <!-- item name="video_player_overlay">@color/transparent_gray</item-->
+        <item name="video_player_overlay">@android:color/transparent</item>
 
         <item name="advanced_options_style">@style/Theme.VLC.AdvancedOptionsBlack</item>
     </style>
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
index c8df820..9cacdfb 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
@@ -72,6 +72,7 @@ import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Color;
 import android.graphics.ImageFormat;
@@ -112,6 +113,7 @@ import android.view.animation.RotateAnimation;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.ImageView;
+import android.widget.RelativeLayout;
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
 import android.widget.TextView;
@@ -364,7 +366,6 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
 
         mSize = (ImageButton) findViewById(R.id.player_overlay_size);
         mSize.setOnClickListener(mSizeListener);
-
         mMenu = (ImageButton) findViewById(R.id.player_overlay_adv_function);
 
         try {
@@ -447,11 +448,14 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
                     : getScreenOrientation());
             // Tips
             mOverlayTips = findViewById(R.id.player_overlay_tips);
-            if(mSettings.getBoolean(PREF_TIPS_SHOWN, false))
-                mOverlayTips.setVisibility(View.GONE);
-            else {
-                mOverlayTips.bringToFront();
-                mOverlayTips.invalidate();
+            if (mOverlayTips != null) {
+                if (mSettings.getBoolean(PREF_TIPS_SHOWN, false)
+                        || getIntent().getBooleanExtra("tvDevice", false))
+                    mOverlayTips.setVisibility(View.GONE);
+                else {
+                    mOverlayTips.bringToFront();
+                    mOverlayTips.invalidate();
+                }
             }
         } else
             setRequestedOrientation(getScreenOrientation());
@@ -789,6 +793,15 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         setSurfaceSize(mVideoWidth, mVideoHeight, mVideoVisibleWidth, mVideoVisibleHeight, mSarNum, mSarDen);
+        //Maintain HUD over the system bar on Android 4.2+
+        RelativeLayout.LayoutParams lp = (android.widget.RelativeLayout.LayoutParams) mOverlayProgress.getLayoutParams();
+        Resources res = getResources();
+        lp.setMargins(0, 0, 0, res.getDimensionPixelSize(R.dimen.overlay_margin_bottom));
+        mOverlayProgress.setPadding(res.getDimensionPixelSize(R.dimen.overlay_padding_sides),
+                res.getDimensionPixelSize(R.dimen.overlay_padding_top),
+                res.getDimensionPixelSize(R.dimen.overlay_padding_sides),
+                res.getDimensionPixelSize(R.dimen.overlay_padding_bottom));
+        mOverlayProgress.setLayoutParams(lp);
         super.onConfigurationChanged(newConfig);
     }
 
@@ -1815,6 +1828,8 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
                     mOverlayHeader.setVisibility(View.VISIBLE);
                 mOverlayOption.setVisibility(View.VISIBLE);
                 mPlayPause.setVisibility(View.VISIBLE);
+                mBackward.setVisibility(View.VISIBLE);
+                mForward.setVisibility(View.VISIBLE);
                 mMenu.setVisibility(View.VISIBLE);
                 dimStatusBar(false);
             }
@@ -1844,6 +1859,8 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
                 mOverlayOption.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
                 mOverlayProgress.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
                 mPlayPause.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
+                mBackward.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
+                mForward.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
                 mMenu.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
             }
             if (mPresentation != null) {
@@ -1857,6 +1874,8 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
             mOverlayOption.setVisibility(View.INVISIBLE);
             mOverlayProgress.setVisibility(View.INVISIBLE);
             mPlayPause.setVisibility(View.INVISIBLE);
+            mBackward.setVisibility(View.INVISIBLE);
+            mForward.setVisibility(View.INVISIBLE);
             mMenu.setVisibility(View.INVISIBLE);
             mShowing = false;
             dimStatusBar(true);
@@ -1927,8 +1946,8 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
 
         // Update all view elements
         boolean isSeekable = mEnableJumpButtons && length > 0;
-        mBackward.setVisibility(isSeekable ? View.VISIBLE : View.GONE);
-        mForward.setVisibility(isSeekable ? View.VISIBLE : View.GONE);
+        mBackward.setVisibility(isSeekable && !mIsLocked ? View.VISIBLE : View.GONE);
+        mForward.setVisibility(isSeekable && !mIsLocked ? View.VISIBLE : View.GONE);
         mSeekbar.setMax(length);
         mSeekbar.setProgress(time);
         if (!mOverlayUseStatusBar)
-- 
1.9.1



More information about the Android mailing list