19
19
package androidx.window.layout
20
20
21
21
import android.content.Context
22
+ import android.content.pm.ActivityInfo
23
+ import androidx.test.core.app.ActivityScenario
22
24
import androidx.test.core.app.ApplicationProvider
23
25
import androidx.test.ext.junit.runners.AndroidJUnit4
24
26
import androidx.test.filters.LargeTest
27
+ import androidx.window.TestConfigChangeHandlingActivity
25
28
import androidx.window.WindowTestBase
26
29
import androidx.window.core.Version
27
30
import androidx.window.layout.ExtensionInterfaceCompat.ExtensionCallbackInterface
@@ -34,6 +37,9 @@ import com.nhaarman.mockitokotlin2.argThat
34
37
import com.nhaarman.mockitokotlin2.atLeastOnce
35
38
import com.nhaarman.mockitokotlin2.mock
36
39
import com.nhaarman.mockitokotlin2.verify
40
+ import kotlinx.coroutines.ExperimentalCoroutinesApi
41
+ import kotlinx.coroutines.test.TestCoroutineScope
42
+ import kotlinx.coroutines.test.runBlockingTest
37
43
import org.junit.Assert.assertNotNull
38
44
import org.junit.Assume.assumeTrue
39
45
import org.junit.Before
@@ -47,6 +53,7 @@ import org.mockito.ArgumentMatcher
47
53
*/
48
54
@LargeTest
49
55
@RunWith(AndroidJUnit4 ::class )
56
+ @OptIn(ExperimentalCoroutinesApi ::class )
50
57
public class SidecarCompatDeviceTest : WindowTestBase (), CompatDeviceTestInterface {
51
58
52
59
private lateinit var sidecarCompat: SidecarCompat
@@ -73,6 +80,49 @@ public class SidecarCompatDeviceTest : WindowTestBase(), CompatDeviceTestInterfa
73
80
}
74
81
}
75
82
83
+ @Test
84
+ fun testWindowLayoutCallbackOnConfigChange () {
85
+ val testScope = TestCoroutineScope ()
86
+ testScope.runBlockingTest {
87
+ val scenario = ActivityScenario .launch(TestConfigChangeHandlingActivity ::class .java)
88
+ val callbackInterface = mock<ExtensionCallbackInterface >()
89
+ scenario.onActivity { activity ->
90
+ val windowToken = getActivityWindowToken(activity)
91
+ assertNotNull(windowToken)
92
+ sidecarCompat.setExtensionCallback(callbackInterface)
93
+ sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
94
+ activity.resetLayoutCounter()
95
+ activity.requestedOrientation = ActivityInfo .SCREEN_ORIENTATION_PORTRAIT
96
+ activity.waitForLayout()
97
+ }
98
+ scenario.onActivity { activity ->
99
+ val windowToken = getActivityWindowToken(activity)
100
+ assertNotNull(windowToken)
101
+ val sidecarWindowLayoutInfo =
102
+ sidecarCompat.sidecar!! .getWindowLayoutInfo(windowToken)
103
+ verify(callbackInterface, atLeastOnce()).onWindowLayoutChanged(
104
+ any(),
105
+ argThat(SidecarMatcher (sidecarWindowLayoutInfo))
106
+ )
107
+ }
108
+ scenario.onActivity { activity ->
109
+ activity.resetLayoutCounter()
110
+ activity.requestedOrientation = ActivityInfo .SCREEN_ORIENTATION_LANDSCAPE
111
+ activity.waitForLayout()
112
+ }
113
+ scenario.onActivity { activity ->
114
+ val windowToken = getActivityWindowToken(activity)
115
+ assertNotNull(windowToken)
116
+ val updatedSidecarWindowLayoutInfo =
117
+ sidecarCompat.sidecar!! .getWindowLayoutInfo(windowToken)
118
+ verify(callbackInterface, atLeastOnce()).onWindowLayoutChanged(
119
+ any(),
120
+ argThat(SidecarMatcher (updatedSidecarWindowLayoutInfo))
121
+ )
122
+ }
123
+ }
124
+ }
125
+
76
126
private fun assumeExtensionV01 () {
77
127
val sidecarVersion = SidecarCompat .sidecarVersion
78
128
assumeTrue(Version .VERSION_0_1 == sidecarVersion)
0 commit comments