Merge cherrypicks of [9022056, 9022057, 9022058] into qt-release
Change-Id: I8201a791c86aaab4ea57357e0a72aa10f4c675bc
This commit is contained in:
@@ -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.
|
||||
*
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -512,7 +512,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
|
||||
float viewEnd = row.getTranslationY() + row.getActualHeight();
|
||||
boolean isPinned = (row.isPinned() || row.isHeadsUpAnimatingAway())
|
||||
&& !mAmbientState.isDozingAndNotPulsing(row);
|
||||
boolean shouldClipOwnTop = row.showingAmbientPulsing()
|
||||
boolean shouldClipOwnTop = row.showingAmbientPulsing() && !mAmbientState.isFullyDark()
|
||||
|| (mAmbientState.isPulseExpanding() && childIndex == 0);
|
||||
if (viewEnd > notificationClipEnd && !shouldClipOwnTop
|
||||
&& (mAmbientState.isShadeExpanded() || !isPinned)) {
|
||||
@@ -752,8 +752,9 @@ public class NotificationShelf extends ActivatableNotificationView implements
|
||||
iconState.scaleY = 1.0f;
|
||||
iconState.hidden = false;
|
||||
}
|
||||
if (row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed()
|
||||
|| row.getTranslationZ() > mAmbientState.getBaseZHeight()))) {
|
||||
if ((row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed()
|
||||
|| row.getTranslationZ() > mAmbientState.getBaseZHeight())))
|
||||
&& !mAmbientState.isFullyDark()) {
|
||||
iconState.hidden = true;
|
||||
}
|
||||
int backgroundColor = getBackgroundColorWithoutTint();
|
||||
|
||||
@@ -153,6 +153,7 @@ public class ActivityLaunchAnimator {
|
||||
if (primary == null) {
|
||||
setAnimationPending(false);
|
||||
invokeCallback(iRemoteAnimationFinishedCallback);
|
||||
mNotificationPanel.collapse(false /* delayed */, 1.0f /* speedUpFactor */);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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 =
|
||||
@@ -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
|
||||
@@ -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);
|
||||
@@ -208,18 +238,19 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
|
||||
|
||||
private void startTimer() {
|
||||
clearTimer();
|
||||
mSeekBarTimer = new Timer(true /* isDaemon */);
|
||||
mSeekBarTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
mHandler.post(mOnUpdateTimerTick);
|
||||
}
|
||||
}, 0, PROGRESS_UPDATE_INTERVAL);
|
||||
if (mIsViewVisible) {
|
||||
mSeekBarTimer = new Timer(true /* isDaemon */);
|
||||
mSeekBarTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
mHandler.post(mOnUpdateTimerTick);
|
||||
}
|
||||
}, 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;
|
||||
|
||||
@@ -1355,7 +1355,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
|
||||
mIsClipped = clipped;
|
||||
}
|
||||
|
||||
if (!mAmbientPulseManager.hasNotifications() && mAmbientState.isFullyDark()) {
|
||||
if (!mPulsing && mAmbientState.isFullyDark()) {
|
||||
setClipBounds(null);
|
||||
} else if (mAmbientState.isDarkAtAll()) {
|
||||
clipToOutline = true;
|
||||
@@ -5169,6 +5169,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
|
||||
return;
|
||||
}
|
||||
mPulsing = pulsing;
|
||||
updateClipping();
|
||||
mAmbientState.setPulsing(pulsing);
|
||||
mSwipeHelper.setPulsing(pulsing);
|
||||
updateNotificationAnimationStates();
|
||||
|
||||
@@ -501,7 +501,8 @@ public class StackScrollAlgorithm {
|
||||
continue;
|
||||
}
|
||||
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
|
||||
if (!row.showingAmbientPulsing() || (i == 0 && ambientState.isPulseExpanding())) {
|
||||
if (!row.showingAmbientPulsing() || ambientState.isFullyDark()
|
||||
|| (i == 0 && ambientState.isPulseExpanding())) {
|
||||
continue;
|
||||
}
|
||||
ExpandableViewState viewState = row.getViewState();
|
||||
|
||||
Reference in New Issue
Block a user