Files
Lawnchair/systemUIUnfold/src/com/android/systemui/unfold/progress/RemoteUnfoldTransitionReceiver.kt
T
2023-10-21 09:52:01 +08:00

111 lines
3.5 KiB
Kotlin

/*
* Copyright (C) 2023 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.unfold.progress
import android.util.Log
import androidx.annotation.BinderThread
import androidx.annotation.FloatRange
import com.android.systemui.unfold.UnfoldTransitionProgressProvider
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.dagger.UseReceivingFilter
import java.util.concurrent.Executor
import javax.inject.Inject
/**
* Receives unfold events from remote senders (System UI).
*
* A binder to an instance to this class (created with [RemoteUnfoldTransitionReceiver.asBinder])
* should be sent to the remote process providing events.
*/
class RemoteUnfoldTransitionReceiver
@Inject
constructor(
@UseReceivingFilter useReceivingFilter: Boolean,
@UnfoldMain private val executor: Executor
) : UnfoldTransitionProgressProvider, IUnfoldTransitionListener.Stub() {
private val listeners: MutableSet<TransitionProgressListener> = mutableSetOf()
private val outputProgressListener = ProcessedProgressListener()
private val filter: TransitionProgressListener? =
if (useReceivingFilter) {
UnfoldRemoteFilter(outputProgressListener)
} else {
null
}
@BinderThread
override fun onTransitionStarted() {
executor.execute {
filter?.onTransitionStarted() ?: outputProgressListener.onTransitionStarted()
}
}
@BinderThread
override fun onTransitionProgress(progress: Float) {
executor.execute {
filter?.onTransitionProgress(progress)
?: outputProgressListener.onTransitionProgress(progress)
}
}
@BinderThread
override fun onTransitionFinished() {
executor.execute {
filter?.onTransitionFinished() ?: outputProgressListener.onTransitionFinished()
}
}
override fun addCallback(listener: TransitionProgressListener) {
listeners += listener
}
override fun removeCallback(listener: TransitionProgressListener) {
listeners -= listener
}
override fun destroy() {
listeners.clear()
}
private inner class ProcessedProgressListener : TransitionProgressListener {
override fun onTransitionStarted() {
log { "onTransitionStarted" }
listeners.forEach { it.onTransitionStarted() }
}
override fun onTransitionProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) {
log { "onTransitionProgress" }
listeners.forEach { it.onTransitionProgress(progress) }
}
override fun onTransitionFinished() {
log { "onTransitionFinished" }
listeners.forEach { it.onTransitionFinished() }
}
}
private fun log(s: () -> String) {
if (DEBUG) {
Log.d(TAG, s())
}
}
}
private const val TAG = "RemoteUnfoldReceiver"
private val DEBUG = false