all: reformat
This commit is contained in:
parent
a3af24688a
commit
f4e1681044
8 changed files with 97 additions and 53 deletions
|
@ -38,7 +38,7 @@ import org.oxycblt.auxio.playback.service.PlaybackServiceFragment
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class AuxioService :
|
class AuxioService :
|
||||||
MediaBrowserServiceCompat(), ForegroundListener, MusicServiceFragment.Invalidator {
|
MediaBrowserServiceCompat(), ForegroundListener, MusicServiceFragment.Invalidator {
|
||||||
@Inject lateinit var playbackFragmentFactory: PlaybackServiceFragment.Factory
|
@Inject lateinit var playbackFragmentFactory: PlaybackServiceFragment.Factory
|
||||||
private lateinit var playbackFragment: PlaybackServiceFragment
|
private lateinit var playbackFragment: PlaybackServiceFragment
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.oxycblt.auxio.music.service
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -36,7 +35,8 @@ import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||||
import org.oxycblt.auxio.util.getSystemServiceCompat
|
import org.oxycblt.auxio.util.getSystemServiceCompat
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
|
|
||||||
class Indexer private constructor(
|
class Indexer
|
||||||
|
private constructor(
|
||||||
override val workerContext: Context,
|
override val workerContext: Context,
|
||||||
private val foregroundListener: ForegroundListener,
|
private val foregroundListener: ForegroundListener,
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
|
@ -49,7 +49,9 @@ class Indexer private constructor(
|
||||||
MusicRepository.IndexingListener,
|
MusicRepository.IndexingListener,
|
||||||
MusicRepository.UpdateListener,
|
MusicRepository.UpdateListener,
|
||||||
MusicSettings.Listener {
|
MusicSettings.Listener {
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
|
@Inject
|
||||||
|
constructor(
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val musicRepository: MusicRepository,
|
private val musicRepository: MusicRepository,
|
||||||
private val musicSettings: MusicSettings,
|
private val musicSettings: MusicSettings,
|
||||||
|
@ -57,8 +59,14 @@ class Indexer private constructor(
|
||||||
private val contentObserver: SystemContentObserver
|
private val contentObserver: SystemContentObserver
|
||||||
) {
|
) {
|
||||||
fun create(context: Context, listener: ForegroundListener) =
|
fun create(context: Context, listener: ForegroundListener) =
|
||||||
Indexer(context, listener, playbackManager,
|
Indexer(
|
||||||
musicRepository, musicSettings, imageLoader, contentObserver)
|
context,
|
||||||
|
listener,
|
||||||
|
playbackManager,
|
||||||
|
musicRepository,
|
||||||
|
musicSettings,
|
||||||
|
imageLoader,
|
||||||
|
contentObserver)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val indexJob = Job()
|
private val indexJob = Job()
|
||||||
|
|
|
@ -20,7 +20,6 @@ package org.oxycblt.auxio.music.service
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.support.v4.media.MediaBrowserCompat.MediaItem
|
import android.support.v4.media.MediaBrowserCompat.MediaItem
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.home.HomeGenerator
|
import org.oxycblt.auxio.home.HomeGenerator
|
||||||
|
@ -37,7 +36,8 @@ import org.oxycblt.auxio.music.Playlist
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.search.SearchEngine
|
import org.oxycblt.auxio.search.SearchEngine
|
||||||
|
|
||||||
class MusicBrowser private constructor(
|
class MusicBrowser
|
||||||
|
private constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val invalidator: Invalidator,
|
private val invalidator: Invalidator,
|
||||||
private val musicRepository: MusicRepository,
|
private val musicRepository: MusicRepository,
|
||||||
|
@ -46,15 +46,24 @@ class MusicBrowser private constructor(
|
||||||
homeGeneratorFactory: HomeGenerator.Factory
|
homeGeneratorFactory: HomeGenerator.Factory
|
||||||
) : MusicRepository.UpdateListener, HomeGenerator.Invalidator {
|
) : MusicRepository.UpdateListener, HomeGenerator.Invalidator {
|
||||||
|
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
private val musicRepository: MusicRepository,
|
@Inject
|
||||||
private val searchEngine: SearchEngine,
|
constructor(
|
||||||
private val listSettings: ListSettings,
|
private val musicRepository: MusicRepository,
|
||||||
|
private val searchEngine: SearchEngine,
|
||||||
|
private val listSettings: ListSettings,
|
||||||
private val homeGeneratorFactory: HomeGenerator.Factory
|
private val homeGeneratorFactory: HomeGenerator.Factory
|
||||||
) {
|
) {
|
||||||
fun create(context: Context, invalidator: Invalidator): MusicBrowser =
|
fun create(context: Context, invalidator: Invalidator): MusicBrowser =
|
||||||
MusicBrowser(context, invalidator, musicRepository, searchEngine, listSettings, homeGeneratorFactory)
|
MusicBrowser(
|
||||||
|
context,
|
||||||
|
invalidator,
|
||||||
|
musicRepository,
|
||||||
|
searchEngine,
|
||||||
|
listSettings,
|
||||||
|
homeGeneratorFactory)
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Invalidator {
|
interface Invalidator {
|
||||||
fun invalidateMusic(ids: Set<String>)
|
fun invalidateMusic(ids: Set<String>)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ import android.support.v4.media.MediaBrowserCompat.MediaItem
|
||||||
import androidx.media.MediaBrowserServiceCompat.BrowserRoot
|
import androidx.media.MediaBrowserServiceCompat.BrowserRoot
|
||||||
import androidx.media.MediaBrowserServiceCompat.Result
|
import androidx.media.MediaBrowserServiceCompat.Result
|
||||||
import androidx.media.utils.MediaConstants
|
import androidx.media.utils.MediaConstants
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -51,13 +50,25 @@ constructor(
|
||||||
private val dispatchJob = Job()
|
private val dispatchJob = Job()
|
||||||
private val dispatchScope = CoroutineScope(dispatchJob + Dispatchers.Default)
|
private val dispatchScope = CoroutineScope(dispatchJob + Dispatchers.Default)
|
||||||
|
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
|
@Inject
|
||||||
|
constructor(
|
||||||
private val indexerFactory: Indexer.Factory,
|
private val indexerFactory: Indexer.Factory,
|
||||||
private val musicBrowserFactory: MusicBrowser.Factory,
|
private val musicBrowserFactory: MusicBrowser.Factory,
|
||||||
private val musicRepository: MusicRepository
|
private val musicRepository: MusicRepository
|
||||||
) {
|
) {
|
||||||
fun create(context: Context, foregroundListener: ForegroundListener, invalidator: Invalidator): MusicServiceFragment =
|
fun create(
|
||||||
MusicServiceFragment(context, foregroundListener, invalidator, indexerFactory, musicBrowserFactory, musicRepository)
|
context: Context,
|
||||||
|
foregroundListener: ForegroundListener,
|
||||||
|
invalidator: Invalidator
|
||||||
|
): MusicServiceFragment =
|
||||||
|
MusicServiceFragment(
|
||||||
|
context,
|
||||||
|
foregroundListener,
|
||||||
|
invalidator,
|
||||||
|
indexerFactory,
|
||||||
|
musicBrowserFactory,
|
||||||
|
musicRepository)
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Invalidator {
|
interface Invalidator {
|
||||||
|
@ -71,9 +82,7 @@ constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun invalidateMusic(ids: Set<String>) {
|
override fun invalidateMusic(ids: Set<String>) {
|
||||||
ids.forEach { mediaId ->
|
ids.forEach { mediaId -> invalidator.invalidateMusic(mediaId) }
|
||||||
invalidator.invalidateMusic(mediaId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun start() {
|
fun start() {
|
||||||
|
|
|
@ -44,17 +44,20 @@ import org.oxycblt.auxio.util.logD
|
||||||
*
|
*
|
||||||
* @author Alexander Capehart (OxygenCobalt)
|
* @author Alexander Capehart (OxygenCobalt)
|
||||||
*/
|
*/
|
||||||
class ReplayGainAudioProcessor private constructor(
|
class ReplayGainAudioProcessor
|
||||||
|
private constructor(
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val playbackSettings: PlaybackSettings
|
private val playbackSettings: PlaybackSettings
|
||||||
) : BaseAudioProcessor(), PlaybackStateManager.Listener, PlaybackSettings.Listener {
|
) : BaseAudioProcessor(), PlaybackStateManager.Listener, PlaybackSettings.Listener {
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
|
@Inject
|
||||||
private val playbackManager: PlaybackStateManager,
|
constructor(
|
||||||
private val playbackSettings: PlaybackSettings
|
private val playbackManager: PlaybackStateManager,
|
||||||
|
private val playbackSettings: PlaybackSettings
|
||||||
) {
|
) {
|
||||||
fun create() = ReplayGainAudioProcessor(playbackManager, playbackSettings)
|
fun create() = ReplayGainAudioProcessor(playbackManager, playbackSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var volume = 1f
|
private var volume = 1f
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
|
|
|
@ -18,23 +18,20 @@
|
||||||
|
|
||||||
package org.oxycblt.auxio.playback.service
|
package org.oxycblt.auxio.playback.service
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.support.v4.media.session.MediaSessionCompat
|
import android.support.v4.media.session.MediaSessionCompat
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import org.oxycblt.auxio.ForegroundListener
|
import org.oxycblt.auxio.ForegroundListener
|
||||||
import org.oxycblt.auxio.ForegroundServiceNotification
|
import org.oxycblt.auxio.ForegroundServiceNotification
|
||||||
import org.oxycblt.auxio.IntegerTable
|
import org.oxycblt.auxio.IntegerTable
|
||||||
import org.oxycblt.auxio.playback.PlaybackSettings
|
|
||||||
import org.oxycblt.auxio.playback.state.DeferredPlayback
|
import org.oxycblt.auxio.playback.state.DeferredPlayback
|
||||||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.widgets.WidgetComponent
|
import org.oxycblt.auxio.widgets.WidgetComponent
|
||||||
|
|
||||||
class PlaybackServiceFragment private constructor(
|
class PlaybackServiceFragment
|
||||||
|
private constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val foregroundListener: ForegroundListener,
|
private val foregroundListener: ForegroundListener,
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
|
@ -43,7 +40,9 @@ class PlaybackServiceFragment private constructor(
|
||||||
widgetComponentFactory: WidgetComponent.Factory,
|
widgetComponentFactory: WidgetComponent.Factory,
|
||||||
systemReceiverFactory: SystemPlaybackReceiver.Factory,
|
systemReceiverFactory: SystemPlaybackReceiver.Factory,
|
||||||
) : MediaSessionCompat.Callback(), PlaybackStateManager.Listener {
|
) : MediaSessionCompat.Callback(), PlaybackStateManager.Listener {
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
|
@Inject
|
||||||
|
constructor(
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val exoHolderFactory: ExoPlaybackStateHolder.Factory,
|
private val exoHolderFactory: ExoPlaybackStateHolder.Factory,
|
||||||
private val sessionHolderFactory: MediaSessionHolder.Factory,
|
private val sessionHolderFactory: MediaSessionHolder.Factory,
|
||||||
|
@ -51,7 +50,14 @@ class PlaybackServiceFragment private constructor(
|
||||||
private val systemReceiverFactory: SystemPlaybackReceiver.Factory,
|
private val systemReceiverFactory: SystemPlaybackReceiver.Factory,
|
||||||
) {
|
) {
|
||||||
fun create(context: Context, foregroundListener: ForegroundListener) =
|
fun create(context: Context, foregroundListener: ForegroundListener) =
|
||||||
PlaybackServiceFragment(context, foregroundListener, playbackManager, exoHolderFactory, sessionHolderFactory, widgetComponentFactory, systemReceiverFactory)
|
PlaybackServiceFragment(
|
||||||
|
context,
|
||||||
|
foregroundListener,
|
||||||
|
playbackManager,
|
||||||
|
exoHolderFactory,
|
||||||
|
sessionHolderFactory,
|
||||||
|
widgetComponentFactory,
|
||||||
|
systemReceiverFactory)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val waitJob = Job()
|
private val waitJob = Job()
|
||||||
|
@ -60,7 +66,8 @@ class PlaybackServiceFragment private constructor(
|
||||||
private val widgetComponent = widgetComponentFactory.create(context)
|
private val widgetComponent = widgetComponentFactory.create(context)
|
||||||
private val systemReceiver = systemReceiverFactory.create(context)
|
private val systemReceiver = systemReceiverFactory.create(context)
|
||||||
|
|
||||||
val token: MediaSessionCompat.Token get() = sessionHolder.token
|
val token: MediaSessionCompat.Token
|
||||||
|
get() = sessionHolder.token
|
||||||
|
|
||||||
// --- MEDIASESSION CALLBACKS ---
|
// --- MEDIASESSION CALLBACKS ---
|
||||||
|
|
||||||
|
|
|
@ -24,32 +24,37 @@ import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.media.AudioManager
|
import android.media.AudioManager
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.playback.PlaybackSettings
|
import org.oxycblt.auxio.playback.PlaybackSettings
|
||||||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.widgets.WidgetComponent
|
import org.oxycblt.auxio.widgets.WidgetComponent
|
||||||
import org.oxycblt.auxio.widgets.WidgetProvider
|
import org.oxycblt.auxio.widgets.WidgetProvider
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A [BroadcastReceiver] for receiving playback-specific [Intent]s from the system that require an
|
* A [BroadcastReceiver] for receiving playback-specific [Intent]s from the system that require an
|
||||||
* active [IntentFilter] to be registered.
|
* active [IntentFilter] to be registered.
|
||||||
*/
|
*/
|
||||||
class SystemPlaybackReceiver private constructor(
|
class SystemPlaybackReceiver
|
||||||
|
private constructor(
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val playbackSettings: PlaybackSettings,
|
private val playbackSettings: PlaybackSettings,
|
||||||
private val widgetComponent: WidgetComponent
|
private val widgetComponent: WidgetComponent
|
||||||
) : BroadcastReceiver() {
|
) : BroadcastReceiver() {
|
||||||
private var initialHeadsetPlugEventHandled = false
|
private var initialHeadsetPlugEventHandled = false
|
||||||
|
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
|
@Inject
|
||||||
|
constructor(
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val playbackSettings: PlaybackSettings,
|
private val playbackSettings: PlaybackSettings,
|
||||||
private val widgetComponent: WidgetComponent
|
private val widgetComponent: WidgetComponent
|
||||||
) {
|
) {
|
||||||
fun create(context: Context): SystemPlaybackReceiver {
|
fun create(context: Context): SystemPlaybackReceiver {
|
||||||
val receiver = SystemPlaybackReceiver(playbackManager, playbackSettings, widgetComponent)
|
val receiver =
|
||||||
ContextCompat.registerReceiver(context, receiver, INTENT_FILTER, ContextCompat.RECEIVER_EXPORTED)
|
SystemPlaybackReceiver(playbackManager, playbackSettings, widgetComponent)
|
||||||
|
ContextCompat.registerReceiver(
|
||||||
|
context, receiver, INTENT_FILTER, ContextCompat.RECEIVER_EXPORTED)
|
||||||
return receiver
|
return receiver
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,16 +136,16 @@ class SystemPlaybackReceiver private constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
val INTENT_FILTER =
|
val INTENT_FILTER =
|
||||||
IntentFilter().apply {
|
IntentFilter().apply {
|
||||||
addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
|
addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
|
||||||
addAction(AudioManager.ACTION_HEADSET_PLUG)
|
addAction(AudioManager.ACTION_HEADSET_PLUG)
|
||||||
addAction(PlaybackActions.ACTION_INC_REPEAT_MODE)
|
addAction(PlaybackActions.ACTION_INC_REPEAT_MODE)
|
||||||
addAction(PlaybackActions.ACTION_INVERT_SHUFFLE)
|
addAction(PlaybackActions.ACTION_INVERT_SHUFFLE)
|
||||||
addAction(PlaybackActions.ACTION_SKIP_PREV)
|
addAction(PlaybackActions.ACTION_SKIP_PREV)
|
||||||
addAction(PlaybackActions.ACTION_PLAY_PAUSE)
|
addAction(PlaybackActions.ACTION_PLAY_PAUSE)
|
||||||
addAction(PlaybackActions.ACTION_SKIP_NEXT)
|
addAction(PlaybackActions.ACTION_SKIP_NEXT)
|
||||||
addAction(WidgetProvider.ACTION_WIDGET_UPDATE)
|
addAction(WidgetProvider.ACTION_WIDGET_UPDATE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import android.graphics.Bitmap
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import coil.request.ImageRequest
|
import coil.request.ImageRequest
|
||||||
import coil.size.Size
|
import coil.size.Size
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.image.BitmapProvider
|
import org.oxycblt.auxio.image.BitmapProvider
|
||||||
|
@ -46,20 +45,24 @@ import org.oxycblt.auxio.util.logD
|
||||||
*
|
*
|
||||||
* @author Alexander Capehart (OxygenCobalt)
|
* @author Alexander Capehart (OxygenCobalt)
|
||||||
*/
|
*/
|
||||||
class WidgetComponent private constructor(
|
class WidgetComponent
|
||||||
|
private constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val imageSettings: ImageSettings,
|
private val imageSettings: ImageSettings,
|
||||||
private val bitmapProvider: BitmapProvider,
|
private val bitmapProvider: BitmapProvider,
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val uiSettings: UISettings
|
private val uiSettings: UISettings
|
||||||
) : PlaybackStateManager.Listener, UISettings.Listener, ImageSettings.Listener {
|
) : PlaybackStateManager.Listener, UISettings.Listener, ImageSettings.Listener {
|
||||||
class Factory @Inject constructor(
|
class Factory
|
||||||
|
@Inject
|
||||||
|
constructor(
|
||||||
private val imageSettings: ImageSettings,
|
private val imageSettings: ImageSettings,
|
||||||
private val bitmapProvider: BitmapProvider,
|
private val bitmapProvider: BitmapProvider,
|
||||||
private val playbackManager: PlaybackStateManager,
|
private val playbackManager: PlaybackStateManager,
|
||||||
private val uiSettings: UISettings
|
private val uiSettings: UISettings
|
||||||
) {
|
) {
|
||||||
fun create(context: Context) = WidgetComponent(context, imageSettings, bitmapProvider, playbackManager, uiSettings)
|
fun create(context: Context) =
|
||||||
|
WidgetComponent(context, imageSettings, bitmapProvider, playbackManager, uiSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val widgetProvider = WidgetProvider()
|
private val widgetProvider = WidgetProvider()
|
||||||
|
|
Loading…
Reference in a new issue