blob: 652ffdd2c2f117dd5eee8917f159fd855d6958d6 [file] [log] [blame]
/*
* 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.customization.picker.clock.data.repository
import android.app.NotificationManager
import android.content.ComponentName
import android.content.Context
import android.view.LayoutInflater
import com.android.systemui.plugins.Plugin
import com.android.systemui.plugins.PluginManager
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.systemui.shared.clocks.DefaultClockProvider
import com.android.systemui.shared.plugins.PluginActionManager
import com.android.systemui.shared.plugins.PluginEnabler
import com.android.systemui.shared.plugins.PluginInstance
import com.android.systemui.shared.plugins.PluginManagerImpl
import com.android.systemui.shared.plugins.PluginPrefs
import com.android.systemui.shared.system.UncaughtExceptionPreHandlerManager_Factory
import java.util.concurrent.Executors
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
/**
* Provide the [ClockRegistry] singleton. Note that we need to make sure that the [PluginManager]
* needs to be connected before [ClockRegistry] is ready to use.
*/
class ClockRegistryProvider(
private val context: Context,
private val coroutineScope: CoroutineScope,
private val mainDispatcher: CoroutineDispatcher,
private val backgroundDispatcher: CoroutineDispatcher,
) {
private val clockRegistry: ClockRegistry by lazy {
ClockRegistry(
context,
createPluginManager(context),
coroutineScope,
mainDispatcher,
backgroundDispatcher,
isEnabled = true,
handleAllUsers = false,
DefaultClockProvider(context, LayoutInflater.from(context), context.resources),
keepAllLoaded = true,
subTag = "Picker",
)
}
init {
// Listeners in ClockRegistry get cleaned up when app ended
clockRegistry.registerListeners()
}
fun get() = clockRegistry
private fun createPluginManager(context: Context): PluginManager {
val privilegedPlugins = listOf<String>()
val isDebugDevice = true
val instanceFactory =
PluginInstance.Factory(
this::class.java.classLoader,
PluginInstance.InstanceFactory<Plugin>(),
PluginInstance.VersionCheckerImpl(),
privilegedPlugins,
isDebugDevice,
)
/*
* let SystemUI handle plugin, in this class assume plugins are enabled
*/
val pluginEnabler =
object : PluginEnabler {
override fun setEnabled(component: ComponentName) = Unit
override fun setDisabled(
component: ComponentName,
@PluginEnabler.DisableReason reason: Int
) = Unit
override fun isEnabled(component: ComponentName): Boolean {
return true
}
@PluginEnabler.DisableReason
override fun getDisableReason(componentName: ComponentName): Int {
return PluginEnabler.ENABLED
}
}
val pluginActionManager =
PluginActionManager.Factory(
context,
context.packageManager,
context.mainExecutor,
Executors.newSingleThreadExecutor(),
context.getSystemService(NotificationManager::class.java),
pluginEnabler,
privilegedPlugins,
instanceFactory,
)
return PluginManagerImpl(
context,
pluginActionManager,
isDebugDevice,
UncaughtExceptionPreHandlerManager_Factory.create().get(),
pluginEnabler,
PluginPrefs(context),
listOf(),
)
}
}