blob: 2cfe6be5c6b2e3f0cdeddbb33d56cb0dc82abaab [file] [log] [blame]
/*
* Copyright (C) 2022 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.smartspace
import android.app.smartspace.SmartspaceManager
import android.app.smartspace.SmartspaceSession
import android.app.smartspace.SmartspaceTarget
import android.content.Context
import android.graphics.drawable.Drawable
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.View
import android.view.ViewGroup
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.dreams.smartspace.DreamsSmartspaceController
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.smartspace.dagger.SmartspaceViewComponent
import com.android.systemui.util.concurrency.Execution
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.withArgCaptor
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import java.util.Optional
import java.util.concurrent.Executor
@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
class DreamSmartspaceControllerTest : SysuiTestCase() {
@Mock
private lateinit var smartspaceManager: SmartspaceManager
@Mock
private lateinit var execution: Execution
@Mock
private lateinit var uiExecutor: Executor
@Mock
private lateinit var viewComponentFactory: SmartspaceViewComponent.Factory
@Mock
private lateinit var viewComponent: SmartspaceViewComponent
@Mock
private lateinit var targetFilter: SmartspaceTargetFilter
@Mock
private lateinit var plugin: BcSmartspaceDataPlugin
@Mock
private lateinit var precondition: SmartspacePrecondition
@Mock
private lateinit var smartspaceView: BcSmartspaceDataPlugin.SmartspaceView
@Mock
private lateinit var listener: BcSmartspaceDataPlugin.SmartspaceTargetListener
@Mock
private lateinit var session: SmartspaceSession
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
`when`(viewComponentFactory.create(any(), eq(plugin), any()))
.thenReturn(viewComponent)
`when`(viewComponent.getView()).thenReturn(smartspaceView)
`when`(smartspaceManager.createSmartspaceSession(any())).thenReturn(session)
}
/**
* Ensures smartspace session begins on a listener only flow.
*/
@Test
fun testConnectOnListen() {
val controller = DreamsSmartspaceController(context,
smartspaceManager, execution, uiExecutor, viewComponentFactory, precondition,
Optional.of(targetFilter), Optional.of(plugin))
`when`(precondition.conditionsMet()).thenReturn(true)
controller.addListener(listener)
verify(smartspaceManager).createSmartspaceSession(any())
var targetListener = withArgCaptor<SmartspaceSession.OnTargetsAvailableListener> {
verify(session).addOnTargetsAvailableListener(any(), capture())
}
`when`(targetFilter.filterSmartspaceTarget(any())).thenReturn(true)
var target = Mockito.mock(SmartspaceTarget::class.java)
targetListener.onTargetsAvailable(listOf(target))
var targets = withArgCaptor<List<SmartspaceTarget>> {
verify(plugin).onTargetsAvailable(capture())
}
assertThat(targets.contains(target)).isTrue()
controller.removeListener(listener)
verify(session).close()
}
/**
* A class which implements SmartspaceView and extends View. This is mocked to provide the right
* object inheritance and interface implementation used in DreamSmartspaceController
*/
private class TestView(context: Context?) : View(context),
BcSmartspaceDataPlugin.SmartspaceView {
override fun registerDataProvider(plugin: BcSmartspaceDataPlugin?) {}
override fun setPrimaryTextColor(color: Int) {}
override fun setIsDreaming(isDreaming: Boolean) {}
override fun setDozeAmount(amount: Float) {}
override fun setIntentStarter(intentStarter: BcSmartspaceDataPlugin.IntentStarter?) {}
override fun setFalsingManager(falsingManager: FalsingManager?) {}
override fun setDnd(image: Drawable?, description: String?) {}
override fun setNextAlarm(image: Drawable?, description: String?) {}
override fun setMediaTarget(target: SmartspaceTarget?) {}
override fun getSelectedPage(): Int { return 0; }
override fun getCurrentCardTopPadding(): Int { return 0; }
}
/**
* Ensures session begins when a view is attached.
*/
@Test
fun testConnectOnViewCreate() {
val controller = DreamsSmartspaceController(context,
smartspaceManager, execution, uiExecutor, viewComponentFactory, precondition,
Optional.of(targetFilter),
Optional.of(plugin))
`when`(precondition.conditionsMet()).thenReturn(true)
controller.buildAndConnectView(Mockito.mock(ViewGroup::class.java))
var stateChangeListener = withArgCaptor<View.OnAttachStateChangeListener> {
verify(viewComponentFactory).create(any(), eq(plugin), capture())
}
var mockView = Mockito.mock(TestView::class.java)
`when`(precondition.conditionsMet()).thenReturn(true)
stateChangeListener.onViewAttachedToWindow(mockView)
verify(smartspaceManager).createSmartspaceSession(any())
verify(mockView).setDozeAmount(0f)
stateChangeListener.onViewDetachedFromWindow(mockView)
verify(session).close()
}
}