Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java +61 −13 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.wm.shell.pip; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import android.app.IActivityManager; import android.app.PendingIntent; import android.app.RemoteAction; import android.content.BroadcastReceiver; Loading @@ -28,11 +27,14 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.drawable.Icon; import android.media.MediaMetadata; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.os.UserHandle; import androidx.annotation.Nullable; import com.android.wm.shell.R; import java.util.ArrayList; Loading Loading @@ -61,8 +63,17 @@ public class PipMediaController { void onMediaActionsChanged(List<RemoteAction> actions); } /** * A listener interface to receive notification on changes to the media metadata. */ public interface MetadataListener { /** * Called when the media metadata changes. */ void onMediaMetadataChanged(MediaMetadata metadata); } private final Context mContext; private final IActivityManager mActivityManager; private final MediaSessionManager mMediaSessionManager; private MediaController mMediaController; Loading Loading @@ -94,16 +105,21 @@ public class PipMediaController { public void onPlaybackStateChanged(PlaybackState state) { notifyActionsChanged(); } @Override public void onMetadataChanged(@Nullable MediaMetadata metadata) { notifyMetadataChanged(metadata); } }; private final MediaSessionManager.OnActiveSessionsChangedListener mSessionsChangedListener = controllers -> resolveActiveMediaController(controllers); this::resolveActiveMediaController; private ArrayList<ActionListener> mListeners = new ArrayList<>(); private final ArrayList<ActionListener> mActionListeners = new ArrayList<>(); private final ArrayList<MetadataListener> mMetadataListeners = new ArrayList<>(); public PipMediaController(Context context, IActivityManager activityManager) { public PipMediaController(Context context) { mContext = context; mActivityManager = activityManager; IntentFilter mediaControlFilter = new IntentFilter(); mediaControlFilter.addAction(ACTION_PLAY); mediaControlFilter.addAction(ACTION_PAUSE); Loading @@ -128,9 +144,9 @@ public class PipMediaController { /** * Adds a new media action listener. */ public void addListener(ActionListener listener) { if (!mListeners.contains(listener)) { mListeners.add(listener); public void addActionListener(ActionListener listener) { if (!mActionListeners.contains(listener)) { mActionListeners.add(listener); listener.onMediaActionsChanged(getMediaActions()); } } Loading @@ -138,9 +154,31 @@ public class PipMediaController { /** * Removes a media action listener. */ public void removeListener(ActionListener listener) { public void removeActionListener(ActionListener listener) { listener.onMediaActionsChanged(Collections.emptyList()); mListeners.remove(listener); mActionListeners.remove(listener); } /** * Adds a new media metadata listener. */ public void addMetadataListener(MetadataListener listener) { if (!mMetadataListeners.contains(listener)) { mMetadataListeners.add(listener); listener.onMediaMetadataChanged(getMediaMetadata()); } } /** * Removes a media metadata listener. */ public void removeMetadataListener(MetadataListener listener) { listener.onMediaMetadataChanged(null); mMetadataListeners.remove(listener); } private MediaMetadata getMediaMetadata() { return mMediaController != null ? mMediaController.getMetadata() : null; } /** Loading Loading @@ -242,6 +280,7 @@ public class PipMediaController { controller.registerCallback(mPlaybackChangedListener); } notifyActionsChanged(); notifyMetadataChanged(getMediaMetadata()); // TODO(winsonc): Consider if we want to close the PIP after a timeout (like on TV) } Loading @@ -251,9 +290,18 @@ public class PipMediaController { * Notifies all listeners that the actions have changed. */ private void notifyActionsChanged() { if (!mListeners.isEmpty()) { if (!mActionListeners.isEmpty()) { List<RemoteAction> actions = getMediaActions(); mListeners.forEach(l -> l.onMediaActionsChanged(actions)); mActionListeners.forEach(l -> l.onMediaActionsChanged(actions)); } } /** * Notifies all listeners that the metadata have changed. */ private void notifyMetadataChanged(MediaMetadata metadata) { if (!mMetadataListeners.isEmpty()) { mMetadataListeners.forEach(l -> l.onMediaMetadataChanged(metadata)); } } } libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuActivityController.java +2 −2 Original line number Diff line number Diff line Loading @@ -343,11 +343,11 @@ public class PipMenuActivityController { if (menuState == MENU_STATE_FULL) { // Once visible, start listening for media action changes. This call will trigger // the menu actions to be updated again. mMediaController.addListener(mMediaActionListener); mMediaController.addActionListener(mMediaActionListener); } else { // Once hidden, stop listening for media action changes. This call will trigger // the menu actions to be updated again. mMediaController.removeListener(mMediaActionListener); mMediaController.removeActionListener(mMediaActionListener); } try { Loading packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +2 −3 Original line number Diff line number Diff line Loading @@ -123,9 +123,8 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides static PipMediaController providePipMediaController(Context context, IActivityManager activityManager) { return new PipMediaController(context, activityManager); static PipMediaController providePipMediaController(Context context) { return new PipMediaController(context); } @WMSingleton Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java +61 −13 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.wm.shell.pip; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; import android.app.IActivityManager; import android.app.PendingIntent; import android.app.RemoteAction; import android.content.BroadcastReceiver; Loading @@ -28,11 +27,14 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.drawable.Icon; import android.media.MediaMetadata; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.os.UserHandle; import androidx.annotation.Nullable; import com.android.wm.shell.R; import java.util.ArrayList; Loading Loading @@ -61,8 +63,17 @@ public class PipMediaController { void onMediaActionsChanged(List<RemoteAction> actions); } /** * A listener interface to receive notification on changes to the media metadata. */ public interface MetadataListener { /** * Called when the media metadata changes. */ void onMediaMetadataChanged(MediaMetadata metadata); } private final Context mContext; private final IActivityManager mActivityManager; private final MediaSessionManager mMediaSessionManager; private MediaController mMediaController; Loading Loading @@ -94,16 +105,21 @@ public class PipMediaController { public void onPlaybackStateChanged(PlaybackState state) { notifyActionsChanged(); } @Override public void onMetadataChanged(@Nullable MediaMetadata metadata) { notifyMetadataChanged(metadata); } }; private final MediaSessionManager.OnActiveSessionsChangedListener mSessionsChangedListener = controllers -> resolveActiveMediaController(controllers); this::resolveActiveMediaController; private ArrayList<ActionListener> mListeners = new ArrayList<>(); private final ArrayList<ActionListener> mActionListeners = new ArrayList<>(); private final ArrayList<MetadataListener> mMetadataListeners = new ArrayList<>(); public PipMediaController(Context context, IActivityManager activityManager) { public PipMediaController(Context context) { mContext = context; mActivityManager = activityManager; IntentFilter mediaControlFilter = new IntentFilter(); mediaControlFilter.addAction(ACTION_PLAY); mediaControlFilter.addAction(ACTION_PAUSE); Loading @@ -128,9 +144,9 @@ public class PipMediaController { /** * Adds a new media action listener. */ public void addListener(ActionListener listener) { if (!mListeners.contains(listener)) { mListeners.add(listener); public void addActionListener(ActionListener listener) { if (!mActionListeners.contains(listener)) { mActionListeners.add(listener); listener.onMediaActionsChanged(getMediaActions()); } } Loading @@ -138,9 +154,31 @@ public class PipMediaController { /** * Removes a media action listener. */ public void removeListener(ActionListener listener) { public void removeActionListener(ActionListener listener) { listener.onMediaActionsChanged(Collections.emptyList()); mListeners.remove(listener); mActionListeners.remove(listener); } /** * Adds a new media metadata listener. */ public void addMetadataListener(MetadataListener listener) { if (!mMetadataListeners.contains(listener)) { mMetadataListeners.add(listener); listener.onMediaMetadataChanged(getMediaMetadata()); } } /** * Removes a media metadata listener. */ public void removeMetadataListener(MetadataListener listener) { listener.onMediaMetadataChanged(null); mMetadataListeners.remove(listener); } private MediaMetadata getMediaMetadata() { return mMediaController != null ? mMediaController.getMetadata() : null; } /** Loading Loading @@ -242,6 +280,7 @@ public class PipMediaController { controller.registerCallback(mPlaybackChangedListener); } notifyActionsChanged(); notifyMetadataChanged(getMediaMetadata()); // TODO(winsonc): Consider if we want to close the PIP after a timeout (like on TV) } Loading @@ -251,9 +290,18 @@ public class PipMediaController { * Notifies all listeners that the actions have changed. */ private void notifyActionsChanged() { if (!mListeners.isEmpty()) { if (!mActionListeners.isEmpty()) { List<RemoteAction> actions = getMediaActions(); mListeners.forEach(l -> l.onMediaActionsChanged(actions)); mActionListeners.forEach(l -> l.onMediaActionsChanged(actions)); } } /** * Notifies all listeners that the metadata have changed. */ private void notifyMetadataChanged(MediaMetadata metadata) { if (!mMetadataListeners.isEmpty()) { mMetadataListeners.forEach(l -> l.onMediaMetadataChanged(metadata)); } } }
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuActivityController.java +2 −2 Original line number Diff line number Diff line Loading @@ -343,11 +343,11 @@ public class PipMenuActivityController { if (menuState == MENU_STATE_FULL) { // Once visible, start listening for media action changes. This call will trigger // the menu actions to be updated again. mMediaController.addListener(mMediaActionListener); mMediaController.addActionListener(mMediaActionListener); } else { // Once hidden, stop listening for media action changes. This call will trigger // the menu actions to be updated again. mMediaController.removeListener(mMediaActionListener); mMediaController.removeActionListener(mMediaActionListener); } try { Loading
packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +2 −3 Original line number Diff line number Diff line Loading @@ -123,9 +123,8 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides static PipMediaController providePipMediaController(Context context, IActivityManager activityManager) { return new PipMediaController(context, activityManager); static PipMediaController providePipMediaController(Context context) { return new PipMediaController(context); } @WMSingleton Loading