Loading core/java/com/android/internal/widget/MediaNotificationView.java +47 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RemoteViews; import java.util.ArrayList; /** * A TextView that can float around an image on the end. * Loading @@ -42,6 +44,7 @@ public class MediaNotificationView extends FrameLayout { private View mMainColumn; private View mMediaContent; private int mImagePushIn; private ArrayList<VisibilityChangeListener> mListeners; public MediaNotificationView(Context context) { this(context, null); Loading Loading @@ -168,4 +171,48 @@ public class MediaNotificationView extends FrameLayout { mMainColumn = findViewById(com.android.internal.R.id.notification_main_column); mMediaContent = findViewById(com.android.internal.R.id.notification_media_content); } @Override public void onVisibilityAggregated(boolean isVisible) { super.onVisibilityAggregated(isVisible); for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).onAggregatedVisibilityChanged(isVisible); } } /** * Add a listener to receive updates on the visibility of this view * * @param listener The listener to add. */ public void addVisibilityListener(VisibilityChangeListener listener) { if (mListeners == null) { mListeners = new ArrayList<>(); } if (!mListeners.contains(listener)) { mListeners.add(listener); } } /** * Remove the specified listener * * @param listener The listener to remove. */ public void removeVisibilityListener(VisibilityChangeListener listener) { if (mListeners != null) { mListeners.remove(listener); } } /** * Interface for receiving updates when the view's visibility changes */ public interface VisibilityChangeListener { /** * Method called when the visibility of this view has changed * @param isVisible true if the view is now visible */ void onAggregatedVisibilityChanged(boolean isVisible); } } packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +39 −8 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.MediaNotificationView; import com.android.systemui.Dependency; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.TransformableView; Loading Loading @@ -67,6 +68,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private View mSeekBarView; private Context mContext; private MetricsLogger mMetricsLogger; private boolean mIsViewVisible; @VisibleForTesting protected SeekBar.OnSeekBarChangeListener mSeekListener = Loading @@ -88,11 +90,33 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi } }; MediaNotificationView.VisibilityChangeListener mVisibilityListener = new MediaNotificationView.VisibilityChangeListener() { @Override public void onAggregatedVisibilityChanged(boolean isVisible) { mIsViewVisible = isVisible; if (isVisible) { // Restart timer if we're currently playing and didn't already have one going PlaybackState state = mMediaController.getPlaybackState(); if (state != null && state.getState() == PlaybackState.STATE_PLAYING && mSeekBarTimer == null && mSeekBarView != null && mSeekBarView.getVisibility() != View.GONE) { startTimer(); } } else { clearTimer(); } } }; private MediaController.Callback mMediaCallback = new MediaController.Callback() { @Override public void onSessionDestroyed() { clearTimer(); mMediaController.unregisterCallback(this); if (mView instanceof MediaNotificationView) { ((MediaNotificationView) mView).removeVisibilityListener(mVisibilityListener); } } @Override Loading Loading @@ -126,10 +150,16 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi mContext = ctx; mMediaManager = Dependency.get(NotificationMediaManager.class); mMetricsLogger = Dependency.get(MetricsLogger.class); if (mView instanceof MediaNotificationView) { MediaNotificationView mediaView = (MediaNotificationView) mView; mediaView.addVisibilityListener(mVisibilityListener); } } private void resolveViews() { mActions = mView.findViewById(com.android.internal.R.id.media_actions); mIsViewVisible = mView.isShown(); final MediaSession.Token token = mRow.getEntry().notification.getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); Loading Loading @@ -208,6 +238,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private void startTimer() { clearTimer(); if (mIsViewVisible) { mSeekBarTimer = new Timer(true /* isDaemon */); mSeekBarTimer.schedule(new TimerTask() { @Override Loading @@ -216,10 +247,10 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi } }, 0, PROGRESS_UPDATE_INTERVAL); } } private void clearTimer() { if (mSeekBarTimer != null) { // TODO: also trigger this when the notification panel is collapsed mSeekBarTimer.cancel(); mSeekBarTimer.purge(); mSeekBarTimer = null; Loading Loading
core/java/com/android/internal/widget/MediaNotificationView.java +47 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RemoteViews; import java.util.ArrayList; /** * A TextView that can float around an image on the end. * Loading @@ -42,6 +44,7 @@ public class MediaNotificationView extends FrameLayout { private View mMainColumn; private View mMediaContent; private int mImagePushIn; private ArrayList<VisibilityChangeListener> mListeners; public MediaNotificationView(Context context) { this(context, null); Loading Loading @@ -168,4 +171,48 @@ public class MediaNotificationView extends FrameLayout { mMainColumn = findViewById(com.android.internal.R.id.notification_main_column); mMediaContent = findViewById(com.android.internal.R.id.notification_media_content); } @Override public void onVisibilityAggregated(boolean isVisible) { super.onVisibilityAggregated(isVisible); for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).onAggregatedVisibilityChanged(isVisible); } } /** * Add a listener to receive updates on the visibility of this view * * @param listener The listener to add. */ public void addVisibilityListener(VisibilityChangeListener listener) { if (mListeners == null) { mListeners = new ArrayList<>(); } if (!mListeners.contains(listener)) { mListeners.add(listener); } } /** * Remove the specified listener * * @param listener The listener to remove. */ public void removeVisibilityListener(VisibilityChangeListener listener) { if (mListeners != null) { mListeners.remove(listener); } } /** * Interface for receiving updates when the view's visibility changes */ public interface VisibilityChangeListener { /** * Method called when the visibility of this view has changed * @param isVisible true if the view is now visible */ void onAggregatedVisibilityChanged(boolean isVisible); } }
packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +39 −8 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.MediaNotificationView; import com.android.systemui.Dependency; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.TransformableView; Loading Loading @@ -67,6 +68,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private View mSeekBarView; private Context mContext; private MetricsLogger mMetricsLogger; private boolean mIsViewVisible; @VisibleForTesting protected SeekBar.OnSeekBarChangeListener mSeekListener = Loading @@ -88,11 +90,33 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi } }; MediaNotificationView.VisibilityChangeListener mVisibilityListener = new MediaNotificationView.VisibilityChangeListener() { @Override public void onAggregatedVisibilityChanged(boolean isVisible) { mIsViewVisible = isVisible; if (isVisible) { // Restart timer if we're currently playing and didn't already have one going PlaybackState state = mMediaController.getPlaybackState(); if (state != null && state.getState() == PlaybackState.STATE_PLAYING && mSeekBarTimer == null && mSeekBarView != null && mSeekBarView.getVisibility() != View.GONE) { startTimer(); } } else { clearTimer(); } } }; private MediaController.Callback mMediaCallback = new MediaController.Callback() { @Override public void onSessionDestroyed() { clearTimer(); mMediaController.unregisterCallback(this); if (mView instanceof MediaNotificationView) { ((MediaNotificationView) mView).removeVisibilityListener(mVisibilityListener); } } @Override Loading Loading @@ -126,10 +150,16 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi mContext = ctx; mMediaManager = Dependency.get(NotificationMediaManager.class); mMetricsLogger = Dependency.get(MetricsLogger.class); if (mView instanceof MediaNotificationView) { MediaNotificationView mediaView = (MediaNotificationView) mView; mediaView.addVisibilityListener(mVisibilityListener); } } private void resolveViews() { mActions = mView.findViewById(com.android.internal.R.id.media_actions); mIsViewVisible = mView.isShown(); final MediaSession.Token token = mRow.getEntry().notification.getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); Loading Loading @@ -208,6 +238,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private void startTimer() { clearTimer(); if (mIsViewVisible) { mSeekBarTimer = new Timer(true /* isDaemon */); mSeekBarTimer.schedule(new TimerTask() { @Override Loading @@ -216,10 +247,10 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi } }, 0, PROGRESS_UPDATE_INTERVAL); } } private void clearTimer() { if (mSeekBarTimer != null) { // TODO: also trigger this when the notification panel is collapsed mSeekBarTimer.cancel(); mSeekBarTimer.purge(); mSeekBarTimer = null; Loading