Merge pull request #1314 from prathameshmm02/dev

UI improvements
This commit is contained in:
Daksh P. Jain 2022-03-25 15:09:59 +05:30 committed by GitHub
commit dc41fe509b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 91 additions and 84 deletions

View file

@ -14,8 +14,8 @@ android {
vectorDrawables.useSupportLibrary = true
applicationId "code.name.monkey.retromusic"
versionCode 10569
versionName '5.7.3'
versionCode 10570
versionName '5.8.0'
buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"")
}
@ -99,7 +99,7 @@ dependencies {
implementation 'androidx.palette:palette-ktx:1.0.0'
//Cast Dependencies
implementation 'androidx.mediarouter:mediarouter:1.2.6'
implementation 'androidx.mediarouter:mediarouter:1.3.0-rc01'
implementation 'com.google.android.gms:play-services-cast-framework:21.0.1'
//WebServer by NanoHttpd
implementation "org.nanohttpd:nanohttpd:2.3.1"
@ -118,7 +118,7 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.core:core-splashscreen:1.0.0-beta01"
implementation "androidx.core:core-splashscreen:1.0.0-beta02"
implementation 'com.google.android.play:core-ktx:1.8.1'
implementation "com.google.android.material:material:$mdc_version"
@ -142,7 +142,7 @@ dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
def koin_version = '3.1.5'
def koin_version = '3.2.0-beta-1'
implementation "io.insert-koin:koin-core:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version"

View file

@ -62,6 +62,19 @@
</head>
<body>
<div>
<h5>March 13, 2022</h5>
<h2>v5.8.0</h2>
<h3>What's New</h3>
<ul>
<li>Updated translations</li>
<li>Minor UI improvements</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Classic Notification crash</li>
</ul>
</div>
<div>
<h5>March 13, 2022</h5>
<h2>v5.7.3</h2>

View file

@ -62,9 +62,9 @@ import code.name.monkey.retromusic.fragments.queue.PlayingQueueFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import code.name.monkey.retromusic.util.ViewUtil
import com.google.android.material.bottomsheet.BottomSheetBehavior.*
import dev.chrisbanes.insetter.applyInsetter
import org.koin.androidx.viewmodel.ext.android.viewModel
@ -145,9 +145,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
windowInsets = insets
insets
}
if (RetroUtil.isLandscape()) {
binding.slidingPanel.drawAboveSystemBarsWithPadding()
}
chooseFragmentForTheme()
setupSlidingUpPanel()
setupBottomSheet()
@ -357,7 +354,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
}
fun setBottomNavVisibility(visible: Boolean, animate: Boolean = false, hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty()) {
fun setBottomNavVisibility(
visible: Boolean,
animate: Boolean = false,
hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty()
) {
if (isInOneTabMode) {
hideBottomSheet(
hide = hideBottomSheet,

View file

@ -28,7 +28,6 @@ import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
@ -56,7 +55,7 @@ class SearchAdapter(
if (dataSet[position] is Album) return ALBUM
if (dataSet[position] is Artist) return if ((dataSet[position] as Artist).isAlbumArtist) ALBUM_ARTIST else ARTIST
if (dataSet[position] is Genre) return GENRE
if (dataSet[position] is PlaylistEntity) return PLAYLIST
if (dataSet[position] is PlaylistWithSongs) return PLAYLIST
return if (dataSet[position] is Song) SONG else HEADER
}
@ -121,8 +120,8 @@ class SearchAdapter(
)
}
PLAYLIST -> {
val playlist = dataSet[position] as PlaylistEntity
holder.title?.text = playlist.playlistName
val playlist = dataSet[position] as PlaylistWithSongs
holder.title?.text = playlist.playlistEntity.playlistName
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
}
ALBUM_ARTIST -> {

View file

@ -24,7 +24,6 @@ import android.text.TextWatcher
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import androidx.annotation.IdRes
import androidx.core.content.getSystemService
import androidx.core.view.*
import androidx.recyclerview.widget.LinearLayoutManager
@ -52,7 +51,7 @@ import java.util.*
class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWatcher,
ChipGroup.OnCheckedChangeListener {
ChipGroup.OnCheckedStateChangeListener {
companion object {
const val QUERY = "query"
const val REQ_CODE_SPEECH_INPUT = 9001
@ -134,7 +133,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
it.chipBackgroundColor = ColorStateList(states, colors)
}
}
binding.searchFilterGroup.setOnCheckedChangeListener(this)
binding.searchFilterGroup.setOnCheckedStateChangeListener(this)
}
private fun showData(data: List<Any>) {
@ -241,7 +240,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
}
}
override fun onCheckedChanged(group: ChipGroup?, @IdRes checkedId: Int) {
override fun onCheckedChanged(group: ChipGroup, checkedIds: MutableList<Int>) {
search(binding.searchView.text.toString())
}
}

View file

@ -16,7 +16,7 @@ package code.name.monkey.retromusic.repository
import android.content.Context
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.fragments.search.Filter
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
@ -93,10 +93,10 @@ class RealSearchRepository(
}
/** Playlists **/
val playlist: List<PlaylistEntity> =
val playlist: List<PlaylistWithSongs> =
if (filter == Filter.PLAYLISTS || filter == Filter.NO_FILTER) {
roomRepository.playlists().filter { playlist ->
playlist.playlistName.lowercase().contains(searchString.lowercase())
roomRepository.playlistWithSongs().filter { playlist ->
playlist.playlistEntity.playlistName.lowercase().contains(searchString.lowercase())
}
} else {
emptyList()

View file

@ -68,8 +68,8 @@ import code.name.monkey.retromusic.providers.MusicPlaybackQueueStore
import code.name.monkey.retromusic.providers.SongPlayCountStore
import code.name.monkey.retromusic.service.AudioFader.Companion.startFadeAnimator
import code.name.monkey.retromusic.service.notification.PlayingNotification
import code.name.monkey.retromusic.service.notification.PlayingNotificationClassic.Companion.from
import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl24.Companion.from
import code.name.monkey.retromusic.service.notification.PlayingNotificationClassic
import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl24
import code.name.monkey.retromusic.service.playback.Playback
import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks
import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri
@ -194,10 +194,10 @@ class MusicService : MediaBrowserServiceCompat(),
playerHandler?.obtainMessage(FOCUS_CHANGE, focusChange, 0)?.sendToTarget()
}
private var playingNotification: PlayingNotification? = null
private val updateFavoriteReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() }
startForegroundOrNotify()
appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED)
}
}
@ -594,9 +594,9 @@ class MusicService : MediaBrowserServiceCompat(),
playingNotification = if (VERSION.SDK_INT >= VERSION_CODES.N
&& !isClassicNotification
) {
from(this, notificationManager!!, mediaSession!!)
PlayingNotificationImpl24.from(this, notificationManager!!, mediaSession!!)
} else {
from(this, notificationManager!!)
PlayingNotificationClassic.from(this, notificationManager!!)
}
}
@ -732,11 +732,18 @@ class MusicService : MediaBrowserServiceCompat(),
}
}
ALBUM_ART_ON_LOCK_SCREEN, BLURRED_ALBUM_ART -> updateMediaSessionMetaData()
COLORED_NOTIFICATION -> updateNotification()
COLORED_NOTIFICATION -> {
playingNotification?.updateMetadata(currentSong) {
playingNotification?.setPlaying(isPlaying)
startForegroundOrNotify()
}
}
CLASSIC_NOTIFICATION -> {
updateNotification()
playingNotification?.setPlaying(isPlaying) { startForegroundOrNotify() }
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
playingNotification?.updateMetadata(currentSong) {
playingNotification?.setPlaying(isPlaying)
startForegroundOrNotify()
}
}
PLAYBACK_SPEED -> updateMediaSessionPlaybackState()
TOGGLE_HEADSET -> registerHeadsetEvents()
@ -1195,12 +1202,14 @@ class MusicService : MediaBrowserServiceCompat(),
savePositionInTrack()
}
songPlayCountHelper.notifyPlayStateChanged(isPlaying)
playingNotification?.setPlaying(isPlaying) { startForegroundOrNotify() }
playingNotification?.setPlaying(isPlaying)
startForegroundOrNotify()
}
FAVORITE_STATE_CHANGED -> {
playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() }
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
playingNotification?.updateFavorite(currentSong) {
startForegroundOrNotify()
}
updateMediaSessionMetaData()
updateMediaSessionPlaybackState()
savePosition()

View file

@ -29,7 +29,7 @@ abstract class PlayingNotification(context: Context) :
abstract fun updateMetadata(song: Song, onUpdate: () -> Unit)
abstract fun setPlaying(isPlaying: Boolean, onUpdate: () -> Unit)
abstract fun setPlaying(isPlaying: Boolean)
abstract fun updateFavorite(song: Song, onUpdate: () -> Unit)

View file

@ -56,13 +56,28 @@ import com.bumptech.glide.request.transition.Transition
class PlayingNotificationClassic(
val context: Context
) : PlayingNotification(context) {
private var primaryColor: Int = 0
private var isInitialized = false
init {
val notificationLayout = getCombinedRemoteViews(true)
val notificationLayoutBig = getCombinedRemoteViews(false)
private fun getCombinedRemoteViews(collapsed: Boolean, song: Song): RemoteViews {
val remoteViews = RemoteViews(
context.packageName,
if (collapsed) R.layout.layout_notification_collapsed else R.layout.layout_notification_expanded
)
remoteViews.setTextViewText(
R.id.appName,
context.getString(R.string.app_name) + "" + song.albumName
)
remoteViews.setTextViewText(R.id.title, song.title)
remoteViews.setTextViewText(R.id.subtitle, song.artistName)
linkButtons(remoteViews)
return remoteViews
}
override fun updateMetadata(song: Song, onUpdate: () -> Unit) {
isInitialized = true
val notificationLayout = getCombinedRemoteViews(true, song)
val notificationLayoutBig = getCombinedRemoteViews(false, song)
val action = Intent(context, MainActivity::class.java)
action.putExtra(MainActivity.EXPAND_PANEL, PreferenceUtil.isExpandPanel)
@ -83,25 +98,12 @@ class PlayingNotificationClassic(
setContentIntent(clickIntent)
setDeleteIntent(deleteIntent)
setCategory(NotificationCompat.CATEGORY_SERVICE)
setColorized(true)
setColorized(PreferenceUtil.isColoredNotification)
priority = NotificationCompat.PRIORITY_MAX
setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
setCustomContentView(notificationLayout)
setCustomBigContentView(notificationLayoutBig)
setOngoing(true)
}
private fun getCombinedRemoteViews(collapsed: Boolean): RemoteViews {
val remoteViews = RemoteViews(
context.packageName,
if (collapsed) R.layout.layout_notification_collapsed else R.layout.layout_notification_expanded
)
linkButtons(remoteViews)
return remoteViews
}
override fun updateMetadata(song: Song, onUpdate: () -> Unit) {
isInitialized = true
val bigNotificationImageSize = context.resources
.getDimensionPixelSize(R.dimen.notification_big_image_size)
GlideApp.with(context).asBitmapPalette().songCoverOptions(song)
@ -128,6 +130,10 @@ class PlayingNotificationClassic(
}
override fun onLoadCleared(placeholder: Drawable?) {
update(
null,
resolveColor(context, R.attr.colorSurface, Color.WHITE)
)
}
private fun update(bitmap: Bitmap?, bgColor: Int) {
@ -208,14 +214,6 @@ class PlayingNotificationClassic(
contentView.setImageViewBitmap(R.id.action_next, next)
contentView.setImageViewBitmap(R.id.action_play_pause, playPause)
contentView.setTextViewText(
R.id.appName,
context.getString(R.string.app_name) + "" + song.albumName
)
contentView.setTextViewText(R.id.title, song.title)
contentView.setTextViewText(R.id.subtitle, song.artistName)
bigContentView.setTextColor(R.id.title, primary)
bigContentView.setTextColor(R.id.subtitle, secondary)
bigContentView.setTextColor(R.id.appName, secondary)
@ -225,14 +223,6 @@ class PlayingNotificationClassic(
bigContentView.setImageViewBitmap(R.id.action_next, next)
bigContentView.setImageViewBitmap(R.id.action_play_pause, playPause)
bigContentView.setTextViewText(
R.id.appName,
context.getString(R.string.app_name) + "" + song.albumName
)
bigContentView.setTextViewText(R.id.title, song.title)
bigContentView.setTextViewText(R.id.subtitle, song.artistName)
contentView.setImageViewBitmap(
R.id.smallIcon,
createBitmap(
@ -269,7 +259,7 @@ class PlayingNotificationClassic(
)
}
override fun setPlaying(isPlaying: Boolean, onUpdate: () -> Unit) {
override fun setPlaying(isPlaying: Boolean) {
getPlayPauseBitmap(isPlaying).also {
contentView.setImageViewBitmap(R.id.action_play_pause, it)
bigContentView.setImageViewBitmap(R.id.action_play_pause, it)
@ -277,9 +267,6 @@ class PlayingNotificationClassic(
}
override fun updateFavorite(song: Song, onUpdate: () -> Unit) {
if (!isInitialized) {
updateMetadata(song, onUpdate)
}
}
private fun buildPendingIntent(

View file

@ -46,10 +46,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroColorUtil
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.*
@SuppressLint("RestrictedApi")
class PlayingNotificationImpl24(
@ -207,9 +204,8 @@ class PlayingNotificationImpl24(
).build()
}
override fun setPlaying(isPlaying: Boolean, onUpdate: () -> Unit) {
override fun setPlaying(isPlaying: Boolean) {
mActions[2] = buildPlayAction(isPlaying)
onUpdate()
}
override fun updateFavorite(song: Song, onUpdate: () -> Unit) {

View file

@ -42,7 +42,8 @@ class BottomNavigationBarTinted @JvmOverloads constructor(
} else {
applyInsetter {
type(navigationBars = true) {
padding()
padding(vertical = true)
margin(horizontal = true)
}
}
}

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<code.name.monkey.retromusic.views.insets.InsetsConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@ -208,4 +208,4 @@
android:layout_height="72dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/listeners" />
</androidx.constraintlayout.widget.ConstraintLayout>
</code.name.monkey.retromusic.views.insets.InsetsConstraintLayout>

View file

@ -51,11 +51,12 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/create_backup" />
<androidx.recyclerview.widget.RecyclerView
<code.name.monkey.retromusic.views.insets.InsetsRecyclerView
android:id="@+id/backup_recyclerview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/backup_title" />

View file

@ -188,6 +188,7 @@
</style>
<style name="BottomSheetStyle" parent="Widget.Material3.BottomSheet">
<item name="paddingBottomSystemWindowInsets">false</item>
<item name="android:maxWidth">@empty</item>
</style>

View file

@ -4,7 +4,7 @@ buildscript {
ext {
kotlin_version = '1.6.10'
navigation_version = '2.4.1'
mdc_version = '1.5.0'
mdc_version = '1.6.0-beta01'
preference_version = '1.2.0'
appcompat_version = '1.4.1'
}