Merge "Add transient notification views of group children to the child container, not directly to the row." into tm-qpr-dev

This commit is contained in:
Jeff DeCew
2023-03-14 00:55:08 +00:00
committed by Android (Google) Code Review
5 changed files with 78 additions and 5 deletions

View File

@@ -3699,7 +3699,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
pw.println("Roundness: " + getRoundableState().debugString());
if (mIsSummaryWithChildren) {
int transientViewCount = mChildrenContainer == null
? 0 : mChildrenContainer.getTransientViewCount();
if (mIsSummaryWithChildren || transientViewCount > 0) {
pw.println();
pw.print("ChildrenContainer");
pw.print(" visibility: " + mChildrenContainer.getVisibility());
@@ -3707,8 +3709,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
pw.print(", translationY: " + mChildrenContainer.getTranslationY());
pw.println();
List<ExpandableNotificationRow> notificationChildren = getAttachedChildren();
pw.println("Children: " + notificationChildren.size());
pw.print("{");
pw.print("Children: " + notificationChildren.size() + " {");
pw.increaseIndent();
for (ExpandableNotificationRow child : notificationChildren) {
pw.println();
@@ -3716,6 +3717,15 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
pw.decreaseIndent();
pw.println("}");
pw.print("Transient Views: " + transientViewCount + " {");
pw.increaseIndent();
for (int i = 0; i < transientViewCount; i++) {
pw.println();
ExpandableView child = (ExpandableView) mChildrenContainer.getTransientView(i);
child.dump(pw, args);
}
pw.decreaseIndent();
pw.println("}");
} else if (mPrivateLayout != null) {
mPrivateLayout.dumpSmartReplies(pw);
}

View File

@@ -312,7 +312,7 @@ public class ExpandableNotificationRowController implements NotifViewController
}
mView.removeChildNotification(childView);
if (!isTransfer) {
mListContainer.notifyGroupChildRemoved(childView, mView);
mListContainer.notifyGroupChildRemoved(childView, mView.getChildrenContainer());
}
}

View File

@@ -2852,7 +2852,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
}
child.setOnHeightChangedListener(null);
updateScrollStateForRemovedChild(child);
boolean animationGenerated = generateRemoveAnimation(child);
boolean animationGenerated = container != null && generateRemoveAnimation(child);
if (animationGenerated) {
if (!mSwipedOutViews.contains(child) || !isFullySwipedOut(child)) {
container.addTransientView(child, 0);

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.android.systemui.statusbar.notification.collection.render
import android.view.View
class FakeNodeController(
override val view: View,
override val nodeLabel: String = "fakeNodeController"
) : NodeController {
override fun offerToKeepInParentForAnimation(): Boolean = false
override fun removeFromParentIfKeptForAnimation(): Boolean = false
override fun resetKeepInParentForAnimation() = Unit
}

View File

@@ -30,15 +30,19 @@ import com.android.systemui.plugins.PluginManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.NotificationMediaManager
import com.android.systemui.statusbar.SmartReplyController
import com.android.systemui.statusbar.notification.collection.render.FakeNodeController
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager
import com.android.systemui.statusbar.notification.logging.NotificationLogger
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier
import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.statusbar.policy.SmartReplyConstants
import com.android.systemui.statusbar.policy.dagger.RemoteInputViewSubcomponent
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.time.SystemClock
import com.android.systemui.wmshell.BubblesManager
@@ -67,6 +71,7 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() {
private val metricsLogger: MetricsLogger = mock()
private val logBufferLogger: NotificationRowLogger = mock()
private val listContainer: NotificationListContainer = mock()
private val childrenContainer: NotificationChildrenContainer = mock()
private val mediaManager: NotificationMediaManager = mock()
private val smartReplyConstants: SmartReplyConstants = mock()
private val smartReplyController: SmartReplyController = mock()
@@ -126,6 +131,7 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() {
Optional.of(bubblesManager),
dragController
)
whenever(view.childrenContainer).thenReturn(childrenContainer)
}
@After
@@ -170,4 +176,32 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() {
Assert.assertFalse(controller.removeFromParentIfKeptForAnimation())
Mockito.verifyNoMoreInteractions(parentView)
}
@Test
fun removeChild_whenTransfer() {
val childView: ExpandableNotificationRow = mock()
val childNodeController = FakeNodeController(childView)
// GIVEN a child is removed for transfer
controller.removeChild(childNodeController, /* isTransfer= */ true)
// VERIFY the listContainer is not notified
Mockito.verify(childView).isChangingPosition = eq(true)
Mockito.verify(view).removeChildNotification(eq(childView))
Mockito.verify(listContainer, never()).notifyGroupChildRemoved(any(), any())
}
@Test
fun removeChild_whenNotTransfer() {
val childView: ExpandableNotificationRow = mock()
val childNodeController = FakeNodeController(childView)
// GIVEN a child is removed for real
controller.removeChild(childNodeController, /* isTransfer= */ false)
// VERIFY the listContainer is passed the childrenContainer for transient animations
Mockito.verify(childView, never()).isChangingPosition = any()
Mockito.verify(view).removeChildNotification(eq(childView))
Mockito.verify(listContainer).notifyGroupChildRemoved(eq(childView), eq(childrenContainer))
}
}