From 21e659ef8e62d57be5ed77c80c1c80df94a8f952 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 18 Nov 2021 12:09:51 +0000 Subject: [PATCH] Migrate the cast demo app from PlayerView to StyledPlayerView StyledPlayerControlView can't really be used on its own (like PlayerControlView was used here), so we instead use the same StyledPlayerView instance for both local and casted playback, replacing the content with a cast icon while casting. PiperOrigin-RevId: 410764338 --- .../media3/demo/cast/MainActivity.java | 19 ++----- .../media3/demo/cast/PlayerManager.java | 54 +++++++++---------- .../ic_baseline_cast_connected_400.xml | 20 +++++++ .../src/main/res/layout/main_activity.xml | 9 +--- 4 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 demos/cast/src/main/res/drawable/ic_baseline_cast_connected_400.xml diff --git a/demos/cast/src/main/java/androidx/media3/demo/cast/MainActivity.java b/demos/cast/src/main/java/androidx/media3/demo/cast/MainActivity.java index 448b6b4738..7d0e3cd387 100644 --- a/demos/cast/src/main/java/androidx/media3/demo/cast/MainActivity.java +++ b/demos/cast/src/main/java/androidx/media3/demo/cast/MainActivity.java @@ -36,8 +36,7 @@ import androidx.media3.common.MediaItem; import androidx.media3.common.util.Assertions; import androidx.media3.common.util.Util; import androidx.media3.exoplayer.ExoPlayer; -import androidx.media3.ui.PlayerControlView; -import androidx.media3.ui.PlayerView; +import androidx.media3.ui.StyledPlayerView; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -53,8 +52,7 @@ import com.google.android.gms.dynamite.DynamiteModule; public class MainActivity extends AppCompatActivity implements OnClickListener, PlayerManager.Listener { - private PlayerView localPlayerView; - private PlayerControlView castControlView; + private StyledPlayerView playerView; private PlayerManager playerManager; private RecyclerView mediaQueueList; private MediaQueueListAdapter mediaQueueListAdapter; @@ -83,10 +81,8 @@ public class MainActivity extends AppCompatActivity setContentView(R.layout.main_activity); - localPlayerView = findViewById(R.id.local_player_view); - localPlayerView.requestFocus(); - - castControlView = findViewById(R.id.cast_control_view); + playerView = findViewById(R.id.player_view); + playerView.requestFocus(); mediaQueueList = findViewById(R.id.sample_list); ItemTouchHelper helper = new ItemTouchHelper(new RecyclerViewCallback()); @@ -114,12 +110,7 @@ public class MainActivity extends AppCompatActivity return; } playerManager = - new PlayerManager( - /* listener= */ this, - localPlayerView, - castControlView, - /* context= */ this, - castContext); + new PlayerManager(/* listener= */ this, this, playerView, /* context= */ castContext); mediaQueueList.setAdapter(mediaQueueListAdapter); } diff --git a/demos/cast/src/main/java/androidx/media3/demo/cast/PlayerManager.java b/demos/cast/src/main/java/androidx/media3/demo/cast/PlayerManager.java index 12dc271c40..efd460fb64 100644 --- a/demos/cast/src/main/java/androidx/media3/demo/cast/PlayerManager.java +++ b/demos/cast/src/main/java/androidx/media3/demo/cast/PlayerManager.java @@ -17,7 +17,7 @@ package androidx.media3.demo.cast; import android.content.Context; import android.view.KeyEvent; -import android.view.View; +import androidx.core.content.res.ResourcesCompat; import androidx.media3.cast.CastPlayer; import androidx.media3.cast.SessionAvailabilityListener; import androidx.media3.common.C; @@ -28,8 +28,9 @@ import androidx.media3.common.Player.TimelineChangeReason; import androidx.media3.common.Timeline; import androidx.media3.common.TracksInfo; import androidx.media3.exoplayer.ExoPlayer; -import androidx.media3.ui.PlayerControlView; import androidx.media3.ui.PlayerView; +import androidx.media3.ui.StyledPlayerControlView; +import androidx.media3.ui.StyledPlayerView; import com.google.android.gms.cast.framework.CastContext; import java.util.ArrayList; @@ -50,8 +51,8 @@ import java.util.ArrayList; void onUnsupportedTrack(int trackType); } - private final PlayerView localPlayerView; - private final PlayerControlView castControlView; + private final Context context; + private final StyledPlayerView playerView; private final Player localPlayer; private final CastPlayer castPlayer; private final ArrayList mediaQueue; @@ -64,32 +65,25 @@ import java.util.ArrayList; /** * Creates a new manager for {@link ExoPlayer} and {@link CastPlayer}. * - * @param listener A {@link Listener} for queue position changes. - * @param localPlayerView The {@link PlayerView} for local playback. - * @param castControlView The {@link PlayerControlView} to control remote playback. * @param context A {@link Context}. + * @param listener A {@link Listener} for queue position changes. + * @param playerView The {@link PlayerView} for playback. * @param castContext The {@link CastContext}. */ public PlayerManager( - Listener listener, - PlayerView localPlayerView, - PlayerControlView castControlView, - Context context, - CastContext castContext) { + Context context, Listener listener, StyledPlayerView playerView, CastContext castContext) { + this.context = context; this.listener = listener; - this.localPlayerView = localPlayerView; - this.castControlView = castControlView; + this.playerView = playerView; mediaQueue = new ArrayList<>(); currentItemIndex = C.INDEX_UNSET; localPlayer = new ExoPlayer.Builder(context).build(); localPlayer.addListener(this); - localPlayerView.setPlayer(localPlayer); castPlayer = new CastPlayer(castContext); castPlayer.addListener(this); castPlayer.setSessionAvailabilityListener(this); - castControlView.setPlayer(castPlayer); setCurrentPlayer(castPlayer.isCastSessionAvailable() ? castPlayer : localPlayer); } @@ -192,11 +186,7 @@ import java.util.ArrayList; * @return Whether the event was handled by the target view. */ public boolean dispatchKeyEvent(KeyEvent event) { - if (currentPlayer == localPlayer) { - return localPlayerView.dispatchKeyEvent(event); - } else /* currentPlayer == castPlayer */ { - return castControlView.dispatchKeyEvent(event); - } + return playerView.dispatchKeyEvent(event); } /** Releases the manager and the players that it holds. */ @@ -205,7 +195,7 @@ import java.util.ArrayList; mediaQueue.clear(); castPlayer.setSessionAvailabilityListener(null); castPlayer.release(); - localPlayerView.setPlayer(null); + playerView.setPlayer(null); localPlayer.release(); } @@ -270,13 +260,19 @@ import java.util.ArrayList; return; } - // View management. - if (currentPlayer == localPlayer) { - localPlayerView.setVisibility(View.VISIBLE); - castControlView.hide(); - } else /* currentPlayer == castPlayer */ { - localPlayerView.setVisibility(View.GONE); - castControlView.show(); + playerView.setPlayer(currentPlayer); + playerView.setControllerHideOnTouch(currentPlayer == localPlayer); + if (currentPlayer == castPlayer) { + playerView.setControllerShowTimeoutMs(0); + playerView.showController(); + playerView.setDefaultArtwork( + ResourcesCompat.getDrawable( + context.getResources(), + R.drawable.ic_baseline_cast_connected_400, + /* theme= */ null)); + } else { // currentPlayer == localPlayer + playerView.setControllerShowTimeoutMs(StyledPlayerControlView.DEFAULT_SHOW_TIMEOUT_MS); + playerView.setDefaultArtwork(null); } // Player state management. diff --git a/demos/cast/src/main/res/drawable/ic_baseline_cast_connected_400.xml b/demos/cast/src/main/res/drawable/ic_baseline_cast_connected_400.xml new file mode 100644 index 0000000000..e65129b686 --- /dev/null +++ b/demos/cast/src/main/res/drawable/ic_baseline_cast_connected_400.xml @@ -0,0 +1,20 @@ + + + + diff --git a/demos/cast/src/main/res/layout/main_activity.xml b/demos/cast/src/main/res/layout/main_activity.xml index f0e18c8ce2..86b6abe7b3 100644 --- a/demos/cast/src/main/res/layout/main_activity.xml +++ b/demos/cast/src/main/res/layout/main_activity.xml @@ -20,7 +20,7 @@ android:layout_height="match_parent" android:keepScreenOn="true"> - - -