mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-06 02:46:57 +00:00
[Memory Leak] Fix leak of Launcher activity from recent view's input consumer
Ensure we always clear the consumer, which has strong ref to RecentsView and launcher activity, once gesture is ended Fix: 407823225 Test: presubmit Flag: NONE - released code (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:222fb581bda7f16b8f44c41aae489a025507ef51) Merged-In: I90f2212247965697a4077890404bb577943efa37 Change-Id: I90f2212247965697a4077890404bb577943efa37
This commit is contained in:
committed by
Android Build Coastguard Worker
parent
03dd831d1f
commit
a88c057874
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (C) 2025 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.quickstep.util
|
||||
|
||||
import android.os.SystemClock
|
||||
import android.view.MotionEvent
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import java.util.function.Consumer
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.ArgumentCaptor
|
||||
import org.mockito.Captor
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.reset
|
||||
import org.mockito.Mockito.verify
|
||||
import org.mockito.Mockito.verifyNoMoreInteractions
|
||||
import org.mockito.MockitoAnnotations
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class CachedEventDispatcherTest {
|
||||
|
||||
private lateinit var underTest: CachedEventDispatcher
|
||||
|
||||
@Mock private lateinit var consumer: Consumer<MotionEvent>
|
||||
@Captor private lateinit var motionEventCaptor: ArgumentCaptor<MotionEvent>
|
||||
|
||||
private lateinit var motionEvent: MotionEvent
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
MockitoAnnotations.initMocks(this)
|
||||
motionEvent =
|
||||
MotionEvent.obtain(
|
||||
0L,
|
||||
SystemClock.elapsedRealtime(),
|
||||
MotionEvent.ACTION_DOWN,
|
||||
0f,
|
||||
0f,
|
||||
0,
|
||||
)
|
||||
underTest = CachedEventDispatcher()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testInitialState() {
|
||||
assertFalse(underTest.hasConsumer())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dispatchMotionEvents() {
|
||||
underTest.setConsumer(consumer)
|
||||
|
||||
underTest.dispatchEvent(motionEvent)
|
||||
|
||||
assertTrue(underTest.hasConsumer())
|
||||
verify(consumer).accept(motionEventCaptor.capture())
|
||||
assertTrue(isMotionEventSame(motionEventCaptor.value, motionEvent))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dispatchMotionEvents_after_settingConsumer() {
|
||||
underTest.dispatchEvent(motionEvent)
|
||||
|
||||
underTest.setConsumer(consumer)
|
||||
|
||||
verify(consumer).accept(motionEventCaptor.capture())
|
||||
assertTrue(isMotionEventSame(motionEventCaptor.value, motionEvent))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun clearConsumer_notDispatchToConsumer() {
|
||||
underTest.setConsumer(consumer)
|
||||
underTest.dispatchEvent(motionEvent)
|
||||
reset(consumer)
|
||||
|
||||
underTest.clearConsumer()
|
||||
|
||||
assertFalse(underTest.hasConsumer())
|
||||
underTest.dispatchEvent(motionEvent)
|
||||
verifyNoMoreInteractions(consumer)
|
||||
}
|
||||
|
||||
private fun isMotionEventSame(e1: MotionEvent, e2: MotionEvent): Boolean {
|
||||
return e1.action == e2.action &&
|
||||
e1.eventTime == e2.eventTime &&
|
||||
e1.x == e2.x &&
|
||||
e1.y == e2.y
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user