From 6b34e2b0045138c671425c32708350de7841b640 Mon Sep 17 00:00:00 2001 From: Joshua Tsuji Date: Thu, 13 Feb 2020 16:13:23 -0500 Subject: [PATCH] Adds currentlyResolvingConflicts to the coordinator. This allows users to call onContentMoved with impunity, simplifying code. Test: atest SystemUITests Change-Id: Ica8f9ecc79c1a452cbcb004a1089538b23eb0603 --- .../util/FloatingContentCoordinator.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt index 70bcc21426b14..0487ce6ea6b52 100644 --- a/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/util/FloatingContentCoordinator.kt @@ -97,6 +97,14 @@ class FloatingContentCoordinator @Inject constructor() { /** The bounds of all pieces of floating content added to the coordinator. */ private val allContentBounds: MutableMap = HashMap() + /** + * Whether we are currently resolving conflicts by asking content to move. If we are, we'll + * temporarily ignore calls to [onContentMoved] - those calls are from the content that is + * moving to new, conflict-free bounds, so we don't need to perform conflict detection + * calculations in response. + */ + private var currentlyResolvingConflicts = false + /** * Makes the coordinator aware of a new piece of floating content, and moves any existing * content out of the way, if necessary. @@ -126,6 +134,13 @@ class FloatingContentCoordinator @Inject constructor() { */ @JvmOverloads fun onContentMoved(content: FloatingContent) { + + // Ignore calls when we are currently resolving conflicts, since those calls are from + // content that is moving to new, conflict-free bounds. + if (currentlyResolvingConflicts) { + return + } + if (!allContentBounds.containsKey(content)) { Log.wtf(TAG, "Received onContentMoved call before onContentAdded! " + "This should never happen.") @@ -162,6 +177,8 @@ class FloatingContentCoordinator @Inject constructor() { * them to move out of the way. */ private fun maybeMoveConflictingContent(fromContent: FloatingContent) { + currentlyResolvingConflicts = true + val conflictingNewBounds = allContentBounds[fromContent]!! allContentBounds // Filter to content that intersects with the new bounds. That's content that needs @@ -182,6 +199,8 @@ class FloatingContentCoordinator @Inject constructor() { .minus(conflictingNewBounds))) allContentBounds[content] = content.getFloatingBoundsOnScreen() } + + currentlyResolvingConflicts = false } /**