kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale-android
Remove build warnings
rodzic
b1913f3ca5
commit
d2497c7217
|
@ -2,6 +2,9 @@ package audio.funkwhale.ffa
|
|||
|
||||
import android.app.Application
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import audio.funkwhale.ffa.playback.MediaSession
|
||||
import audio.funkwhale.ffa.playback.QueueManager
|
||||
import audio.funkwhale.ffa.utils.*
|
||||
import com.google.android.exoplayer2.database.ExoDatabaseProvider
|
||||
import com.google.android.exoplayer2.offline.DefaultDownloadIndex
|
||||
import com.google.android.exoplayer2.offline.DefaultDownloaderFactory
|
||||
|
@ -13,17 +16,14 @@ import com.google.android.exoplayer2.upstream.cache.SimpleCache
|
|||
import com.preference.PowerPreference
|
||||
import kotlinx.coroutines.channels.BroadcastChannel
|
||||
import kotlinx.coroutines.channels.ConflatedBroadcastChannel
|
||||
import audio.funkwhale.ffa.playback.MediaSession
|
||||
import audio.funkwhale.ffa.playback.QueueManager
|
||||
import audio.funkwhale.ffa.utils.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
class FFA : Application() {
|
||||
companion object {
|
||||
private var instance: audio.funkwhale.ffa.FFA = audio.funkwhale.ffa.FFA()
|
||||
private var instance: FFA = FFA()
|
||||
|
||||
fun get(): audio.funkwhale.ffa.FFA = audio.funkwhale.ffa.FFA.Companion.instance
|
||||
fun get(): FFA = instance
|
||||
}
|
||||
|
||||
var defaultExceptionHandler: Thread.UncaughtExceptionHandler? = null
|
||||
|
@ -70,7 +70,7 @@ class FFA : Application() {
|
|||
|
||||
Thread.setDefaultUncaughtExceptionHandler(CrashReportHandler())
|
||||
|
||||
audio.funkwhale.ffa.FFA.Companion.instance = this
|
||||
FFA.Companion.instance = this
|
||||
|
||||
when (PowerPreference.getDefaultFile().getString("night_mode")) {
|
||||
"on" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
|
@ -94,19 +94,20 @@ class FFA : Application() {
|
|||
val now = Date(Date().time - (5 * 60 * 1000))
|
||||
val formatter = SimpleDateFormat("MM-dd kk:mm:ss.000", Locale.US)
|
||||
|
||||
Runtime.getRuntime().exec(listOf("logcat", "-d", "-T", formatter.format(now)).toTypedArray()).also {
|
||||
it.inputStream.bufferedReader().also { reader ->
|
||||
val builder = StringBuilder()
|
||||
Runtime.getRuntime().exec(listOf("logcat", "-d", "-T", formatter.format(now)).toTypedArray())
|
||||
.also {
|
||||
it.inputStream.bufferedReader().also { reader ->
|
||||
val builder = StringBuilder()
|
||||
|
||||
while (true) {
|
||||
builder.appendln(reader.readLine() ?: break)
|
||||
while (true) {
|
||||
builder.appendLine(reader.readLine() ?: break)
|
||||
}
|
||||
|
||||
builder.appendLine(e.toString())
|
||||
|
||||
Cache.set(this@FFA, "crashdump", builder.toString().toByteArray())
|
||||
}
|
||||
|
||||
builder.appendln(e.toString())
|
||||
|
||||
Cache.set(this@FFA, "crashdump", builder.toString().toByteArray())
|
||||
}
|
||||
}
|
||||
|
||||
defaultExceptionHandler?.uncaughtException(t, e)
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.os.Bundle
|
|||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.adapters.DownloadsAdapter
|
||||
import audio.funkwhale.ffa.databinding.ActivityDownloadsBinding
|
||||
import audio.funkwhale.ffa.utils.Event
|
||||
|
@ -62,7 +63,7 @@ class DownloadsActivity : AppCompatActivity() {
|
|||
|
||||
private fun refresh() {
|
||||
lifecycleScope.launch(Main) {
|
||||
val cursor = audio.funkwhale.ffa.FFA.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||
val cursor = FFA.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||
|
||||
adapter.downloads.clear()
|
||||
|
||||
|
@ -98,7 +99,7 @@ class DownloadsActivity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
private suspend fun refreshProgress() {
|
||||
val cursor = audio.funkwhale.ffa.FFA.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||
val cursor = FFA.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
val download = cursor.download
|
||||
|
|
|
@ -21,6 +21,7 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.R
|
||||
import audio.funkwhale.ffa.databinding.ActivityMainBinding
|
||||
import audio.funkwhale.ffa.fragments.*
|
||||
|
@ -259,7 +260,7 @@ class MainActivity : AppCompatActivity() {
|
|||
|
||||
if (resultCode == ResultCode.LOGOUT.code) {
|
||||
Intent(this, LoginActivity::class.java).apply {
|
||||
audio.funkwhale.ffa.FFA.get().deleteAllData()
|
||||
FFA.get().deleteAllData()
|
||||
|
||||
flags =
|
||||
Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||
|
@ -298,7 +299,7 @@ class MainActivity : AppCompatActivity() {
|
|||
EventBus.get().collect { message ->
|
||||
when (message) {
|
||||
is Event.LogOut -> {
|
||||
audio.funkwhale.ffa.FFA.get().deleteAllData()
|
||||
FFA.get().deleteAllData()
|
||||
|
||||
startActivity(Intent(this@MainActivity, LoginActivity::class.java).apply {
|
||||
flags = Intent.FLAG_ACTIVITY_NO_HISTORY
|
||||
|
|
|
@ -89,9 +89,9 @@ class SearchActivity : AppCompatActivity() {
|
|||
|
||||
val query = URLEncoder.encode(it, "UTF-8")
|
||||
|
||||
artistsRepository.query = query.toLowerCase(Locale.ROOT)
|
||||
albumsRepository.query = query.toLowerCase(Locale.ROOT)
|
||||
tracksRepository.query = query.toLowerCase(Locale.ROOT)
|
||||
artistsRepository.query = query.lowercase(Locale.ROOT)
|
||||
albumsRepository.query = query.lowercase(Locale.ROOT)
|
||||
tracksRepository.query = query.lowercase(Locale.ROOT)
|
||||
|
||||
binding.searchSpinner.visibility = View.VISIBLE
|
||||
binding.searchEmpty.visibility = View.GONE
|
||||
|
|
|
@ -14,6 +14,7 @@ import androidx.preference.ListPreference
|
|||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.SeekBarPreference
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.R
|
||||
import audio.funkwhale.ffa.databinding.ActivitySettingsBinding
|
||||
import audio.funkwhale.ffa.utils.Cache
|
||||
|
@ -97,7 +98,7 @@ class SettingsFragment :
|
|||
.setPositiveButton(android.R.string.yes) { _, _ ->
|
||||
CommandBus.send(Command.ClearQueue)
|
||||
|
||||
audio.funkwhale.ffa.FFA.get().deleteAllData()
|
||||
FFA.get().deleteAllData()
|
||||
|
||||
activity?.setResult(MainActivity.ResultCode.LOGOUT.code)
|
||||
activity?.finish()
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.content.Context
|
|||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.utils.AppContext
|
||||
import audio.funkwhale.ffa.utils.Settings
|
||||
|
||||
|
@ -21,7 +22,7 @@ class SplashActivity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
false -> Intent(this@SplashActivity, LoginActivity::class.java).apply {
|
||||
audio.funkwhale.ffa.FFA.get().deleteAllData()
|
||||
FFA.get().deleteAllData()
|
||||
|
||||
flags = Intent.FLAG_ACTIVITY_NO_ANIMATION
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ class MediaControlsManager(val context: Service, private val scope: CoroutineSco
|
|||
}
|
||||
}
|
||||
|
||||
audio.funkwhale.ffa.FFA.get().mediaSession.connector.invalidateMediaSessionMetadata()
|
||||
FFA.get().mediaSession.connector.invalidateMediaSessionMetadata()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,17 @@ import android.app.Notification
|
|||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.R
|
||||
import audio.funkwhale.ffa.utils.AppContext
|
||||
import audio.funkwhale.ffa.utils.DownloadInfo
|
||||
import audio.funkwhale.ffa.utils.Event
|
||||
import audio.funkwhale.ffa.utils.EventBus
|
||||
import audio.funkwhale.ffa.utils.Request
|
||||
import audio.funkwhale.ffa.utils.RequestBus
|
||||
import audio.funkwhale.ffa.utils.Response
|
||||
import audio.funkwhale.ffa.utils.Track
|
||||
import audio.funkwhale.ffa.utils.mustNormalizeUrl
|
||||
import com.google.android.exoplayer2.offline.Download
|
||||
import com.google.android.exoplayer2.offline.DownloadManager
|
||||
import com.google.android.exoplayer2.offline.DownloadRequest
|
||||
|
@ -16,17 +27,6 @@ import kotlinx.coroutines.Dispatchers.Main
|
|||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.launch
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.R
|
||||
import audio.funkwhale.ffa.utils.AppContext
|
||||
import audio.funkwhale.ffa.utils.DownloadInfo
|
||||
import audio.funkwhale.ffa.utils.Event
|
||||
import audio.funkwhale.ffa.utils.EventBus
|
||||
import audio.funkwhale.ffa.utils.Request
|
||||
import audio.funkwhale.ffa.utils.RequestBus
|
||||
import audio.funkwhale.ffa.utils.Response
|
||||
import audio.funkwhale.ffa.utils.Track
|
||||
import audio.funkwhale.ffa.utils.mustNormalizeUrl
|
||||
import java.util.Collections
|
||||
|
||||
class PinService : DownloadService(AppContext.NOTIFICATION_DOWNLOADS) {
|
||||
|
@ -66,7 +66,7 @@ class PinService : DownloadService(AppContext.NOTIFICATION_DOWNLOADS) {
|
|||
scope.launch(Main) {
|
||||
RequestBus.get().collect { request ->
|
||||
when (request) {
|
||||
is Request.GetDownloads -> request.channel?.offer(Response.Downloads(getDownloads()))
|
||||
is Request.GetDownloads -> request.channel?.trySend(Response.Downloads(getDownloads()))?.isSuccess
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ class PinService : DownloadService(AppContext.NOTIFICATION_DOWNLOADS) {
|
|||
return super.onStartCommand(intent, flags, startId)
|
||||
}
|
||||
|
||||
override fun getDownloadManager() = audio.funkwhale.ffa.FFA.get().exoDownloadManager.apply {
|
||||
override fun getDownloadManager() = FFA.get().exoDownloadManager.apply {
|
||||
addListener(DownloadListener())
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,9 @@ import android.support.v4.media.MediaMetadataCompat
|
|||
import android.view.KeyEvent
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.media.session.MediaButtonReceiver
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.R
|
||||
import audio.funkwhale.ffa.utils.*
|
||||
import com.google.android.exoplayer2.C
|
||||
import com.google.android.exoplayer2.ExoPlaybackException
|
||||
import com.google.android.exoplayer2.Player
|
||||
|
@ -26,9 +29,6 @@ import kotlinx.coroutines.*
|
|||
import kotlinx.coroutines.Dispatchers.IO
|
||||
import kotlinx.coroutines.Dispatchers.Main
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import audio.funkwhale.ffa.R
|
||||
import audio.funkwhale.ffa.utils.*
|
||||
|
||||
class PlayerService : Service() {
|
||||
companion object {
|
||||
|
@ -63,12 +63,12 @@ class PlayerService : Service() {
|
|||
when (key.keyCode) {
|
||||
KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> {
|
||||
if (hasAudioFocus(true)) MediaButtonReceiver.handleIntent(
|
||||
audio.funkwhale.ffa.FFA.get().mediaSession.session,
|
||||
FFA.get().mediaSession.session,
|
||||
intent
|
||||
)
|
||||
Unit
|
||||
}
|
||||
else -> MediaButtonReceiver.handleIntent(audio.funkwhale.ffa.FFA.get().mediaSession.session, intent)
|
||||
else -> MediaButtonReceiver.handleIntent(FFA.get().mediaSession.session, intent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -108,7 +108,7 @@ class PlayerService : Service() {
|
|||
}
|
||||
}
|
||||
|
||||
mediaControlsManager = MediaControlsManager(this, scope, audio.funkwhale.ffa.FFA.get().mediaSession.session)
|
||||
mediaControlsManager = MediaControlsManager(this, scope, FFA.get().mediaSession.session)
|
||||
|
||||
player = SimpleExoPlayer.Builder(this).build().apply {
|
||||
playWhenReady = false
|
||||
|
@ -118,9 +118,9 @@ class PlayerService : Service() {
|
|||
}
|
||||
}
|
||||
|
||||
audio.funkwhale.ffa.FFA.get().mediaSession.active = true
|
||||
FFA.get().mediaSession.active = true
|
||||
|
||||
audio.funkwhale.ffa.FFA.get().mediaSession.connector.apply {
|
||||
FFA.get().mediaSession.connector.apply {
|
||||
setPlayer(player)
|
||||
|
||||
setMediaMetadataProvider {
|
||||
|
@ -216,9 +216,9 @@ class PlayerService : Service() {
|
|||
scope.launch(Main) {
|
||||
RequestBus.get().collect { request ->
|
||||
when (request) {
|
||||
is Request.GetCurrentTrack -> request.channel?.offer(Response.CurrentTrack(queue.current()))
|
||||
is Request.GetState -> request.channel?.offer(Response.State(player.playWhenReady))
|
||||
is Request.GetQueue -> request.channel?.offer(Response.Queue(queue.get()))
|
||||
is Request.GetCurrentTrack -> request.channel?.trySend(Response.CurrentTrack(queue.current()))?.isSuccess
|
||||
is Request.GetState -> request.channel?.trySend(Response.State(player.playWhenReady))?.isSuccess
|
||||
is Request.GetQueue -> request.channel?.trySend(Response.Queue(queue.get()))?.isSuccess
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -271,7 +271,7 @@ class PlayerService : Service() {
|
|||
setPlaybackState(false)
|
||||
player.release()
|
||||
|
||||
audio.funkwhale.ffa.FFA.get().mediaSession.active = false
|
||||
FFA.get().mediaSession.active = false
|
||||
|
||||
super.onDestroy()
|
||||
}
|
||||
|
|
|
@ -30,10 +30,10 @@ class QueueManager(val context: Context) {
|
|||
}
|
||||
}
|
||||
|
||||
val playbackCache = CacheDataSourceFactory(audio.funkwhale.ffa.FFA.get().exoCache, http)
|
||||
val playbackCache = CacheDataSourceFactory(FFA.get().exoCache, http)
|
||||
|
||||
return CacheDataSourceFactory(
|
||||
audio.funkwhale.ffa.FFA.get().exoDownloadCache,
|
||||
FFA.get().exoDownloadCache,
|
||||
playbackCache,
|
||||
FileDataSource.Factory(),
|
||||
null,
|
||||
|
|
|
@ -32,7 +32,7 @@ class FavoritesRepository(override val context: Context?) : Repository<Track, Tr
|
|||
|
||||
track.bestUpload()?.let { upload ->
|
||||
maybeNormalizeUrl(upload.listen_url)?.let { url ->
|
||||
track.cached = audio.funkwhale.ffa.FFA.get().exoCache.isCached(url, 0, upload.duration * 1000L)
|
||||
track.cached = FFA.get().exoCache.isCached(url, 0, upload.duration * 1000L)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ class TracksSearchRepository(override val context: Context?, var query: String)
|
|||
track.bestUpload()?.let { upload ->
|
||||
val url = mustNormalizeUrl(upload.listen_url)
|
||||
|
||||
track.cached = audio.funkwhale.ffa.FFA.get().exoCache.isCached(url, 0, upload.duration * 1000L)
|
||||
track.cached = FFA.get().exoCache.isCached(url, 0, upload.duration * 1000L)
|
||||
}
|
||||
|
||||
track
|
||||
|
|
|
@ -20,7 +20,7 @@ class TracksRepository(override val context: Context?, albumId: Int) : Repositor
|
|||
|
||||
companion object {
|
||||
fun getDownloadedIds(): List<Int>? {
|
||||
val cursor = audio.funkwhale.ffa.FFA.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||
val cursor = FFA.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||
val ids: MutableList<Int> = mutableListOf()
|
||||
|
||||
while (cursor.moveToNext()) {
|
||||
|
@ -52,7 +52,7 @@ class TracksRepository(override val context: Context?, albumId: Int) : Repositor
|
|||
track.bestUpload()?.let { upload ->
|
||||
val url = mustNormalizeUrl(upload.listen_url)
|
||||
|
||||
track.cached = audio.funkwhale.ffa.FFA.get().exoCache.isCached(url, 0, upload.duration * 1000L)
|
||||
track.cached = FFA.get().exoCache.isCached(url, 0, upload.duration * 1000L)
|
||||
}
|
||||
|
||||
track
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package audio.funkwhale.ffa.utils
|
||||
|
||||
import audio.funkwhale.ffa.FFA
|
||||
import com.google.android.exoplayer2.offline.Download
|
||||
import com.google.android.exoplayer2.offline.DownloadCursor
|
||||
import kotlinx.coroutines.Dispatchers.IO
|
||||
|
@ -70,21 +71,21 @@ sealed class Response {
|
|||
object EventBus {
|
||||
fun send(event: Event) {
|
||||
GlobalScope.launch(IO) {
|
||||
audio.funkwhale.ffa.FFA.get().eventBus.offer(event)
|
||||
FFA.get().eventBus.trySend(event).isSuccess
|
||||
}
|
||||
}
|
||||
|
||||
fun get() = audio.funkwhale.ffa.FFA.get().eventBus.asFlow()
|
||||
fun get() = FFA.get().eventBus.asFlow()
|
||||
}
|
||||
|
||||
object CommandBus {
|
||||
fun send(command: Command) {
|
||||
GlobalScope.launch(IO) {
|
||||
audio.funkwhale.ffa.FFA.get().commandBus.offer(command)
|
||||
FFA.get().commandBus.trySend(command).isSuccess
|
||||
}
|
||||
}
|
||||
|
||||
fun get() = audio.funkwhale.ffa.FFA.get().commandBus.asFlow()
|
||||
fun get() = FFA.get().commandBus.asFlow()
|
||||
}
|
||||
|
||||
object RequestBus {
|
||||
|
@ -93,22 +94,22 @@ object RequestBus {
|
|||
GlobalScope.launch(IO) {
|
||||
request.channel = it
|
||||
|
||||
audio.funkwhale.ffa.FFA.get().requestBus.offer(request)
|
||||
FFA.get().requestBus.trySend(request).isSuccess
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun get() = audio.funkwhale.ffa.FFA.get().requestBus.asFlow()
|
||||
fun get() = FFA.get().requestBus.asFlow()
|
||||
}
|
||||
|
||||
object ProgressBus {
|
||||
fun send(current: Int, duration: Int, percent: Int) {
|
||||
GlobalScope.launch(IO) {
|
||||
audio.funkwhale.ffa.FFA.get().progressBus.send(Triple(current, duration, percent))
|
||||
FFA.get().progressBus.send(Triple(current, duration, percent))
|
||||
}
|
||||
}
|
||||
|
||||
fun get() = audio.funkwhale.ffa.FFA.get().progressBus.asFlow().conflate()
|
||||
fun get() = FFA.get().progressBus.asFlow().conflate()
|
||||
}
|
||||
|
||||
suspend inline fun <reified T> Channel<Response>.wait(): T? {
|
||||
|
|
Ładowanie…
Reference in New Issue