Refactor music widget
This commit is contained in:
@@ -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
|
||||
}
|
||||
+9
-12
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user