blob: 3138b6a5a1e075ef351f47a51a0ea932ec0a1a56 [file] [log] [blame]
/*
* Copyright 2021 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 androidx.wear.watchface.editor
import android.os.IBinder
import androidx.annotation.RestrictTo
import androidx.wear.watchface.IndentingPrintWriter
import androidx.wear.watchface.editor.data.EditorStateWireFormat
/**
* Implementation of [IEditorService], intended for use by EditorSession only.
*
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class EditorService : IEditorService.Stub() {
private val lock = Any()
private var nextId: Int = 0
private val observers = HashMap<Int, IEditorObserver>()
private val deathObservers = HashMap<Int, IBinder.DeathRecipient>()
public companion object {
/** [EditorService] singleton. */
public val globalEditorService: EditorService by lazy { EditorService() }
}
public override fun getApiVersion(): Int = API_VERSION
override fun registerObserver(observer: IEditorObserver): Int {
synchronized(lock) {
val id = nextId++
observers[id] = observer
val deathObserver = IBinder.DeathRecipient { unregisterObserver(id) }
observer.asBinder().linkToDeath(deathObserver, 0)
deathObservers[id] = deathObserver
return id
}
}
override fun unregisterObserver(observerId: Int) {
synchronized(lock) {
deathObservers[observerId]?.let {
observers[observerId]?.asBinder()?.unlinkToDeath(it, 0)
}
observers.remove(observerId)
deathObservers.remove(observerId)
}
}
/**
* Calls [IEditorObserver.onEditorStateChange] with [editorState] for each [IEditorObserver].
*/
public fun broadcastEditorState(editorState: EditorStateWireFormat) {
synchronized(lock) {
for ((_, observer) in observers) {
if (observer.asBinder().isBinderAlive) {
observer.onEditorStateChange(editorState)
}
}
}
}
internal fun dump(writer: IndentingPrintWriter) {
writer.println("EditorService:")
writer.increaseIndent()
synchronized(lock) {
for ((id, observer) in observers) {
writer.println("id = $id, alive = ${observer.asBinder().isBinderAlive}")
if (observer.asBinder().isBinderAlive) {
writer.println("$apiVersion = {observer.apiVersion}")
}
}
}
writer.decreaseIndent()
}
}