Merge "[MEDIA TTT] Apply wakelock for chipbar" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
93b5e24d46
@@ -45,6 +45,7 @@ import com.android.systemui.temporarydisplay.TemporaryViewInfo
|
|||||||
import com.android.systemui.util.animation.AnimationUtil.Companion.frames
|
import com.android.systemui.util.animation.AnimationUtil.Companion.frames
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
|
import com.android.systemui.util.wakelock.WakeLock
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,6 +69,7 @@ class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
private val mediaTttFlags: MediaTttFlags,
|
private val mediaTttFlags: MediaTttFlags,
|
||||||
private val uiEventLogger: MediaTttReceiverUiEventLogger,
|
private val uiEventLogger: MediaTttReceiverUiEventLogger,
|
||||||
private val viewUtil: ViewUtil,
|
private val viewUtil: ViewUtil,
|
||||||
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
) : TemporaryViewDisplayController<ChipReceiverInfo, MediaTttLogger>(
|
) : TemporaryViewDisplayController<ChipReceiverInfo, MediaTttLogger>(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -77,6 +79,7 @@ class MediaTttChipControllerReceiver @Inject constructor(
|
|||||||
configurationController,
|
configurationController,
|
||||||
powerManager,
|
powerManager,
|
||||||
R.layout.media_ttt_chip_receiver,
|
R.layout.media_ttt_chip_receiver,
|
||||||
|
wakeLockBuilder,
|
||||||
) {
|
) {
|
||||||
@SuppressLint("WrongConstant") // We're allowed to use LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
|
@SuppressLint("WrongConstant") // We're allowed to use LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
|
||||||
override val windowLayoutParams = commonWindowLayoutParams.apply {
|
override val windowLayoutParams = commonWindowLayoutParams.apply {
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import android.graphics.PixelFormat
|
|||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
import android.os.SystemClock
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@@ -35,6 +34,7 @@ import com.android.systemui.CoreStartable
|
|||||||
import com.android.systemui.dagger.qualifiers.Main
|
import com.android.systemui.dagger.qualifiers.Main
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
|
import com.android.systemui.util.wakelock.WakeLock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A generic controller that can temporarily display a new view in a new window.
|
* A generic controller that can temporarily display a new view in a new window.
|
||||||
@@ -54,6 +54,7 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
private val configurationController: ConfigurationController,
|
private val configurationController: ConfigurationController,
|
||||||
private val powerManager: PowerManager,
|
private val powerManager: PowerManager,
|
||||||
@LayoutRes private val viewLayoutRes: Int,
|
@LayoutRes private val viewLayoutRes: Int,
|
||||||
|
private val wakeLockBuilder: WakeLock.Builder,
|
||||||
) : CoreStartable {
|
) : CoreStartable {
|
||||||
/**
|
/**
|
||||||
* Window layout params that will be used as a starting point for the [windowLayoutParams] of
|
* Window layout params that will be used as a starting point for the [windowLayoutParams] of
|
||||||
@@ -64,7 +65,8 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
height = WindowManager.LayoutParams.WRAP_CONTENT
|
height = WindowManager.LayoutParams.WRAP_CONTENT
|
||||||
type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
|
type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
|
||||||
flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
|
flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
|
||||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
|
||||||
|
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|
||||||
format = PixelFormat.TRANSLUCENT
|
format = PixelFormat.TRANSLUCENT
|
||||||
setTrustedOverlay()
|
setTrustedOverlay()
|
||||||
}
|
}
|
||||||
@@ -83,6 +85,15 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
/** A [Runnable] that, when run, will cancel the pending timeout of the view. */
|
/** A [Runnable] that, when run, will cancel the pending timeout of the view. */
|
||||||
private var cancelViewTimeout: Runnable? = null
|
private var cancelViewTimeout: Runnable? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A wakelock that is acquired when view is displayed and screen off,
|
||||||
|
* then released when view is removed.
|
||||||
|
*/
|
||||||
|
private var wakeLock: WakeLock? = null
|
||||||
|
|
||||||
|
/** A string that keeps track of wakelock reason once it is acquired till it gets released */
|
||||||
|
private var wakeReasonAcquired: String? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the view with the provided [newInfo].
|
* Displays the view with the provided [newInfo].
|
||||||
*
|
*
|
||||||
@@ -113,11 +124,15 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
// the view to show over the dream state, so we should only wake up if the screen is
|
// the view to show over the dream state, so we should only wake up if the screen is
|
||||||
// completely off.)
|
// completely off.)
|
||||||
if (!powerManager.isScreenOn) {
|
if (!powerManager.isScreenOn) {
|
||||||
powerManager.wakeUp(
|
wakeLock = wakeLockBuilder
|
||||||
SystemClock.uptimeMillis(),
|
.setTag(newInfo.windowTitle)
|
||||||
PowerManager.WAKE_REASON_APPLICATION,
|
.setLevelsAndFlags(
|
||||||
"com.android.systemui:${newInfo.wakeReason}",
|
PowerManager.FULL_WAKE_LOCK or
|
||||||
)
|
PowerManager.ACQUIRE_CAUSES_WAKEUP
|
||||||
|
)
|
||||||
|
.build()
|
||||||
|
wakeLock?.acquire(newInfo.wakeReason)
|
||||||
|
wakeReasonAcquired = newInfo.wakeReason
|
||||||
}
|
}
|
||||||
logger.logViewAddition(newInfo.windowTitle)
|
logger.logViewAddition(newInfo.windowTitle)
|
||||||
inflateAndUpdateView(newInfo)
|
inflateAndUpdateView(newInfo)
|
||||||
@@ -155,6 +170,7 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
it.copyFrom(windowLayoutParams)
|
it.copyFrom(windowLayoutParams)
|
||||||
it.title = newInfo.windowTitle
|
it.title = newInfo.windowTitle
|
||||||
}
|
}
|
||||||
|
newView.keepScreenOn = true
|
||||||
windowManager.addView(newView, paramsWithTitle)
|
windowManager.addView(newView, paramsWithTitle)
|
||||||
animateViewIn(newView)
|
animateViewIn(newView)
|
||||||
}
|
}
|
||||||
@@ -183,7 +199,10 @@ abstract class TemporaryViewDisplayController<T : TemporaryViewInfo, U : Tempora
|
|||||||
val currentDisplayInfo = displayInfo ?: return
|
val currentDisplayInfo = displayInfo ?: return
|
||||||
|
|
||||||
val currentView = currentDisplayInfo.view
|
val currentView = currentDisplayInfo.view
|
||||||
animateViewOut(currentView) { windowManager.removeView(currentView) }
|
animateViewOut(currentView) {
|
||||||
|
windowManager.removeView(currentView)
|
||||||
|
wakeLock?.release(wakeReasonAcquired)
|
||||||
|
}
|
||||||
|
|
||||||
logger.logViewRemoval(removalReason)
|
logger.logViewRemoval(removalReason)
|
||||||
configurationController.removeCallback(displayScaleListener)
|
configurationController.removeCallback(displayScaleListener)
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController
|
|||||||
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
import com.android.systemui.temporarydisplay.TemporaryViewDisplayController
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
|
import com.android.systemui.util.wakelock.WakeLock
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,6 +76,7 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
private val falsingCollector: FalsingCollector,
|
private val falsingCollector: FalsingCollector,
|
||||||
private val viewUtil: ViewUtil,
|
private val viewUtil: ViewUtil,
|
||||||
private val vibratorHelper: VibratorHelper,
|
private val vibratorHelper: VibratorHelper,
|
||||||
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
) : TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>(
|
) : TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -84,6 +86,7 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
configurationController,
|
configurationController,
|
||||||
powerManager,
|
powerManager,
|
||||||
R.layout.chipbar,
|
R.layout.chipbar,
|
||||||
|
wakeLockBuilder,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private lateinit var parent: ChipbarRootView
|
private lateinit var parent: ChipbarRootView
|
||||||
@@ -92,8 +95,6 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
gravity = Gravity.TOP.or(Gravity.CENTER_HORIZONTAL)
|
gravity = Gravity.TOP.or(Gravity.CENTER_HORIZONTAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun start() {}
|
|
||||||
|
|
||||||
override fun updateView(
|
override fun updateView(
|
||||||
newInfo: ChipbarInfo,
|
newInfo: ChipbarInfo,
|
||||||
currentView: ViewGroup
|
currentView: ViewGroup
|
||||||
@@ -192,6 +193,8 @@ open class ChipbarCoordinator @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun start() {}
|
||||||
|
|
||||||
override fun getTouchableRegion(view: View, outRect: Rect) {
|
override fun getTouchableRegion(view: View, outRect: Rect) {
|
||||||
viewUtil.setRectToViewWindowLocation(view, outRect)
|
viewUtil.setRectToViewWindowLocation(view, outRect)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ public interface WakeLock {
|
|||||||
*/
|
*/
|
||||||
long DEFAULT_MAX_TIMEOUT = 20000;
|
long DEFAULT_MAX_TIMEOUT = 20000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default wake-lock levels and flags.
|
||||||
|
*/
|
||||||
|
int DEFAULT_LEVELS_AND_FLAGS = PowerManager.PARTIAL_WAKE_LOCK;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param why A tag that will be saved for sysui dumps.
|
* @param why A tag that will be saved for sysui dumps.
|
||||||
* @see android.os.PowerManager.WakeLock#acquire()
|
* @see android.os.PowerManager.WakeLock#acquire()
|
||||||
@@ -60,13 +65,21 @@ public interface WakeLock {
|
|||||||
* Creates a {@link WakeLock} that has a default release timeout.
|
* Creates a {@link WakeLock} that has a default release timeout.
|
||||||
* @see android.os.PowerManager.WakeLock#acquire(long) */
|
* @see android.os.PowerManager.WakeLock#acquire(long) */
|
||||||
static WakeLock createPartial(Context context, String tag, long maxTimeout) {
|
static WakeLock createPartial(Context context, String tag, long maxTimeout) {
|
||||||
return wrap(createPartialInner(context, tag), maxTimeout);
|
return wrap(createWakeLockInner(context, tag, DEFAULT_LEVELS_AND_FLAGS), maxTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link WakeLock} that has a default release timeout and flags.
|
||||||
|
*/
|
||||||
|
static WakeLock createWakeLock(Context context, String tag, int flags, long maxTimeout) {
|
||||||
|
return wrap(createWakeLockInner(context, tag, flags), maxTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static PowerManager.WakeLock createPartialInner(Context context, String tag) {
|
static PowerManager.WakeLock createWakeLockInner(
|
||||||
|
Context context, String tag, int levelsAndFlags) {
|
||||||
return context.getSystemService(PowerManager.class)
|
return context.getSystemService(PowerManager.class)
|
||||||
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, tag);
|
.newWakeLock(levelsAndFlags, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Runnable wrapImpl(WakeLock w, Runnable r) {
|
static Runnable wrapImpl(WakeLock w, Runnable r) {
|
||||||
@@ -131,6 +144,7 @@ public interface WakeLock {
|
|||||||
class Builder {
|
class Builder {
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private String mTag;
|
private String mTag;
|
||||||
|
private int mLevelsAndFlags = DEFAULT_LEVELS_AND_FLAGS;
|
||||||
private long mMaxTimeout = DEFAULT_MAX_TIMEOUT;
|
private long mMaxTimeout = DEFAULT_MAX_TIMEOUT;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -143,13 +157,18 @@ public interface WakeLock {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder setLevelsAndFlags(int levelsAndFlags) {
|
||||||
|
this.mLevelsAndFlags = levelsAndFlags;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder setMaxTimeout(long maxTimeout) {
|
public Builder setMaxTimeout(long maxTimeout) {
|
||||||
this.mMaxTimeout = maxTimeout;
|
this.mMaxTimeout = maxTimeout;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WakeLock build() {
|
public WakeLock build() {
|
||||||
return WakeLock.createPartial(mContext, mTag, mMaxTimeout);
|
return WakeLock.createWakeLock(mContext, mTag, mLevelsAndFlags, mMaxTimeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import com.android.systemui.util.mockito.any
|
|||||||
import com.android.systemui.util.mockito.eq
|
import com.android.systemui.util.mockito.eq
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
|
import com.android.systemui.util.wakelock.WakeLockFake
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -85,6 +86,10 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
private lateinit var fakeAppIconDrawable: Drawable
|
private lateinit var fakeAppIconDrawable: Drawable
|
||||||
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
||||||
private lateinit var receiverUiEventLogger: MediaTttReceiverUiEventLogger
|
private lateinit var receiverUiEventLogger: MediaTttReceiverUiEventLogger
|
||||||
|
private lateinit var fakeClock: FakeSystemClock
|
||||||
|
private lateinit var fakeExecutor: FakeExecutor
|
||||||
|
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
||||||
|
private lateinit var fakeWakeLock: WakeLockFake
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
@@ -99,15 +104,22 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
)).thenReturn(applicationInfo)
|
)).thenReturn(applicationInfo)
|
||||||
context.setMockPackageManager(packageManager)
|
context.setMockPackageManager(packageManager)
|
||||||
|
|
||||||
|
fakeClock = FakeSystemClock()
|
||||||
|
fakeExecutor = FakeExecutor(fakeClock)
|
||||||
|
|
||||||
uiEventLoggerFake = UiEventLoggerFake()
|
uiEventLoggerFake = UiEventLoggerFake()
|
||||||
receiverUiEventLogger = MediaTttReceiverUiEventLogger(uiEventLoggerFake)
|
receiverUiEventLogger = MediaTttReceiverUiEventLogger(uiEventLoggerFake)
|
||||||
|
|
||||||
|
fakeWakeLock = WakeLockFake()
|
||||||
|
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
||||||
|
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
||||||
|
|
||||||
controllerReceiver = MediaTttChipControllerReceiver(
|
controllerReceiver = MediaTttChipControllerReceiver(
|
||||||
commandQueue,
|
commandQueue,
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
windowManager,
|
windowManager,
|
||||||
FakeExecutor(FakeSystemClock()),
|
fakeExecutor,
|
||||||
accessibilityManager,
|
accessibilityManager,
|
||||||
configurationController,
|
configurationController,
|
||||||
powerManager,
|
powerManager,
|
||||||
@@ -115,6 +127,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
mediaTttFlags,
|
mediaTttFlags,
|
||||||
receiverUiEventLogger,
|
receiverUiEventLogger,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
|
fakeWakeLockBuilder,
|
||||||
)
|
)
|
||||||
controllerReceiver.start()
|
controllerReceiver.start()
|
||||||
|
|
||||||
@@ -141,6 +154,7 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
mediaTttFlags,
|
mediaTttFlags,
|
||||||
receiverUiEventLogger,
|
receiverUiEventLogger,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
|
fakeWakeLockBuilder,
|
||||||
)
|
)
|
||||||
controllerReceiver.start()
|
controllerReceiver.start()
|
||||||
|
|
||||||
@@ -199,6 +213,39 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
|
|||||||
verify(windowManager).removeView(viewCaptor.value)
|
verify(windowManager).removeView(viewCaptor.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun commandQueueCallback_closeThenFar_wakeLockAcquiredThenReleased() {
|
||||||
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER,
|
||||||
|
routeInfo,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isTrue()
|
||||||
|
|
||||||
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER,
|
||||||
|
routeInfo,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun commandQueueCallback_closeThenFar_wakeLockNeverAcquired() {
|
||||||
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER,
|
||||||
|
routeInfo,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun receivesNewStateFromCommandQueue_isLogged() {
|
fun receivesNewStateFromCommandQueue_isLogged() {
|
||||||
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ import com.android.systemui.util.mockito.any
|
|||||||
import com.android.systemui.util.mockito.eq
|
import com.android.systemui.util.mockito.eq
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
|
import com.android.systemui.util.wakelock.WakeLockFake
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -89,6 +90,8 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
@Mock private lateinit var viewUtil: ViewUtil
|
@Mock private lateinit var viewUtil: ViewUtil
|
||||||
@Mock private lateinit var windowManager: WindowManager
|
@Mock private lateinit var windowManager: WindowManager
|
||||||
@Mock private lateinit var vibratorHelper: VibratorHelper
|
@Mock private lateinit var vibratorHelper: VibratorHelper
|
||||||
|
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
||||||
|
private lateinit var fakeWakeLock: WakeLockFake
|
||||||
private lateinit var chipbarCoordinator: ChipbarCoordinator
|
private lateinit var chipbarCoordinator: ChipbarCoordinator
|
||||||
private lateinit var commandQueueCallback: CommandQueue.Callbacks
|
private lateinit var commandQueueCallback: CommandQueue.Callbacks
|
||||||
private lateinit var fakeAppIconDrawable: Drawable
|
private lateinit var fakeAppIconDrawable: Drawable
|
||||||
@@ -118,6 +121,10 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
fakeClock = FakeSystemClock()
|
fakeClock = FakeSystemClock()
|
||||||
fakeExecutor = FakeExecutor(fakeClock)
|
fakeExecutor = FakeExecutor(fakeClock)
|
||||||
|
|
||||||
|
fakeWakeLock = WakeLockFake()
|
||||||
|
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
||||||
|
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
||||||
|
|
||||||
uiEventLoggerFake = UiEventLoggerFake()
|
uiEventLoggerFake = UiEventLoggerFake()
|
||||||
uiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake)
|
uiEventLogger = MediaTttSenderUiEventLogger(uiEventLoggerFake)
|
||||||
|
|
||||||
@@ -134,6 +141,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
falsingCollector,
|
falsingCollector,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
vibratorHelper,
|
vibratorHelper,
|
||||||
|
fakeWakeLockBuilder,
|
||||||
)
|
)
|
||||||
chipbarCoordinator.start()
|
chipbarCoordinator.start()
|
||||||
|
|
||||||
@@ -471,6 +479,36 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() {
|
|||||||
verify(windowManager).removeView(viewCaptor.value)
|
verify(windowManager).removeView(viewCaptor.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun commandQueueCallback_almostCloseThenFarFromReceiver_wakeLockAcquiredThenReleased() {
|
||||||
|
commandQueueCallback.updateMediaTapToTransferSenderDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_ALMOST_CLOSE_TO_START_CAST,
|
||||||
|
routeInfo,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isTrue()
|
||||||
|
|
||||||
|
commandQueueCallback.updateMediaTapToTransferSenderDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_FAR_FROM_RECEIVER,
|
||||||
|
routeInfo,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun commandQueueCallback_FarFromReceiver_wakeLockNeverReleased() {
|
||||||
|
commandQueueCallback.updateMediaTapToTransferSenderDisplay(
|
||||||
|
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_FAR_FROM_RECEIVER,
|
||||||
|
routeInfo,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun commandQueueCallback_invalidStateParam_noChipShown() {
|
fun commandQueueCallback_invalidStateParam_noChipShown() {
|
||||||
commandQueueCallback.updateMediaTapToTransferSenderDisplay(100, routeInfo, null)
|
commandQueueCallback.updateMediaTapToTransferSenderDisplay(100, routeInfo, null)
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ import com.android.systemui.util.mockito.any
|
|||||||
import com.android.systemui.util.mockito.argumentCaptor
|
import com.android.systemui.util.mockito.argumentCaptor
|
||||||
import com.android.systemui.util.mockito.capture
|
import com.android.systemui.util.mockito.capture
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
|
import com.android.systemui.util.wakelock.WakeLock
|
||||||
|
import com.android.systemui.util.wakelock.WakeLockFake
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -53,6 +55,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
private lateinit var fakeClock: FakeSystemClock
|
private lateinit var fakeClock: FakeSystemClock
|
||||||
private lateinit var fakeExecutor: FakeExecutor
|
private lateinit var fakeExecutor: FakeExecutor
|
||||||
|
|
||||||
|
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
||||||
|
private lateinit var fakeWakeLock: WakeLockFake
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private lateinit var logger: TemporaryViewLogger
|
private lateinit var logger: TemporaryViewLogger
|
||||||
@Mock
|
@Mock
|
||||||
@@ -74,6 +79,10 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
fakeClock = FakeSystemClock()
|
fakeClock = FakeSystemClock()
|
||||||
fakeExecutor = FakeExecutor(fakeClock)
|
fakeExecutor = FakeExecutor(fakeClock)
|
||||||
|
|
||||||
|
fakeWakeLock = WakeLockFake()
|
||||||
|
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
||||||
|
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
||||||
|
|
||||||
underTest = TestController(
|
underTest = TestController(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -82,7 +91,9 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
accessibilityManager,
|
accessibilityManager,
|
||||||
configurationController,
|
configurationController,
|
||||||
powerManager,
|
powerManager,
|
||||||
|
fakeWakeLockBuilder,
|
||||||
)
|
)
|
||||||
|
underTest.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -112,25 +123,33 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun displayView_screenOff_screenWakes() {
|
fun displayView_screenOff_wakeLockAcquired() {
|
||||||
whenever(powerManager.isScreenOn).thenReturn(false)
|
|
||||||
|
|
||||||
underTest.displayView(getState())
|
underTest.displayView(getState())
|
||||||
|
|
||||||
verify(powerManager).wakeUp(any(), any(), any())
|
assertThat(fakeWakeLock.isHeld).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun displayView_screenAlreadyOn_screenNotWoken() {
|
fun displayView_screenAlreadyOn_wakeLockNotAcquired() {
|
||||||
whenever(powerManager.isScreenOn).thenReturn(true)
|
whenever(powerManager.isScreenOn).thenReturn(true)
|
||||||
|
|
||||||
underTest.displayView(getState())
|
underTest.displayView(getState())
|
||||||
|
|
||||||
verify(powerManager, never()).wakeUp(any(), any(), any())
|
assertThat(fakeWakeLock.isHeld).isFalse()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun displayView_twiceWithSameWindowTitle_viewNotAddedTwice() {
|
fun displayView_screenOff_wakeLockCanBeReleasedAfterTimeOut() {
|
||||||
|
underTest.displayView(getState())
|
||||||
|
assertThat(fakeWakeLock.isHeld).isTrue()
|
||||||
|
|
||||||
|
fakeClock.advanceTime(TIMEOUT_MS + 1)
|
||||||
|
|
||||||
|
assertThat(fakeWakeLock.isHeld).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun displayView_twice_viewNotAddedTwice() {
|
||||||
underTest.displayView(getState())
|
underTest.displayView(getState())
|
||||||
reset(windowManager)
|
reset(windowManager)
|
||||||
|
|
||||||
@@ -269,6 +288,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
accessibilityManager: AccessibilityManager,
|
accessibilityManager: AccessibilityManager,
|
||||||
configurationController: ConfigurationController,
|
configurationController: ConfigurationController,
|
||||||
powerManager: PowerManager,
|
powerManager: PowerManager,
|
||||||
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
) : TemporaryViewDisplayController<ViewInfo, TemporaryViewLogger>(
|
) : TemporaryViewDisplayController<ViewInfo, TemporaryViewLogger>(
|
||||||
context,
|
context,
|
||||||
logger,
|
logger,
|
||||||
@@ -278,13 +298,12 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
configurationController,
|
configurationController,
|
||||||
powerManager,
|
powerManager,
|
||||||
R.layout.chipbar,
|
R.layout.chipbar,
|
||||||
|
wakeLockBuilder,
|
||||||
) {
|
) {
|
||||||
var mostRecentViewInfo: ViewInfo? = null
|
var mostRecentViewInfo: ViewInfo? = null
|
||||||
|
|
||||||
override val windowLayoutParams = commonWindowLayoutParams
|
override val windowLayoutParams = commonWindowLayoutParams
|
||||||
|
|
||||||
override fun start() {}
|
|
||||||
|
|
||||||
override fun updateView(newInfo: ViewInfo, currentView: ViewGroup) {
|
override fun updateView(newInfo: ViewInfo, currentView: ViewGroup) {
|
||||||
mostRecentViewInfo = newInfo
|
mostRecentViewInfo = newInfo
|
||||||
}
|
}
|
||||||
@@ -292,6 +311,8 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() {
|
|||||||
override fun getTouchableRegion(view: View, outRect: Rect) {
|
override fun getTouchableRegion(view: View, outRect: Rect) {
|
||||||
outRect.setEmpty()
|
outRect.setEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun start() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class ViewInfo(
|
inner class ViewInfo(
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import com.android.systemui.util.mockito.any
|
|||||||
import com.android.systemui.util.mockito.eq
|
import com.android.systemui.util.mockito.eq
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
|
import com.android.systemui.util.wakelock.WakeLockFake
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -69,6 +70,8 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
@Mock private lateinit var falsingCollector: FalsingCollector
|
@Mock private lateinit var falsingCollector: FalsingCollector
|
||||||
@Mock private lateinit var viewUtil: ViewUtil
|
@Mock private lateinit var viewUtil: ViewUtil
|
||||||
@Mock private lateinit var vibratorHelper: VibratorHelper
|
@Mock private lateinit var vibratorHelper: VibratorHelper
|
||||||
|
private lateinit var fakeWakeLockBuilder: WakeLockFake.Builder
|
||||||
|
private lateinit var fakeWakeLock: WakeLockFake
|
||||||
private lateinit var fakeClock: FakeSystemClock
|
private lateinit var fakeClock: FakeSystemClock
|
||||||
private lateinit var fakeExecutor: FakeExecutor
|
private lateinit var fakeExecutor: FakeExecutor
|
||||||
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
private lateinit var uiEventLoggerFake: UiEventLoggerFake
|
||||||
@@ -81,6 +84,10 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
fakeClock = FakeSystemClock()
|
fakeClock = FakeSystemClock()
|
||||||
fakeExecutor = FakeExecutor(fakeClock)
|
fakeExecutor = FakeExecutor(fakeClock)
|
||||||
|
|
||||||
|
fakeWakeLock = WakeLockFake()
|
||||||
|
fakeWakeLockBuilder = WakeLockFake.Builder(context)
|
||||||
|
fakeWakeLockBuilder.setWakeLock(fakeWakeLock)
|
||||||
|
|
||||||
uiEventLoggerFake = UiEventLoggerFake()
|
uiEventLoggerFake = UiEventLoggerFake()
|
||||||
|
|
||||||
underTest =
|
underTest =
|
||||||
@@ -96,6 +103,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
|
|||||||
falsingCollector,
|
falsingCollector,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
vibratorHelper,
|
vibratorHelper,
|
||||||
|
fakeWakeLockBuilder,
|
||||||
)
|
)
|
||||||
underTest.start()
|
underTest.start()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import com.android.systemui.statusbar.VibratorHelper
|
|||||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor
|
import com.android.systemui.util.concurrency.DelayableExecutor
|
||||||
import com.android.systemui.util.view.ViewUtil
|
import com.android.systemui.util.view.ViewUtil
|
||||||
|
import com.android.systemui.util.wakelock.WakeLock
|
||||||
|
|
||||||
/** A fake implementation of [ChipbarCoordinator] for testing. */
|
/** A fake implementation of [ChipbarCoordinator] for testing. */
|
||||||
class FakeChipbarCoordinator(
|
class FakeChipbarCoordinator(
|
||||||
@@ -41,6 +42,7 @@ class FakeChipbarCoordinator(
|
|||||||
falsingCollector: FalsingCollector,
|
falsingCollector: FalsingCollector,
|
||||||
viewUtil: ViewUtil,
|
viewUtil: ViewUtil,
|
||||||
vibratorHelper: VibratorHelper,
|
vibratorHelper: VibratorHelper,
|
||||||
|
wakeLockBuilder: WakeLock.Builder,
|
||||||
) :
|
) :
|
||||||
ChipbarCoordinator(
|
ChipbarCoordinator(
|
||||||
context,
|
context,
|
||||||
@@ -54,6 +56,7 @@ class FakeChipbarCoordinator(
|
|||||||
falsingCollector,
|
falsingCollector,
|
||||||
viewUtil,
|
viewUtil,
|
||||||
vibratorHelper,
|
vibratorHelper,
|
||||||
|
wakeLockBuilder,
|
||||||
) {
|
) {
|
||||||
override fun animateViewOut(view: ViewGroup, onAnimationEnd: Runnable) {
|
override fun animateViewOut(view: ViewGroup, onAnimationEnd: Runnable) {
|
||||||
// Just bypass the animation in tests
|
// Just bypass the animation in tests
|
||||||
|
|||||||
@@ -42,7 +42,9 @@ public class WakeLockTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInner = WakeLock.createPartialInner(mContext, WakeLockTest.class.getName());
|
mInner = WakeLock.createWakeLockInner(mContext,
|
||||||
|
WakeLockTest.class.getName(),
|
||||||
|
PowerManager.PARTIAL_WAKE_LOCK);
|
||||||
mWakeLock = WakeLock.wrap(mInner, 20000);
|
mWakeLock = WakeLock.wrap(mInner, 20000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user