Loading packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt +13 −3 Original line number Original line Diff line number Diff line Loading @@ -42,10 +42,10 @@ class MediaViewManager @Inject constructor( val mediaCarousel: HorizontalScrollView val mediaCarousel: HorizontalScrollView private val mediaContent: ViewGroup private val mediaContent: ViewGroup private val mediaPlayers: MutableMap<String, MediaControlPanel> = mutableMapOf() private val mediaPlayers: MutableMap<String, MediaControlPanel> = mutableMapOf() private val visualStabilityCallback = ::reorderAllPlayers private val visualStabilityCallback : VisualStabilityManager.Callback private var activeMediaIndex: Int = 0 private var activeMediaIndex: Int = 0 private var needsReordering: Boolean = false private var scrollIntoCurrentMedia: Int = 0 private var scrollIntoCurrentMedia: Int = 0 private var currentlyExpanded = true private var currentlyExpanded = true set(value) { set(value) { if (field != value) { if (field != value) { Loading Loading @@ -75,6 +75,16 @@ class MediaViewManager @Inject constructor( mediaCarousel = inflateMediaCarousel() mediaCarousel = inflateMediaCarousel() mediaCarousel.setOnScrollChangeListener(scrollChangedListener) mediaCarousel.setOnScrollChangeListener(scrollChangedListener) mediaContent = mediaCarousel.requireViewById(R.id.media_carousel) mediaContent = mediaCarousel.requireViewById(R.id.media_carousel) visualStabilityCallback = VisualStabilityManager.Callback { if (needsReordering) { needsReordering = false reorderAllPlayers() } // Let's reset our scroll position mediaCarousel.scrollX = 0 } visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback, true /* persistent */) mediaManager.addListener(object : MediaDataManager.Listener { mediaManager.addListener(object : MediaDataManager.Listener { override fun onMediaDataLoaded(key: String, data: MediaData) { override fun onMediaDataLoaded(key: String, data: MediaData) { updateView(key, data) updateView(key, data) Loading Loading @@ -169,7 +179,7 @@ class MediaViewManager @Inject constructor( mediaContent.removeView(existingPlayer.view?.player) mediaContent.removeView(existingPlayer.view?.player) mediaContent.addView(existingPlayer.view?.player, 0) mediaContent.addView(existingPlayer.view?.player, 0) } else { } else { visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback) needsReordering = true } } } } existingPlayer.bind(data) existingPlayer.bind(data) Loading packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +6 −3 Original line number Original line Diff line number Diff line Loading @@ -195,13 +195,15 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle boolean wasChildInGroup = ent.isChildInGroup(); boolean wasChildInGroup = ent.isChildInGroup(); if (isChildInGroup && !wasChildInGroup) { if (isChildInGroup && !wasChildInGroup) { isChildInGroup = wasChildInGroup; isChildInGroup = wasChildInGroup; mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager); mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager, false /* persistent */); } else if (!isChildInGroup && wasChildInGroup) { } else if (!isChildInGroup && wasChildInGroup) { // We allow grouping changes if the group was collapsed // We allow grouping changes if the group was collapsed if (mGroupManager.isLogicalGroupExpanded(ent.getSbn())) { if (mGroupManager.isLogicalGroupExpanded(ent.getSbn())) { isChildInGroup = wasChildInGroup; isChildInGroup = wasChildInGroup; parent = ent.getRow().getNotificationParent().getEntry(); parent = ent.getRow().getNotificationParent().getEntry(); mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager); mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager, false /* persistent */); } } } } } } Loading Loading @@ -286,7 +288,8 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle if (mVisualStabilityManager.canReorderNotification(targetChild)) { if (mVisualStabilityManager.canReorderNotification(targetChild)) { mListContainer.changeViewPosition(targetChild, i); mListContainer.changeViewPosition(targetChild, i); } else { } else { mVisualStabilityManager.addReorderingAllowedCallback(mEntryManager); mVisualStabilityManager.addReorderingAllowedCallback(mEntryManager, false /* persistent */); } } } } j++; j++; Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java +28 −7 Original line number Original line Diff line number Diff line Loading @@ -43,7 +43,9 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl private static final long TEMPORARY_REORDERING_ALLOWED_DURATION = 1000; private static final long TEMPORARY_REORDERING_ALLOWED_DURATION = 1000; private final ArrayList<Callback> mReorderingAllowedCallbacks = new ArrayList<>(); private final ArrayList<Callback> mReorderingAllowedCallbacks = new ArrayList<>(); private final ArraySet<Callback> mPersistentReorderingCallbacks = new ArraySet<>(); private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>(); private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>(); private final ArraySet<Callback> mPersistentGroupCallbacks = new ArraySet<>(); private final Handler mHandler; private final Handler mHandler; private boolean mPanelExpanded; private boolean mPanelExpanded; Loading Loading @@ -85,8 +87,15 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl /** /** * Add a callback to invoke when reordering is allowed again. * Add a callback to invoke when reordering is allowed again. * * @param callback the callback to add * @param persistent {@code true} if this callback should this callback be persisted, otherwise * it will be removed after a single invocation */ */ public void addReorderingAllowedCallback(Callback callback) { public void addReorderingAllowedCallback(Callback callback, boolean persistent) { if (persistent) { mPersistentReorderingCallbacks.add(callback); } if (mReorderingAllowedCallbacks.contains(callback)) { if (mReorderingAllowedCallbacks.contains(callback)) { return; return; } } Loading @@ -95,8 +104,15 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl /** /** * Add a callback to invoke when group changes are allowed again. * Add a callback to invoke when group changes are allowed again. * * @param callback the callback to add * @param persistent {@code true} if this callback should this callback be persisted, otherwise * it will be removed after a single invocation */ */ public void addGroupChangesAllowedCallback(Callback callback) { public void addGroupChangesAllowedCallback(Callback callback, boolean persistent) { if (persistent) { mPersistentGroupCallbacks.add(callback); } if (mGroupChangesAllowedCallbacks.contains(callback)) { if (mGroupChangesAllowedCallbacks.contains(callback)) { return; return; } } Loading Loading @@ -136,21 +152,26 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl boolean changedToTrue = reorderingAllowed && !mReorderingAllowed; boolean changedToTrue = reorderingAllowed && !mReorderingAllowed; mReorderingAllowed = reorderingAllowed; mReorderingAllowed = reorderingAllowed; if (changedToTrue) { if (changedToTrue) { notifyChangeAllowed(mReorderingAllowedCallbacks); notifyChangeAllowed(mReorderingAllowedCallbacks, mPersistentReorderingCallbacks); } } boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing; boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing; changedToTrue = groupChangesAllowed && !mGroupChangedAllowed; changedToTrue = groupChangesAllowed && !mGroupChangedAllowed; mGroupChangedAllowed = groupChangesAllowed; mGroupChangedAllowed = groupChangesAllowed; if (changedToTrue) { if (changedToTrue) { notifyChangeAllowed(mGroupChangesAllowedCallbacks); notifyChangeAllowed(mGroupChangesAllowedCallbacks, mPersistentGroupCallbacks); } } } } private void notifyChangeAllowed(ArrayList<Callback> callbacks) { private void notifyChangeAllowed(ArrayList<Callback> callbacks, ArraySet<Callback> persistentCallbacks) { for (int i = 0; i < callbacks.size(); i++) { for (int i = 0; i < callbacks.size(); i++) { callbacks.get(i).onChangeAllowed(); Callback callback = callbacks.get(i); callback.onChangeAllowed(); if (!persistentCallbacks.contains(callback)) { callbacks.remove(callback); i--; } } } callbacks.clear(); } } /** /** Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -463,7 +463,8 @@ public class NotificationChildrenContainer extends ViewGroup { mAttachedChildren.add(i, desiredChild); mAttachedChildren.add(i, desiredChild); result = true; result = true; } else { } else { visualStabilityManager.addReorderingAllowedCallback(callback); visualStabilityManager.addReorderingAllowedCallback(callback, false /* persistent */); } } } } } } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -439,7 +439,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, // time out anyway // time out anyway && !entry.showingPulsing()) { && !entry.showingPulsing()) { mEntriesToRemoveWhenReorderingAllowed.add(entry); mEntriesToRemoveWhenReorderingAllowed.add(entry); mVisualStabilityManager.addReorderingAllowedCallback(HeadsUpManagerPhone.this); mVisualStabilityManager.addReorderingAllowedCallback(HeadsUpManagerPhone.this, false /* persistent */); } else if (mTrackingHeadsUp) { } else if (mTrackingHeadsUp) { mEntriesToRemoveAfterExpand.add(entry); mEntriesToRemoveAfterExpand.add(entry); } else if (mIsAutoHeadsUp && mStatusBarState == StatusBarState.KEYGUARD) { } else if (mIsAutoHeadsUp && mStatusBarState == StatusBarState.KEYGUARD) { Loading Loading
packages/SystemUI/src/com/android/systemui/media/MediaViewManager.kt +13 −3 Original line number Original line Diff line number Diff line Loading @@ -42,10 +42,10 @@ class MediaViewManager @Inject constructor( val mediaCarousel: HorizontalScrollView val mediaCarousel: HorizontalScrollView private val mediaContent: ViewGroup private val mediaContent: ViewGroup private val mediaPlayers: MutableMap<String, MediaControlPanel> = mutableMapOf() private val mediaPlayers: MutableMap<String, MediaControlPanel> = mutableMapOf() private val visualStabilityCallback = ::reorderAllPlayers private val visualStabilityCallback : VisualStabilityManager.Callback private var activeMediaIndex: Int = 0 private var activeMediaIndex: Int = 0 private var needsReordering: Boolean = false private var scrollIntoCurrentMedia: Int = 0 private var scrollIntoCurrentMedia: Int = 0 private var currentlyExpanded = true private var currentlyExpanded = true set(value) { set(value) { if (field != value) { if (field != value) { Loading Loading @@ -75,6 +75,16 @@ class MediaViewManager @Inject constructor( mediaCarousel = inflateMediaCarousel() mediaCarousel = inflateMediaCarousel() mediaCarousel.setOnScrollChangeListener(scrollChangedListener) mediaCarousel.setOnScrollChangeListener(scrollChangedListener) mediaContent = mediaCarousel.requireViewById(R.id.media_carousel) mediaContent = mediaCarousel.requireViewById(R.id.media_carousel) visualStabilityCallback = VisualStabilityManager.Callback { if (needsReordering) { needsReordering = false reorderAllPlayers() } // Let's reset our scroll position mediaCarousel.scrollX = 0 } visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback, true /* persistent */) mediaManager.addListener(object : MediaDataManager.Listener { mediaManager.addListener(object : MediaDataManager.Listener { override fun onMediaDataLoaded(key: String, data: MediaData) { override fun onMediaDataLoaded(key: String, data: MediaData) { updateView(key, data) updateView(key, data) Loading Loading @@ -169,7 +179,7 @@ class MediaViewManager @Inject constructor( mediaContent.removeView(existingPlayer.view?.player) mediaContent.removeView(existingPlayer.view?.player) mediaContent.addView(existingPlayer.view?.player, 0) mediaContent.addView(existingPlayer.view?.player, 0) } else { } else { visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback) needsReordering = true } } } } existingPlayer.bind(data) existingPlayer.bind(data) Loading
packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +6 −3 Original line number Original line Diff line number Diff line Loading @@ -195,13 +195,15 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle boolean wasChildInGroup = ent.isChildInGroup(); boolean wasChildInGroup = ent.isChildInGroup(); if (isChildInGroup && !wasChildInGroup) { if (isChildInGroup && !wasChildInGroup) { isChildInGroup = wasChildInGroup; isChildInGroup = wasChildInGroup; mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager); mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager, false /* persistent */); } else if (!isChildInGroup && wasChildInGroup) { } else if (!isChildInGroup && wasChildInGroup) { // We allow grouping changes if the group was collapsed // We allow grouping changes if the group was collapsed if (mGroupManager.isLogicalGroupExpanded(ent.getSbn())) { if (mGroupManager.isLogicalGroupExpanded(ent.getSbn())) { isChildInGroup = wasChildInGroup; isChildInGroup = wasChildInGroup; parent = ent.getRow().getNotificationParent().getEntry(); parent = ent.getRow().getNotificationParent().getEntry(); mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager); mVisualStabilityManager.addGroupChangesAllowedCallback(mEntryManager, false /* persistent */); } } } } } } Loading Loading @@ -286,7 +288,8 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle if (mVisualStabilityManager.canReorderNotification(targetChild)) { if (mVisualStabilityManager.canReorderNotification(targetChild)) { mListContainer.changeViewPosition(targetChild, i); mListContainer.changeViewPosition(targetChild, i); } else { } else { mVisualStabilityManager.addReorderingAllowedCallback(mEntryManager); mVisualStabilityManager.addReorderingAllowedCallback(mEntryManager, false /* persistent */); } } } } j++; j++; Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java +28 −7 Original line number Original line Diff line number Diff line Loading @@ -43,7 +43,9 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl private static final long TEMPORARY_REORDERING_ALLOWED_DURATION = 1000; private static final long TEMPORARY_REORDERING_ALLOWED_DURATION = 1000; private final ArrayList<Callback> mReorderingAllowedCallbacks = new ArrayList<>(); private final ArrayList<Callback> mReorderingAllowedCallbacks = new ArrayList<>(); private final ArraySet<Callback> mPersistentReorderingCallbacks = new ArraySet<>(); private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>(); private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>(); private final ArraySet<Callback> mPersistentGroupCallbacks = new ArraySet<>(); private final Handler mHandler; private final Handler mHandler; private boolean mPanelExpanded; private boolean mPanelExpanded; Loading Loading @@ -85,8 +87,15 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl /** /** * Add a callback to invoke when reordering is allowed again. * Add a callback to invoke when reordering is allowed again. * * @param callback the callback to add * @param persistent {@code true} if this callback should this callback be persisted, otherwise * it will be removed after a single invocation */ */ public void addReorderingAllowedCallback(Callback callback) { public void addReorderingAllowedCallback(Callback callback, boolean persistent) { if (persistent) { mPersistentReorderingCallbacks.add(callback); } if (mReorderingAllowedCallbacks.contains(callback)) { if (mReorderingAllowedCallbacks.contains(callback)) { return; return; } } Loading @@ -95,8 +104,15 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl /** /** * Add a callback to invoke when group changes are allowed again. * Add a callback to invoke when group changes are allowed again. * * @param callback the callback to add * @param persistent {@code true} if this callback should this callback be persisted, otherwise * it will be removed after a single invocation */ */ public void addGroupChangesAllowedCallback(Callback callback) { public void addGroupChangesAllowedCallback(Callback callback, boolean persistent) { if (persistent) { mPersistentGroupCallbacks.add(callback); } if (mGroupChangesAllowedCallbacks.contains(callback)) { if (mGroupChangesAllowedCallbacks.contains(callback)) { return; return; } } Loading Loading @@ -136,21 +152,26 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl boolean changedToTrue = reorderingAllowed && !mReorderingAllowed; boolean changedToTrue = reorderingAllowed && !mReorderingAllowed; mReorderingAllowed = reorderingAllowed; mReorderingAllowed = reorderingAllowed; if (changedToTrue) { if (changedToTrue) { notifyChangeAllowed(mReorderingAllowedCallbacks); notifyChangeAllowed(mReorderingAllowedCallbacks, mPersistentReorderingCallbacks); } } boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing; boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing; changedToTrue = groupChangesAllowed && !mGroupChangedAllowed; changedToTrue = groupChangesAllowed && !mGroupChangedAllowed; mGroupChangedAllowed = groupChangesAllowed; mGroupChangedAllowed = groupChangesAllowed; if (changedToTrue) { if (changedToTrue) { notifyChangeAllowed(mGroupChangesAllowedCallbacks); notifyChangeAllowed(mGroupChangesAllowedCallbacks, mPersistentGroupCallbacks); } } } } private void notifyChangeAllowed(ArrayList<Callback> callbacks) { private void notifyChangeAllowed(ArrayList<Callback> callbacks, ArraySet<Callback> persistentCallbacks) { for (int i = 0; i < callbacks.size(); i++) { for (int i = 0; i < callbacks.size(); i++) { callbacks.get(i).onChangeAllowed(); Callback callback = callbacks.get(i); callback.onChangeAllowed(); if (!persistentCallbacks.contains(callback)) { callbacks.remove(callback); i--; } } } callbacks.clear(); } } /** /** Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -463,7 +463,8 @@ public class NotificationChildrenContainer extends ViewGroup { mAttachedChildren.add(i, desiredChild); mAttachedChildren.add(i, desiredChild); result = true; result = true; } else { } else { visualStabilityManager.addReorderingAllowedCallback(callback); visualStabilityManager.addReorderingAllowedCallback(callback, false /* persistent */); } } } } } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -439,7 +439,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, // time out anyway // time out anyway && !entry.showingPulsing()) { && !entry.showingPulsing()) { mEntriesToRemoveWhenReorderingAllowed.add(entry); mEntriesToRemoveWhenReorderingAllowed.add(entry); mVisualStabilityManager.addReorderingAllowedCallback(HeadsUpManagerPhone.this); mVisualStabilityManager.addReorderingAllowedCallback(HeadsUpManagerPhone.this, false /* persistent */); } else if (mTrackingHeadsUp) { } else if (mTrackingHeadsUp) { mEntriesToRemoveAfterExpand.add(entry); mEntriesToRemoveAfterExpand.add(entry); } else if (mIsAutoHeadsUp && mStatusBarState == StatusBarState.KEYGUARD) { } else if (mIsAutoHeadsUp && mStatusBarState == StatusBarState.KEYGUARD) { Loading