Refactor music widget

This commit is contained in:
MM20
2021-12-19 18:29:52 +01:00
parent 71652ffc71
commit 8be19a1309
8 changed files with 88 additions and 95 deletions
@@ -0,0 +1,17 @@
package de.mm20.launcher2.ui.launcher.search
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import de.mm20.launcher2.search.data.File
import org.koin.core.component.KoinComponent
class SearchViewModel: ViewModel(), KoinComponent {
fun search(query: String) {
}
private val _files = MutableLiveData<List<File>>()
val files: LiveData<List<File>> = _files
}
@@ -21,26 +21,25 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.music.MusicViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.music.PlaybackState
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.ktx.conditional
import org.koin.androidx.compose.getViewModel
import de.mm20.launcher2.ui.launcher.widgets.music.MusicWidgetVM
@OptIn(
ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class,
ExperimentalFoundationApi::class,
ExperimentalAnimationGraphicsApi::class
)
@Composable
fun MusicWidget() {
val viewModel: MusicViewModel = getViewModel()
val viewModel: MusicWidgetVM = viewModel()
val albumArt by viewModel.albumArt.observeAsState()
val title by viewModel.title.observeAsState()
@@ -91,7 +90,7 @@ fun MusicWidget() {
) {
IconButton(
onClick = {
viewModel.previous()
viewModel.onPreviousClick()
}) {
Icon(
imageVector = Icons.Rounded.SkipPrevious,
@@ -99,14 +98,14 @@ fun MusicWidget() {
)
}
val playPauseIcon = AnimatedImageVector.animatedVectorResource(R.drawable.anim_ic_play_pause)
IconButton(onClick = { viewModel.togglePause() }) {
IconButton(onClick = { viewModel.onPlayClick() }) {
Icon(
painter = rememberAnimatedVectorPainter(playPauseIcon, atEnd = playbackState == PlaybackState.Playing),
contentDescription = ""
)
}
IconButton(onClick = {
viewModel.next()
viewModel.onNextClick()
}) {
Icon(
imageVector = Icons.Rounded.SkipNext,
@@ -120,12 +119,10 @@ fun MusicWidget() {
.size(144.dp)
.combinedClickable(
onClick = {
viewModel
.getLaunchIntent(context)
.send()
viewModel.onAlbumArtClick()
},
onLongClick = {
viewModel.openPlayerChooser(context)
viewModel.onAlbumArtLongClick(context)
}
)
.conditional(
@@ -0,0 +1,47 @@
package de.mm20.launcher2.ui.launcher.widgets.music
import android.app.PendingIntent
import android.content.Context
import android.graphics.Bitmap
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.music.MusicRepository
import de.mm20.launcher2.music.PlaybackState
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class MusicWidgetVM: ViewModel(), KoinComponent {
private val musicRepository: MusicRepository by inject()
val title: LiveData<String?> = musicRepository.title.asLiveData()
val artist: LiveData<String?> = musicRepository.artist.asLiveData()
val album: LiveData<String?> = musicRepository.album.asLiveData()
val albumArt: LiveData<Bitmap?> = musicRepository.albumArt.asLiveData()
val playbackState: LiveData<PlaybackState> = musicRepository.playbackState.asLiveData()
fun onPreviousClick() {
musicRepository.previous()
}
fun onNextClick() {
musicRepository.next()
}
fun onPlayClick() {
musicRepository.togglePause()
}
fun onAlbumArtClick() {
try {
musicRepository.getLaunchIntent().send()
} catch (e: PendingIntent.CanceledException) {
CrashReporter.logException(e)
}
}
fun onAlbumArtLongClick(context: Context) {
musicRepository.openPlayerChooser(context)
}
}
@@ -1,30 +1,16 @@
package de.mm20.launcher2.ui.legacy.widget
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.drawable.AnimatedVectorDrawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.ComposeView
import androidx.core.content.ContextCompat
import androidx.core.graphics.alpha
import androidx.lifecycle.Observer
import de.mm20.launcher2.ktx.dp
import de.mm20.launcher2.legacy.helper.ActivityStarter
import de.mm20.launcher2.music.MusicViewModel
import de.mm20.launcher2.music.PlaybackState
import de.mm20.launcher2.ui.LegacyLauncherTheme
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.databinding.CompactMusicBinding
import de.mm20.launcher2.ui.widget.MusicWidget
import org.koin.androidx.viewmodel.ext.android.viewModel
class MusicWidget : LauncherWidget {
@@ -33,8 +19,6 @@ class MusicWidget : LauncherWidget {
override val name: String
get() = context.getString(R.string.widget_name_music)
private val viewModel: MusicViewModel by (context as AppCompatActivity).viewModel()
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleRes: Int) : super(context, attrs, defStyleRes)