Перевод

Мелкие шайтанские фокусы
This commit is contained in:
2023-06-24 01:49:30 +05:00
parent 83fad60483
commit 0e0cd3ea07
246 changed files with 1424 additions and 1420 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic
package it.hamy.muza
import android.content.ContentValues
import android.content.Context
@@ -31,28 +31,28 @@ import androidx.room.migration.Migration
import androidx.sqlite.db.SimpleSQLiteQuery
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.sqlite.db.SupportSQLiteQuery
import it.vfsfitvnm.vimusic.enums.AlbumSortBy
import it.vfsfitvnm.vimusic.enums.ArtistSortBy
import it.vfsfitvnm.vimusic.enums.PlaylistSortBy
import it.vfsfitvnm.vimusic.enums.SongSortBy
import it.vfsfitvnm.vimusic.enums.SortOrder
import it.vfsfitvnm.vimusic.models.Album
import it.vfsfitvnm.vimusic.models.Artist
import it.vfsfitvnm.vimusic.models.SongWithContentLength
import it.vfsfitvnm.vimusic.models.Event
import it.vfsfitvnm.vimusic.models.Format
import it.vfsfitvnm.vimusic.models.Info
import it.vfsfitvnm.vimusic.models.Lyrics
import it.vfsfitvnm.vimusic.models.Playlist
import it.vfsfitvnm.vimusic.models.PlaylistPreview
import it.vfsfitvnm.vimusic.models.PlaylistWithSongs
import it.vfsfitvnm.vimusic.models.QueuedMediaItem
import it.vfsfitvnm.vimusic.models.SearchQuery
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.models.SongAlbumMap
import it.vfsfitvnm.vimusic.models.SongArtistMap
import it.vfsfitvnm.vimusic.models.SongPlaylistMap
import it.vfsfitvnm.vimusic.models.SortedSongPlaylistMap
import it.hamy.muza.enums.AlbumSortBy
import it.hamy.muza.enums.ArtistSortBy
import it.hamy.muza.enums.PlaylistSortBy
import it.hamy.muza.enums.SongSortBy
import it.hamy.muza.enums.SortOrder
import it.hamy.muza.models.Album
import it.hamy.muza.models.Artist
import it.hamy.muza.models.SongWithContentLength
import it.hamy.muza.models.Event
import it.hamy.muza.models.Format
import it.hamy.muza.models.Info
import it.hamy.muza.models.Lyrics
import it.hamy.muza.models.Playlist
import it.hamy.muza.models.PlaylistPreview
import it.hamy.muza.models.PlaylistWithSongs
import it.hamy.muza.models.QueuedMediaItem
import it.hamy.muza.models.SearchQuery
import it.hamy.muza.models.Song
import it.hamy.muza.models.SongAlbumMap
import it.hamy.muza.models.SongArtistMap
import it.hamy.muza.models.SongPlaylistMap
import it.hamy.muza.models.SortedSongPlaylistMap
import kotlin.jvm.Throws
import kotlinx.coroutines.flow.Flow

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic
package it.hamy.muza
import android.content.ComponentName
import android.content.Context
@@ -58,42 +58,42 @@ import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import com.valentinilk.shimmer.LocalShimmerTheme
import com.valentinilk.shimmer.defaultShimmerTheme
import it.vfsfitvnm.compose.persist.PersistMap
import it.vfsfitvnm.compose.persist.PersistMapOwner
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
import it.vfsfitvnm.innertube.requests.playlistPage
import it.vfsfitvnm.innertube.requests.song
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
import it.vfsfitvnm.vimusic.enums.ColorPaletteName
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.vimusic.service.PlayerService
import it.vfsfitvnm.vimusic.ui.components.BottomSheetMenu
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.rememberBottomSheetState
import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.artistRoute
import it.vfsfitvnm.vimusic.ui.screens.home.HomeScreen
import it.vfsfitvnm.vimusic.ui.screens.player.Player
import it.vfsfitvnm.vimusic.ui.screens.playlistRoute
import it.vfsfitvnm.vimusic.ui.styling.Appearance
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.colorPaletteOf
import it.vfsfitvnm.vimusic.ui.styling.dynamicColorPaletteOf
import it.vfsfitvnm.vimusic.ui.styling.typographyOf
import it.vfsfitvnm.vimusic.utils.applyFontPaddingKey
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.colorPaletteModeKey
import it.vfsfitvnm.vimusic.utils.colorPaletteNameKey
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.getEnum
import it.vfsfitvnm.vimusic.utils.intent
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid6
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid8
import it.vfsfitvnm.vimusic.utils.preferences
import it.vfsfitvnm.vimusic.utils.thumbnailRoundnessKey
import it.vfsfitvnm.vimusic.utils.useSystemFontKey
import it.hamy.compose.persist.PersistMap
import it.hamy.compose.persist.PersistMapOwner
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.BrowseBody
import it.hamy.innertube.requests.playlistPage
import it.hamy.innertube.requests.song
import it.hamy.muza.enums.ColorPaletteMode
import it.hamy.muza.enums.ColorPaletteName
import it.hamy.muza.enums.ThumbnailRoundness
import it.hamy.muza.service.PlayerService
import it.hamy.muza.ui.components.BottomSheetMenu
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.rememberBottomSheetState
import it.hamy.muza.ui.screens.albumRoute
import it.hamy.muza.ui.screens.artistRoute
import it.hamy.muza.ui.screens.home.HomeScreen
import it.hamy.muza.ui.screens.player.Player
import it.hamy.muza.ui.screens.playlistRoute
import it.hamy.muza.ui.styling.Appearance
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.colorPaletteOf
import it.hamy.muza.ui.styling.dynamicColorPaletteOf
import it.hamy.muza.ui.styling.typographyOf
import it.hamy.muza.utils.applyFontPaddingKey
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.colorPaletteModeKey
import it.hamy.muza.utils.colorPaletteNameKey
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.getEnum
import it.hamy.muza.utils.intent
import it.hamy.muza.utils.isAtLeastAndroid6
import it.hamy.muza.utils.isAtLeastAndroid8
import it.hamy.muza.utils.preferences
import it.hamy.muza.utils.thumbnailRoundnessKey
import it.hamy.muza.utils.useSystemFontKey
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.filterNotNull

View File

@@ -1,13 +1,13 @@
package it.vfsfitvnm.vimusic
package it.hamy.muza
import android.app.Application
import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.disk.DiskCache
import it.vfsfitvnm.vimusic.enums.CoilDiskCacheMaxSize
import it.vfsfitvnm.vimusic.utils.coilDiskCacheMaxSizeKey
import it.vfsfitvnm.vimusic.utils.getEnum
import it.vfsfitvnm.vimusic.utils.preferences
import it.hamy.muza.enums.CoilDiskCacheMaxSize
import it.hamy.muza.utils.coilDiskCacheMaxSizeKey
import it.hamy.muza.utils.getEnum
import it.hamy.muza.utils.preferences
class MainApplication : Application(), ImageLoaderFactory {
override fun onCreate() {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class AlbumSortBy {
Title,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class ArtistSortBy {
Name,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class BuiltInPlaylist {
Favorites,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class CoilDiskCacheMaxSize {
`128MB`,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class ColorPaletteMode {
Light,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class ColorPaletteName {
Default,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class ExoPlayerDiskCacheMaxSize {
`32MB`,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class PlaylistSortBy {
Name,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class SongSortBy {
PlayTime,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
enum class SortOrder {
Ascending,

View File

@@ -1,12 +1,9 @@
package it.vfsfitvnm.vimusic.enums
package it.hamy.muza.enums
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
enum class ThumbnailRoundness {
None,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
data class Info(
val id: String,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Embedded

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Embedded

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.media3.common.MediaItem

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Entity

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.Embedded

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.models
package it.hamy.muza.models
import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.service
package it.hamy.muza.service
import android.content.Context
import android.content.res.Configuration
@@ -9,7 +9,7 @@ import androidx.core.graphics.applyCanvas
import coil.imageLoader
import coil.request.Disposable
import coil.request.ImageRequest
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.hamy.muza.utils.thumbnail
context(Context)
class BitmapProvider(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.service
package it.hamy.muza.service
import androidx.media3.common.PlaybackException

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.service
package it.hamy.muza.service
import android.media.MediaDescription as BrowserMediaDescription
import android.media.browse.MediaBrowser.MediaItem as BrowserMediaItem
@@ -17,17 +17,17 @@ import androidx.core.net.toUri
import androidx.core.os.bundleOf
import androidx.media3.common.Player
import androidx.media3.datasource.cache.Cache
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Album
import it.vfsfitvnm.vimusic.models.PlaylistPreview
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.models.SongWithContentLength
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.forceSeekToNext
import it.vfsfitvnm.vimusic.utils.forceSeekToPrevious
import it.vfsfitvnm.vimusic.utils.intent
import it.hamy.muza.Database
import it.hamy.muza.R
import it.hamy.muza.models.Album
import it.hamy.muza.models.PlaylistPreview
import it.hamy.muza.models.Song
import it.hamy.muza.models.SongWithContentLength
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.forceSeekToNext
import it.hamy.muza.utils.forceSeekToPrevious
import it.hamy.muza.utils.intent
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.service
package it.hamy.muza.service
import android.os.Binder as AndroidBinder
import android.annotation.SuppressLint
@@ -67,45 +67,45 @@ import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.extractor.ExtractorsFactory
import androidx.media3.extractor.mkv.MatroskaExtractor
import androidx.media3.extractor.mp4.FragmentedMp4Extractor
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.NavigationEndpoint
import it.vfsfitvnm.innertube.models.bodies.PlayerBody
import it.vfsfitvnm.innertube.requests.player
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.MainActivity
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.ExoPlayerDiskCacheMaxSize
import it.vfsfitvnm.vimusic.models.Event
import it.vfsfitvnm.vimusic.models.QueuedMediaItem
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.utils.InvincibleService
import it.vfsfitvnm.vimusic.utils.RingBuffer
import it.vfsfitvnm.vimusic.utils.TimerJob
import it.vfsfitvnm.vimusic.utils.YouTubeRadio
import it.vfsfitvnm.vimusic.utils.activityPendingIntent
import it.vfsfitvnm.vimusic.utils.broadCastPendingIntent
import it.vfsfitvnm.vimusic.utils.exoPlayerDiskCacheMaxSizeKey
import it.vfsfitvnm.vimusic.utils.findNextMediaItemById
import it.vfsfitvnm.vimusic.utils.forcePlayFromBeginning
import it.vfsfitvnm.vimusic.utils.forceSeekToNext
import it.vfsfitvnm.vimusic.utils.forceSeekToPrevious
import it.vfsfitvnm.vimusic.utils.getEnum
import it.vfsfitvnm.vimusic.utils.intent
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid13
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid6
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid8
import it.vfsfitvnm.vimusic.utils.isInvincibilityEnabledKey
import it.vfsfitvnm.vimusic.utils.isShowingThumbnailInLockscreenKey
import it.vfsfitvnm.vimusic.utils.mediaItems
import it.vfsfitvnm.vimusic.utils.persistentQueueKey
import it.vfsfitvnm.vimusic.utils.preferences
import it.vfsfitvnm.vimusic.utils.queueLoopEnabledKey
import it.vfsfitvnm.vimusic.utils.resumePlaybackWhenDeviceConnectedKey
import it.vfsfitvnm.vimusic.utils.shouldBePlaying
import it.vfsfitvnm.vimusic.utils.skipSilenceKey
import it.vfsfitvnm.vimusic.utils.timer
import it.vfsfitvnm.vimusic.utils.trackLoopEnabledKey
import it.vfsfitvnm.vimusic.utils.volumeNormalizationKey
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.NavigationEndpoint
import it.hamy.innertube.models.bodies.PlayerBody
import it.hamy.innertube.requests.player
import it.hamy.muza.Database
import it.hamy.muza.MainActivity
import it.hamy.muza.R
import it.hamy.muza.enums.ExoPlayerDiskCacheMaxSize
import it.hamy.muza.models.Event
import it.hamy.muza.models.QueuedMediaItem
import it.hamy.muza.query
import it.hamy.muza.utils.InvincibleService
import it.hamy.muza.utils.RingBuffer
import it.hamy.muza.utils.TimerJob
import it.hamy.muza.utils.YouTubeRadio
import it.hamy.muza.utils.activityPendingIntent
import it.hamy.muza.utils.broadCastPendingIntent
import it.hamy.muza.utils.exoPlayerDiskCacheMaxSizeKey
import it.hamy.muza.utils.findNextMediaItemById
import it.hamy.muza.utils.forcePlayFromBeginning
import it.hamy.muza.utils.forceSeekToNext
import it.hamy.muza.utils.forceSeekToPrevious
import it.hamy.muza.utils.getEnum
import it.hamy.muza.utils.intent
import it.hamy.muza.utils.isAtLeastAndroid13
import it.hamy.muza.utils.isAtLeastAndroid6
import it.hamy.muza.utils.isAtLeastAndroid8
import it.hamy.muza.utils.isInvincibilityEnabledKey
import it.hamy.muza.utils.isShowingThumbnailInLockscreenKey
import it.hamy.muza.utils.mediaItems
import it.hamy.muza.utils.persistentQueueKey
import it.hamy.muza.utils.preferences
import it.hamy.muza.utils.queueLoopEnabledKey
import it.hamy.muza.utils.resumePlaybackWhenDeviceConnectedKey
import it.hamy.muza.utils.shouldBePlaying
import it.hamy.muza.utils.skipSilenceKey
import it.hamy.muza.utils.timer
import it.hamy.muza.utils.trackLoopEnabledKey
import it.hamy.muza.utils.volumeNormalizationKey
import kotlin.math.roundToInt
import kotlin.system.exitProcess
import kotlinx.coroutines.CoroutineScope
@@ -791,7 +791,7 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene
mediaItem?.let(Database::insert)
Database.insert(
it.vfsfitvnm.vimusic.models.Format(
it.hamy.muza.models.Format(
songId = videoId,
itag = format.itag,
mimeType = format.mimeType,
@@ -991,10 +991,10 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene
)
companion object {
val pause = Action("it.vfsfitvnm.vimusic.pause")
val play = Action("it.vfsfitvnm.vimusic.play")
val next = Action("it.vfsfitvnm.vimusic.next")
val previous = Action("it.vfsfitvnm.vimusic.previous")
val pause = Action("it.hamy.muza.pause")
val play = Action("it.hamy.muza.play")
val next = Action("it.hamy.muza.next")
val previous = Action("it.hamy.muza.previous")
}
}

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components
package it.hamy.muza.ui.components
import androidx.activity.compose.BackHandler
import androidx.compose.animation.core.Animatable

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components
package it.hamy.muza.ui.components
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components
package it.hamy.muza.ui.components
import androidx.compose.animation.core.Animatable
import androidx.compose.foundation.Canvas

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components
package it.hamy.muza.ui.components
import androidx.compose.animation.core.MutableTransitionState
import androidx.compose.animation.core.animateDp

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components
package it.hamy.muza.ui.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
@@ -48,12 +48,12 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.drawCircle
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.center
import it.hamy.muza.utils.drawCircle
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import kotlinx.coroutines.delay
@Composable
@@ -62,8 +62,8 @@ fun TextFieldDialog(
onDismiss: () -> Unit,
onDone: (String) -> Unit,
modifier: Modifier = Modifier,
cancelText: String = "Cancel",
doneText: String = "Done",
cancelText: String = "Отмена",
doneText: String = "Готово",
initialTextInput: String = "",
singleLine: Boolean = true,
maxLines: Int = 1,
@@ -167,8 +167,8 @@ fun ConfirmationDialog(
onDismiss: () -> Unit,
onConfirm: () -> Unit,
modifier: Modifier = Modifier,
cancelText: String = "Cancel",
confirmText: String = "Confirm",
cancelText: String = "Отменить",
confirmText: String = "Продолжить",
onCancel: () -> Unit = onDismiss
) {
val (_, typography) = LocalAppearance.current
@@ -324,7 +324,7 @@ inline fun <T> ValueSelectorDialog(
.padding(end = 24.dp)
) {
DialogTextButton(
text = "Cancel",
text = "Отмена",
onClick = onDismiss,
modifier = Modifier
)

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -10,9 +10,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.medium
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.color
import it.hamy.muza.utils.medium
@Composable
fun DialogTextButton(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi
@@ -24,11 +24,11 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.utils.ScrollingInfo
import it.vfsfitvnm.vimusic.utils.scrollingInfo
import it.vfsfitvnm.vimusic.utils.smoothScrollToTop
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.R
import it.hamy.muza.utils.ScrollingInfo
import it.hamy.muza.utils.scrollingInfo
import it.hamy.muza.utils.smoothScrollToTop
import kotlinx.coroutines.launch
@ExperimentalAnimationApi

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
@@ -16,10 +16,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.medium
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.medium
import kotlin.random.Random
@Composable

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.BoxWithConstraints
@@ -14,11 +14,11 @@ import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.isLandscape
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.isLandscape
import it.hamy.muza.utils.thumbnail
@Composable
inline fun LayoutWithAdaptiveThumbnail(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import android.content.Intent
import androidx.activity.compose.BackHandler
@@ -43,34 +43,33 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.media3.common.MediaItem
import it.vfsfitvnm.innertube.models.NavigationEndpoint
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.PlaylistSortBy
import it.vfsfitvnm.vimusic.enums.SortOrder
import it.vfsfitvnm.vimusic.models.Info
import it.vfsfitvnm.vimusic.models.Playlist
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.models.SongPlaylistMap
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.transaction
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.artistRoute
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.favoritesIcon
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.addNext
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.enqueue
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.formatAsDuration
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.thumbnail
import kotlin.system.measureTimeMillis
import it.hamy.innertube.models.NavigationEndpoint
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.enums.PlaylistSortBy
import it.hamy.muza.enums.SortOrder
import it.hamy.muza.models.Info
import it.hamy.muza.models.Playlist
import it.hamy.muza.models.Song
import it.hamy.muza.models.SongPlaylistMap
import it.hamy.muza.query
import it.hamy.muza.transaction
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.screens.albumRoute
import it.hamy.muza.ui.screens.artistRoute
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.favoritesIcon
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.addNext
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.enqueue
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.formatAsDuration
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.thumbnail
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.withContext

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
@@ -22,9 +22,9 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.secondary
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.secondary
@Composable
inline fun Menu(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.animation.animateColor
import androidx.compose.animation.core.animateFloat
@@ -32,13 +32,13 @@ import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.layout
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.isLandscape
import it.vfsfitvnm.vimusic.utils.semiBold
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.center
import it.hamy.muza.utils.color
import it.hamy.muza.utils.isLandscape
import it.hamy.muza.utils.semiBold
@Composable
inline fun NavigationRail(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
@@ -14,8 +14,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.primaryButton
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.primaryButton
@Composable
fun PrimaryButton(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentScope
@@ -15,7 +15,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.IntOffset
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.LocalAppearance
@ExperimentalAnimationApi
@Composable

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
@@ -14,8 +14,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.primaryButton
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.primaryButton
@Composable
fun SecondaryButton(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -9,9 +9,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.primaryButton
import it.vfsfitvnm.vimusic.utils.medium
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.primaryButton
import it.hamy.muza.utils.medium
@Composable
fun SecondaryTextButton(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.animation.animateColor
import androidx.compose.animation.core.animateDp
@@ -14,8 +14,8 @@ import androidx.compose.ui.geometry.center
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shadow
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.drawCircle
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.drawCircle
@Composable
fun Switch(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.components.themed
package it.hamy.muza.ui.components.themed
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Spacer
@@ -10,8 +10,8 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.shimmer
import kotlin.random.Random
@Composable

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.items
package it.hamy.muza.ui.items
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Spacer
@@ -13,14 +13,14 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.models.Album
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.vfsfitvnm.innertube.Innertube
import it.hamy.muza.models.Album
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.thumbnail
import it.hamy.innertube.Innertube
@Composable
fun AlbumItem(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.items
package it.hamy.muza.ui.items
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Spacer
@@ -15,14 +15,14 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.models.Artist
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.vfsfitvnm.innertube.Innertube
import it.hamy.muza.models.Artist
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.thumbnail
import it.hamy.innertube.Innertube
@Composable
fun ArtistItem(

View File

@@ -1,10 +1,9 @@
package it.vfsfitvnm.vimusic.ui.items
package it.hamy.muza.ui.items
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
@@ -13,7 +12,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.hamy.muza.ui.styling.Dimensions
@Composable
inline fun ItemContainer(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.items
package it.hamy.muza.ui.items
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
@@ -27,19 +27,19 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.models.PlaylistPreview
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.onOverlay
import it.vfsfitvnm.vimusic.ui.styling.overlay
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.vfsfitvnm.innertube.Innertube
import it.hamy.muza.Database
import it.hamy.muza.models.PlaylistPreview
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.onOverlay
import it.hamy.muza.ui.styling.overlay
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.color
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.thumbnail
import it.hamy.innertube.Innertube
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.items
package it.hamy.muza.ui.items
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
@@ -19,15 +19,15 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.media3.common.MediaItem
import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.vimusic.models.Song
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.thumbnail
import it.hamy.innertube.Innertube
import it.hamy.muza.models.Song
@Composable
fun SongItem(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.items
package it.hamy.muza.ui.items
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
@@ -16,16 +16,16 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.onOverlay
import it.vfsfitvnm.vimusic.ui.styling.overlay
import it.vfsfitvnm.vimusic.ui.styling.shimmer
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.innertube.Innertube
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.onOverlay
import it.hamy.muza.ui.styling.overlay
import it.hamy.muza.ui.styling.shimmer
import it.hamy.muza.utils.color
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.innertube.Innertube
@Composable
fun VideoItem(

View File

@@ -1,16 +1,16 @@
package it.vfsfitvnm.vimusic.ui.screens
package it.hamy.muza.ui.screens
import android.annotation.SuppressLint
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import it.vfsfitvnm.compose.routing.Route0
import it.vfsfitvnm.compose.routing.Route1
import it.vfsfitvnm.compose.routing.RouteHandlerScope
import it.vfsfitvnm.vimusic.enums.BuiltInPlaylist
import it.vfsfitvnm.vimusic.ui.screens.album.AlbumScreen
import it.vfsfitvnm.vimusic.ui.screens.artist.ArtistScreen
import it.vfsfitvnm.vimusic.ui.screens.playlist.PlaylistScreen
import it.hamy.compose.routing.Route0
import it.hamy.compose.routing.Route1
import it.hamy.compose.routing.RouteHandlerScope
import it.hamy.muza.enums.BuiltInPlaylist
import it.hamy.muza.ui.screens.album.AlbumScreen
import it.hamy.muza.ui.screens.artist.ArtistScreen
import it.hamy.muza.ui.screens.playlist.PlaylistScreen
val albumRoute = Route1<String?>("albumRoute")
val artistRoute = Route1<String?>("artistRoute")

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.album
package it.hamy.muza.ui.screens.album
import android.content.Intent
import androidx.compose.animation.ExperimentalAnimationApi
@@ -17,30 +17,30 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
import it.vfsfitvnm.innertube.requests.albumPage
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Album
import it.vfsfitvnm.vimusic.models.SongAlbumMap
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderPlaceholder
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.components.themed.adaptiveThumbnailContent
import it.vfsfitvnm.vimusic.ui.items.AlbumItem
import it.vfsfitvnm.vimusic.ui.items.AlbumItemPlaceholder
import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.vfsfitvnm.vimusic.ui.screens.searchresult.ItemsPage
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.persist.persist
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.BrowseBody
import it.hamy.innertube.requests.albumPage
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.Database
import it.hamy.muza.R
import it.hamy.muza.models.Album
import it.hamy.muza.models.SongAlbumMap
import it.hamy.muza.query
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.components.themed.HeaderPlaceholder
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.components.themed.adaptiveThumbnailContent
import it.hamy.muza.ui.items.AlbumItem
import it.hamy.muza.ui.items.AlbumItemPlaceholder
import it.hamy.muza.ui.screens.albumRoute
import it.hamy.muza.ui.screens.globalRoutes
import it.hamy.muza.ui.screens.searchresult.ItemsPage
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.withContext
@@ -122,7 +122,7 @@ fun AlbumScreen(browseId: String) {
val (colorPalette) = LocalAppearance.current
val context = LocalContext.current
Header(title = album?.title ?: "Unknown") {
Header(title = album?.title ?: "Неизвестный") {
textButton?.invoke()
Spacer(
@@ -182,8 +182,8 @@ fun AlbumScreen(browseId: String) {
tabIndex = tabIndex,
onTabChanged = { tabIndex = it },
tabColumnContent = { Item ->
Item(0, "Songs", R.drawable.musical_notes)
Item(1, "Other versions", R.drawable.disc)
Item(0, "Песни", R.drawable.musical_notes)
Item(1, "Другие версии", R.drawable.disc)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(key = currentTabIndex) {
@@ -203,7 +203,7 @@ fun AlbumScreen(browseId: String) {
headerContent = headerContent,
initialPlaceholderCount = 1,
continuationPlaceholderCount = 1,
emptyItemsText = "This album doesn't have any alternative version",
emptyItemsText = "Этот альбом не имеет других версий",
itemsPageProvider = albumPage?.let {
({
Result.success(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.album
package it.hamy.muza.ui.screens.album
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -22,30 +22,30 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.ShimmerHost
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.enqueue
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.forcePlayFromBeginning
import it.vfsfitvnm.vimusic.utils.isLandscape
import it.vfsfitvnm.vimusic.utils.semiBold
import it.hamy.compose.persist.persistList
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Song
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.ShimmerHost
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.center
import it.hamy.muza.utils.color
import it.hamy.muza.utils.enqueue
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.forcePlayFromBeginning
import it.hamy.muza.utils.isLandscape
import it.hamy.muza.utils.semiBold
@ExperimentalAnimationApi
@ExperimentalFoundationApi
@@ -86,7 +86,7 @@ fun AlbumSongs(
Column(horizontalAlignment = Alignment.CenterHorizontally) {
headerContent {
SecondaryTextButton(
text = "Enqueue",
text = "В очередь",
enabled = songs.isNotEmpty(),
onClick = {
binder?.player?.enqueue(songs.map(Song::asMediaItem))

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.artist
package it.hamy.muza.ui.screens.artist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -19,27 +19,27 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.ShimmerHost
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.enqueue
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.forcePlayFromBeginning
import it.hamy.compose.persist.persist
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Song
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.ShimmerHost
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.enqueue
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.forcePlayFromBeginning
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -81,7 +81,7 @@ fun ArtistLocalSongs(
Column(horizontalAlignment = Alignment.CenterHorizontally) {
headerContent {
SecondaryTextButton(
text = "Enqueue",
text = "В очередь",
enabled = !songs.isNullOrEmpty(),
onClick = {
binder?.player?.enqueue(songs!!.map(Song::asMediaItem))

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.artist
package it.hamy.muza.ui.screens.artist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -26,31 +26,31 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.NavigationEndpoint
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.ShimmerHost
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.items.AlbumItem
import it.vfsfitvnm.vimusic.ui.items.AlbumItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.align
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.NavigationEndpoint
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.ShimmerHost
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.items.AlbumItem
import it.hamy.muza.ui.items.AlbumItemPlaceholder
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.align
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.color
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -103,7 +103,7 @@ fun ArtistOverview(
headerContent {
youtubeArtistPage?.shuffleEndpoint?.let { endpoint ->
SecondaryTextButton(
text = "Shuffle",
text = "Перемешать",
onClick = {
binder?.stopRadio()
binder?.playRadio(endpoint)
@@ -125,14 +125,14 @@ fun ArtistOverview(
.padding(endPaddingValues)
) {
BasicText(
text = "Songs",
text = "Песни",
style = typography.m.semiBold,
modifier = sectionTextModifier
)
youtubeArtistPage.songsEndpoint?.let {
BasicText(
text = "View all",
text = "Все",
style = typography.xs.secondary,
modifier = sectionTextModifier
.clickable(onClick = onViewAllSongsClick),
@@ -178,14 +178,14 @@ fun ArtistOverview(
.padding(endPaddingValues)
) {
BasicText(
text = "Albums",
text = "Альбомы",
style = typography.m.semiBold,
modifier = sectionTextModifier
)
youtubeArtistPage.albumsEndpoint?.let {
BasicText(
text = "View all",
text = "Все",
style = typography.xs.secondary,
modifier = sectionTextModifier
.clickable(onClick = onViewAllAlbumsClick),
@@ -223,14 +223,14 @@ fun ArtistOverview(
.padding(endPaddingValues)
) {
BasicText(
text = "Singles",
text = "Синглы",
style = typography.m.semiBold,
modifier = sectionTextModifier
)
youtubeArtistPage.singlesEndpoint?.let {
BasicText(
text = "View all",
text = "Все",
style = typography.xs.secondary,
modifier = sectionTextModifier
.clickable(onClick = onViewAllSinglesClick),

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.artist
package it.hamy.muza.ui.screens.artist
import android.content.Intent
import androidx.compose.animation.ExperimentalAnimationApi
@@ -17,41 +17,41 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
import it.vfsfitvnm.innertube.models.bodies.ContinuationBody
import it.vfsfitvnm.innertube.requests.artistPage
import it.vfsfitvnm.innertube.requests.itemsPage
import it.vfsfitvnm.innertube.utils.from
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Artist
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderPlaceholder
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.components.themed.adaptiveThumbnailContent
import it.vfsfitvnm.vimusic.ui.items.AlbumItem
import it.vfsfitvnm.vimusic.ui.items.AlbumItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.vfsfitvnm.vimusic.ui.screens.searchresult.ItemsPage
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.artistScreenTabIndexKey
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.persist.persist
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.BrowseBody
import it.hamy.innertube.models.bodies.ContinuationBody
import it.hamy.innertube.requests.artistPage
import it.hamy.innertube.requests.itemsPage
import it.hamy.innertube.utils.from
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Artist
import it.hamy.muza.query
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.components.themed.HeaderPlaceholder
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.components.themed.adaptiveThumbnailContent
import it.hamy.muza.ui.items.AlbumItem
import it.hamy.muza.ui.items.AlbumItemPlaceholder
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.screens.albumRoute
import it.hamy.muza.ui.screens.globalRoutes
import it.hamy.muza.ui.screens.searchresult.ItemsPage
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.artistScreenTabIndexKey
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.rememberPreference
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.builtinplaylist
package it.hamy.muza.ui.screens.builtinplaylist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -6,12 +6,12 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.BuiltInPlaylist
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.R
import it.hamy.muza.enums.BuiltInPlaylist
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.screens.globalRoutes
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -38,8 +38,8 @@ fun BuiltInPlaylistScreen(builtInPlaylist: BuiltInPlaylist) {
tabIndex = tabIndex,
onTabChanged = onTabIndexChanged,
tabColumnContent = { Item ->
Item(0, "Favorites", R.drawable.heart)
Item(1, "Offline", R.drawable.airplane)
Item(0, "Любимые", R.drawable.heart)
Item(1, "Сохранённые", R.drawable.airplane)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(key = currentTabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.builtinplaylist
package it.hamy.muza.ui.screens.builtinplaylist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -20,28 +20,28 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.BuiltInPlaylist
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.models.SongWithContentLength
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.InHistoryMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.enqueue
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.forcePlayFromBeginning
import it.hamy.compose.persist.persistList
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.enums.BuiltInPlaylist
import it.hamy.muza.models.Song
import it.hamy.muza.models.SongWithContentLength
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.InHistoryMediaItemMenu
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.enqueue
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.forcePlayFromBeginning
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
@@ -94,14 +94,14 @@ fun BuiltInPlaylistSongs(builtInPlaylist: BuiltInPlaylist) {
) {
Header(
title = when (builtInPlaylist) {
BuiltInPlaylist.Favorites -> "Favorites"
BuiltInPlaylist.Offline -> "Offline"
BuiltInPlaylist.Favorites -> "Любимые"
BuiltInPlaylist.Offline -> "Сохранённые"
},
modifier = Modifier
.padding(bottom = 8.dp)
) {
SecondaryTextButton(
text = "Enqueue",
text = "В очередь",
enabled = songs.isNotEmpty(),
onClick = {
binder?.player?.enqueue(songs.map(Song::asMediaItem))

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.home
package it.hamy.muza.ui.screens.home
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.LinearEasing
@@ -15,34 +15,32 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.AlbumSortBy
import it.vfsfitvnm.vimusic.enums.SortOrder
import it.vfsfitvnm.vimusic.models.Album
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.items.AlbumItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.albumSortByKey
import it.vfsfitvnm.vimusic.utils.albumSortOrderKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.hamy.compose.persist.persist
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.R
import it.hamy.muza.enums.AlbumSortBy
import it.hamy.muza.enums.SortOrder
import it.hamy.muza.models.Album
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.items.AlbumItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.albumSortByKey
import it.hamy.muza.utils.albumSortOrderKey
import it.hamy.muza.utils.rememberPreference
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -85,7 +83,7 @@ fun HomeAlbums(
key = "header",
contentType = 0
) {
Header(title = "Albums") {
Header(title = "Альбомы") {
HeaderIconButton(
icon = R.drawable.calendar,
color = if (sortBy == AlbumSortBy.Year) colorPalette.text else colorPalette.textDisabled,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.home
package it.hamy.muza.ui.screens.home
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.LinearEasing
@@ -28,23 +28,23 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.ArtistSortBy
import it.vfsfitvnm.vimusic.enums.SortOrder
import it.vfsfitvnm.vimusic.models.Artist
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.items.ArtistItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.artistSortByKey
import it.vfsfitvnm.vimusic.utils.artistSortOrderKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.hamy.compose.persist.persistList
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.R
import it.hamy.muza.enums.ArtistSortBy
import it.hamy.muza.enums.SortOrder
import it.hamy.muza.models.Artist
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.items.ArtistItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.artistSortByKey
import it.hamy.muza.utils.artistSortOrderKey
import it.hamy.muza.utils.rememberPreference
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -94,7 +94,7 @@ fun HomeArtistList(
contentType = 0,
span = { GridItemSpan(maxLineSpan) }
) {
Header(title = "Artists") {
Header(title = "Исполнители") {
HeaderIconButton(
icon = R.drawable.text,
color = if (sortBy == ArtistSortBy.Name) colorPalette.text else colorPalette.textDisabled,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.home
package it.hamy.muza.ui.screens.home
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.LinearEasing
@@ -30,28 +30,28 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.BuiltInPlaylist
import it.vfsfitvnm.vimusic.enums.PlaylistSortBy
import it.vfsfitvnm.vimusic.enums.SortOrder
import it.vfsfitvnm.vimusic.models.Playlist
import it.vfsfitvnm.vimusic.models.PlaylistPreview
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.components.themed.TextFieldDialog
import it.vfsfitvnm.vimusic.ui.items.PlaylistItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.playlistSortByKey
import it.vfsfitvnm.vimusic.utils.playlistSortOrderKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.hamy.compose.persist.persistList
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.R
import it.hamy.muza.enums.BuiltInPlaylist
import it.hamy.muza.enums.PlaylistSortBy
import it.hamy.muza.enums.SortOrder
import it.hamy.muza.models.Playlist
import it.hamy.muza.models.PlaylistPreview
import it.hamy.muza.query
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.components.themed.TextFieldDialog
import it.hamy.muza.ui.items.PlaylistItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.playlistSortByKey
import it.hamy.muza.utils.playlistSortOrderKey
import it.hamy.muza.utils.rememberPreference
@ExperimentalAnimationApi
@ExperimentalFoundationApi
@@ -69,7 +69,7 @@ fun HomePlaylists(
if (isCreatingANewPlaylist) {
TextFieldDialog(
hintText = "Enter the playlist name",
hintText = "Введите название плейлиста",
onDismiss = {
isCreatingANewPlaylist = false
},
@@ -116,9 +116,9 @@ fun HomePlaylists(
.background(colorPalette.background0)
) {
item(key = "header", contentType = 0, span = { GridItemSpan(maxLineSpan) }) {
Header(title = "Playlists") {
Header(title = "Плейлисты") {
SecondaryTextButton(
text = "New playlist",
text = "Новый плейлист",
onClick = { isCreatingANewPlaylist = true }
)
@@ -164,7 +164,7 @@ fun HomePlaylists(
PlaylistItem(
icon = R.drawable.heart,
colorTint = colorPalette.red,
name = "Favorites",
name = "Любимые",
songCount = null,
thumbnailSizeDp = thumbnailSizeDp,
alternative = true,
@@ -178,7 +178,7 @@ fun HomePlaylists(
PlaylistItem(
icon = R.drawable.airplane,
colorTint = colorPalette.blue,
name = "Offline",
name = "Сохранённые",
songCount = null,
thumbnailSizeDp = thumbnailSizeDp,
alternative = true,

View File

@@ -1,41 +1,41 @@
package it.vfsfitvnm.vimusic.ui.screens.home
package it.hamy.muza.ui.screens.home
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import androidx.compose.ui.platform.LocalContext
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.compose.routing.defaultStacking
import it.vfsfitvnm.compose.routing.defaultStill
import it.vfsfitvnm.compose.routing.defaultUnstacking
import it.vfsfitvnm.compose.routing.isStacking
import it.vfsfitvnm.compose.routing.isUnknown
import it.vfsfitvnm.compose.routing.isUnstacking
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.SearchQuery
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.artistRoute
import it.vfsfitvnm.vimusic.ui.screens.builtInPlaylistRoute
import it.vfsfitvnm.vimusic.ui.screens.builtinplaylist.BuiltInPlaylistScreen
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.vfsfitvnm.vimusic.ui.screens.localPlaylistRoute
import it.vfsfitvnm.vimusic.ui.screens.localplaylist.LocalPlaylistScreen
import it.vfsfitvnm.vimusic.ui.screens.playlistRoute
import it.vfsfitvnm.vimusic.ui.screens.search.SearchScreen
import it.vfsfitvnm.vimusic.ui.screens.searchResultRoute
import it.vfsfitvnm.vimusic.ui.screens.searchRoute
import it.vfsfitvnm.vimusic.ui.screens.searchresult.SearchResultScreen
import it.vfsfitvnm.vimusic.ui.screens.settings.SettingsScreen
import it.vfsfitvnm.vimusic.ui.screens.settingsRoute
import it.vfsfitvnm.vimusic.utils.homeScreenTabIndexKey
import it.vfsfitvnm.vimusic.utils.pauseSearchHistoryKey
import it.vfsfitvnm.vimusic.utils.preferences
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.routing.RouteHandler
import it.hamy.compose.routing.defaultStacking
import it.hamy.compose.routing.defaultStill
import it.hamy.compose.routing.defaultUnstacking
import it.hamy.compose.routing.isStacking
import it.hamy.compose.routing.isUnknown
import it.hamy.compose.routing.isUnstacking
import it.hamy.muza.Database
import it.hamy.muza.R
import it.hamy.muza.models.SearchQuery
import it.hamy.muza.query
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.screens.albumRoute
import it.hamy.muza.ui.screens.artistRoute
import it.hamy.muza.ui.screens.builtInPlaylistRoute
import it.hamy.muza.ui.screens.builtinplaylist.BuiltInPlaylistScreen
import it.hamy.muza.ui.screens.globalRoutes
import it.hamy.muza.ui.screens.localPlaylistRoute
import it.hamy.muza.ui.screens.localplaylist.LocalPlaylistScreen
import it.hamy.muza.ui.screens.playlistRoute
import it.hamy.muza.ui.screens.search.SearchScreen
import it.hamy.muza.ui.screens.searchResultRoute
import it.hamy.muza.ui.screens.searchRoute
import it.hamy.muza.ui.screens.searchresult.SearchResultScreen
import it.hamy.muza.ui.screens.settings.SettingsScreen
import it.hamy.muza.ui.screens.settingsRoute
import it.hamy.muza.utils.homeScreenTabIndexKey
import it.hamy.muza.utils.pauseSearchHistoryKey
import it.hamy.muza.utils.preferences
import it.hamy.muza.utils.rememberPreference
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -119,11 +119,11 @@ fun HomeScreen(onPlaylistUrl: (String) -> Unit) {
tabIndex = tabIndex,
onTabChanged = onTabChanged,
tabColumnContent = { Item ->
Item(0, "Quick picks", R.drawable.sparkles)
Item(1, "Songs", R.drawable.musical_notes)
Item(2, "Playlists", R.drawable.playlist)
Item(3, "Artists", R.drawable.person)
Item(4, "Albums", R.drawable.disc)
Item(0, "Обзор", R.drawable.sparkles)
Item(1, "Песни", R.drawable.musical_notes)
Item(2, "Плейлисты", R.drawable.playlist)
Item(3, "Исполнители", R.drawable.person)
Item(4, "Альбомы", R.drawable.disc)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(key = currentTabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.home
package it.hamy.muza.ui.screens.home
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.LinearEasing
@@ -31,33 +31,33 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.enums.SongSortBy
import it.vfsfitvnm.vimusic.enums.SortOrder
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.components.themed.InHistoryMediaItemMenu
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.onOverlay
import it.vfsfitvnm.vimusic.ui.styling.overlay
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.songSortByKey
import it.vfsfitvnm.vimusic.utils.songSortOrderKey
import it.hamy.compose.persist.persistList
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.enums.SongSortBy
import it.hamy.muza.enums.SortOrder
import it.hamy.muza.models.Song
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.components.themed.InHistoryMediaItemMenu
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.onOverlay
import it.hamy.muza.ui.styling.overlay
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.center
import it.hamy.muza.utils.color
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.songSortByKey
import it.hamy.muza.utils.songSortOrderKey
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -102,7 +102,7 @@ fun HomeSongs(
key = "header",
contentType = 0
) {
Header(title = "Songs") {
Header(title = "Песни") {
HeaderIconButton(
icon = R.drawable.trending,
color = if (sortBy == SongSortBy.PlayTime) colorPalette.text else colorPalette.textDisabled,

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.home
package it.hamy.muza.ui.screens.home
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -38,41 +38,41 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.NavigationEndpoint
import it.vfsfitvnm.innertube.models.bodies.NextBody
import it.vfsfitvnm.innertube.requests.relatedPage
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.ShimmerHost
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.items.AlbumItem
import it.vfsfitvnm.vimusic.ui.items.AlbumItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.ArtistItem
import it.vfsfitvnm.vimusic.ui.items.ArtistItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.PlaylistItem
import it.vfsfitvnm.vimusic.ui.items.PlaylistItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.SnapLayoutInfoProvider
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.isLandscape
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.hamy.compose.persist.persist
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.NavigationEndpoint
import it.hamy.innertube.models.bodies.NextBody
import it.hamy.innertube.requests.relatedPage
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Song
import it.hamy.muza.query
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.ShimmerHost
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.items.AlbumItem
import it.hamy.muza.ui.items.AlbumItemPlaceholder
import it.hamy.muza.ui.items.ArtistItem
import it.hamy.muza.ui.items.ArtistItemPlaceholder
import it.hamy.muza.ui.items.PlaylistItem
import it.hamy.muza.ui.items.PlaylistItemPlaceholder
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.SnapLayoutInfoProvider
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.center
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.isLandscape
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import kotlinx.coroutines.flow.distinctUntilChanged
@ExperimentalFoundationApi
@@ -152,7 +152,7 @@ fun QuickPicks(
)
) {
Header(
title = "Quick picks",
title = "Обзор",
modifier = Modifier
.padding(endPaddingValues)
)
@@ -248,7 +248,7 @@ fun QuickPicks(
related.albums?.let { albums ->
BasicText(
text = "Related albums",
text = "Похожие альбомы",
style = typography.m.semiBold,
modifier = sectionTextModifier
)
@@ -272,7 +272,7 @@ fun QuickPicks(
related.artists?.let { artists ->
BasicText(
text = "Similar artists",
text = "Похожие исполнители",
style = typography.m.semiBold,
modifier = sectionTextModifier
)
@@ -296,7 +296,7 @@ fun QuickPicks(
related.playlists?.let { playlists ->
BasicText(
text = "Playlists you might like",
text = "Плейлисты, которые вам понравятся",
style = typography.m.semiBold,
modifier = Modifier
.padding(horizontal = 16.dp)
@@ -323,7 +323,7 @@ fun QuickPicks(
Unit
} ?: relatedPageResult?.exceptionOrNull()?.let {
BasicText(
text = "An error has occurred",
text = "Упс, тут какая-то ошЫбочка...",
style = typography.s.secondary.center,
modifier = Modifier
.align(Alignment.CenterHorizontally)

View File

@@ -1,14 +1,14 @@
package it.vfsfitvnm.vimusic.ui.screens.localplaylist
package it.hamy.muza.ui.screens.localplaylist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.R
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.screens.globalRoutes
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -28,7 +28,7 @@ fun LocalPlaylistScreen(playlistId: Long) {
tabIndex = 0,
onTabChanged = { },
tabColumnContent = { Item ->
Item(0, "Songs", R.drawable.musical_notes)
Item(0, "Песни", R.drawable.musical_notes)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(currentTabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.localplaylist
package it.hamy.muza.ui.screens.localplaylist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -23,44 +23,44 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
import it.vfsfitvnm.innertube.requests.playlistPage
import it.vfsfitvnm.compose.reordering.ReorderingLazyColumn
import it.vfsfitvnm.compose.reordering.animateItemPlacement
import it.vfsfitvnm.compose.reordering.draggedItem
import it.vfsfitvnm.compose.reordering.rememberReorderingState
import it.vfsfitvnm.compose.reordering.reorder
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.PlaylistWithSongs
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.models.SongPlaylistMap
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.transaction
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.ConfirmationDialog
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.components.themed.IconButton
import it.vfsfitvnm.vimusic.ui.components.themed.InPlaylistMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.Menu
import it.vfsfitvnm.vimusic.ui.components.themed.MenuEntry
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.components.themed.TextFieldDialog
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.completed
import it.vfsfitvnm.vimusic.utils.enqueue
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.forcePlayFromBeginning
import it.hamy.compose.persist.persist
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.BrowseBody
import it.hamy.innertube.requests.playlistPage
import it.hamy.compose.reordering.ReorderingLazyColumn
import it.hamy.compose.reordering.animateItemPlacement
import it.hamy.compose.reordering.draggedItem
import it.hamy.compose.reordering.rememberReorderingState
import it.hamy.compose.reordering.reorder
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.PlaylistWithSongs
import it.hamy.muza.models.Song
import it.hamy.muza.models.SongPlaylistMap
import it.hamy.muza.query
import it.hamy.muza.transaction
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.ConfirmationDialog
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.components.themed.IconButton
import it.hamy.muza.ui.components.themed.InPlaylistMediaItemMenu
import it.hamy.muza.ui.components.themed.Menu
import it.hamy.muza.ui.components.themed.MenuEntry
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.components.themed.TextFieldDialog
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.completed
import it.hamy.muza.utils.enqueue
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.forcePlayFromBeginning
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.runBlocking
@@ -102,7 +102,7 @@ fun LocalPlaylistSongs(
if (isRenaming) {
TextFieldDialog(
hintText = "Enter the playlist name",
hintText = "Введите название плейлиста",
initialTextInput = playlistWithSongs?.playlist?.name ?: "",
onDismiss = { isRenaming = false },
onDone = { text ->
@@ -119,7 +119,7 @@ fun LocalPlaylistSongs(
if (isDeleting) {
ConfirmationDialog(
text = "Do you really want to delete this playlist?",
text = "Вы реально хотите удалить этот плейлист?",
onDismiss = { isDeleting = false },
onConfirm = {
query {
@@ -149,7 +149,7 @@ fun LocalPlaylistSongs(
contentType = 0
) {
Header(
title = playlistWithSongs?.playlist?.name ?: "Unknown",
title = playlistWithSongs?.playlist?.name ?: "Неизвестный",
modifier = Modifier
.padding(bottom = 8.dp)
) {
@@ -179,7 +179,7 @@ fun LocalPlaylistSongs(
playlistWithSongs?.playlist?.browseId?.let { browseId ->
MenuEntry(
icon = R.drawable.sync,
text = "Sync",
text = "Синхр.",
onClick = {
menuState.hide()
transaction {
@@ -210,7 +210,7 @@ fun LocalPlaylistSongs(
MenuEntry(
icon = R.drawable.pencil,
text = "Rename",
text = "Переименовать",
onClick = {
menuState.hide()
isRenaming = true
@@ -219,7 +219,7 @@ fun LocalPlaylistSongs(
MenuEntry(
icon = R.drawable.trash,
text = "Delete",
text = "Удалить",
onClick = {
menuState.hide()
isDeleting = true

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.animateDp
@@ -35,23 +35,23 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.media3.common.C
import androidx.media3.common.Player
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.SeekBar
import it.vfsfitvnm.vimusic.ui.components.themed.IconButton
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.favoritesIcon
import it.vfsfitvnm.vimusic.utils.bold
import it.vfsfitvnm.vimusic.utils.forceSeekToNext
import it.vfsfitvnm.vimusic.utils.forceSeekToPrevious
import it.vfsfitvnm.vimusic.utils.formatAsDuration
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.trackLoopEnabledKey
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Song
import it.hamy.muza.query
import it.hamy.muza.ui.components.SeekBar
import it.hamy.muza.ui.components.themed.IconButton
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.favoritesIcon
import it.hamy.muza.utils.bold
import it.hamy.muza.utils.forceSeekToNext
import it.hamy.muza.utils.forceSeekToPrevious
import it.hamy.muza.utils.formatAsDuration
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.trackLoopEnabledKey
import kotlinx.coroutines.flow.distinctUntilChanged
@Composable

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import android.app.SearchManager
import android.content.ActivityNotFoundException
@@ -49,32 +49,32 @@ import androidx.compose.ui.unit.dp
import androidx.media3.common.C
import androidx.media3.common.MediaMetadata
import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.NextBody
import it.vfsfitvnm.innertube.requests.lyrics
import it.vfsfitvnm.kugou.KuGou
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Lyrics
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.Menu
import it.vfsfitvnm.vimusic.ui.components.themed.MenuEntry
import it.vfsfitvnm.vimusic.ui.components.themed.TextFieldDialog
import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.DefaultDarkColorPalette
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.PureBlackColorPalette
import it.vfsfitvnm.vimusic.ui.styling.onOverlayShimmer
import it.vfsfitvnm.vimusic.utils.SynchronizedLyrics
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.isShowingSynchronizedLyricsKey
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.toast
import it.vfsfitvnm.vimusic.utils.verticalFadingEdge
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.NextBody
import it.hamy.innertube.requests.lyrics
import it.hamy.kugou.KuGou
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Lyrics
import it.hamy.muza.query
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.Menu
import it.hamy.muza.ui.components.themed.MenuEntry
import it.hamy.muza.ui.components.themed.TextFieldDialog
import it.hamy.muza.ui.components.themed.TextPlaceholder
import it.hamy.muza.ui.styling.DefaultDarkColorPalette
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.PureBlackColorPalette
import it.hamy.muza.ui.styling.onOverlayShimmer
import it.hamy.muza.utils.SynchronizedLyrics
import it.hamy.muza.utils.center
import it.hamy.muza.utils.color
import it.hamy.muza.utils.isShowingSynchronizedLyricsKey
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.toast
import it.hamy.muza.utils.verticalFadingEdge
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
@@ -169,7 +169,7 @@ fun Lyrics(
if (isEditing) {
TextFieldDialog(
hintText = "Enter the lyrics",
hintText = "Введите текст песни",
initialTextInput = text ?: "",
singleLine = false,
maxLines = 10,
@@ -218,7 +218,7 @@ fun Lyrics(
.align(Alignment.TopCenter)
) {
BasicText(
text = "An error has occurred while fetching the ${if (isShowingSynchronizedLyrics) "synchronized " else ""}lyrics",
text = "Произошла ошибка при синхронизации ${if (isShowingSynchronizedLyrics) "синхронизирован " else ""}текст песни",
style = typography.xs.center.medium.color(PureBlackColorPalette.text),
modifier = Modifier
.background(Color.Black.copy(0.4f))
@@ -235,7 +235,7 @@ fun Lyrics(
.align(Alignment.TopCenter)
) {
BasicText(
text = "${if (isShowingSynchronizedLyrics) "Synchronized l" else "L"}yrics are not available for this song",
text = "${if (isShowingSynchronizedLyrics) "Синхронизирован текст" else "Т"}екст песни не доступен",
style = typography.xs.center.medium.color(PureBlackColorPalette.text),
modifier = Modifier
.background(Color.Black.copy(0.4f))
@@ -334,8 +334,8 @@ fun Lyrics(
Menu {
MenuEntry(
icon = R.drawable.time,
text = "Show ${if (isShowingSynchronizedLyrics) "un" else ""}synchronized lyrics",
secondaryText = if (isShowingSynchronizedLyrics) null else "Provided by kugou.com",
text = "Показать ${if (isShowingSynchronizedLyrics) "не" else ""}синхронизированный текст",
secondaryText = if (isShowingSynchronizedLyrics) null else "при помощи kugou.com",
onClick = {
menuState.hide()
isShowingSynchronizedLyrics =
@@ -345,7 +345,7 @@ fun Lyrics(
MenuEntry(
icon = R.drawable.pencil,
text = "Edit lyrics",
text = "Изменить текст песни",
onClick = {
menuState.hide()
isEditing = true
@@ -354,7 +354,7 @@ fun Lyrics(
MenuEntry(
icon = R.drawable.search,
text = "Search lyrics online",
text = "Искать текст в интернете",
onClick = {
menuState.hide()
val mediaMetadata = mediaMetadataProvider()
@@ -364,19 +364,19 @@ fun Lyrics(
Intent(Intent.ACTION_WEB_SEARCH).apply {
putExtra(
SearchManager.QUERY,
"${mediaMetadata.title} ${mediaMetadata.artist} lyrics"
"${mediaMetadata.title} ${mediaMetadata.artist} текст песни"
)
}
)
} catch (e: ActivityNotFoundException) {
context.toast("Couldn't find an application to browse the Internet")
context.toast("На вашем смартфоне не установлен поисковик!")
}
}
)
MenuEntry(
icon = R.drawable.download,
text = "Fetch lyrics again",
text = "Обновить текст песни",
enabled = lyrics != null,
onClick = {
menuState.hide()

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
@@ -20,11 +20,11 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.ui.styling.PureBlackColorPalette
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.medium
import it.hamy.muza.ui.styling.PureBlackColorPalette
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.center
import it.hamy.muza.utils.color
import it.hamy.muza.utils.medium
@Composable
fun PlaybackError(

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import android.content.ActivityNotFoundException
import android.content.Intent
@@ -46,31 +46,31 @@ import androidx.compose.ui.unit.dp
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import coil.compose.AsyncImage
import it.vfsfitvnm.innertube.models.NavigationEndpoint
import it.vfsfitvnm.compose.routing.OnGlobalRoute
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.service.PlayerService
import it.vfsfitvnm.vimusic.ui.components.BottomSheet
import it.vfsfitvnm.vimusic.ui.components.BottomSheetState
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.rememberBottomSheetState
import it.vfsfitvnm.vimusic.ui.components.themed.BaseMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.IconButton
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.collapsedPlayerProgressBar
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.DisposableListener
import it.vfsfitvnm.vimusic.utils.forceSeekToNext
import it.vfsfitvnm.vimusic.utils.isLandscape
import it.vfsfitvnm.vimusic.utils.positionAndDurationState
import it.vfsfitvnm.vimusic.utils.seamlessPlay
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.vfsfitvnm.vimusic.utils.shouldBePlaying
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.vfsfitvnm.vimusic.utils.toast
import it.hamy.innertube.models.NavigationEndpoint
import it.hamy.compose.routing.OnGlobalRoute
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.service.PlayerService
import it.hamy.muza.ui.components.BottomSheet
import it.hamy.muza.ui.components.BottomSheetState
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.rememberBottomSheetState
import it.hamy.muza.ui.components.themed.BaseMediaItemMenu
import it.hamy.muza.ui.components.themed.IconButton
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.collapsedPlayerProgressBar
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.DisposableListener
import it.hamy.muza.utils.forceSeekToNext
import it.hamy.muza.utils.isLandscape
import it.hamy.muza.utils.positionAndDurationState
import it.hamy.muza.utils.seamlessPlay
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
import it.hamy.muza.utils.shouldBePlaying
import it.hamy.muza.utils.thumbnail
import it.hamy.muza.utils.toast
import kotlin.math.absoluteValue
@ExperimentalFoundationApi
@@ -404,7 +404,7 @@ private fun PlayerMenu(
}
)
} catch (e: ActivityNotFoundException) {
context.toast("Couldn't find an application to equalize audio")
context.toast("На вашем смартфоне не найдено эквалайзера")
}
},
onShowSleepTimer = {},

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentScope
@@ -53,34 +53,34 @@ import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.common.Timeline
import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.compose.reordering.ReorderingLazyColumn
import it.vfsfitvnm.compose.reordering.animateItemPlacement
import it.vfsfitvnm.compose.reordering.draggedItem
import it.vfsfitvnm.compose.reordering.rememberReorderingState
import it.vfsfitvnm.compose.reordering.reorder
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.BottomSheet
import it.vfsfitvnm.vimusic.ui.components.BottomSheetState
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.MusicBars
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.IconButton
import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.onOverlay
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.DisposableListener
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.queueLoopEnabledKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.shouldBePlaying
import it.vfsfitvnm.vimusic.utils.shuffleQueue
import it.vfsfitvnm.vimusic.utils.smoothScrollToTop
import it.vfsfitvnm.vimusic.utils.windows
import it.hamy.compose.reordering.ReorderingLazyColumn
import it.hamy.compose.reordering.animateItemPlacement
import it.hamy.compose.reordering.draggedItem
import it.hamy.compose.reordering.rememberReorderingState
import it.hamy.compose.reordering.reorder
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.ui.components.BottomSheet
import it.hamy.muza.ui.components.BottomSheetState
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.MusicBars
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.IconButton
import it.hamy.muza.ui.components.themed.QueuedMediaItemMenu
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.onOverlay
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.DisposableListener
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.queueLoopEnabledKey
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.shouldBePlaying
import it.hamy.muza.utils.shuffleQueue
import it.hamy.muza.utils.smoothScrollToTop
import it.hamy.muza.utils.windows
import kotlinx.coroutines.launch
@ExperimentalFoundationApi
@@ -331,7 +331,7 @@ fun Queue(
.height(64.dp)
) {
BasicText(
text = "${windows.size} songs",
text = "${windows.size} песни",
style = typography.xxs.medium,
modifier = Modifier
.background(
@@ -361,7 +361,7 @@ fun Queue(
.animateContentSize()
) {
BasicText(
text = "Queue loop ",
text = "Повтор очереди ",
style = typography.xxs.medium,
)
@@ -377,7 +377,7 @@ fun Queue(
}
) {
BasicText(
text = if (it) "on" else "off",
text = if (it) "ВКЛ." else "ВЫКЛ.",
style = typography.xxs.medium,
)
}

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import android.text.format.Formatter
import androidx.compose.animation.AnimatedVisibility
@@ -27,17 +27,17 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.media3.datasource.cache.Cache
import androidx.media3.datasource.cache.CacheSpan
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.PlayerBody
import it.vfsfitvnm.innertube.requests.player
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.models.Format
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.onOverlay
import it.vfsfitvnm.vimusic.ui.styling.overlay
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.medium
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.PlayerBody
import it.hamy.innertube.requests.player
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.models.Format
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.onOverlay
import it.hamy.muza.ui.styling.overlay
import it.hamy.muza.utils.color
import it.hamy.muza.utils.medium
import kotlin.math.roundToInt
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.player
package it.hamy.muza.ui.screens.player
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentScope
@@ -30,18 +30,18 @@ import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import coil.compose.AsyncImage
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.service.LoginRequiredException
import it.vfsfitvnm.vimusic.service.PlayableFormatNotFoundException
import it.vfsfitvnm.vimusic.service.UnplayableException
import it.vfsfitvnm.vimusic.service.VideoIdMismatchException
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.currentWindow
import it.vfsfitvnm.vimusic.utils.DisposableListener
import it.vfsfitvnm.vimusic.utils.thumbnail
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.service.LoginRequiredException
import it.hamy.muza.service.PlayableFormatNotFoundException
import it.hamy.muza.service.UnplayableException
import it.hamy.muza.service.VideoIdMismatchException
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.currentWindow
import it.hamy.muza.utils.DisposableListener
import it.hamy.muza.utils.thumbnail
import java.net.UnknownHostException
import java.nio.channels.UnresolvedAddressException

View File

@@ -1,14 +1,14 @@
package it.vfsfitvnm.vimusic.ui.screens.playlist
package it.hamy.muza.ui.screens.playlist
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.R
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.screens.globalRoutes
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -27,7 +27,7 @@ fun PlaylistScreen(browseId: String) {
tabIndex = 0,
onTabChanged = { },
tabColumnContent = { Item ->
Item(0, "Songs", R.drawable.musical_notes)
Item(0, "Песни", R.drawable.musical_notes)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(key = currentTabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.playlist
package it.hamy.muza.ui.screens.playlist
import android.content.Intent
import androidx.compose.animation.ExperimentalAnimationApi
@@ -25,40 +25,40 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.valentinilk.shimmer.shimmer
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.BrowseBody
import it.vfsfitvnm.innertube.requests.playlistPage
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.Playlist
import it.vfsfitvnm.vimusic.models.SongPlaylistMap
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.transaction
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.ShimmerHost
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderIconButton
import it.vfsfitvnm.vimusic.ui.components.themed.HeaderPlaceholder
import it.vfsfitvnm.vimusic.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.components.themed.TextFieldDialog
import it.vfsfitvnm.vimusic.ui.components.themed.adaptiveThumbnailContent
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.completed
import it.vfsfitvnm.vimusic.utils.enqueue
import it.vfsfitvnm.vimusic.utils.forcePlayAtIndex
import it.vfsfitvnm.vimusic.utils.forcePlayFromBeginning
import it.vfsfitvnm.vimusic.utils.isLandscape
import it.hamy.compose.persist.persist
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.BrowseBody
import it.hamy.innertube.requests.playlistPage
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.models.Playlist
import it.hamy.muza.models.SongPlaylistMap
import it.hamy.muza.query
import it.hamy.muza.transaction
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.ShimmerHost
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.HeaderIconButton
import it.hamy.muza.ui.components.themed.HeaderPlaceholder
import it.hamy.muza.ui.components.themed.LayoutWithAdaptiveThumbnail
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.components.themed.TextFieldDialog
import it.hamy.muza.ui.components.themed.adaptiveThumbnailContent
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.completed
import it.hamy.muza.utils.enqueue
import it.hamy.muza.utils.forcePlayAtIndex
import it.hamy.muza.utils.forcePlayFromBeginning
import it.hamy.muza.utils.isLandscape
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -92,7 +92,7 @@ fun PlaylistSongList(
if (isImportingPlaylist) {
TextFieldDialog(
hintText = "Enter the playlist name",
hintText = "Введите название плейлиста",
initialTextInput = playlistPage?.title ?: "",
onDismiss = { isImportingPlaylist = false },
onDone = { text ->
@@ -123,9 +123,9 @@ fun PlaylistSongList(
.shimmer()
)
} else {
Header(title = playlistPage?.title ?: "Unknown") {
Header(title = playlistPage?.title ?: "Неизвестный") {
SecondaryTextButton(
text = "Enqueue",
text = "В очередь",
enabled = playlistPage?.songsPage?.items?.isNotEmpty() == true,
onClick = {
playlistPage?.songsPage?.items?.map(Innertube.SongItem::asMediaItem)?.let { mediaItems ->

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.search
package it.hamy.muza.ui.screens.search
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -22,25 +22,25 @@ import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.innertube.models.NavigationEndpoint
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.models.Song
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.InHistoryMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.align
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.medium
import it.hamy.compose.persist.persistList
import it.hamy.innertube.models.NavigationEndpoint
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.models.Song
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.InHistoryMediaItemMenu
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.align
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.medium
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -95,7 +95,7 @@ fun LocalSongSearch(
actionsContent = {
if (textFieldValue.text.isNotEmpty()) {
SecondaryTextButton(
text = "Clear",
text = "Очистить",
onClick = { onTextFieldValueChanged(TextFieldValue()) }
)
}

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.search
package it.hamy.muza.ui.screens.search
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.Image
@@ -43,26 +43,26 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.core.net.toUri
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.compose.persist.persistList
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.SearchSuggestionsBody
import it.vfsfitvnm.innertube.requests.searchSuggestions
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.SearchQuery
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.SecondaryTextButton
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.align
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.medium
import it.vfsfitvnm.vimusic.utils.pauseSearchHistoryKey
import it.vfsfitvnm.vimusic.utils.preferences
import it.vfsfitvnm.vimusic.utils.secondary
import it.hamy.compose.persist.persist
import it.hamy.compose.persist.persistList
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.SearchSuggestionsBody
import it.hamy.innertube.requests.searchSuggestions
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.R
import it.hamy.muza.models.SearchQuery
import it.hamy.muza.query
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.SecondaryTextButton
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.align
import it.hamy.muza.utils.center
import it.hamy.muza.utils.medium
import it.hamy.muza.utils.pauseSearchHistoryKey
import it.hamy.muza.utils.preferences
import it.hamy.muza.utils.secondary
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -160,7 +160,7 @@ fun OnlineSearch(
val isAlbum = playlistId.startsWith("OLAK5uy_")
SecondaryTextButton(
text = "View ${if (isAlbum) "album" else "playlist"}",
text = "Посмотреть ${if (isAlbum) "альбом" else "плейлист"}",
onClick = { onViewPlaylist(textFieldValue.text) }
)
}
@@ -172,7 +172,7 @@ fun OnlineSearch(
if (textFieldValue.text.isNotEmpty()) {
SecondaryTextButton(
text = "Clear",
text = "Очистить",
onClick = { onTextFieldValueChanged(TextFieldValue()) }
)
}

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.search
package it.hamy.muza.ui.screens.search
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi
@@ -16,13 +16,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.secondary
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.R
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.screens.globalRoutes
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.secondary
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -66,7 +66,7 @@ fun SearchScreen(
.align(Alignment.CenterEnd)
) {
BasicText(
text = "Enter a name",
text = "Найти...",
maxLines = 1,
style = LocalAppearance.current.typography.xxl.secondary
)
@@ -82,8 +82,8 @@ fun SearchScreen(
tabIndex = tabIndex,
onTabChanged = onTabChanged,
tabColumnContent = { Item ->
Item(0, "Online", R.drawable.globe)
Item(1, "Library", R.drawable.library)
Item(0, "Онлайн", R.drawable.globe)
Item(1, "Библиотека", R.drawable.library)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(currentTabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.searchresult
package it.hamy.muza.ui.screens.searchresult
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.Box
@@ -21,15 +21,15 @@ import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.persist
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.utils.plus
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.ui.components.ShimmerHost
import it.vfsfitvnm.vimusic.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.center
import it.vfsfitvnm.vimusic.utils.secondary
import it.hamy.compose.persist.persist
import it.hamy.innertube.Innertube
import it.hamy.innertube.utils.plus
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.ui.components.ShimmerHost
import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.center
import it.hamy.muza.utils.secondary
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -43,7 +43,7 @@ inline fun <T : Innertube.Item> ItemsPage(
modifier: Modifier = Modifier,
initialPlaceholderCount: Int = 8,
continuationPlaceholderCount: Int = 3,
emptyItemsText: String = "No items found",
emptyItemsText: String = "Ничего не нашлось",
noinline itemsPageProvider: (suspend (String?) -> Result<Innertube.ItemsPage<T>?>?)? = null,
) {
val (_, typography) = LocalAppearance.current

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.searchresult
package it.hamy.muza.ui.screens.searchresult
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -11,40 +11,40 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.persist.PersistMapCleanup
import it.vfsfitvnm.compose.persist.persistMap
import it.vfsfitvnm.innertube.Innertube
import it.vfsfitvnm.innertube.models.bodies.ContinuationBody
import it.vfsfitvnm.innertube.models.bodies.SearchBody
import it.vfsfitvnm.innertube.requests.searchPage
import it.vfsfitvnm.innertube.utils.from
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.items.AlbumItem
import it.vfsfitvnm.vimusic.ui.items.AlbumItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.ArtistItem
import it.vfsfitvnm.vimusic.ui.items.ArtistItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.PlaylistItem
import it.vfsfitvnm.vimusic.ui.items.PlaylistItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.SongItem
import it.vfsfitvnm.vimusic.ui.items.SongItemPlaceholder
import it.vfsfitvnm.vimusic.ui.items.VideoItem
import it.vfsfitvnm.vimusic.ui.items.VideoItemPlaceholder
import it.vfsfitvnm.vimusic.ui.screens.albumRoute
import it.vfsfitvnm.vimusic.ui.screens.artistRoute
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.vfsfitvnm.vimusic.ui.screens.playlistRoute
import it.vfsfitvnm.vimusic.ui.styling.Dimensions
import it.vfsfitvnm.vimusic.ui.styling.px
import it.vfsfitvnm.vimusic.utils.asMediaItem
import it.vfsfitvnm.vimusic.utils.forcePlay
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.searchResultScreenTabIndexKey
import it.hamy.compose.persist.PersistMapCleanup
import it.hamy.compose.persist.persistMap
import it.hamy.innertube.Innertube
import it.hamy.innertube.models.bodies.ContinuationBody
import it.hamy.innertube.models.bodies.SearchBody
import it.hamy.innertube.requests.searchPage
import it.hamy.innertube.utils.from
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.R
import it.hamy.muza.ui.components.LocalMenuState
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.components.themed.NonQueuedMediaItemMenu
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.items.AlbumItem
import it.hamy.muza.ui.items.AlbumItemPlaceholder
import it.hamy.muza.ui.items.ArtistItem
import it.hamy.muza.ui.items.ArtistItemPlaceholder
import it.hamy.muza.ui.items.PlaylistItem
import it.hamy.muza.ui.items.PlaylistItemPlaceholder
import it.hamy.muza.ui.items.SongItem
import it.hamy.muza.ui.items.SongItemPlaceholder
import it.hamy.muza.ui.items.VideoItem
import it.hamy.muza.ui.items.VideoItemPlaceholder
import it.hamy.muza.ui.screens.albumRoute
import it.hamy.muza.ui.screens.artistRoute
import it.hamy.muza.ui.screens.globalRoutes
import it.hamy.muza.ui.screens.playlistRoute
import it.hamy.muza.ui.styling.Dimensions
import it.hamy.muza.ui.styling.px
import it.hamy.muza.utils.asMediaItem
import it.hamy.muza.utils.forcePlay
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.searchResultScreenTabIndexKey
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -75,7 +75,7 @@ fun SearchResultScreen(query: String, onSearchAgain: () -> Unit) {
)
}
val emptyItemsText = "No results found. Please try a different query or category"
val emptyItemsText = "Ничего не нашлось"
Scaffold(
topIconButtonId = R.drawable.chevron_back,
@@ -83,12 +83,12 @@ fun SearchResultScreen(query: String, onSearchAgain: () -> Unit) {
tabIndex = tabIndex,
onTabChanged = onTabIndexChanges,
tabColumnContent = { Item ->
Item(0, "Songs", R.drawable.musical_notes)
Item(1, "Albums", R.drawable.disc)
Item(2, "Artists", R.drawable.person)
Item(3, "Videos", R.drawable.film)
Item(4, "Playlists", R.drawable.playlist)
Item(5, "Featured", R.drawable.playlist)
Item(0, "Песни", R.drawable.musical_notes)
Item(1, "Альбомы", R.drawable.disc)
Item(2, "Исполнители", R.drawable.person)
Item(3, "Видео", R.drawable.film)
Item(4, "Плейлисты", R.drawable.playlist)
Item(5, "Рекомендации", R.drawable.playlist)
}
) { tabIndex ->
saveableStateHolder.SaveableStateProvider(tabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.background
@@ -14,11 +14,11 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler
import it.vfsfitvnm.vimusic.BuildConfig
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.secondary
import it.hamy.muza.BuildConfig
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.secondary
@ExperimentalAnimationApi
@Composable
@@ -37,40 +37,40 @@ fun About() {
.asPaddingValues()
)
) {
Header(title = "About") {
Header(title = "Информация") {
BasicText(
text = "v${BuildConfig.VERSION_NAME} by vfsfitvnm",
text = "v${BuildConfig.VERSION_NAME} by Hamy",
style = typography.s.secondary
)
}
SettingsEntryGroupText(title = "SOCIAL")
SettingsEntryGroupText(title = "СОЦИАЛЬНОЕ")
SettingsEntry(
title = "GitHub",
text = "View the source code",
text = "Посмотреть исходный код",
onClick = {
uriHandler.openUri("https://github.com/vfsfitvnm/ViMusic")
uriHandler.openUri("https://github.com/hammsterr/muza")
}
)
SettingsEntry(
title = "Новости",
text = "Следите за новостями в группе ВКонтакте",
onClick = {
uriHandler.openUri("https://vk.com/hamyack")
}
)
SettingsGroupSpacer()
SettingsEntryGroupText(title = "TROUBLESHOOTING")
SettingsEntryGroupText(title = "ДИАГНОСТИКА")
SettingsEntry(
title = "Report an issue",
text = "You will be redirected to GitHub",
title = "Тех. поддержка",
text = "Сообщайте об ошибках или пожеланиях",
onClick = {
uriHandler.openUri("https://github.com/vfsfitvnm/ViMusic/issues/new?assignees=&labels=bug&template=bug_report.yaml")
}
)
SettingsEntry(
title = "Request a feature or suggest an idea",
text = "You will be redirected to GitHub",
onClick = {
uriHandler.openUri("https://github.com/vfsfitvnm/ViMusic/issues/new?assignees=&labels=enhancement&template=feature_request.yaml")
uriHandler.openUri("https://hamyack.pages.dev")
}
)
}

View File

@@ -1,5 +1,8 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import android.app.AlertDialog
import android.content.ComponentName
import android.content.pm.PackageManager
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.border
@@ -18,20 +21,23 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.enums.ColorPaletteMode
import it.vfsfitvnm.vimusic.enums.ColorPaletteName
import it.vfsfitvnm.vimusic.enums.ThumbnailRoundness
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.applyFontPaddingKey
import it.vfsfitvnm.vimusic.utils.colorPaletteModeKey
import it.vfsfitvnm.vimusic.utils.colorPaletteNameKey
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid13
import it.vfsfitvnm.vimusic.utils.isShowingThumbnailInLockscreenKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.thumbnailRoundnessKey
import it.vfsfitvnm.vimusic.utils.useSystemFontKey
import androidx.core.content.ContextCompat
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.enums.ColorPaletteMode
import it.hamy.muza.enums.ColorPaletteName
import it.hamy.muza.enums.ThumbnailRoundness
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.applyFontPaddingKey
import it.hamy.muza.utils.colorPaletteModeKey
import it.hamy.muza.utils.colorPaletteNameKey
import it.hamy.muza.utils.isAtLeastAndroid13
import it.hamy.muza.utils.isShowingThumbnailInLockscreenKey
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.thumbnailRoundnessKey
import it.hamy.muza.utils.useSystemFontKey
import it.hamy.muza.*
@ExperimentalAnimationApi
@Composable
@@ -49,6 +55,7 @@ fun AppearanceSettings() {
var isShowingThumbnailInLockscreen by rememberPreference(
isShowingThumbnailInLockscreenKey,
false
)
Column(
@@ -62,18 +69,18 @@ fun AppearanceSettings() {
.asPaddingValues()
)
) {
Header(title = "Appearance")
Header(title = "Внешний Вид")
SettingsEntryGroupText(title = "COLORS")
SettingsEntryGroupText(title = "ЦВЕТА")
EnumValueSelectorSettingsEntry(
title = "Theme",
title = "Цвет темы",
selectedValue = colorPaletteName,
onValueSelected = { colorPaletteName = it }
)
EnumValueSelectorSettingsEntry(
title = "Theme mode",
title = "Ночная тема",
selectedValue = colorPaletteMode,
isEnabled = colorPaletteName != ColorPaletteName.PureBlack,
onValueSelected = { colorPaletteMode = it }
@@ -81,17 +88,24 @@ fun AppearanceSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "SHAPES")
SettingsEntryGroupText(title = "ФОРМЫ")
EnumValueSelectorSettingsEntry(
title = "Thumbnail roundness",
title = "Скругление",
selectedValue = thumbnailRoundness,
onValueSelected = { thumbnailRoundness = it },
trailingContent = {
Spacer(
modifier = Modifier
.border(width = 1.dp, color = colorPalette.accent, shape = thumbnailRoundness.shape())
.background(color = colorPalette.background1, shape = thumbnailRoundness.shape())
.border(
width = 1.dp,
color = colorPalette.accent,
shape = thumbnailRoundness.shape()
)
.background(
color = colorPalette.background1,
shape = thumbnailRoundness.shape()
)
.size(36.dp)
)
}
@@ -99,18 +113,18 @@ fun AppearanceSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "TEXT")
SettingsEntryGroupText(title = "ТЕКСТ")
SwitchSettingEntry(
title = "Use system font",
text = "Use the font applied by the system",
title = "Системный шрифт",
text = "Использовать системный шрифт",
isChecked = useSystemFont,
onCheckedChange = { useSystemFont = it }
)
SwitchSettingEntry(
title = "Apply font padding",
text = "Add spacing around texts",
title = "Заполнение шрифта",
text = "Увеличить пробелы текста",
isChecked = applyFontPadding,
onCheckedChange = { applyFontPadding = it }
)
@@ -118,14 +132,16 @@ fun AppearanceSettings() {
if (!isAtLeastAndroid13) {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "LOCKSCREEN")
SettingsEntryGroupText(title = "ЭКРАН БЛОКИРОВКИ")
SwitchSettingEntry(
title = "Show song cover",
text = "Use the playing song cover as the lockscreen wallpaper",
title = "Показывать обложку",
text = "Использовать обложку в качестве обоев экрана блокировки",
isChecked = isShowingThumbnailInLockscreen,
onCheckedChange = { isShowingThumbnailInLockscreen = it }
)
}
}
}

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import android.text.format.Formatter
import androidx.compose.animation.ExperimentalAnimationApi
@@ -20,15 +20,15 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import coil.Coil
import coil.annotation.ExperimentalCoilApi
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.enums.CoilDiskCacheMaxSize
import it.vfsfitvnm.vimusic.enums.ExoPlayerDiskCacheMaxSize
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.coilDiskCacheMaxSizeKey
import it.vfsfitvnm.vimusic.utils.exoPlayerDiskCacheMaxSizeKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.enums.CoilDiskCacheMaxSize
import it.hamy.muza.enums.ExoPlayerDiskCacheMaxSize
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.coilDiskCacheMaxSizeKey
import it.hamy.muza.utils.exoPlayerDiskCacheMaxSizeKey
import it.hamy.muza.utils.rememberPreference
@OptIn(ExperimentalCoilApi::class)
@ExperimentalAnimationApi
@@ -58,9 +58,9 @@ fun CacheSettings() {
.asPaddingValues()
)
) {
Header(title = "Cache")
Header(title = "Кэш")
SettingsDescription(text = "When the cache runs out of space, the resources that haven't been accessed for the longest time are cleared")
SettingsDescription(text = "Когда в кэше заканчивается свободное место, очищаются ресурсы, которые давно не используются.")
Coil.imageLoader(context).diskCache?.let { diskCache ->
val diskCacheSize = remember(diskCache) {
@@ -69,7 +69,7 @@ fun CacheSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "IMAGE CACHE")
SettingsEntryGroupText(title = "КЭШ КАРТИНОК")
SettingsDescription(
text = "${
@@ -77,11 +77,11 @@ fun CacheSettings() {
context,
diskCacheSize
)
} used (${diskCacheSize * 100 / coilDiskCacheMaxSize.bytes.coerceAtLeast(1)}%)"
} использовано (${diskCacheSize * 100 / coilDiskCacheMaxSize.bytes.coerceAtLeast(1)}%)"
)
EnumValueSelectorSettingsEntry(
title = "Max size",
title = "Максимальный размер",
selectedValue = coilDiskCacheMaxSize,
onValueSelected = { coilDiskCacheMaxSize = it }
)
@@ -96,12 +96,12 @@ fun CacheSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "SONG CACHE")
SettingsEntryGroupText(title = "КЭШ ПЕСЕН")
SettingsDescription(
text = buildString {
append(Formatter.formatShortFileSize(context, diskCacheSize))
append(" used")
append(" использовано")
when (val size = exoPlayerDiskCacheMaxSize) {
ExoPlayerDiskCacheMaxSize.Unlimited -> {}
else -> append(" (${diskCacheSize * 100 / size.bytes}%)")
@@ -110,7 +110,7 @@ fun CacheSettings() {
)
EnumValueSelectorSettingsEntry(
title = "Max size",
title = "Максимальный размер",
selectedValue = exoPlayerDiskCacheMaxSize,
onValueSelected = { exoPlayerDiskCacheMaxSize = it }
)

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
@@ -20,16 +20,16 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.internal
import it.vfsfitvnm.vimusic.path
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.service.PlayerService
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.intent
import it.vfsfitvnm.vimusic.utils.toast
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.internal
import it.hamy.muza.path
import it.hamy.muza.query
import it.hamy.muza.service.PlayerService
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.intent
import it.hamy.muza.utils.toast
import java.io.FileInputStream
import java.io.FileOutputStream
import java.text.SimpleDateFormat
@@ -94,16 +94,16 @@ fun DatabaseSettings() {
.asPaddingValues()
)
) {
Header(title = "Database")
Header(title = "Данные")
SettingsEntryGroupText(title = "CLEANUP")
SettingsEntryGroupText(title = "ОЧИСТИТЬ")
SettingsEntry(
title = "Reset quick picks",
title = "Очистить воспроизведения",
text = if (eventsCount > 0) {
"Delete $eventsCount playback events"
"Удалить $eventsCount событий воспроизведения"
} else {
"Quick picks are cleared"
"Воспроизведения были удалены!"
},
isEnabled = eventsCount > 0,
onClick = { query(Database::clearEvents) }
@@ -111,34 +111,34 @@ fun DatabaseSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "BACKUP")
SettingsEntryGroupText(title = "БЭКАП")
SettingsDescription(text = "Personal preferences (i.e. the theme mode) and the cache are excluded.")
SettingsDescription(text = "Личные настройки (ночная тема и т.д.) и кэш исключаются")
SettingsEntry(
title = "Backup",
text = "Export the database to the external storage",
title = "Бэкап",
text = "Экспорт данных в локальное хранилище",
onClick = {
@SuppressLint("SimpleDateFormat")
val dateFormat = SimpleDateFormat("yyyyMMddHHmmss")
try {
backupLauncher.launch("vimusic_${dateFormat.format(Date())}.db")
backupLauncher.launch("muza_${dateFormat.format(Date())}.db")
} catch (e: ActivityNotFoundException) {
context.toast("Couldn't find an application to create documents")
context.toast("не найдено приложения для создания документов")
}
}
)
SettingsGroupSpacer()
SettingsEntryGroupText(title = "RESTORE")
SettingsEntryGroupText(title = "ВОССТАНОВЛЕНИЕ")
ImportantSettingsDescription(text = "Existing data will be overwritten.\n${context.applicationInfo.nonLocalizedLabel} will automatically close itself after restoring the database.")
ImportantSettingsDescription(text = "Существующие настройки будут перезаписаны.\n${context.applicationInfo.nonLocalizedLabel} Будет перезапушена.")
SettingsEntry(
title = "Restore",
text = "Import the database from the external storage",
title = "Восстановить",
text = "импорт данных из локального хранилища",
onClick = {
try {
restoreLauncher.launch(
@@ -149,7 +149,7 @@ fun DatabaseSettings() {
)
)
} catch (e: ActivityNotFoundException) {
context.toast("Couldn't find an application to open documents")
context.toast("не найдено приложения для открытия документов")
}
}
)

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
@@ -28,19 +28,19 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import it.vfsfitvnm.vimusic.Database
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.query
import it.vfsfitvnm.vimusic.service.PlayerMediaBrowserService
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid12
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid6
import it.vfsfitvnm.vimusic.utils.isIgnoringBatteryOptimizations
import it.vfsfitvnm.vimusic.utils.isInvincibilityEnabledKey
import it.vfsfitvnm.vimusic.utils.pauseSearchHistoryKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.toast
import it.hamy.muza.Database
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.query
import it.hamy.muza.service.PlayerMediaBrowserService
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.isAtLeastAndroid12
import it.hamy.muza.utils.isAtLeastAndroid6
import it.hamy.muza.utils.isIgnoringBatteryOptimizations
import it.hamy.muza.utils.isInvincibilityEnabledKey
import it.hamy.muza.utils.pauseSearchHistoryKey
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.toast
import kotlinx.coroutines.flow.distinctUntilChanged
@SuppressLint("BatteryLife")
@@ -98,36 +98,36 @@ fun OtherSettings() {
.asPaddingValues()
)
) {
Header(title = "Other")
Header(title = "Другое")
SettingsEntryGroupText(title = "ANDROID AUTO")
SettingsEntryGroupText(title = "АНДРОИД АВТО")
SettingsDescription(text = "Remember to enable \"Unknown sources\" in the Developer Settings of Android Auto.")
SettingsDescription(text = "Включите опцию \"неизвестные источники\" в настройках разработчика в Андроид Авто.")
SwitchSettingEntry(
title = "Android Auto",
text = "Enable Android Auto support",
text = "Включить поддержку Андроид Авто",
isChecked = isAndroidAutoEnabled,
onCheckedChange = { isAndroidAutoEnabled = it }
)
SettingsGroupSpacer()
SettingsEntryGroupText(title = "SEARCH HISTORY")
SettingsEntryGroupText(title = "ИСТОРИЯ ПОИСКА")
SwitchSettingEntry(
title = "Pause search history",
text = "Neither save new searched queries nor show history",
title = "Приостановить историю",
text = "Не сохранять историю поиска",
isChecked = pauseSearchHistory,
onCheckedChange = { pauseSearchHistory = it }
)
SettingsEntry(
title = "Clear search history",
title = "Очистить историю поиска",
text = if (queriesCount > 0) {
"Delete $queriesCount search queries"
"Удалить $queriesCount поисковых запросов"
} else {
"History is empty"
"История чиста"
},
isEnabled = queriesCount > 0,
onClick = { query(Database::clearQueries) }
@@ -135,21 +135,21 @@ fun OtherSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "SERVICE LIFETIME")
SettingsEntryGroupText(title = "ОПТИМИЗАЦИЯ БАТАРЕИ")
ImportantSettingsDescription(text = "If battery optimizations are applied, the playback notification can suddenly disappear when paused.")
ImportantSettingsDescription(text = "Если включена экономия батареи, воспроизведение может внезапно остановиться!")
if (isAtLeastAndroid12) {
SettingsDescription(text = "Since Android 12, disabling battery optimizations is required for the \"Invincible service\" option to take effect.")
SettingsDescription(text = "Android 12+: Обязательно отключите экономию батареи, прежде чем включать опцию \"Invincible service\"!")
}
SettingsEntry(
title = "Ignore battery optimizations",
title = "Игнор. экономии батареи ",
isEnabled = !isIgnoringBatteryOptimizations,
text = if (isIgnoringBatteryOptimizations) {
"Already unrestricted"
"Уже игнорируется"
} else {
"Disable background restrictions"
"Отключить остановку приложения в фоне"
},
onClick = {
if (!isAtLeastAndroid6) return@SettingsEntry
@@ -166,7 +166,7 @@ fun OtherSettings() {
Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
)
} catch (e: ActivityNotFoundException) {
context.toast("Couldn't find battery optimization settings, please whitelist ViMusic manually")
context.toast("не найдено настроек батареи! Добавьте приложение в белый список вручную")
}
}
}

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import android.content.ActivityNotFoundException
import android.content.Intent
@@ -20,17 +20,17 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import it.vfsfitvnm.vimusic.LocalPlayerAwareWindowInsets
import it.vfsfitvnm.vimusic.LocalPlayerServiceBinder
import it.vfsfitvnm.vimusic.ui.components.themed.Header
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.isAtLeastAndroid6
import it.vfsfitvnm.vimusic.utils.persistentQueueKey
import it.vfsfitvnm.vimusic.utils.rememberPreference
import it.vfsfitvnm.vimusic.utils.resumePlaybackWhenDeviceConnectedKey
import it.vfsfitvnm.vimusic.utils.skipSilenceKey
import it.vfsfitvnm.vimusic.utils.toast
import it.vfsfitvnm.vimusic.utils.volumeNormalizationKey
import it.hamy.muza.LocalPlayerAwareWindowInsets
import it.hamy.muza.LocalPlayerServiceBinder
import it.hamy.muza.ui.components.themed.Header
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.isAtLeastAndroid6
import it.hamy.muza.utils.persistentQueueKey
import it.hamy.muza.utils.rememberPreference
import it.hamy.muza.utils.resumePlaybackWhenDeviceConnectedKey
import it.hamy.muza.utils.skipSilenceKey
import it.hamy.muza.utils.toast
import it.hamy.muza.utils.volumeNormalizationKey
@ExperimentalAnimationApi
@Composable
@@ -61,13 +61,13 @@ fun PlayerSettings() {
.asPaddingValues()
)
) {
Header(title = "Player & Audio")
Header(title = "Плеер и Аудио")
SettingsEntryGroupText(title = "PLAYER")
SettingsEntryGroupText(title = "Плеер")
SwitchSettingEntry(
title = "Persistent queue",
text = "Save and restore playing songs",
title = "Постоянная очередь",
text = "Сохранение и восстановление воспроизводимых песен",
isChecked = persistentQueue,
onCheckedChange = {
persistentQueue = it
@@ -76,8 +76,8 @@ fun PlayerSettings() {
if (isAtLeastAndroid6) {
SwitchSettingEntry(
title = "Resume playback",
text = "When a wired or bluetooth device is connected",
title = "Возобновление музыки",
text = "При подключении bluetooth устройств",
isChecked = resumePlaybackWhenDeviceConnected,
onCheckedChange = {
resumePlaybackWhenDeviceConnected = it
@@ -87,11 +87,11 @@ fun PlayerSettings() {
SettingsGroupSpacer()
SettingsEntryGroupText(title = "AUDIO")
SettingsEntryGroupText(title = "АУДИО")
SwitchSettingEntry(
title = "Skip silence",
text = "Skip silent parts during playback",
title = "Пропускать тишину",
text = "Пропускать тихие фрагменты песен",
isChecked = skipSilence,
onCheckedChange = {
skipSilence = it
@@ -99,8 +99,8 @@ fun PlayerSettings() {
)
SwitchSettingEntry(
title = "Loudness normalization",
text = "Adjust the volume to a fixed level",
title = "Нормализация звука",
text = "Фиксированный уровень громкости",
isChecked = volumeNormalization,
onCheckedChange = {
volumeNormalization = it
@@ -108,8 +108,8 @@ fun PlayerSettings() {
)
SettingsEntry(
title = "Equalizer",
text = "Interact with the system equalizer",
title = "Эквалайзер",
text = "Открыть системный эквалайзер",
onClick = {
val intent = Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL).apply {
putExtra(AudioEffect.EXTRA_AUDIO_SESSION, binder?.player?.audioSessionId)
@@ -120,7 +120,7 @@ fun PlayerSettings() {
try {
activityResultLauncher.launch(intent)
} catch (e: ActivityNotFoundException) {
context.toast("Couldn't find an application to equalize audio")
context.toast("не найден эквалайзер")
}
}
)

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.screens.settings
package it.hamy.muza.ui.screens.settings
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -22,16 +22,16 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.compose.routing.RouteHandler
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.ui.components.themed.Scaffold
import it.vfsfitvnm.vimusic.ui.components.themed.Switch
import it.vfsfitvnm.vimusic.ui.components.themed.ValueSelectorDialog
import it.vfsfitvnm.vimusic.ui.screens.globalRoutes
import it.vfsfitvnm.vimusic.ui.styling.LocalAppearance
import it.vfsfitvnm.vimusic.utils.color
import it.vfsfitvnm.vimusic.utils.secondary
import it.vfsfitvnm.vimusic.utils.semiBold
import it.hamy.compose.routing.RouteHandler
import it.hamy.muza.R
import it.hamy.muza.ui.components.themed.Scaffold
import it.hamy.muza.ui.components.themed.Switch
import it.hamy.muza.ui.components.themed.ValueSelectorDialog
import it.hamy.muza.ui.screens.globalRoutes
import it.hamy.muza.ui.styling.LocalAppearance
import it.hamy.muza.utils.color
import it.hamy.muza.utils.secondary
import it.hamy.muza.utils.semiBold
@ExperimentalFoundationApi
@ExperimentalAnimationApi
@@ -53,12 +53,12 @@ fun SettingsScreen() {
tabIndex = tabIndex,
onTabChanged = onTabChanged,
tabColumnContent = { Item ->
Item(0, "Appearance", R.drawable.color_palette)
Item(1, "Player", R.drawable.play)
Item(2, "Cache", R.drawable.server)
Item(3, "Database", R.drawable.server)
Item(4, "Other", R.drawable.shapes)
Item(5, "About", R.drawable.information)
Item(0, "Вид", R.drawable.color_palette)
Item(1, "Плеер", R.drawable.play)
Item(2, "Кэш", R.drawable.server)
Item(3, "Данные", R.drawable.server)
Item(4, "Другое", R.drawable.shapes)
Item(5, "Инфо", R.drawable.information)
}
) { currentTabIndex ->
saveableStateHolder.SaveableStateProvider(currentTabIndex) {

View File

@@ -1,4 +1,4 @@
package it.vfsfitvnm.vimusic.ui.styling
package it.hamy.muza.ui.styling
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.saveable.Saver
@@ -30,6 +30,7 @@ data class Appearance(
RoundedCornerShape(2.dp) -> 2
RoundedCornerShape(4.dp) -> 4
RoundedCornerShape(8.dp) -> 8
RoundedCornerShape(16.dp) -> 16
else -> 0
}
)

Some files were not shown because too many files have changed in this diff Show More