music: add wakelock to indexerservice

Add a wake lock to IndexerService.

This ensures that the CPU is active throughout the whole music loading
process.
This commit is contained in:
OxygenCobalt 2022-07-20 11:07:19 -06:00
parent 19a0728e5b
commit f75f75308e
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 35 additions and 9 deletions

View file

@ -7,7 +7,7 @@
at the cost of longer loading times at the cost of longer loading times
- Added support for sort tags [#172, dependent on this feature] - Added support for sort tags [#172, dependent on this feature]
- Added support for date tags, including more fine-grained dates [#159, dependent on this feature] - Added support for date tags, including more fine-grained dates [#159, dependent on this feature]
- Added support for release types signifying EPs/Singles [#158, dependent on this feature] - Added support for release types signifying EPs, Singles, Compilations, and more [#158, dependent on this feature]
- Added Last Added sorting - Added Last Added sorting
- Search now takes sort tags and file names in account [#184] - Search now takes sort tags and file names in account [#184]

View file

@ -47,7 +47,7 @@ import org.oxycblt.auxio.util.unlikelyToBeNull
* - The sorts for each type of data * - The sorts for each type of data
* @author OxygenCobalt * @author OxygenCobalt
* *
* TODO: Unify how detail items are indicated * TODO: Unify how detail items are indicated [When playlists are implemented]
*/ */
class DetailViewModel(application: Application) : class DetailViewModel(application: Application) :
AndroidViewModel(application), MusicStore.Callback { AndroidViewModel(application), MusicStore.Callback {

View file

@ -20,21 +20,21 @@ package org.oxycblt.auxio.music.system
import android.app.Service import android.app.Service
import android.content.Intent import android.content.Intent
import android.database.ContentObserver import android.database.ContentObserver
import android.os.Handler import android.os.*
import android.os.IBinder
import android.os.Looper
import android.provider.MediaStore import android.provider.MediaStore
import coil.imageLoader import coil.imageLoader
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.playback.state.PlaybackStateManager
import org.oxycblt.auxio.settings.Settings import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.ui.system.ForegroundManager import org.oxycblt.auxio.ui.system.ForegroundManager
import org.oxycblt.auxio.util.contentResolverSafe import org.oxycblt.auxio.util.contentResolverSafe
import org.oxycblt.auxio.util.getSystemServiceSafe
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
/** /**
@ -46,8 +46,6 @@ import org.oxycblt.auxio.util.logD
* You could probably do the same using WorkManager and the GooberQueue library or whatever, but the * You could probably do the same using WorkManager and the GooberQueue library or whatever, but the
* boilerplate you skip is not worth the insanity of androidx. * boilerplate you skip is not worth the insanity of androidx.
* *
* TODO: Add a wake-lock to the music loading process
*
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class IndexerService : Service(), Indexer.Controller, Settings.Callback { class IndexerService : Service(), Indexer.Controller, Settings.Callback {
@ -56,15 +54,17 @@ class IndexerService : Service(), Indexer.Controller, Settings.Callback {
private val serviceJob = Job() private val serviceJob = Job()
private val indexScope = CoroutineScope(serviceJob + Dispatchers.IO) private val indexScope = CoroutineScope(serviceJob + Dispatchers.IO)
private lateinit var indexerContentObserver: SystemContentObserver
private val playbackManager = PlaybackStateManager.getInstance() private val playbackManager = PlaybackStateManager.getInstance()
private lateinit var settings: Settings
private lateinit var foregroundManager: ForegroundManager private lateinit var foregroundManager: ForegroundManager
private lateinit var indexingNotification: IndexingNotification private lateinit var indexingNotification: IndexingNotification
private lateinit var observingNotification: ObservingNotification private lateinit var observingNotification: ObservingNotification
private lateinit var settings: Settings
private lateinit var wakeLock: PowerManager.WakeLock
private lateinit var indexerContentObserver: SystemContentObserver
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -81,6 +81,11 @@ class IndexerService : Service(), Indexer.Controller, Settings.Callback {
onStartIndexing() onStartIndexing()
} }
wakeLock =
getSystemServiceSafe(PowerManager::class)
.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID + ".IndexerService")
logD("Service created.") logD("Service created.")
} }
@ -92,6 +97,7 @@ class IndexerService : Service(), Indexer.Controller, Settings.Callback {
super.onDestroy() super.onDestroy()
foregroundManager.release() foregroundManager.release()
wakeLock.releaseSafe()
// De-initialize the components first to prevent stray reloading events // De-initialize the components first to prevent stray reloading events
settings.release() settings.release()
@ -167,6 +173,9 @@ class IndexerService : Service(), Indexer.Controller, Settings.Callback {
logD("Notification changed, re-posting notification") logD("Notification changed, re-posting notification")
indexingNotification.post() indexingNotification.post()
} }
// Make sure we can keep the CPU on while loading music
wakeLock.acquireSafe()
} }
private fun updateIdleSession() { private fun updateIdleSession() {
@ -183,6 +192,23 @@ class IndexerService : Service(), Indexer.Controller, Settings.Callback {
} else { } else {
foregroundManager.tryStopForeground() foregroundManager.tryStopForeground()
} }
// Release our wake lock (if we were using it)
wakeLock.releaseSafe()
}
private fun PowerManager.WakeLock.acquireSafe() {
if (!wakeLock.isHeld) {
logD("Acquiring wake lock")
acquire()
}
}
private fun PowerManager.WakeLock.releaseSafe() {
if (wakeLock.isHeld) {
logD("Releasing wake lock")
release()
}
} }
// --- SETTING CALLBACKS --- // --- SETTING CALLBACKS ---