Conflicts:
	app/build.gradle
	app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java
	app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/CoroutineViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/full/FullPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt
	app/src/main/res/layout/item_grid_circle.xml
	app/src/main/res/layout/item_list_quick_actions.xml
	appthemehelper/build.gradle
This commit is contained in:
Muntashir Al-Islam 2021-01-04 16:51:16 +06:00
commit 86f2f788e9
58 changed files with 1156 additions and 496 deletions

View file

@ -16,6 +16,9 @@ assignees: ''
**Have you read the [FAQ](https://www.github.com/h4h13/RetroMusicPlayer/tree/dev/FAQ.md)?** **Have you read the [FAQ](https://www.github.com/h4h13/RetroMusicPlayer/tree/dev/FAQ.md)?**
[Yes/No] [Yes/No]
**Has the bug already been reported? Please search in GitHub issue tab before creating an issue.**
[Yes/No]
**Describe the bug** **Describe the bug**
A clear and concise description of what the bug is. A clear and concise description of what the bug is.

View file

@ -6,7 +6,7 @@ apply plugin: "androidx.navigation.safeargs.kotlin"
android { android {
compileSdkVersion 29 compileSdkVersion 29
buildToolsVersion = '30.0.2' buildToolsVersion = '30.0.3'
defaultConfig { defaultConfig {
minSdkVersion 21 minSdkVersion 21
@ -69,14 +69,14 @@ dependencies {
implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.cardview:cardview:1.0.0"
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.core:core-ktx:1.3.1' implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.fragment:fragment-ktx:1.2.5' implementation 'androidx.fragment:fragment-ktx:1.2.5'
implementation 'androidx.palette:palette-ktx:1.0.0' implementation 'androidx.palette:palette-ktx:1.0.0'
def nav_version = "2.3.0" def nav_version = "2.3.2"
implementation "androidx.navigation:navigation-runtime-ktx:$nav_version" implementation "androidx.navigation:navigation-runtime-ktx:$nav_version"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
@ -91,7 +91,7 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation 'com.google.android.material:material:1.3.0-alpha01' implementation 'com.google.android.material:material:1.3.0-alpha04'
def retrofit_version = '2.9.0' def retrofit_version = '2.9.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:retrofit:$retrofit_version"

View file

@ -50,6 +50,7 @@ import io.github.muntashirakon.music.TOGGLE_SEPARATE_LINE
import io.github.muntashirakon.music.TOGGLE_VOLUME import io.github.muntashirakon.music.TOGGLE_VOLUME
import io.github.muntashirakon.music.USER_NAME import io.github.muntashirakon.music.USER_NAME
import io.github.muntashirakon.music.activities.base.AbsSlidingMusicPanelActivity import io.github.muntashirakon.music.activities.base.AbsSlidingMusicPanelActivity
import io.github.muntashirakon.music.extensions.extra
import io.github.muntashirakon.music.extensions.findNavController import io.github.muntashirakon.music.extensions.findNavController
import io.github.muntashirakon.music.helper.MusicPlayerRemote import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.SearchQueryHelper.getSongs import io.github.muntashirakon.music.helper.SearchQueryHelper.getSongs
@ -57,6 +58,7 @@ import io.github.muntashirakon.music.model.CategoryInfo
import io.github.muntashirakon.music.model.Song import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.repository.PlaylistSongsLoader import io.github.muntashirakon.music.repository.PlaylistSongsLoader
import io.github.muntashirakon.music.service.MusicService import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.util.AppRater
import io.github.muntashirakon.music.util.PreferenceUtil import io.github.muntashirakon.music.util.PreferenceUtil
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -66,7 +68,6 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
companion object { companion object {
const val TAG = "MainActivity" const val TAG = "MainActivity"
const val EXPAND_PANEL = "expand_panel" const val EXPAND_PANEL = "expand_panel"
const val APP_UPDATE_REQUEST_CODE = 9002
} }
override fun createContentView(): View { override fun createContentView(): View {
@ -83,17 +84,10 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
hideStatusBar() hideStatusBar()
updateTabs() updateTabs()
// NavigationUI.setupWithNavController(getBottomNavigationView(), findNavController(R.id.fragment_container))
setupNavigationController() setupNavigationController()
if (!hasPermissions()) { if (!hasPermissions()) {
findNavController(R.id.fragment_container).navigate(R.id.permissionFragment) findNavController(R.id.fragment_container).navigate(R.id.permissionFragment)
} }
showPromotionalDialog()
}
private fun showPromotionalDialog() {
} }
private fun setupNavigationController() { private fun setupNavigationController() {
@ -115,27 +109,27 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
PreferenceUtil.registerOnSharedPreferenceChangedListener(this) PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
if (intent.hasExtra(EXPAND_PANEL) && val expand = extra<Boolean>(EXPAND_PANEL).value ?: false
intent.getBooleanExtra(EXPAND_PANEL, false) && if (expand && PreferenceUtil.isExpandPanel) {
PreferenceUtil.isExpandPanel
) {
expandPanel() expandPanel()
intent.removeExtra(EXPAND_PANEL) intent.removeExtra(EXPAND_PANEL)
} }
} }
override fun onDestroy() {
super.onDestroy()
PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == GENERAL_THEME || key == BLACK_THEME || key == ADAPTIVE_COLOR_APP || key == USER_NAME || key == TOGGLE_FULL_SCREEN || key == TOGGLE_VOLUME || key == ROUND_CORNERS || key == CAROUSEL_EFFECT || key == NOW_PLAYING_SCREEN_ID || key == TOGGLE_GENRE || key == BANNER_IMAGE_PATH || key == PROFILE_IMAGE_PATH || key == CIRCULAR_ALBUM_ART || key == KEEP_SCREEN_ON || key == TOGGLE_SEPARATE_LINE || key == TOGGLE_HOME_BANNER || key == TOGGLE_ADD_CONTROLS || key == ALBUM_COVER_STYLE || key == HOME_ARTIST_GRID_STYLE || key == ALBUM_COVER_TRANSFORM || key == DESATURATED_COLOR || key == EXTRA_SONG_INFO || key == TAB_TEXT_MODE || key == LANGUAGE_NAME || key == LIBRARY_CATEGORIES if (key == GENERAL_THEME || key == BLACK_THEME || key == ADAPTIVE_COLOR_APP || key == USER_NAME || key == TOGGLE_FULL_SCREEN || key == TOGGLE_VOLUME || key == ROUND_CORNERS || key == CAROUSEL_EFFECT || key == NOW_PLAYING_SCREEN_ID || key == TOGGLE_GENRE || key == BANNER_IMAGE_PATH || key == PROFILE_IMAGE_PATH || key == CIRCULAR_ALBUM_ART || key == KEEP_SCREEN_ON || key == TOGGLE_SEPARATE_LINE || key == TOGGLE_HOME_BANNER || key == TOGGLE_ADD_CONTROLS || key == ALBUM_COVER_STYLE || key == HOME_ARTIST_GRID_STYLE || key == ALBUM_COVER_TRANSFORM || key == DESATURATED_COLOR || key == EXTRA_SONG_INFO || key == TAB_TEXT_MODE || key == LANGUAGE_NAME || key == LIBRARY_CATEGORIES) {
) {
postRecreate() postRecreate()
} }
} }
override fun onServiceConnected() { override fun onServiceConnected() {
super.onServiceConnected() super.onServiceConnected()
if (intent == null) { intent ?: return
return
}
handlePlaybackIntent(intent) handlePlaybackIntent(intent)
} }

View file

@ -56,7 +56,6 @@ import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.model.CategoryInfo import io.github.muntashirakon.music.model.CategoryInfo
import io.github.muntashirakon.music.util.PreferenceUtil import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.views.BottomNavigationBarTinted import io.github.muntashirakon.music.views.BottomNavigationBarTinted
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.* import com.google.android.material.bottomsheet.BottomSheetBehavior.*
import kotlinx.android.synthetic.main.sliding_music_panel_layout.* import kotlinx.android.synthetic.main.sliding_music_panel_layout.*
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
@ -97,6 +96,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
onPanelCollapsed() onPanelCollapsed()
dimBackground.hide() dimBackground.hide()
} }
else -> { else -> {
println("Do something") println("Do something")
} }
@ -114,11 +114,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
setupBottomSheet() setupBottomSheet()
updateColor() updateColor()
val themeColor = ATHUtil.resolveColor(this, android.R.attr.windowBackground, Color.GRAY) val themeColor = resolveColor(android.R.attr.windowBackground, Color.GRAY)
dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f)) dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f))
dimBackground.setOnClickListener { dimBackground.setOnClickListener {
println("dimBackground") println("dimBackground")
collapsePanel()
} }
} }
@ -132,7 +132,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) { if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) {
postRecreate() postRecreate()
} }
if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) { if (bottomSheetBehavior.state == STATE_EXPANDED) {
setMiniPlayerAlphaProgress(1f) setMiniPlayerAlphaProgress(1f)
} }
} }
@ -154,6 +154,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
fun collapsePanel() { fun collapsePanel() {
bottomSheetBehavior.state = STATE_COLLAPSED bottomSheetBehavior.state = STATE_COLLAPSED
setMiniPlayerAlphaProgress(0f)
} }
fun expandPanel() { fun expandPanel() {
@ -324,14 +325,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}) })
} }
fun setBottomBarVisibility(visible: Int) { fun setBottomBarVisibility(visible: Boolean) {
bottomNavigationView.visibility = visible bottomNavigationView.isVisible = visible
hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty()) hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
} }
private fun hideBottomBar(hide: Boolean) { private fun hideBottomBar(hide: Boolean) {
val heightOfBar = dip(R.dimen.mini_player_height) val heightOfBar = dip(R.dimen.mini_player_height)
val heightOfBarWithTabs = dip(R.dimen.mini_player_height_expanded) val heightOfBarWithTabs = heightOfBar * 2
val isVisible = bottomNavigationView.isVisible val isVisible = bottomNavigationView.isVisible
if (hide) { if (hide) {
bottomSheetBehavior.isHideable = true bottomSheetBehavior.isHideable = true
@ -345,10 +346,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
ViewCompat.setElevation(slidingPanel, 10f) ViewCompat.setElevation(slidingPanel, 10f)
ViewCompat.setElevation(bottomNavigationView, 10f) ViewCompat.setElevation(bottomNavigationView, 10f)
if (isVisible) { if (isVisible) {
bottomSheetBehavior.peekHeight = heightOfBarWithTabs println("List")
bottomNavigationView.translateYAnimate(0f) bottomSheetBehavior.peekHeight = heightOfBarWithTabs - 22
} else { } else {
bottomNavigationView.translateYAnimate(150f) println("Details")
bottomSheetBehavior.peekHeight = heightOfBar bottomSheetBehavior.peekHeight = heightOfBar
} }
} }

View file

@ -98,7 +98,8 @@ public class WriteTagsAsyncTask extends DialogAsyncTask<LoadingInfo, Integer, Li
Context context = getContext(); Context context = getContext();
if (context != null) { if (context != null) {
if (wroteArtwork) { if (wroteArtwork) {
MusicUtil.INSTANCE.insertAlbumArt(context, info.getArtworkInfo().getAlbumId(), albumArtFile.getPath()); MusicUtil.INSTANCE.
insertAlbumArt(context, info.getArtworkInfo().getAlbumId(), albumArtFile.getPath());
} else if (deletedArtwork) { } else if (deletedArtwork) {
MusicUtil.INSTANCE.deleteAlbumArt(context, info.getArtworkInfo().getAlbumId()); MusicUtil.INSTANCE.deleteAlbumArt(context, info.getArtworkInfo().getAlbumId());
} }

View file

@ -239,15 +239,17 @@ class HomeAdapter(
val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area) val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area)
} }
fun artistsAdapter(artists: List<Artist>) = private fun artistsAdapter(artists: List<Artist>) =
ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this) ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this)
fun albumAdapter(albums: List<Album>) = private fun albumAdapter(albums: List<Album>) =
AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this) AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this)
fun gridLayoutManager() = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) private fun gridLayoutManager() =
GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
fun linearLayoutManager() = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) private fun linearLayoutManager() =
LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
override fun onArtist(artistId: Long, view: View) { override fun onArtist(artistId: Long, view: View) {
activity.findNavController(R.id.fragment_container).navigate( activity.findNavController(R.id.fragment_container).navigate(

View file

@ -42,10 +42,10 @@ class SongFileAdapter(
private val activity: AppCompatActivity, private val activity: AppCompatActivity,
private var dataSet: List<File>, private var dataSet: List<File>,
private val itemLayoutRes: Int, private val itemLayoutRes: Int,
private val ICallbacks: ICallbacks?, private val iCallbacks: ICallbacks?,
ICabHolder: ICabHolder? iCabHolder: ICabHolder?
) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>( ) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(
activity, ICabHolder, R.menu.menu_media_selection activity, iCabHolder, R.menu.menu_media_selection
), PopupTextProvider { ), PopupTextProvider {
init { init {
@ -135,8 +135,8 @@ class SongFileAdapter(
} }
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<File>) { override fun onMultipleItemAction(menuItem: MenuItem, selection: List<File>) {
if (ICallbacks == null) return if (iCallbacks == null) return
ICallbacks.onMultipleItemAction(menuItem, selection as ArrayList<File>) iCallbacks.onMultipleItemAction(menuItem, selection as ArrayList<File>)
} }
override fun getPopupText(position: Int): String { override fun getPopupText(position: Int): String {
@ -150,11 +150,11 @@ class SongFileAdapter(
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init { init {
if (menu != null && ICallbacks != null) { if (menu != null && iCallbacks != null) {
menu?.setOnClickListener { v -> menu?.setOnClickListener { v ->
val position = layoutPosition val position = layoutPosition
if (isPositionInRange(position)) { if (isPositionInRange(position)) {
ICallbacks.onFileMenuClicked(dataSet[position], v) iCallbacks.onFileMenuClicked(dataSet[position], v)
} }
} }
} }
@ -169,7 +169,7 @@ class SongFileAdapter(
if (isInQuickSelectMode) { if (isInQuickSelectMode) {
toggleChecked(position) toggleChecked(position)
} else { } else {
ICallbacks?.onFileSelected(dataSet[position]) iCallbacks?.onFileSelected(dataSet[position])
} }
} }
} }

View file

@ -15,20 +15,17 @@
package io.github.muntashirakon.music.adapter.album package io.github.muntashirakon.music.adapter.album
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Resources
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import com.bumptech.glide.Glide
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.glide.AlbumGlideRequest import io.github.muntashirakon.music.glide.AlbumGlideRequest
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import io.github.muntashirakon.music.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.SortOrder import io.github.muntashirakon.music.helper.SortOrder
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper import io.github.muntashirakon.music.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import io.github.muntashirakon.music.interfaces.IAlbumClickListener
@ -38,17 +35,18 @@ import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.MusicUtil import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.PreferenceUtil import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import io.github.muntashirakon.music.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
open class AlbumAdapter( open class AlbumAdapter(
protected val activity: FragmentActivity, val activity: FragmentActivity,
var dataSet: List<Album>, var dataSet: List<Album>,
protected var itemLayoutRes: Int, var itemLayoutRes: Int,
ICabHolder: ICabHolder?, iCabHolder: ICabHolder?,
private val albumClickListener: IAlbumClickListener? val listener: IAlbumClickListener?
) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>( ) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>(
activity, activity,
ICabHolder, iCabHolder,
R.menu.menu_media_selection R.menu.menu_media_selection
), PopupTextProvider { ), PopupTextProvider {
@ -62,12 +60,7 @@ open class AlbumAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
try {
LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
} catch (e: Resources.NotFoundException) {
LayoutInflater.from(activity).inflate(R.layout.item_grid, parent, false)
}
return createViewHolder(view, viewType) return createViewHolder(view, viewType)
} }
@ -99,7 +92,7 @@ open class AlbumAdapter(
holder.paletteColorContainer?.setBackgroundColor(color.backgroundColor) holder.paletteColorContainer?.setBackgroundColor(color.backgroundColor)
} }
holder.mask?.backgroundTintList = ColorStateList.valueOf(color.primaryTextColor) holder.mask?.backgroundTintList = ColorStateList.valueOf(color.primaryTextColor)
} holder.imageContainerCard?.setCardBackgroundColor(color.backgroundColor) }
protected open fun loadAlbumCover(album: Album, holder: ViewHolder) { protected open fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) { if (holder.image == null) {
@ -177,8 +170,11 @@ open class AlbumAdapter(
if (isInQuickSelectMode) { if (isInQuickSelectMode) {
toggleChecked(layoutPosition) toggleChecked(layoutPosition)
} else { } else {
ViewCompat.setTransitionName(itemView, "album") image?.let {
albumClickListener?.onAlbumClick(dataSet[layoutPosition].id, itemView) ViewCompat.setTransitionName(it, "album")
listener?.onAlbumClick(dataSet[layoutPosition].id, it)
}
} }
} }

View file

@ -85,7 +85,7 @@ class ArtistAdapter(
loadArtistImage(artist, holder) loadArtistImage(artist, holder)
} }
fun setColors(processor: MediaNotificationProcessor, holder: ViewHolder) { private fun setColors(processor: MediaNotificationProcessor, holder: ViewHolder) {
holder.mask?.backgroundTintList = ColorStateList.valueOf(processor.primaryTextColor) holder.mask?.backgroundTintList = ColorStateList.valueOf(processor.primaryTextColor)
if (holder.paletteColorContainer != null) { if (holder.paletteColorContainer != null) {
holder.paletteColorContainer?.setBackgroundColor(processor.backgroundColor) holder.paletteColorContainer?.setBackgroundColor(processor.backgroundColor)
@ -155,8 +155,8 @@ class ArtistAdapter(
toggleChecked(layoutPosition) toggleChecked(layoutPosition)
} else { } else {
image?.let { image?.let {
ViewCompat.setTransitionName(itemView, "album") ViewCompat.setTransitionName(it, "artist")
IArtistClickListener.onArtist(dataSet[layoutPosition].id, itemView) IArtistClickListener.onArtist(dataSet[layoutPosition].id, it)
} }
} }
} }

View file

@ -16,52 +16,70 @@ package io.github.muntashirakon.music.adapter.base;
import android.graphics.Color; import android.graphics.Color;
import android.view.View; import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView; import androidx.appcompat.widget.AppCompatImageView;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import io.github.muntashirakon.music.R; import io.github.muntashirakon.music.R;
import com.google.android.material.card.MaterialCardView; import com.google.android.material.card.MaterialCardView;
import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractDraggableSwipeableItemViewHolder; import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractDraggableSwipeableItemViewHolder;
public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHolder public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHolder
implements View.OnLongClickListener, View.OnClickListener { implements View.OnLongClickListener, View.OnClickListener {
@Nullable public View dragView; @Nullable
public View dragView;
@Nullable public View dummyContainer; @Nullable
public View dummyContainer;
@Nullable public ImageView image; @Nullable
public ImageView image;
@Nullable public ImageView artistImage; @Nullable
public ImageView artistImage;
@Nullable public ImageView playerImage; @Nullable
public ImageView playerImage;
@Nullable public MaterialCardView imageContainerCard; @Nullable
public MaterialCardView imageContainerCard;
@Nullable public TextView imageText; @Nullable
public TextView imageText;
@Nullable public MaterialCardView imageTextContainer; @Nullable
public MaterialCardView imageTextContainer;
@Nullable public View mask; @Nullable
public View mask;
@Nullable public AppCompatImageView menu; @Nullable
public AppCompatImageView menu;
@Nullable public View paletteColorContainer; @Nullable
public View paletteColorContainer;
@Nullable public RecyclerView recyclerView; @Nullable
public RecyclerView recyclerView;
@Nullable public TextView text; @Nullable
public TextView text;
@Nullable public TextView text2; @Nullable
public TextView text2;
@Nullable public TextView time; @Nullable
public TextView time;
@Nullable public TextView title; @Nullable
public TextView title;
public MediaEntryViewHolder(@NonNull View itemView) { public MediaEntryViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
@ -99,7 +117,8 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
} }
@Override @Override
public void onClick(View v) {} public void onClick(View v) {
}
@Override @Override
public boolean onLongClick(View v) { public boolean onLongClick(View v) {

View file

@ -25,13 +25,13 @@ import io.github.muntashirakon.music.dialogs.RemoveSongFromPlaylistDialog
import io.github.muntashirakon.music.interfaces.ICabHolder import io.github.muntashirakon.music.interfaces.ICabHolder
import io.github.muntashirakon.music.model.Song import io.github.muntashirakon.music.model.Song
open class PlaylistSongAdapter( class PlaylistSongAdapter(
private val playlist: PlaylistEntity, private val playlist: PlaylistEntity,
activity: FragmentActivity, activity: FragmentActivity,
dataSet: MutableList<Song>, dataSet: MutableList<Song>,
itemLayoutRes: Int, itemLayoutRes: Int,
ICabHolder: ICabHolder? iCabHolder: ICabHolder?
) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) { ) : SongAdapter(activity, dataSet, itemLayoutRes, iCabHolder) {
init { init {
this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection) this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection)

View file

@ -15,15 +15,18 @@
package io.github.muntashirakon.music.adapter.song package io.github.muntashirakon.music.adapter.song
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentActivity
import code.name.monkey.appthemehelper.ThemeStore
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.extensions.applyColor
import io.github.muntashirakon.music.extensions.applyOutlineColor
import io.github.muntashirakon.music.helper.MusicPlayerRemote import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.ICabHolder import io.github.muntashirakon.music.interfaces.ICabHolder
import io.github.muntashirakon.music.model.Song import io.github.muntashirakon.music.model.Song
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
class ShuffleButtonSongAdapter( class ShuffleButtonSongAdapter(
activity: AppCompatActivity, activity: FragmentActivity,
dataSet: MutableList<Song>, dataSet: MutableList<Song>,
itemLayoutRes: Int, itemLayoutRes: Int,
ICabHolder: ICabHolder? ICabHolder: ICabHolder?
@ -35,16 +38,19 @@ class ShuffleButtonSongAdapter(
override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
if (holder.itemViewType == OFFSET_ITEM) { if (holder.itemViewType == OFFSET_ITEM) {
val color = ThemeStore.accentColor(activity)
val viewHolder = holder as ViewHolder val viewHolder = holder as ViewHolder
viewHolder.playAction?.let { viewHolder.playAction?.let {
it.setOnClickListener { it.setOnClickListener {
MusicPlayerRemote.openQueue(dataSet, 0, true) MusicPlayerRemote.openQueue(dataSet, 0, true)
} }
it.applyOutlineColor(color)
} }
viewHolder.shuffleAction?.let { viewHolder.shuffleAction?.let {
it.setOnClickListener { it.setOnClickListener {
MusicPlayerRemote.openAndShuffleQueue(dataSet, true) MusicPlayerRemote.openAndShuffleQueue(dataSet, true)
} }
it.applyColor(color)
} }
} else { } else {
super.onBindViewHolder(holder, position - 1) super.onBindViewHolder(holder, position - 1)

View file

@ -19,7 +19,7 @@ import androidx.room.RoomDatabase
@Database( @Database(
entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class], entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class],
version = 22, version = 23,
exportSchema = false exportSchema = false
) )
abstract class RetroDatabase : RoomDatabase() { abstract class RetroDatabase : RoomDatabase() {

View file

@ -16,6 +16,7 @@ package io.github.muntashirakon.music.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_SONG import io.github.muntashirakon.music.EXTRA_SONG
@ -40,11 +41,11 @@ class DeleteSongsDialog : DialogFragment() {
} }
fun create(songs: List<Song>): DeleteSongsDialog { fun create(songs: List<Song>): DeleteSongsDialog {
val dialog = DeleteSongsDialog() return DeleteSongsDialog().apply {
val args = Bundle() arguments = bundleOf(
args.putParcelableArrayList(EXTRA_SONG, ArrayList(songs)) EXTRA_SONG to ArrayList(songs)
dialog.arguments = args )
return dialog }
} }
} }

View file

@ -164,7 +164,6 @@ class SleepTimerDialog : DialogFragment() {
) { ) {
override fun onTick(millisUntilFinished: Long) { override fun onTick(millisUntilFinished: Long) {
println("onTick: $millisUntilFinished")
seekBar.progress = millisUntilFinished.toInt() seekBar.progress = millisUntilFinished.toInt()
} }

View file

@ -23,6 +23,7 @@ import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.TextView import android.widget.TextView
import androidx.annotation.NonNull import androidx.annotation.NonNull
import androidx.core.os.bundleOf
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_SONG import io.github.muntashirakon.music.EXTRA_SONG
@ -155,11 +156,11 @@ class SongDetailDialog : DialogFragment() {
val TAG: String = SongDetailDialog::class.java.simpleName val TAG: String = SongDetailDialog::class.java.simpleName
fun create(song: Song): SongDetailDialog { fun create(song: Song): SongDetailDialog {
val dialog = SongDetailDialog() return SongDetailDialog().apply {
val args = Bundle() arguments = bundleOf(
args.putParcelable(EXTRA_SONG, song) EXTRA_SONG to song
dialog.arguments = args )
return dialog }
} }
private fun makeTextWithTitle(context: Context, titleResId: Int, text: String?): Spanned { private fun makeTextWithTitle(context: Context, titleResId: Int, text: String?): Spanned {

View file

@ -17,6 +17,7 @@ package io.github.muntashirakon.music.dialogs
import android.app.Dialog import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_SONG import io.github.muntashirakon.music.EXTRA_SONG
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
@ -93,11 +94,11 @@ class SongShareDialog : DialogFragment() {
companion object { companion object {
fun create(song: Song): SongShareDialog { fun create(song: Song): SongShareDialog {
val dialog = SongShareDialog() return SongShareDialog().apply {
val args = Bundle() arguments = bundleOf(
args.putParcelable(EXTRA_SONG, song) EXTRA_SONG to song
dialog.arguments = args )
return dialog }
} }
} }
} }

View file

@ -38,7 +38,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.progressindicator.ProgressIndicator import com.google.android.material.progressindicator.CircularProgressIndicator
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import io.github.muntashirakon.music.App import io.github.muntashirakon.music.App
@ -95,13 +95,7 @@ fun SeekBar.addAccentColor() {
thumbTintList = colorState thumbTintList = colorState
} }
fun Button.accentTextColor() { fun Button.accentTextColor() = setTextColor(ThemeStore.accentColor(App.getContext()))
setTextColor(ThemeStore.accentColor(App.getContext()))
}
fun MaterialButton.accentTextColor() {
setTextColor(ThemeStore.accentColor(App.getContext()))
}
fun MaterialButton.accentBackgroundColor() { fun MaterialButton.accentBackgroundColor() {
backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(App.getContext())) backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(App.getContext()))
@ -154,9 +148,7 @@ fun MaterialButton.applyColor(color: Int) {
iconTint = textColorColorStateList iconTint = textColorColorStateList
} }
fun MaterialButton.accentColor(){ fun MaterialButton.accentColor() = applyColor(ThemeStore.accentColor(context))
this.applyColor(ThemeStore.accentColor(context))
}
fun MaterialButton.applyOutlineColor(color: Int) { fun MaterialButton.applyOutlineColor(color: Int) {
val textColorColorStateList = ColorStateList.valueOf(color) val textColorColorStateList = ColorStateList.valueOf(color)
@ -172,23 +164,18 @@ fun TextInputLayout.accentColor() {
isHintAnimationEnabled = true isHintAnimationEnabled = true
} }
fun ProgressIndicator.accentColor() { fun CircularProgressIndicator.accentColor() {
val accentColor = ThemeStore.accentColor(context) val color = ThemeStore.accentColor(context)
indicatorColors = intArrayOf(accentColor) setIndicatorColor(color)
trackColor = ColorUtil.withAlpha(accentColor, 0.2f)
}
fun ProgressIndicator.applyColor(color: Int) {
indicatorColors = intArrayOf(color)
trackColor = ColorUtil.withAlpha(color, 0.2f) trackColor = ColorUtil.withAlpha(color, 0.2f)
} }
fun TextInputEditText.accentColor() { fun CircularProgressIndicator.applyColor(color: Int) {
setIndicatorColor(color)
trackColor = ColorUtil.withAlpha(color, 0.2f)
} }
fun AppCompatImageView.accentColor(): Int { fun AppCompatImageView.accentColor(): Int = ThemeStore.accentColor(context)
return ThemeStore.accentColor(context)
}
@CheckResult @CheckResult
fun Drawable.tint(@ColorInt color: Int): Drawable { fun Drawable.tint(@ColorInt color: Int): Drawable {
@ -198,9 +185,8 @@ fun Drawable.tint(@ColorInt color: Int): Drawable {
} }
@CheckResult @CheckResult
fun Drawable.tint(context: Context, @ColorRes color: Int): Drawable { fun Drawable.tint(context: Context, @ColorRes color: Int): Drawable =
return tint(context.getColorCompat(color)) tint(context.getColorCompat(color))
}
@ColorInt @ColorInt
fun Context.getColorCompat(@ColorRes colorRes: Int): Int { fun Context.getColorCompat(@ColorRes colorRes: Int): Int {

View file

@ -49,14 +49,3 @@ fun Drawable.getBitmapDrawable(): Bitmap {
draw(canvas) draw(canvas)
return bmp return bmp
} }
fun getAdaptiveIconDrawable(context: Context): Drawable {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
AdaptiveIconDrawable(
ContextCompat.getDrawable(context, R.drawable.ic_launcher_background),
ContextCompat.getDrawable(context, R.drawable.ic_launcher_background)
)
} else {
ContextCompat.getDrawable(context, R.drawable.color_circle_gradient)!!
}
}

View file

@ -27,6 +27,8 @@ import androidx.core.animation.doOnStart
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.shape.ShapeAppearanceModel
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <T : View> ViewGroup.inflate(@LayoutRes layout: Int): T { fun <T : View> ViewGroup.inflate(@LayoutRes layout: Int): T {
@ -113,3 +115,10 @@ fun View.focusAndShowKeyboard() {
}) })
} }
} }
fun ShapeableImageView.setCircleShape(boolean: Boolean) {
addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
val radius = width / 2f
shapeAppearanceModel = ShapeAppearanceModel().withCornerSize(radius)
}
}

View file

@ -1,37 +0,0 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.fragments
import androidx.lifecycle.ViewModel
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.*
open class CoroutineViewModel(
private val mainDispatcher: CoroutineDispatcher
) : ViewModel() {
private val job = Job()
protected val scope = CoroutineScope(job + mainDispatcher)
protected fun launch(
context: CoroutineContext = mainDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
) = scope.launch(context, start, block)
override fun onCleared() {
super.onCleared()
job.cancel()
}
}

View file

@ -26,15 +26,16 @@ import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
import io.github.muntashirakon.music.* import io.github.muntashirakon.music.*
import io.github.muntashirakon.music.adapter.album.AlbumAdapter import io.github.muntashirakon.music.adapter.album.AlbumAdapter
import io.github.muntashirakon.music.adapter.artist.ArtistAdapter import io.github.muntashirakon.music.adapter.artist.ArtistAdapter
import io.github.muntashirakon.music.adapter.song.ShuffleButtonSongAdapter
import io.github.muntashirakon.music.adapter.song.SongAdapter import io.github.muntashirakon.music.adapter.song.SongAdapter
import io.github.muntashirakon.music.db.toSong import io.github.muntashirakon.music.db.toSong
import io.github.muntashirakon.music.extensions.dipToPix import io.github.muntashirakon.music.extensions.dipToPix
import io.github.muntashirakon.music.extensions.hide
import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import io.github.muntashirakon.music.interfaces.IAlbumClickListener
import io.github.muntashirakon.music.interfaces.IArtistClickListener import io.github.muntashirakon.music.interfaces.IArtistClickListener
import io.github.muntashirakon.music.model.Album import io.github.muntashirakon.music.model.Album
import io.github.muntashirakon.music.model.Artist import io.github.muntashirakon.music.model.Artist
import io.github.muntashirakon.music.state.NowPlayingPanelState
import io.github.muntashirakon.music.util.RetroUtil import io.github.muntashirakon.music.util.RetroUtil
import kotlinx.android.synthetic.main.fragment_playlist_detail.* import kotlinx.android.synthetic.main.fragment_playlist_detail.*
@ -44,22 +45,14 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
mainActivity.setBottomBarVisibility(View.GONE) mainActivity.setBottomBarVisibility(false)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
progressIndicator.hide() progressIndicator.hide()
when (args.type) { when (args.type) {
TOP_ARTISTS -> { TOP_ARTISTS -> loadArtists(R.string.top_artists, TOP_ARTISTS)
loadArtists(R.string.top_artists, TOP_ARTISTS) RECENT_ARTISTS -> loadArtists(R.string.recent_artists, RECENT_ARTISTS)
} TOP_ALBUMS -> loadAlbums(R.string.top_albums, TOP_ALBUMS)
RECENT_ARTISTS -> { RECENT_ALBUMS -> loadAlbums(R.string.recent_albums, RECENT_ALBUMS)
loadArtists(R.string.recent_artists, RECENT_ARTISTS)
}
TOP_ALBUMS -> {
loadAlbums(R.string.top_albums, TOP_ALBUMS)
}
RECENT_ALBUMS -> {
loadAlbums(R.string.recent_albums, RECENT_ALBUMS)
}
FAVOURITES -> loadFavorite() FAVOURITES -> loadFavorite()
HISTORY_PLAYLIST -> loadHistory() HISTORY_PLAYLIST -> loadHistory()
LAST_ADDED_PLAYLIST -> lastAddedSongs() LAST_ADDED_PLAYLIST -> lastAddedSongs()
@ -77,7 +70,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
private fun lastAddedSongs() { private fun lastAddedSongs() {
toolbar.setTitle(R.string.last_added) toolbar.setTitle(R.string.last_added)
val songAdapter = SongAdapter( val songAdapter = ShuffleButtonSongAdapter(
requireActivity(), requireActivity(),
mutableListOf(), mutableListOf(),
R.layout.item_list, null R.layout.item_list, null
@ -93,7 +86,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
private fun topPlayed() { private fun topPlayed() {
toolbar.setTitle(R.string.my_top_tracks) toolbar.setTitle(R.string.my_top_tracks)
val songAdapter = SongAdapter( val songAdapter = ShuffleButtonSongAdapter(
requireActivity(), requireActivity(),
mutableListOf(), mutableListOf(),
R.layout.item_list, null R.layout.item_list, null
@ -110,7 +103,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
private fun loadHistory() { private fun loadHistory() {
toolbar.setTitle(R.string.history) toolbar.setTitle(R.string.history)
val songAdapter = SongAdapter( val songAdapter = ShuffleButtonSongAdapter(
requireActivity(), requireActivity(),
mutableListOf(), mutableListOf(),
R.layout.item_list, null R.layout.item_list, null

View file

@ -122,10 +122,6 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
volumeSeekBar.applyColor(color) volumeSeekBar.applyColor(color)
} }
fun removeThumb() {
volumeSeekBar.thumb = null
}
private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) { private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) {
if (PreferenceUtil.isPauseOnZeroVolume) if (PreferenceUtil.isPauseOnZeroVolume)
if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume) if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume)

View file

@ -16,6 +16,7 @@ package io.github.muntashirakon.music.fragments.albums
import android.app.ActivityOptions import android.app.ActivityOptions
import android.content.Intent import android.content.Intent
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@ -31,7 +32,6 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.appthemehelper.common.ATHToolbarActivity.getToolbarBackgroundColor import code.name.monkey.appthemehelper.common.ATHToolbarActivity.getToolbarBackgroundColor
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import io.github.muntashirakon.music.EXTRA_ALBUM_ID import io.github.muntashirakon.music.EXTRA_ALBUM_ID
import io.github.muntashirakon.music.EXTRA_ARTIST_ID import io.github.muntashirakon.music.EXTRA_ARTIST_ID
@ -42,17 +42,17 @@ import io.github.muntashirakon.music.adapter.album.HorizontalAlbumAdapter
import io.github.muntashirakon.music.adapter.song.SimpleSongAdapter import io.github.muntashirakon.music.adapter.song.SimpleSongAdapter
import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog
import io.github.muntashirakon.music.dialogs.DeleteSongsDialog import io.github.muntashirakon.music.dialogs.DeleteSongsDialog
import io.github.muntashirakon.music.extensions.applyColor import io.github.muntashirakon.music.extensions.*
import io.github.muntashirakon.music.extensions.applyOutlineColor
import io.github.muntashirakon.music.extensions.findActivityNavController
import io.github.muntashirakon.music.extensions.show
import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment
import io.github.muntashirakon.music.glide.AlbumGlideRequest import io.github.muntashirakon.music.glide.AlbumGlideRequest
import io.github.muntashirakon.music.glide.ArtistGlideRequest import io.github.muntashirakon.music.glide.ArtistGlideRequest
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import io.github.muntashirakon.music.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.glide.SingleColorTarget import io.github.muntashirakon.music.glide.SingleColorTarget
import io.github.muntashirakon.music.helper.MusicPlayerRemote import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.SortOrder import io.github.muntashirakon.music.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_A_Z
import io.github.muntashirakon.music.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_DURATION
import io.github.muntashirakon.music.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_TRACK_LIST
import io.github.muntashirakon.music.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_Z_A
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import io.github.muntashirakon.music.interfaces.IAlbumClickListener
import io.github.muntashirakon.music.model.Album import io.github.muntashirakon.music.model.Album
import io.github.muntashirakon.music.model.Artist import io.github.muntashirakon.music.model.Artist
@ -64,7 +64,9 @@ import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.RetroUtil import io.github.muntashirakon.music.util.RetroUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import io.github.muntashirakon.music.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform import com.google.android.material.transition.MaterialContainerTransform
import com.google.android.material.transition.MaterialElevationScale
import kotlinx.android.synthetic.main.fragment_album_content.* import kotlinx.android.synthetic.main.fragment_album_content.*
import kotlinx.android.synthetic.main.fragment_album_details.* import kotlinx.android.synthetic.main.fragment_album_details.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -89,25 +91,26 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
private val savedSortOrder: String private val savedSortOrder: String
get() = PreferenceUtil.albumDetailSongSortOrder get() = PreferenceUtil.albumDetailSongSortOrder
private fun setUpTransitions() {
val transform = MaterialContainerTransform()
transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface))
sharedElementEnterTransition = transform
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setUpTransitions() sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.fragment_container
duration = 300L
scrimColor = Color.TRANSPARENT
setAllContainerColors(requireContext().resolveColor(R.attr.colorSurface))
setPathMotion(MaterialArcMotion())
}
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
mainActivity.setBottomBarVisibility(View.GONE) mainActivity.setBottomBarVisibility(false)
mainActivity.addMusicServiceEventListener(detailsViewModel) mainActivity.addMusicServiceEventListener(detailsViewModel)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
toolbar.title = " " toolbar.title = " "
ViewCompat.setTransitionName(container, "album") ViewCompat.setTransitionName(albumCoverContainer, "album")
postponeEnterTransition() postponeEnterTransition()
detailsViewModel.getAlbum().observe(viewLifecycleOwner, Observer { detailsViewModel.getAlbum().observe(viewLifecycleOwner, Observer {
startPostponedEnterTransition() startPostponedEnterTransition()
@ -117,6 +120,12 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
setupRecyclerView() setupRecyclerView()
artistImage.setOnClickListener { artistView -> artistImage.setOnClickListener { artistView ->
ViewCompat.setTransitionName(artistView, "artist") ViewCompat.setTransitionName(artistView, "artist")
exitTransition = MaterialElevationScale(false).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(true).apply {
duration = 300L
}
findActivityNavController(R.id.fragment_container) findActivityNavController(R.id.fragment_container)
.navigate( .navigate(
R.id.artistDetailsFragment, R.id.artistDetailsFragment,
@ -125,8 +134,9 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
FragmentNavigatorExtras(artistView to "artist") FragmentNavigatorExtras(artistView to "artist")
) )
} }
playAction.setOnClickListener { MusicPlayerRemote.openQueue(album.songs, 0, true) } playAction.setOnClickListener {
MusicPlayerRemote.openQueue(album.songs, 0, true)
}
shuffleAction.setOnClickListener { shuffleAction.setOnClickListener {
MusicPlayerRemote.openAndShuffleQueue( MusicPlayerRemote.openAndShuffleQueue(
album.songs, album.songs,
@ -141,9 +151,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
aboutAlbumText.maxLines = 4 aboutAlbumText.maxLines = 4
} }
} }
image.apply {
transitionName = getString(R.string.transition_album_art)
}
} }
override fun onDestroy() { override fun onDestroy() {
@ -255,7 +262,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
} }
private fun loadArtistImage(artist: Artist) { private fun loadArtistImage(artist: Artist) {
detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner, Observer { detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner, {
moreAlbums(it) moreAlbums(it)
}) })
ArtistGlideRequest.Builder.from(Glide.with(requireContext()), artist) ArtistGlideRequest.Builder.from(Glide.with(requireContext()), artist)
@ -288,6 +295,12 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
} }
override fun onAlbumClick(albumId: Long, view: View) { override fun onAlbumClick(albumId: Long, view: View) {
exitTransition = MaterialElevationScale(false).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(false).apply {
duration = 300L
}
findNavController().navigate( findNavController().navigate(
R.id.albumDetailsFragment, R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to albumId), bundleOf(EXTRA_ALBUM_ID to albumId),
@ -356,13 +369,10 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
) )
return true return true
} }
/*Sort*/ R.id.action_sort_order_title -> sortOrder = SONG_A_Z
R.id.action_sort_order_title -> sortOrder = SortOrder.AlbumSongSortOrder.SONG_A_Z R.id.action_sort_order_title_desc -> sortOrder = SONG_Z_A
R.id.action_sort_order_title_desc -> sortOrder = SortOrder.AlbumSongSortOrder.SONG_Z_A R.id.action_sort_order_track_list -> sortOrder = SONG_TRACK_LIST
R.id.action_sort_order_track_list -> sortOrder = R.id.action_sort_order_artist_song_duration -> sortOrder = SONG_DURATION
SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST
R.id.action_sort_order_artist_song_duration ->
sortOrder = SortOrder.AlbumSongSortOrder.SONG_DURATION
} }
if (sortOrder != null) { if (sortOrder != null) {
item.isChecked = true item.isChecked = true
@ -373,36 +383,34 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
private fun setUpSortOrderMenu(sortOrder: SubMenu) { private fun setUpSortOrderMenu(sortOrder: SubMenu) {
when (savedSortOrder) { when (savedSortOrder) {
SortOrder.AlbumSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title) SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked = true
.isChecked = true SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = true
SortOrder.AlbumSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc) SONG_TRACK_LIST ->
.isChecked = true sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = true
SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST -> sortOrder.findItem(R.id.action_sort_order_track_list) SONG_DURATION ->
.isChecked = true sortOrder.findItem(R.id.action_sort_order_artist_song_duration).isChecked = true
SortOrder.AlbumSongSortOrder.SONG_DURATION -> sortOrder.findItem(R.id.action_sort_order_artist_song_duration)
.isChecked = true
} }
} }
private fun setSaveSortOrder(sortOrder: String) { private fun setSaveSortOrder(sortOrder: String) {
PreferenceUtil.albumDetailSongSortOrder = sortOrder PreferenceUtil.albumDetailSongSortOrder = sortOrder
val songs = when (sortOrder) { val songs = when (sortOrder) {
SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST -> album.songs.sortedWith { o1, o2 -> SONG_TRACK_LIST -> album.songs.sortedWith { o1, o2 ->
o1.trackNumber.compareTo( o1.trackNumber.compareTo(
o2.trackNumber o2.trackNumber
) )
} }
SortOrder.AlbumSongSortOrder.SONG_A_Z -> album.songs.sortedWith { o1, o2 -> SONG_A_Z -> album.songs.sortedWith { o1, o2 ->
o1.title.compareTo( o1.title.compareTo(
o2.title o2.title
) )
} }
SortOrder.AlbumSongSortOrder.SONG_Z_A -> album.songs.sortedWith { o1, o2 -> SONG_Z_A -> album.songs.sortedWith { o1, o2 ->
o2.title.compareTo( o2.title.compareTo(
o1.title o1.title
) )
} }
SortOrder.AlbumSongSortOrder.SONG_DURATION -> album.songs.sortedWith { o1, o2 -> SONG_DURATION -> album.songs.sortedWith { o1, o2 ->
o1.duration.compareTo( o1.duration.compareTo(
o2.duration o2.duration
) )

View file

@ -17,7 +17,6 @@ package io.github.muntashirakon.music.fragments.albums
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.lifecycle.Observer
import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
@ -27,7 +26,6 @@ import io.github.muntashirakon.music.adapter.album.AlbumAdapter
import io.github.muntashirakon.music.extensions.surfaceColor import io.github.muntashirakon.music.extensions.surfaceColor
import io.github.muntashirakon.music.fragments.ReloadType import io.github.muntashirakon.music.fragments.ReloadType
import io.github.muntashirakon.music.fragments.base.AbsRecyclerViewCustomGridSizeFragment import io.github.muntashirakon.music.fragments.base.AbsRecyclerViewCustomGridSizeFragment
import io.github.muntashirakon.music.helper.SortOrder
import io.github.muntashirakon.music.helper.SortOrder.AlbumSortOrder import io.github.muntashirakon.music.helper.SortOrder.AlbumSortOrder
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import io.github.muntashirakon.music.interfaces.IAlbumClickListener
import io.github.muntashirakon.music.interfaces.ICabHolder import io.github.muntashirakon.music.interfaces.ICabHolder
@ -35,13 +33,14 @@ import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.RetroColorUtil import io.github.muntashirakon.music.util.RetroColorUtil
import io.github.muntashirakon.music.util.RetroUtil import io.github.muntashirakon.music.util.RetroUtil
import com.afollestad.materialcab.MaterialCab import com.afollestad.materialcab.MaterialCab
import com.google.android.material.transition.MaterialElevationScale
class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(), class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(),
IAlbumClickListener, ICabHolder { IAlbumClickListener, ICabHolder {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
libraryViewModel.getAlbums().observe(viewLifecycleOwner, Observer { libraryViewModel.getAlbums().observe(viewLifecycleOwner, {
if (it.isNotEmpty()) if (it.isNotEmpty())
adapter?.swapDataSet(it) adapter?.swapDataSet(it)
else else
@ -115,6 +114,12 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
} }
override fun onAlbumClick(albumId: Long, view: View) { override fun onAlbumClick(albumId: Long, view: View) {
exitTransition = MaterialElevationScale(false).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(true).apply {
duration = 300L
}
findNavController().navigate( findNavController().navigate(
R.id.albumDetailsFragment, R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to albumId), bundleOf(EXTRA_ALBUM_ID to albumId),
@ -148,28 +153,28 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
0, 0,
R.string.sort_order_a_z R.string.sort_order_a_z
).isChecked = ).isChecked =
currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_A_Z) currentSortOrder.equals(AlbumSortOrder.ALBUM_A_Z)
sortOrderMenu.add( sortOrderMenu.add(
0, 0,
R.id.action_album_sort_order_desc, R.id.action_album_sort_order_desc,
1, 1,
R.string.sort_order_z_a R.string.sort_order_z_a
).isChecked = ).isChecked =
currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_Z_A) currentSortOrder.equals(AlbumSortOrder.ALBUM_Z_A)
sortOrderMenu.add( sortOrderMenu.add(
0, 0,
R.id.action_album_sort_order_artist, R.id.action_album_sort_order_artist,
2, 2,
R.string.sort_order_artist R.string.sort_order_artist
).isChecked = ).isChecked =
currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_ARTIST) currentSortOrder.equals(AlbumSortOrder.ALBUM_ARTIST)
sortOrderMenu.add( sortOrderMenu.add(
0, 0,
R.id.action_album_sort_order_year, R.id.action_album_sort_order_year,
3, 3,
R.string.sort_order_year R.string.sort_order_year
).isChecked = ).isChecked =
currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_YEAR) currentSortOrder.equals(AlbumSortOrder.ALBUM_YEAR)
sortOrderMenu.setGroupCheckable(0, true, true) sortOrderMenu.setGroupCheckable(0, true, true)
} }
@ -300,16 +305,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
private var cab: MaterialCab? = null private var cab: MaterialCab? = null
fun handleBackPress(): Boolean {
cab?.let {
if (it.isActive) {
it.finish()
return true
}
}
return false
}
override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab { override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab {
cab?.let { cab?.let {
println("Cab") println("Cab")

View file

@ -16,6 +16,7 @@ package io.github.muntashirakon.music.fragments.artists
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.text.Spanned import android.text.Spanned
import android.view.Menu import android.view.Menu
@ -39,10 +40,7 @@ import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.album.HorizontalAlbumAdapter import io.github.muntashirakon.music.adapter.album.HorizontalAlbumAdapter
import io.github.muntashirakon.music.adapter.song.SimpleSongAdapter import io.github.muntashirakon.music.adapter.song.SimpleSongAdapter
import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog
import io.github.muntashirakon.music.extensions.applyColor import io.github.muntashirakon.music.extensions.*
import io.github.muntashirakon.music.extensions.applyOutlineColor
import io.github.muntashirakon.music.extensions.show
import io.github.muntashirakon.music.extensions.showToast
import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment
import io.github.muntashirakon.music.glide.ArtistGlideRequest import io.github.muntashirakon.music.glide.ArtistGlideRequest
import io.github.muntashirakon.music.glide.SingleColorTarget import io.github.muntashirakon.music.glide.SingleColorTarget
@ -57,6 +55,7 @@ import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.RetroUtil import io.github.muntashirakon.music.util.RetroUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.google.android.material.transition.MaterialContainerTransform import com.google.android.material.transition.MaterialContainerTransform
import com.google.android.material.transition.MaterialElevationScale
import kotlinx.android.synthetic.main.fragment_artist_content.* import kotlinx.android.synthetic.main.fragment_artist_content.*
import kotlinx.android.synthetic.main.fragment_artist_details.* import kotlinx.android.synthetic.main.fragment_artist_details.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -81,27 +80,26 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d
private var lang: String? = null private var lang: String? = null
private var biography: Spanned? = null private var biography: Spanned? = null
private fun setUpTransitions() {
val transform = MaterialContainerTransform()
transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface))
sharedElementEnterTransition = transform
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setUpTransitions() sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.fragment_container
duration = 300L
scrimColor = Color.TRANSPARENT
setAllContainerColors(requireContext().resolveColor(R.attr.colorSurface))
}
} }
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
mainActivity.setBottomBarVisibility(View.GONE) mainActivity.setBottomBarVisibility(false)
mainActivity.addMusicServiceEventListener(detailsViewModel) mainActivity.addMusicServiceEventListener(detailsViewModel)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
toolbar.title = null toolbar.title = null
ViewCompat.setTransitionName(container, "artist") ViewCompat.setTransitionName(artistCoverContainer, "artist")
postponeEnterTransition() postponeEnterTransition()
detailsViewModel.getArtist().observe(viewLifecycleOwner, Observer { detailsViewModel.getArtist().observe(viewLifecycleOwner, {
startPostponedEnterTransition() startPostponedEnterTransition()
showArtist(it) showArtist(it)
}) })
@ -150,14 +148,12 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d
MusicUtil.getArtistInfoString(requireContext(), artist), MusicUtil.getArtistInfoString(requireContext(), artist),
MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(artist.songs)) MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(artist.songs))
) )
val songText = val songText = resources.getQuantityString(
resources.getQuantityString(
R.plurals.albumSongs, R.plurals.albumSongs,
artist.songCount, artist.songCount,
artist.songCount artist.songCount
) )
val albumText = val albumText = resources.getQuantityString(
resources.getQuantityString(
R.plurals.albums, R.plurals.albums,
artist.songCount, artist.songCount,
artist.songCount artist.songCount
@ -228,6 +224,12 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d
} }
override fun onAlbumClick(albumId: Long, view: View) { override fun onAlbumClick(albumId: Long, view: View) {
exitTransition = MaterialElevationScale(false).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(false).apply {
duration = 300L
}
findNavController().navigate( findNavController().navigate(
R.id.albumDetailsFragment, R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to albumId), bundleOf(EXTRA_ALBUM_ID to albumId),

View file

@ -34,6 +34,7 @@ import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.RetroColorUtil import io.github.muntashirakon.music.util.RetroColorUtil
import io.github.muntashirakon.music.util.RetroUtil import io.github.muntashirakon.music.util.RetroUtil
import com.afollestad.materialcab.MaterialCab import com.afollestad.materialcab.MaterialCab
import com.google.android.material.transition.MaterialElevationScale
class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(), class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(),
IArtistClickListener, ICabHolder { IArtistClickListener, ICabHolder {
@ -114,6 +115,12 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
} }
override fun onArtist(artistId: Long, view: View) { override fun onArtist(artistId: Long, view: View) {
exitTransition = MaterialElevationScale(true).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(false).apply {
duration = 300L
}
findNavController().navigate( findNavController().navigate(
R.id.artistDetailsFragment, R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to artistId), bundleOf(EXTRA_ARTIST_ID to artistId),
@ -160,13 +167,13 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
when (itemLayoutRes()) { when (itemLayoutRes()) {
R.layout.item_card -> subMenu.findItem(R.id.action_layout_card).isChecked = true R.layout.item_card -> subMenu.findItem(R.id.action_layout_card).isChecked = true
R.layout.item_grid -> subMenu.findItem(R.id.action_layout_normal).isChecked = true R.layout.item_grid -> subMenu.findItem(R.id.action_layout_normal).isChecked = true
R.layout.item_card_color -> R.layout.item_card_color -> subMenu.findItem(R.id.action_layout_colored_card).isChecked =
subMenu.findItem(R.id.action_layout_colored_card).isChecked = true true
R.layout.item_grid_circle -> R.layout.item_grid_circle -> subMenu.findItem(R.id.action_layout_circular).isChecked =
subMenu.findItem(R.id.action_layout_circular).isChecked = true true
R.layout.image -> subMenu.findItem(R.id.action_layout_image).isChecked = true R.layout.image -> subMenu.findItem(R.id.action_layout_image).isChecked = true
R.layout.item_image_gradient -> R.layout.item_image_gradient -> subMenu.findItem(R.id.action_layout_gradient_image).isChecked =
subMenu.findItem(R.id.action_layout_gradient_image).isChecked = true true
} }
} }
@ -275,21 +282,11 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
} }
return false return false
} }
private var cab: MaterialCab? = null
fun handleBackPress(): Boolean { private var cab: MaterialCab? = null
cab?.let {
if (it.isActive) {
it.finish()
return true
}
}
return false
}
override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab { override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab {
cab?.let { cab?.let {
println("Cab")
if (it.isActive) { if (it.isActive) {
it.finish() it.finish()
} }

View file

@ -22,6 +22,7 @@ import android.view.View
import androidx.annotation.NonNull import androidx.annotation.NonNull
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.core.view.doOnPreDraw
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -53,7 +54,11 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mainActivity.setBottomBarVisibility(View.VISIBLE)
postponeEnterTransition()
view.doOnPreDraw { startPostponedEnterTransition() }
mainActivity.setBottomBarVisibility(true)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
mainActivity.supportActionBar?.title = null mainActivity.supportActionBar?.title = null
initLayoutManager() initLayoutManager()
@ -78,7 +83,6 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
layoutManager = this@AbsRecyclerViewFragment.layoutManager layoutManager = this@AbsRecyclerViewFragment.layoutManager
adapter = this@AbsRecyclerViewFragment.adapter adapter = this@AbsRecyclerViewFragment.adapter
val fastScroller = create(this) val fastScroller = create(this)
} }
checkForPadding() checkForPadding()
} }

View file

@ -166,7 +166,7 @@ public class FoldersFragment extends AbsMainActivityFragment
@Override @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
getMainActivity().addMusicServiceEventListener(getLibraryViewModel()); getMainActivity().addMusicServiceEventListener(getLibraryViewModel());
getMainActivity().setBottomBarVisibility(View.VISIBLE); getMainActivity().setBottomBarVisibility(true);
getMainActivity().setSupportActionBar(toolbar); getMainActivity().setSupportActionBar(toolbar);
getMainActivity().getSupportActionBar().setTitle(null); getMainActivity().getSupportActionBar().setTitle(null);
setStatusBarColorAuto(view); setStatusBarColorAuto(view);

View file

@ -14,6 +14,7 @@
*/ */
package io.github.muntashirakon.music.fragments.genres package io.github.muntashirakon.music.fragments.genres
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
@ -24,14 +25,15 @@ import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.util.ATHUtil
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.song.SongAdapter import io.github.muntashirakon.music.adapter.song.SongAdapter
import io.github.muntashirakon.music.extensions.dipToPix import io.github.muntashirakon.music.extensions.dipToPix
import io.github.muntashirakon.music.extensions.resolveColor
import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment
import io.github.muntashirakon.music.helper.menu.GenreMenuHelper import io.github.muntashirakon.music.helper.menu.GenreMenuHelper
import io.github.muntashirakon.music.model.Genre import io.github.muntashirakon.music.model.Genre
import io.github.muntashirakon.music.model.Song import io.github.muntashirakon.music.model.Song
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform import com.google.android.material.transition.MaterialContainerTransform
import kotlinx.android.synthetic.main.fragment_playlist_detail.* import kotlinx.android.synthetic.main.fragment_playlist_detail.*
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
@ -45,21 +47,22 @@ class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_
} }
private lateinit var genre: Genre private lateinit var genre: Genre
private lateinit var songAdapter: SongAdapter private lateinit var songAdapter: SongAdapter
private fun setUpTransitions() {
val transform = MaterialContainerTransform()
transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface))
sharedElementEnterTransition = transform
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setUpTransitions() sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.fragment_container
duration = 300L
scrimColor = Color.TRANSPARENT
setAllContainerColors(requireContext().resolveColor(R.attr.colorSurface))
setPathMotion(MaterialArcMotion())
}
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
mainActivity.setBottomBarVisibility(View.GONE) mainActivity.setBottomBarVisibility(false)
mainActivity.addMusicServiceEventListener(detailsViewModel) mainActivity.addMusicServiceEventListener(detailsViewModel)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
ViewCompat.setTransitionName(container, "genre") ViewCompat.setTransitionName(container, "genre")

View file

@ -27,6 +27,7 @@ import io.github.muntashirakon.music.adapter.GenreAdapter
import io.github.muntashirakon.music.fragments.base.AbsRecyclerViewFragment import io.github.muntashirakon.music.fragments.base.AbsRecyclerViewFragment
import io.github.muntashirakon.music.interfaces.IGenreClickListener import io.github.muntashirakon.music.interfaces.IGenreClickListener
import io.github.muntashirakon.music.model.Genre import io.github.muntashirakon.music.model.Genre
import com.google.android.material.transition.MaterialElevationScale
class GenresFragment : AbsRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(), class GenresFragment : AbsRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(),
IGenreClickListener { IGenreClickListener {
@ -63,6 +64,12 @@ class GenresFragment : AbsRecyclerViewFragment<GenreAdapter, LinearLayoutManager
} }
override fun onClickGenre(genre: Genre, view: View) { override fun onClickGenre(genre: Genre, view: View) {
exitTransition = MaterialElevationScale(false).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(true).apply {
duration = 300L
}
findNavController().navigate( findNavController().navigate(
R.id.genreDetailsFragment, R.id.genreDetailsFragment,
bundleOf(EXTRA_GENRE to genre), bundleOf(EXTRA_GENRE to genre),

View file

@ -48,7 +48,7 @@ class HomeFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mainActivity.setBottomBarVisibility(View.VISIBLE) mainActivity.setBottomBarVisibility(true)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
mainActivity.supportActionBar?.title = null mainActivity.supportActionBar?.title = null
setStatusBarColorAuto(view) setStatusBarColorAuto(view)

View file

@ -41,7 +41,7 @@ class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
mainActivity.setBottomBarVisibility(View.VISIBLE) mainActivity.setBottomBarVisibility(true)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
mainActivity.supportActionBar?.title = null mainActivity.supportActionBar?.title = null
toolbar.setNavigationOnClickListener { toolbar.setNavigationOnClickListener {

View file

@ -16,9 +16,11 @@ package io.github.muntashirakon.music.fragments.player.full
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import android.os.AsyncTask import android.os.AsyncTask
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
@ -27,12 +29,18 @@ import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import android.widget.PopupMenu import android.widget.PopupMenu
import android.widget.SeekBar import android.widget.SeekBar
import androidx.lifecycle.lifecycleScope
import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.db.PlaylistEntity
import io.github.muntashirakon.music.db.SongEntity
import io.github.muntashirakon.music.db.toSongEntity
import io.github.muntashirakon.music.extensions.applyColor import io.github.muntashirakon.music.extensions.applyColor
import io.github.muntashirakon.music.extensions.hide import io.github.muntashirakon.music.extensions.hide
import io.github.muntashirakon.music.extensions.show import io.github.muntashirakon.music.extensions.show
import io.github.muntashirakon.music.fragments.LibraryViewModel
import io.github.muntashirakon.music.fragments.ReloadType
import io.github.muntashirakon.music.fragments.base.AbsPlayerControlsFragment import io.github.muntashirakon.music.fragments.base.AbsPlayerControlsFragment
import io.github.muntashirakon.music.helper.MusicPlayerRemote import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.MusicProgressViewUpdateHelper import io.github.muntashirakon.music.helper.MusicProgressViewUpdateHelper
@ -42,8 +50,13 @@ import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.service.MusicService import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.util.MusicUtil import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.PreferenceUtil import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.RetroUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import io.github.muntashirakon.music.util.color.MediaNotificationProcessor
import kotlinx.android.synthetic.main.fragment_full_player_controls.* import kotlinx.android.synthetic.main.fragment_full_player_controls.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
/** /**
* Created by hemanths on 20/09/17. * Created by hemanths on 20/09/17.
@ -56,6 +69,7 @@ class FullPlaybackControlsFragment :
private var lastPlaybackControlsColor: Int = 0 private var lastPlaybackControlsColor: Int = 0
private var lastDisabledPlaybackControlsColor: Int = 0 private var lastDisabledPlaybackControlsColor: Int = 0
private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper
private val libraryViewModel: LibraryViewModel by sharedViewModel()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -158,7 +172,6 @@ class FullPlaybackControlsFragment :
} }
private fun setUpPlayPauseFab() { private fun setUpPlayPauseFab() {
playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler())
playPauseButton.post { playPauseButton.post {
if (playPauseButton != null) { if (playPauseButton != null) {
@ -283,44 +296,41 @@ class FullPlaybackControlsFragment :
} }
} }
private fun toggleFavorite(song: Song) {
MusicUtil.toggleFavorite(requireContext(), song)
if (song.id == MusicPlayerRemote.currentSong.id) {
updateIsFavorite()
}
}
private var updateIsFavoriteTask: AsyncTask<*, *, *>? = null
@SuppressLint("StaticFieldLeak")
fun updateIsFavorite() { fun updateIsFavorite() {
if (updateIsFavoriteTask != null) { lifecycleScope.launch(Dispatchers.IO) {
updateIsFavoriteTask?.cancel(false) val playlist: PlaylistEntity? = libraryViewModel.favoritePlaylist()
} if (playlist != null) {
updateIsFavoriteTask = object : AsyncTask<Song, Void, Boolean>() { val song: SongEntity =
override fun doInBackground(vararg params: Song): Boolean? { MusicPlayerRemote.currentSong.toSongEntity(playlist.playListId)
val activity = activity val isFavorite: Boolean = libraryViewModel.isFavoriteSong(song).isNotEmpty()
return if (activity != null) { withContext(Dispatchers.Main) {
MusicUtil.isFavorite(requireActivity(), params[0]) val icon =
} else { if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border
cancel(false) val drawable = TintHelper.createTintedDrawable(activity, icon, Color.WHITE)
null
}
}
override fun onPostExecute(isFavorite: Boolean?) {
val activity = activity
if (activity != null) {
val res = if (isFavorite!!)
R.drawable.ic_favorite
else
R.drawable.ic_favorite_border
val drawable = TintHelper.createTintedDrawable(activity, res, Color.WHITE)
songFavourite?.setImageDrawable(drawable) songFavourite?.setImageDrawable(drawable)
} }
} }
}.execute(MusicPlayerRemote.currentSong) }
}
private fun toggleFavorite(song: Song) {
if (song.id == MusicPlayerRemote.currentSong.id) {
updateIsFavorite()
}
lifecycleScope.launch(Dispatchers.IO) {
val playlist: PlaylistEntity? = libraryViewModel.favoritePlaylist()
if (playlist != null) {
val songEntity = song.toSongEntity(playlist.playListId)
val isFavorite = libraryViewModel.isFavoriteSong(songEntity).isNotEmpty()
if (isFavorite) {
libraryViewModel.removeSongFromPlaylist(songEntity)
} else {
libraryViewModel.insertSongs(listOf(song.toSongEntity(playlist.playListId)))
}
}
libraryViewModel.forceReload(ReloadType.Playlists)
requireContext().sendBroadcast(Intent(MusicService.FAVORITE_STATE_CHANGED))
}
} }
fun onFavoriteToggled() { fun onFavoriteToggled() {

View file

@ -1,5 +1,6 @@
package io.github.muntashirakon.music.fragments.playlists package io.github.muntashirakon.music.fragments.playlists
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
@ -12,14 +13,15 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ATHUtil
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.song.PlaylistSongAdapter import io.github.muntashirakon.music.adapter.song.ShuffleButtonSongAdapter
import io.github.muntashirakon.music.db.PlaylistWithSongs import io.github.muntashirakon.music.db.PlaylistWithSongs
import io.github.muntashirakon.music.db.toSongs import io.github.muntashirakon.music.db.toSongs
import io.github.muntashirakon.music.extensions.dipToPix import io.github.muntashirakon.music.extensions.dipToPix
import io.github.muntashirakon.music.extensions.resolveColor
import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment
import io.github.muntashirakon.music.helper.menu.PlaylistMenuHelper import io.github.muntashirakon.music.helper.menu.PlaylistMenuHelper
import io.github.muntashirakon.music.model.Song import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.state.NowPlayingPanelState import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform import com.google.android.material.transition.MaterialContainerTransform
import kotlinx.android.synthetic.main.fragment_playlist_detail.* import kotlinx.android.synthetic.main.fragment_playlist_detail.*
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
@ -32,23 +34,23 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
} }
private lateinit var playlist: PlaylistWithSongs private lateinit var playlist: PlaylistWithSongs
private lateinit var playlistSongAdapter: PlaylistSongAdapter private lateinit var playlistSongAdapter: ShuffleButtonSongAdapter
private fun setUpTransitions() {
val transform = MaterialContainerTransform()
transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface))
sharedElementEnterTransition = transform
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setUpTransitions() sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.fragment_container
duration = 300L
scrimColor = Color.TRANSPARENT
setAllContainerColors(requireContext().resolveColor(R.attr.colorSurface))
setPathMotion(MaterialArcMotion())
}
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
mainActivity.setBottomBarVisibility(View.GONE) mainActivity.setBottomBarVisibility(false)
mainActivity.addMusicServiceEventListener(viewModel) mainActivity.addMusicServiceEventListener(viewModel)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
ViewCompat.setTransitionName(container, "playlist") ViewCompat.setTransitionName(container, "playlist")
@ -61,8 +63,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
} }
private fun setUpRecyclerView() { private fun setUpRecyclerView() {
playlistSongAdapter = PlaylistSongAdapter( playlistSongAdapter = ShuffleButtonSongAdapter(
playlist.playlistEntity,
requireActivity(), requireActivity(),
ArrayList(), ArrayList(),
R.layout.item_list, R.layout.item_list,

View file

@ -35,6 +35,7 @@ import io.github.muntashirakon.music.fragments.base.AbsRecyclerViewCustomGridSiz
import io.github.muntashirakon.music.helper.SortOrder.PlaylistSortOrder import io.github.muntashirakon.music.helper.SortOrder.PlaylistSortOrder
import io.github.muntashirakon.music.interfaces.IPlaylistClickListener import io.github.muntashirakon.music.interfaces.IPlaylistClickListener
import io.github.muntashirakon.music.util.PreferenceUtil import io.github.muntashirakon.music.util.PreferenceUtil
import com.google.android.material.transition.MaterialElevationScale
import kotlinx.android.synthetic.main.fragment_library.* import kotlinx.android.synthetic.main.fragment_library.*
class PlaylistsFragment : class PlaylistsFragment :
@ -183,6 +184,12 @@ class PlaylistsFragment :
} }
override fun onPlaylistClick(playlistWithSongs: PlaylistWithSongs, view: View) { override fun onPlaylistClick(playlistWithSongs: PlaylistWithSongs, view: View) {
exitTransition = MaterialElevationScale(false).apply {
duration = 300L
}
reenterTransition = MaterialElevationScale(true).apply {
duration = 300L
}
findNavController().navigate( findNavController().navigate(
R.id.playlistDetailsFragment, R.id.playlistDetailsFragment,
bundleOf(EXTRA_PLAYLIST to playlistWithSongs), bundleOf(EXTRA_PLAYLIST to playlistWithSongs),

View file

@ -15,12 +15,15 @@
package io.github.muntashirakon.music.fragments.search package io.github.muntashirakon.music.fragments.search
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.speech.RecognizerIntent import android.speech.RecognizerIntent
import android.text.Editable import android.text.Editable
import android.text.TextWatcher import android.text.TextWatcher
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -28,12 +31,11 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager import androidx.transition.TransitionManager
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.SearchAdapter import io.github.muntashirakon.music.adapter.SearchAdapter
import io.github.muntashirakon.music.extensions.accentColor import io.github.muntashirakon.music.extensions.*
import io.github.muntashirakon.music.extensions.dipToPix
import io.github.muntashirakon.music.extensions.focusAndShowKeyboard
import io.github.muntashirakon.music.extensions.showToast
import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform
import kotlinx.android.synthetic.main.fragment_search.* import kotlinx.android.synthetic.main.fragment_search.*
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -47,18 +49,30 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
private lateinit var searchAdapter: SearchAdapter private lateinit var searchAdapter: SearchAdapter
private var query: String? = null private var query: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedElementEnterTransition = MaterialContainerTransform().apply {
drawingViewId = R.id.fragment_container
duration = 300L
scrimColor = Color.TRANSPARENT
setAllContainerColors(requireContext().resolveColor(R.attr.colorSurface))
setPathMotion(MaterialArcMotion())
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mainActivity.setBottomBarVisibility(View.GONE) mainActivity.setBottomBarVisibility(false)
mainActivity.setSupportActionBar(toolbar) mainActivity.setSupportActionBar(toolbar)
libraryViewModel.clearSearchResult() libraryViewModel.clearSearchResult()
setupRecyclerView() setupRecyclerView()
voiceSearch.setOnClickListener { startMicSearch() }
clearText.setOnClickListener { searchView.clearText() }
searchView.apply { searchView.apply {
addTextChangedListener(this@SearchFragment) addTextChangedListener(this@SearchFragment)
focusAndShowKeyboard() focusAndShowKeyboard()
} }
voiceSearch.setOnClickListener { startMicSearch() }
clearText.setOnClickListener { searchView.clearText() }
keyboardPopup.apply { keyboardPopup.apply {
accentColor() accentColor()
setOnClickListener { setOnClickListener {
@ -143,6 +157,19 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
showToast(getString(R.string.speech_not_supported)) showToast(getString(R.string.speech_not_supported))
} }
} }
override fun onDestroyView() {
hideKeyboard(view)
super.onDestroyView()
}
private fun hideKeyboard(view: View?) {
if (view != null) {
val imm: InputMethodManager =
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}
} }
fun TextInputEditText.clearText() { fun TextInputEditText.clearText() {

View file

@ -20,6 +20,7 @@ import androidx.annotation.LayoutRes
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import io.github.muntashirakon.music.R import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.song.ShuffleButtonSongAdapter
import io.github.muntashirakon.music.adapter.song.SongAdapter import io.github.muntashirakon.music.adapter.song.SongAdapter
import io.github.muntashirakon.music.extensions.surfaceColor import io.github.muntashirakon.music.extensions.surfaceColor
import io.github.muntashirakon.music.fragments.ReloadType import io.github.muntashirakon.music.fragments.ReloadType
@ -35,7 +36,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
ICabHolder { ICabHolder {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
libraryViewModel.getSongs().observe(viewLifecycleOwner, Observer { libraryViewModel.getSongs().observe(viewLifecycleOwner, {
if (it.isNotEmpty()) if (it.isNotEmpty())
adapter?.swapDataSet(it) adapter?.swapDataSet(it)
else else
@ -52,7 +53,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
override fun createAdapter(): SongAdapter { override fun createAdapter(): SongAdapter {
val dataSet = if (adapter == null) mutableListOf() else adapter!!.dataSet val dataSet = if (adapter == null) mutableListOf() else adapter!!.dataSet
return SongAdapter( return ShuffleButtonSongAdapter(
requireActivity(), requireActivity(),
dataSet, dataSet,
itemLayoutRes(), itemLayoutRes(),
@ -198,8 +199,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
gridSizeMenu: SubMenu gridSizeMenu: SubMenu
) { ) {
when (getGridSize()) { when (getGridSize()) {
1 -> gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = 1 -> gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = true
true
2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true 2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true
3 -> gridSizeMenu.findItem(R.id.action_grid_size_3).isChecked = true 3 -> gridSizeMenu.findItem(R.id.action_grid_size_3).isChecked = true
4 -> gridSizeMenu.findItem(R.id.action_grid_size_4).isChecked = true 4 -> gridSizeMenu.findItem(R.id.action_grid_size_4).isChecked = true

View file

@ -71,7 +71,7 @@ class LibraryPreferenceDialog : DialogFragment() {
categoryAdapter.categoryInfos = PreferenceUtil.defaultCategories categoryAdapter.categoryInfos = PreferenceUtil.defaultCategories
} }
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok) { _, _ -> updateCategories(categoryAdapter.categoryInfos) } .setPositiveButton( R.string.done) { _, _ -> updateCategories(categoryAdapter.categoryInfos) }
.setView(view) .setView(view)
.create() .create()
.colorButtons() .colorButtons()

View file

@ -100,7 +100,6 @@ class RealRoomRepository(
playlistDao.insertSongsToPlaylist(songs) playlistDao.insertSongsToPlaylist(songs)
} }
override fun getSongs(playListId: Long): LiveData<List<SongEntity>> = override fun getSongs(playListId: Long): LiveData<List<SongEntity>> =
playlistDao.songsFromPlaylist(playListId) playlistDao.songsFromPlaylist(playListId)
@ -160,8 +159,7 @@ class RealRoomRepository(
) )
override suspend fun favoritePlaylistSongs(favorite: String): List<SongEntity> = override suspend fun favoritePlaylistSongs(favorite: String): List<SongEntity> =
if (playlistDao.isPlaylistExists(favorite).isNotEmpty()) if (playlistDao.isPlaylistExists(favorite).isNotEmpty()) playlistDao.favoritesSongs(
playlistDao.favoritesSongs(
playlistDao.isPlaylistExists(favorite).first().playListId playlistDao.isPlaylistExists(favorite).first().playListId
) else emptyList() ) else emptyList()
@ -192,11 +190,9 @@ class RealRoomRepository(
override suspend fun blackListPaths(): List<BlackListStoreEntity> = override suspend fun blackListPaths(): List<BlackListStoreEntity> =
blackListStoreDao.blackListPaths() blackListStoreDao.blackListPaths()
override suspend fun deleteSongs(songs: List<Song>) { override suspend fun deleteSongs(songs: List<Song>) = songs.forEach {
songs.forEach {
playCountDao.deleteSong(it.id) playCountDao.deleteSong(it.id)
} }
}
override suspend fun deleteBlacklistPath(blackListStoreEntity: BlackListStoreEntity) = override suspend fun deleteBlacklistPath(blackListStoreEntity: BlackListStoreEntity) =
blackListStoreDao.deleteBlacklistPath(blackListStoreEntity) blackListStoreDao.deleteBlacklistPath(blackListStoreEntity)

View file

@ -94,7 +94,7 @@ object MusicUtil : KoinComponent {
fun deleteAlbumArt(context: Context, albumId: Long) { fun deleteAlbumArt(context: Context, albumId: Long) {
val contentResolver = context.contentResolver val contentResolver = context.contentResolver
val localUri = Uri.parse("content://media/external/audio/albumart") val localUri = Uri.parse("content://media/external/audio/albumart")
contentResolver.delete(ContentUris.withAppendedId(localUri, albumId.toLong()), null, null) contentResolver.delete(ContentUris.withAppendedId(localUri, albumId), null, null)
contentResolver.notifyChange(localUri, null) contentResolver.notifyChange(localUri, null)
} }
@ -165,7 +165,7 @@ object MusicUtil : KoinComponent {
try { try {
val newLyrics = val newLyrics =
FileUtil.read(f) FileUtil.read(f)
if (newLyrics != null && !newLyrics.trim { it <= ' ' }.isEmpty()) { if (newLyrics != null && newLyrics.trim { it <= ' ' }.isNotEmpty()) {
if (AbsSynchronizedLyrics.isSynchronized(newLyrics)) { if (AbsSynchronizedLyrics.isSynchronized(newLyrics)) {
return newLyrics return newLyrics
} }
@ -283,9 +283,8 @@ object MusicUtil : KoinComponent {
path: String? path: String?
) { ) {
val contentResolver = context.contentResolver val contentResolver = context.contentResolver
val artworkUri = val artworkUri = Uri.parse("content://media/external/audio/albumart")
Uri.parse("content://media/external/audio/albumart") contentResolver.delete(ContentUris.withAppendedId(artworkUri, albumId), null, null)
contentResolver.delete(ContentUris.withAppendedId(artworkUri, albumId.toLong()), null, null)
val values = ContentValues() val values = ContentValues()
values.put("album_id", albumId) values.put("album_id", albumId)
values.put("_data", path) values.put("_data", path)
@ -444,9 +443,7 @@ object MusicUtil : KoinComponent {
} }
fun deleteTracks(context: Context, songs: List<Song>) { fun deleteTracks(context: Context, songs: List<Song>) {
val projection = arrayOf( val projection = arrayOf(BaseColumns._ID, MediaStore.MediaColumns.DATA)
BaseColumns._ID, MediaStore.MediaColumns.DATA
)
val selection = StringBuilder() val selection = StringBuilder()
selection.append(BaseColumns._ID + " IN (") selection.append(BaseColumns._ID + " IN (")
for (i in songs.indices) { for (i in songs.indices) {

View file

@ -27,7 +27,7 @@ import androidx.core.view.ViewCompat
import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import com.google.android.material.progressindicator.ProgressIndicator import com.google.android.material.progressindicator.CircularProgressIndicator
object ViewUtil { object ViewUtil {
@ -77,9 +77,9 @@ object ViewUtil {
) )
} }
fun setProgressDrawable(progressIndicator: ProgressIndicator, newColor: Int) { fun setProgressDrawable(indicator: CircularProgressIndicator, newColor: Int) {
progressIndicator.indicatorColors = intArrayOf(newColor) indicator.setIndicatorColor(newColor)
progressIndicator.trackColor = ColorUtil.withAlpha(newColor, 0.2f) indicator.trackColor = ColorUtil.withAlpha(newColor, 0.2f)
} }
fun hitTest(v: View, x: Int, y: Int): Boolean { fun hitTest(v: View, x: Int, y: Int): Boolean {

View file

@ -31,9 +31,12 @@ class RetroShapeableImageView @JvmOverloads constructor(
init { init {
val typedArray = val typedArray =
context.obtainStyledAttributes(attrs, R.styleable.RetroShapeableImageView, defStyle, -1) context.obtainStyledAttributes(attrs, R.styleable.RetroShapeableImageView, defStyle, -1)
val cornerSize = val cornerSize = typedArray.getDimension(R.styleable.RetroShapeableImageView_retroCornerSize, 0f)
typedArray.getDimension(R.styleable.RetroShapeableImageView_retroCornerSize, 0f) val circleShape = typedArray.getBoolean(R.styleable.RetroShapeableImageView_circleShape, false)
updateCornerSize(cornerSize) addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
val radius = width / 2f
shapeAppearanceModel = ShapeAppearanceModel().withCornerSize(radius)
}
typedArray.recycle() typedArray.recycle()
} }

View file

@ -60,15 +60,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical"> android:layout_gravity="center_vertical">
<com.google.android.material.progressindicator.ProgressIndicator <com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/progressBar" android:id="@+id/progressBar"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:circularRadius="16dp" android:layout_gravity="center"
app:indicatorColor="@android:color/black"
app:indicatorType="circular"
app:indicatorWidth="2dp"
app:linearSeamless="true"
tools:progress="10" /> tools:progress="10" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView

View file

@ -72,10 +72,10 @@
tools:visibility="visible" /> tools:visibility="visible" />
</LinearLayout> </LinearLayout>
<com.google.android.material.progressindicator.ProgressIndicator <com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/progressIndicator" android:id="@+id/progressIndicator"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="wrap_content" android:layout_height="100dp"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:indeterminate="true" /> android:indeterminate="true" />

View file

@ -9,7 +9,7 @@
android:padding="4dp" android:padding="4dp"
tools:ignore="MissingPrefix"> tools:ignore="MissingPrefix">
<io.github.muntashirakon.music.views.CircularImageView <io.github.muntashirakon.music.views.RetroShapeableImageView
android:id="@+id/image" android:id="@+id/image"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"

View file

@ -10,12 +10,11 @@
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/imageContainer" android:id="@+id/imageContainer"
android:layout_width="156dp" android:layout_width="156dp"
android:layout_height="0dp" android:layout_height="156dp"
android:layout_margin="8dp" android:layout_margin="8dp"
android:orientation="vertical" android:orientation="vertical"
app:cardCornerRadius="8dp" app:cardCornerRadius="8dp"
app:cardPreventCornerOverlap="true" app:cardPreventCornerOverlap="true"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">

View file

@ -12,59 +12,48 @@
~ See the GNU General Public License for more details. ~ See the GNU General Public License for more details.
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical|end" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/playAction" android:id="@+id/playAction"
android:layout_width="wrap_content" style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:layout_weight="1" android:paddingTop="12dp"
android:paddingBottom="12dp"
android:text="@string/action_play_all" android:text="@string/action_play_all"
android:visibility="gone" android:textColor="?android:attr/textColorPrimary"
app:backgroundTint="?attr/colorSurface" app:backgroundTint="?attr/colorSurface"
app:icon="@drawable/ic_play_arrow" /> app:cornerRadius="8dp"
app:layout_constraintEnd_toStartOf="@+id/shuffleAction"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/shuffleAction" android:id="@+id/shuffleAction"
android:layout_width="wrap_content" style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_weight="1" android:paddingTop="12dp"
android:paddingBottom="12dp"
android:text="@string/shuffle" android:text="@string/shuffle"
android:visibility="gone" android:textColor="?android:attr/textColorPrimary"
app:backgroundTint="?attr/colorSurface" app:backgroundTint="?attr/colorSurface"
app:icon="@drawable/ic_shuffle" /> app:cornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="@+id/playAction"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/playAction"
app:layout_constraintTop_toTopOf="@+id/playAction" />
<androidx.appcompat.widget.AppCompatImageView </androidx.constraintlayout.widget.ConstraintLayout>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:padding="16dp"
app:srcCompat="@drawable/ic_sort"
app:tint="?attr/colorControlNormal" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:padding="16dp"
app:srcCompat="@drawable/ic_grid_size"
app:tint="?attr/colorControlNormal" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:padding="16dp"
app:srcCompat="@drawable/ic_layout"
app:tint="?attr/colorControlNormal" />
</LinearLayout>

View file

@ -13,16 +13,19 @@
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="14dp"> android:padding="14dp"
app:layout_gravity="center">
<ProgressBar <ProgressBar
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate" style="@style/Widget.MaterialComponents.CircularProgressIndicator"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true" /> android:indeterminate="true" />
</LinearLayout> </LinearLayout>

View file

@ -20,6 +20,7 @@
android:background="?attr/rectSelector" android:background="?attr/rectSelector"
android:descendantFocusability="blocksDescendants" android:descendantFocusability="blocksDescendants"
android:focusable="true" android:focusable="true"
android:minHeight="@dimen/md_listitem_height"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingEnd="0dp" android:paddingEnd="0dp"
@ -41,11 +42,7 @@
android:layout_weight="1" android:layout_weight="1"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center_vertical" android:gravity="center_vertical"
android:minHeight="@dimen/md_listitem_height" android:paddingHorizontal="16dp"
android:paddingStart="@dimen/md_listitem_control_margin"
android:paddingLeft="@dimen/md_listitem_control_margin"
android:paddingTop="@dimen/md_listitem_vertical_margin_choice"
android:paddingBottom="@dimen/md_listitem_vertical_margin_choice"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/TextViewNormal" android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary"

View file

@ -20,8 +20,8 @@
<string name="action_go_to_genre">Aller au genre</string> <string name="action_go_to_genre">Aller au genre</string>
<string name="action_go_to_start_directory">Aller au dossier de départ</string> <string name="action_go_to_start_directory">Aller au dossier de départ</string>
<string name="action_grant">Accorder</string> <string name="action_grant">Accorder</string>
<string name="action_grid_size">Taille de la grille</string> <string name="action_grid_size">Taille de l\'affichage</string>
<string name="action_grid_size_land">Taille de la grille (paysage)</string> <string name="action_grid_size_land">Taille de l\'affichage (paysage)</string>
<string name="action_new_playlist">Nouvelle liste de lecture…</string> <string name="action_new_playlist">Nouvelle liste de lecture…</string>
<string name="action_next">Suivant</string> <string name="action_next">Suivant</string>
<string name="action_play">Lecture</string> <string name="action_play">Lecture</string>
@ -540,7 +540,7 @@
<string name="sort_order_artist">Artiste</string> <string name="sort_order_artist">Artiste</string>
<string name="sort_order_composer">Compositeur</string> <string name="sort_order_composer">Compositeur</string>
<string name="sort_order_date">Date</string> <string name="sort_order_date">Date</string>
<string name="sort_order_date_modified">Date modified</string> <string name="sort_order_date_modified">Date de modification</string>
<string name="sort_order_year">Année</string> <string name="sort_order_year">Année</string>
<string name="sort_order_z_a">Descendant</string> <string name="sort_order_z_a">Descendant</string>

View file

@ -0,0 +1,659 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<resources>
<string name="about_album_label">About %s</string>
<string name="about_settings_summary">အဖွဲ့နှင့် လူမှုကွန်ယက်လင့်ခ်များ</string>
<string name="accent_color">Accent Color</string>
<string name="accent_color_desc">The theme accent color (ခရမ်းရောင်သည်မူလအရောင်)</string>
<string name="action_about">About</string>
<string name="action_add_to_favorites">အကြိုက်ဆုံးသို့ထည့်မည်</string>
<string name="action_add_to_playing_queue">နားထောင်နေသည့်စာရင်းထဲသို့ထည့်မည်</string>
<string name="action_add_to_playlist">Playlist သို့ထည့်မည်</string>
<string name="action_clear_playing_queue">နားထောင်နေသည့်စာရင်းအားရှင်းမည်</string>
<string name="action_cycle_repeat">Cycle repeat mode</string>
<string name="action_delete">ဖျက်မည်</string>
<string name="action_delete_from_device">Device မှဖျက်မည်</string>
<string name="action_details">အသေးစိတ်</string>
<string name="action_go_to_album">Album သို့သွားမည်</string>
<string name="action_go_to_artist">အဆိုတော်သို့သွားမည်</string>
<string name="action_go_to_genre">အမျိုးအစားသို့သွားမည်</string>
<string name="action_go_to_start_directory">Directory အစသို့သွားမည်</string>
<string name="action_grant">ခွင့်ပြုမည်</string>
<string name="action_grid_size">အကွက်အရွယ်အစား</string>
<string name="action_grid_size_land">အကွက်အရွယ်အစား (land)</string>
<string name="action_new_playlist">Playlist အသစ်</string>
<string name="action_next">နောက်တစ်ပုဒ်</string>
<string name="action_play">Play မည်</string>
<string name="action_play_all">အားလုံး play မည်</string>
<string name="action_play_next">Play next</string>
<string name="action_play_pause">Play/ခေတ္တရပ်</string>
<string name="action_previous">ယခင်အပုဒ်</string>
<string name="action_remove_from_favorites">အကြိုက်ဆုံးမှထုတ်မည်</string>
<string name="action_remove_from_playing_queue">နားထောင်နေသည့်စာရင်းမှထုတ်မည်</string>
<string name="action_remove_from_playlist">Playlist မှထုတ်မည်</string>
<string name="action_rename">နာမည်ပြင်မည်</string>
<string name="action_save_playing_queue">နားထောင်နေသည့်စာရင်းအားသိမ်းမည်</string>
<string name="action_scan">စကန်ဖတ်မည်</string>
<string name="action_search">ရှာမည်</string>
<string name="action_set">စမည်</string>
<string name="action_set_as_ringtone">Ringtone အဖြစ်ထားမည်</string>
<string name="action_set_as_start_directory">Directory အစအဖြစ်ထားမည်</string>
<string name="action_settings">"Settings"</string>
<string name="action_share">မျှဝေမည်</string>
<string name="action_shuffle_all">အားလုံး Shuffle play မည်</string>
<string name="action_shuffle_playlist">Playlist အား Shuffle play မည်</string>
<string name="action_sleep_timer">Sleep Timer</string>
<string name="action_sort_order">အထားအသိုပြင်မည်</string>
<string name="action_tag_editor">Tag တည်းဖြတ်ခြင်း</string>
<string name="action_toggle_favorite">Toggle favorite</string>
<string name="action_toggle_shuffle">Toggle shuffle mode</string>
<string name="adaptive">Adaptive</string>
<string name="add_action">ထည့်မည်</string>
<string name="add_playlist_title">"အောက်ပါ Playlist သို့ထည့်မည်"</string>
<string name="added_title_to_playing_queue">"နားထောင်နေသည့်စာရင်းထဲသို့ ၁ ပုဒ်ပေါင်းထည့်ခဲ့သည်"</string>
<string name="added_x_titles_to_playing_queue">နားထောင်နေသည့်စာရင်းထဲသို့ %1$d ပုဒ်ပေါင်းထည့်ခဲ့သည်</string>
<string name="album">Album</string>
<plurals name="albumSongs">
<item quantity="one">သီချင်း</item>
<item quantity="other">သီချင်းများ</item>
</plurals>
<string name="album_artist">Album အားသီဆိုသူ</string>
<string name="albums">Albums</string>
<plurals name="albums">
<item quantity="one">Album</item>
<item quantity="other">Albums</item>
</plurals>
<string name="always">Always</string>
<string name="app_share">ဟေ့ အရမ်းမိုက်တဲ့ဒီ Music Player ကိုတစ်ချက်ကြည့်ကြည့်! https://play.google.com/store/apps/details?id=%s</string>
<string name="app_shortcut_shuffle_all_short">Shuffle</string>
<string name="app_shortcut_top_tracks_short">ထိပ်ဆုံးသီချင်းများ</string>
<string name="app_widget_big_name">ပုံအပြည့်</string>
<string name="app_widget_card_name">ကတ်</string>
<string name="app_widget_classic_name">ရိုးရိုး</string>
<string name="app_widget_small_name">အသေး</string>
<string name="app_widget_text_name">စာပါဝင်မှုနည်း</string>
<string name="artist">အဆိုတော်</string>
<string name="artists">အဆိုတော်များ</string>
<string name="audio_focus_denied">အသံအာရုံစိုက်ခြင်းအား ပယ်ဖျက်ခဲ့သည်</string>
<string name="audio_settings_summary">အသံ Settings များပြောင်းလဲရန်နှင့် Equalizer ချိန်ညှိရန်</string>
<string name="auto">အလိုအလျောက်</string>
<string name="biography">အတ္ထုပတ္တိ</string>
<string name="black_theme_name">အနက်ရောင်သာ</string>
<string name="blacklist">လစ်လျူရှုမည့်စာရင်း</string>
<string name="blur">Blur</string>
<string name="blur_card">ကတ်အဝါး</string>
<string name="bug_report_failed">သတင်းပို့၍မရနိုင်ပါ</string>
<string name="bug_report_failed_invalid_token">မမှန်ကန်သော Access token ဖြစ်သည်။ ကျေးဇူးပြု၍ App ရေးသားသူအားဆက်သွယ်ပါ။</string>
<string name="bug_report_failed_issues_not_available">ရွေးချယ်ထားသော Repository အတွက် Issue ဖွင့်ခွင့်မပေးထားပါ။ ကျေးဇူးပြု၍ App ရေးသားသူအားဆက်သွယ်ပါ။</string>
<string name="bug_report_failed_unknown">မသိထားသော Error တက်သွားခဲ့သည်။ ကျေးဇူးပြု၍ App ရေးသားသူအားဆက်သွယ်ပါ။</string>
<string name="bug_report_failed_wrong_credentials">Username (သို့မဟုတ်) Password မှားနေသည်</string>
<string name="bug_report_issue">အကြောင်းအရာ</string>
<string name="bug_report_manual">ကိုယ်တိုင်အသေးစိတ်သတင်းပို့မည်</string>
<string name="bug_report_no_description">ကျေးဇူးပြု၍ အကြောင်းအရာအသေးစိတ်ကိုဖြည့်သွင်းပါ</string>
<string name="bug_report_no_password">ကျေးဇူးပြု၍ မှန်ကန်သော Github password ကိုဖြည့်သွင်းပါ</string>
<string name="bug_report_no_title">ကျေးဇူးပြု၍အကြောင်းအရာခေါင်းစဉ်အားဖြည့်သွင်းပါ</string>
<string name="bug_report_no_username">ကျေးဇူးပြု၍ မှန်ကန်သော Github username ကိုဖြည့်သွင်းပါ</string>
<string name="bug_report_summary">မသိထားတဲ့ Error တစ်ခုတက်ခဲ့တယ်ဆိုပါစို့။ ဆက်ပြီး Crash ဖြစ်နေတယ်ဆိုရင် \"Clear App Data\" လုပ်ပါ (ဒါမှမဟုတ်) အီးမေးလ်ပို့ပါ။</string>
<string name="bug_report_use_account">GitHub အကောင့်ဖြင့်ပို့မည်</string>
<string name="buy_now">ယခုဝယ်မည်</string>
<string name="cancel_current_timer">ပယ်ဖျက်မည်</string>
<string name="card">ကတ်</string>
<string name="card_color_style">အရောင်ပါသောကတ်</string>
<string name="card_square">လေးထောင့်ကတ်</string>
<string name="card_style">ကတ်</string>
<string name="carousal_effect_on_now_playing_screen">Now Playing Screen ပေါ်တွင် Carousel effect </string>
<string name="cascading">Cascading</string>
<string name="changelog">ပြောင်းလဲမှုမှတ်တမ်း</string>
<string name="changelog_summary">Telegram channel ရှိ ပြောင်းလဲမှုမှတ်တမ်း</string>
<string name="circle">အဝိုင်း</string>
<string name="circular">အဝိုင်း</string>
<string name="classic">ရိုးရိုး</string>
<string name="clear_action">ရှင်းမည်</string>
<string name="clear_blacklist">Blacklist အားရှင်းမည်</string>
<string name="clear_playing_queue">နားထောင်နေသည့်စာရင်းအားရှင်းမည်</string>
<string name="color">အရောင်</string>
<string name="colors">အရောင်များ</string>
<string name="composer">တေးရေးဆရာ</string>
<string name="copied_device_info_to_clipboard">Device အချက်အလက်အား Clipboard သို့ ကော်ပီကူးခဲ့ပြီး</string>
<string name="could_not_create_playlist">Playlist ဖန်တီး၍မရပါ</string>
<string name="could_not_download_album_cover">"ကိုက်ညီသော Album Cover ကို Download မလုပ်နိုင်ပါ"</string>
<string name="could_not_restore_purchase">ဝယ်ယူမှုကိုပြန်မရယူနိုင်ပါ</string>
<string name="could_not_scan_files">ဖိုင် %d ခုကိုစကန်မဖတ်နိုင်ပါ</string>
<string name="create_action">ဖန်တီးမည်</string>
<string name="created_playlist_x">ဖန်တီးထားသော Playlist %1$s ခု</string>
<string name="credit_title">အဖွဲ့ဝင်များနှင့် ကူညီသူများ</string>
<string name="currently_listening_to_x_by_x">%2$s သီဆိုထားသော %1$s ကိုယခုနားထောင်နေသည်</string>
<string name="dark_theme_name">အနက်ရောင်ဆန်ဆန်</string>
<string name="delete_playlist_title">Playlist ဖျက်ခြင်း</string>
<string name="delete_playlist_x"><![CDATA[<b>%1$s</b> Playlist ကိုဖျက်မှာလား]]></string>
<string name="delete_playlists_title">Playlist များဖျက်ခြင်း</string>
<string name="delete_song_title">သီချင်းဖျက်ခြင်း</string>
<string name="delete_song_x"><![CDATA[<b>%1$s</b>? သီချင်းကိုဖျက်မှာလား]]></string>
<string name="delete_songs_title">သီချင်းများဖျက်ခြင်း</string>
<string name="delete_x_playlists"><![CDATA[Playlist <b>%1$d</b> ခုကိုဖျက်မှာလား]]></string>
<string name="delete_x_songs"><![CDATA[သီချင်း <b>%1$d</b> ပုဒ်ကိုဖျက်မှာလား]]></string>
<string name="deleted_x_songs">သီချင်း %1$d ပုဒ်ကိုဖျက်ပစ်ခဲ့သည်</string>
<string name="depth">Depth</string>
<string name="description">အကြောင်းအရာအသေးစိတ်</string>
<string name="device_info">Device အချက်အလက်</string>
<string name="dialog_message_set_ringtone">အသံ Settings ပြုပြင်ရန် Retro Music ကိုခွင့်ပြုချက်ပေးပါ</string>
<string name="dialog_title_set_ringtone">Ringtone ထားခြင်း</string>
<string name="do_you_want_to_clear_the_blacklist">Blacklist ကိုရှင်းလင်းလိုပါသလား</string>
<string name="do_you_want_to_remove_from_the_blacklist"><![CDATA[Blacklist မှ <b>%1$s</b> ကိုဖယ်ရှားလိုပါသလား]]></string>
<string name="donate">လှူဒါန်းမည်</string>
<string name="donate_summary">ကျွန်တော့်ရဲ့လက်ရာအတွက် မုန့်ဖိုးရဖို့ထိုက်တန်တယ်လို့ထင်ရင် ဒီမှာပေးသွားလိုက်ပါ။</string>
<string name="donation_header">ဝယ်ပေးမယ်: </string>
<string name="done">ပြီးပြီ</string>
<string name="drive_mode">Drive mode</string>
<string name="empty">ဘာမှမရှိပါ</string>
<string name="equalizer">Equalizer</string>
<string name="faq">မေးလေ့ရှိသောမေးခွန်းများ</string>
<string name="favorites">အကြိုက်ဆုံး</string>
<string name="finish_last_song">Finish last song</string>
<string name="fit">အနေတော်</string>
<string name="flat">အပြားပုံစံ</string>
<string name="folders">Folders</string>
<string name="follow_system">System အတိုင်း</string>
<string name="for_you">သင့်အတွက်</string>
<string name="free">အခမဲ့</string>
<string name="full">အပြည့်</string>
<string name="full_card">ကတ်အပြည့်ပုံစံ</string>
<string name="general_settings_summary">App Theme နှင့် အရောင်များကိုပြောင်းလဲရန်</string>
<string name="general_settings_title">Look and Feel</string>
<string name="genre">အမျိုးအစား</string>
<string name="genres">အမျိုးအစားများ</string>
<string name="git_hub_summary">Project ကို GitHub မှာ Fork လုပ်ပါ</string>
<string name="gradient">Gradient</string>
<string name="grid_size_1"></string>
<string name="grid_size_2"></string>
<string name="grid_size_3"></string>
<string name="grid_size_4"></string>
<string name="grid_size_5"></string>
<string name="grid_size_6"></string>
<string name="grid_size_7"></string>
<string name="grid_size_8"></string>
<string name="grid_style_label">အကွက်စတိုင်</string>
<string name="help_summary">အကူအညီထပ်လိုပါသေးလား</string>
<string name="hinge">Hinge</string>
<string name="history">မှတ်တမ်း</string>
<string name="home">မူလ</string>
<string name="horizontal_flip">ရေပြင်ညီအတိုင်းဟိုဘက်ဒီဘက်လှန်ခြင်း</string>
<string name="image">ဓာတ်ပုံ</string>
<string name="image_gradient">Gradient ပုံ</string>
<string name="image_settings_summary">အဆိုတော်ပုံအား ဒေါင်းလုဒ်ဆွဲခြင်း Settings များ</string>
<string name="import_label">Import</string>
<string name="import_playlist">Import playlist</string>
<string name="import_playlist_message">Android မီဒီယာစတိုးမှ Playlist များကိုသီချင်းများနှင့်အတူ import လုပ်သွားမည်ဖြစ်ပြီး ရှိပြီးသား Playlist ဖြစ်ပါကသီချင်းများကိုထည့်ပေါင်းသွားပါမည်။</string>
<string name="inserted_x_songs_into_playlist_x">Playlist %2$s သို့သီချင်း %1$d ပုဒ်ထည့်ပြီးပါပြီ</string>
<string name="instagram_page" translatable="false">Instagram</string>
<string name="instagram_page_summary">သင့်ရဲ့ Retro Music setup ကို Instagram တွင်ပြသလိုက်ပါ</string>
<string name="keyboard">ကီးဘုတ်</string>
<string name="label_bit_rate">Bitrate</string>
<string name="label_file_format">အမျိုးအစား</string>
<string name="label_file_name">ဖိုင်နာမည်</string>
<string name="label_file_path">ဖိုင်နေရာ</string>
<string name="label_file_size">အရွယ်အစား</string>
<string name="label_more_from">%s ၏နောက်ထပ် Album များ</string>
<string name="label_sampling_rate">Sampling rate</string>
<string name="label_track_length">ကြာချိန်</string>
<string name="labeled">Label ထိုးထားမည်</string>
<string name="last_added">နောက်ဆုံးသွင်းထားသော</string>
<string name="last_song">နောက်ဆုံးအပုဒ်</string>
<string name="library_categories">Tab အမျိုးအစားများ</string>
<string name="licenses">လိုင်စင်များ</string>
<string name="light_theme_name">အဖြူရောင်သက်သက်</string>
<string name="listeners_label">နားဆင်သူများ</string>
<string name="listing_files">ဖိုင်ပြန်စီနေသည်...</string>
<string name="loading_products">ခဏစောင့်ပါ...</string>
<string name="login">Login</string>
<string name="lyrics">သီချင်းစာသား</string>
<string name="made_with_love">အိန္ဒိယနိုင်ငံတွင် ❤️ များဖြင့် ဖန်တီးသည်</string>
<string name="material">Material</string>
<string name="md_error_label">Error</string>
<string name="md_storage_perm_error">Storage ခွင့်ပြုချက် error</string>
<string name="my_name">နာမည်</string>
<string name="my_top_tracks">အများဆုံးနားထောင်ခဲ့သော</string>
<string name="never">ဘယ်တော့မှ</string>
<string name="new_playlist_title">Playlist အသစ်</string>
<string name="new_start_directory">%s ဟာ Directory အစဖြစ်သွားပါပြီ</string>
<string name="next_song">နောက်တစ်ပုဒ်</string>
<string name="no_albums">Album တစ်ခုမှမရှိပါ</string>
<string name="no_artists">အဆိုတော်တစ်ယောက်မှမရှိပါ</string>
<string name="no_audio_ID">"သီချင်းတစ်ပုဒ်အရင် play ကြည့်ပြီးမှ ပြန်ကြိုးစားပါ"</string>
<string name="no_equalizer">Equalizer တစ်ခုမှရှာမတွေ့ပါ</string>
<string name="no_genres">အမျိုးအစားခွဲစရာတစ်ခုမှမရှိပါ</string>
<string name="no_lyrics_found">သီချင်းစာသားရှာမတွေ့ပါ</string>
<string name="no_playing_queue">သီချင်းတစ်ပုဒ်မှ play မထားပါ</string>
<string name="no_playlists">Playlist တစ်ခုမှမရှိပါ</string>
<string name="no_purchase_found">ဝယ်ယူထားမှုမရှိပါ</string>
<string name="no_results">ရှာမတွေ့ပါ</string>
<string name="no_songs">သီချင်းတစ်ပုဒ်မှမရှိပါ</string>
<string name="normal">ပုံမှန်</string>
<string name="normal_lyrics">ပုံမှန်သီချင်းစာသား</string>
<string name="not_listed_in_media_store"><![CDATA[<b>%s</b> သည် Android မီဒီယာစတိုးတွင် မရှိပါ]]></string>
<string name="not_recently_played">မကြာသေးခင်က play မထားပါ</string>
<string name="nothing_to_scan">စကန်ဖတ်စရာမရှိပါ</string>
<string name="nothing_to_see">ကြည့်စရာတစ်ခုမှမရှိပါ</string>
<string name="notification">Notification</string>
<string name="notification_settings_summary">Notification ပုံစံကို စိတ်ကြိုက်ပြင်ဆင်မည်</string>
<string name="now_playing">Now playing</string>
<string name="now_playing_queue">Now playing queue</string>
<string name="now_playing_summary">Now playing screen ကိုစိတ်ကြိုက်ပြင်ခြင်း</string>
<string name="now_playing_themes">Now playing theme (၉) ခုအထက် ရရှိခြင်း</string>
<string name="only_on_wifi">Wi-Fi ဖြင့်သာ</string>
<string name="other_settings_summary">အဆင့်မြင့် Settings များ</string>
<string name="others">အခြား</string>
<string name="password">Password</string>
<string name="past_three_months">လွန်ခဲ့သော (၃)လ</string>
<string name="peak">Peak ပုံစံ</string>
<string name="permission_external_storage_denied">External Storage ကြည့်ရှုခွင့်အားငြင်းပယ်ခဲ့သည်။</string>
<string name="permission_summary">သီချင်းဖွင့်ရန်အတွက် ယခု App အား Storage ကြည့်ရှုခွင့်ပေးရန်လိုသည်။</string>
<string name="permission_title">Storage ကြည့်ရှုခွင့်</string>
<string name="permissions_denied">ခွင့်ပြုချက်ငြင်းပယ်ခံရသည်</string>
<string name="personalize">မိမိစိတ်ကြိုက်</string>
<string name="personalize_settings_summary">Now Playing နှင့် UI controls များကိုစိတ်ကြိုက်ပြင်ဆင်မည်</string>
<string name="pick_from_local_storage">Local Storage မှ ရွေးမည်</string>
<string name="pinterest_page">Pinterest</string>
<string name="pinterest_page_summary">Retro Music ဒီဇိုင်းအကြံဉာဏ်ကောင်းများအတွက် Pinterest page ကို follow ပါ</string>
<string name="plain">ရှင်းရှင်းလင်းလင်းပုံစံ</string>
<string name="playing_notification_description">Playing notification သည် play/pause ခလုတ် စသည့်တို့ကိုဖော်ပြပေးသည်</string>
<string name="playing_notification_name">Playing notification</string>
<string name="playlist_is_empty">Playlist တွင်ဘာမှမရှိပါ</string>
<string name="playlist_name_empty">Playlist နာမည်</string>
<string name="playlists">Playlists</string>
<string name="pref_blur_amount_summary">Blur Themes များအတွက်သက်ရောက်သော အဝါးပမာဏဖြစ်ပြီး ပမာဏနည်းလေ ပိုမြန်လေဖြစ်သည်</string>
<string name="pref_blur_amount_title">အဝါးပမာဏ</string>
<string name="pref_filter_song_summary">ကြာချိန်ဖြင့်သီချင်းစစ်ထုတ်မည်</string>
<string name="pref_filter_song_title">သီချင်းကြာချိန်စစ်ထုတ်ခြင်း</string>
<string name="pref_header_advanced">ပိုမိုဆန်းသစ်သော</string>
<string name="pref_header_album">Album စတိုင်</string>
<string name="pref_header_audio">အသံပိုင်းဆိုင်ရာ</string>
<string name="pref_header_blacklist">Blacklist</string>
<string name="pref_header_controls">ထိန်းချုပ်မှုဆိုင်ရာ</string>
<string name="pref_header_general">Theme</string>
<string name="pref_header_images">Images</string>
<string name="pref_header_library">Library</string>
<string name="pref_header_lockscreen">Lockscreen</string>
<string name="pref_header_playlists">Playlists</string>
<string name="pref_keep_pause_on_zero_volume_summary">Volume သုညရောက်သွားပါက သီချင်းရပ်ပြီး Volume ပြန်ကျယ်လာသည့်အခါ ပြန် play မည်ဖြစ်သည်။ App ထဲဝင်မထားသော်လည်းအလုပ်လုပ်သည်။</string>
<string name="pref_keep_pause_on_zero_volume_title">သုည၌ရပ်ခြင်း</string>
<string name="pref_keep_screen_on_summary">ဤ feature ဖွင့်ထားပါက ဘက်ထရီသက်တမ်းထိခိုက်နိုင်ပါသည်</string>
<string name="pref_keep_screen_on_title">Screen တစ်ချိန်လုံးဖွင့်ထားမည်</string>
<string name="pref_language_name">ဘာသာစကားရွေးချယ်မည်</string>
<string name="pref_summary_album_art_on_lockscreen">ယခု play နေသောသီချင်း Album cover ပုံအား Lockscreen wallpaper အဖြစ်ထားမည်</string>
<string name="pref_summary_album_artists_only">Album သီဆိုသူများကိုလည်း အဆိုတော် Category တွင်ထားမည်</string>
<string name="pref_summary_audio_ducking">System Sound (သို့) Notification တစ်ခုရောက်လာသည့်အခါ သီချင်းအသံကိုတိုးမည်</string>
<string name="pref_summary_blacklist">Blacklist folder သိို့သွင်းထားသည်များကို Library တွင်မြင်ရမည်မဟုတ်ပါ</string>
<string name="pref_summary_bluetooth_playback">Bluetooth device နှင့်ချိတ်ဆက်လိုက်သည်နှင့် သီချင်းစဖွင့်မည်</string>
<string name="pref_summary_blurred_album_art">Lockscreen တွင် Album cover ပုံကိုဝါးထားမည်။ Third-party app နှင့် Widget များတွင် ပြဿနာတက်နိုင်သည်။</string>
<string name="pref_summary_carousel_effect">Now Playing screen မှ Album cover အတွက် Carousel effect ဖြစ်သည်။ ဤ effect ကြောင့် ကတ်နှင့် ကတ်အဝါး Theme များအလုပ်လုပ်မည်မဟုတ်ပါ။</string>
<string name="pref_summary_classic_notification">Android ၏ Notification ဒီဇိုင်းအဟောင်းကိုသုံးမည်</string>
<string name="pref_summary_colored_app">နောက်ခံအရောင်နှင့်ထိန်းချုပ်ခလုတ်အရောင်များသည် Now Playing screen မှ Album cover အရောင်အတိုင်း ပြောင်းလဲပါမည်</string>
<string name="pref_summary_colored_app_shortcuts">Accent color မှ App shortcuts များကိုအရောင်ပြောင်းလဲသည်။ Accent color ပြောင်းသည့်အခါတိုင်း App ကိုသက်ရောက်မှုရှိစေရန် ဤခလုတ်ကိုအဖွင့်၊အပိတ်လုပ်ပေးပါ။</string>
<string name="pref_summary_colored_notification">"Notification အရောင်ကို Album cover မှထင်ရှားသည့်အရောင်အတိုင်း ပြောင်းမည်"</string>
<string name="pref_summary_desaturated_color">Material ဒီဇိုင်းညွှန်ကြားချက်များအရ Dark Mode ဖွင့်ထားချိန်တွင်အရောင်များမှိန်နေသင့်သည်</string>
<string name="pref_summary_expand_now_playing_panel">Notification ကိုနှိပ်သည့်အခါ Home screen သို့ရောက်မည့်အစား Now Playing screen သို့တိုက်ရိုက်ရောက်သွားမည်</string>
<string name="pref_summary_extra_controls">Mini player တွင် ထိန်းချုပ်ခလုတ်အပိုများထပ်ပေါင်းမည်</string>
<string name="pref_summary_extra_song_info">သီချင်းဖိုင်၏အသေးစိတ်အချက်အလက်များ ပြသမည်၊ ဥပမာ - ဖိုင်အမျိုးအစား၊ bitrate နှင့် ကြိမ်နှုန်း</string>
<string name="pref_summary_gapless_playback">"အချို့ device များတွင် playback ပြဿနာများဖြစ်ပေါ်နိုင်သည်"</string>
<string name="pref_summary_home_banner">Home banner အား ပြသခြင်း၊ ဖျောက်ထားခြင်း</string>
<string name="pref_summary_ignore_media_store_artwork">Album cover အရည်အသွေးပိုမိုကောင်းမွန်လာနိုင်သော်လည်း Loading time ပိုကြာနိုင်သည်။ အရည်အသွေးနိမ့်သောပုံများနှင့်အဆင်မပြေမှသာလျှင် ဤခလုတ်ကိုဖွင့်ပါ။</string>
<string name="pref_summary_library_categories">Library category များ ဖော်ခြင်း၊ ဖျောက်ခြင်းနှင့် အထားအသိုများ ချိန်ညှိမည်</string>
<string name="pref_summary_lock_screen">Retro Music ၏ ပြင်ဆင်ထားသော Lockscreen controls များကိုသုံးမည်</string>
<string name="pref_summary_open_source_licences">Open Source software အတွက် လိုင်စင်အချက်အလက်များ</string>
<string name="pref_summary_toggle_full_screen">Immersive mode</string>
<string name="pref_summary_toggle_headset">နားကြပ်နှင့်ချိတ်ဆက်ပြီးသည့်နှင့် စတင် play မည်</string>
<string name="pref_summary_toggle_shuffle">သီချင်းဖွင့်မည့်စာရင်း\'အသစ်\'ကို play သည့်အခါ Shuffle Mode ပိတ်သွားပါမည်</string>
<string name="pref_summary_toggle_volume">နေရာလုံလုံလောက်လောက်ရှိပါက Now Playing screen တွင် အသံအတိုးအကျယ်ခလုတ်များပြသမည်</string>
<string name="pref_title_album_art_on_lockscreen">Album cover ပြသခြင်း</string>
<string name="pref_title_album_artists_only">Album သီဆိုသူဖြင့် ရှာဖွေခြင်း</string>
<string name="pref_title_album_cover_style">Album cover theme</string>
<string name="pref_title_album_cover_transform">Album cover skip</string>
<string name="pref_title_app_shortcuts">Colored App shortcuts</string>
<string name="pref_title_audio_ducking">Reduce volume on focus loss</string>
<string name="pref_title_auto_download_artist_images">အဆိုတော်ဓာတ်ပုံများကို အလိုအလျောက်ဒေါင်းလုဒ်ဆွဲခြင်း</string>
<string name="pref_title_blacklist">Blacklist</string>
<string name="pref_title_bluetooth_playback">Bluetooth playback</string>
<string name="pref_title_blurred_album_art">Album cover အဝါး</string>
<string name="pref_title_classic_notification">Notification ဒီဇိုင်းအဟောင်း</string>
<string name="pref_title_colored_app">Adaptive color</string>
<string name="pref_title_colored_notification">အရောင်ပါသော notification</string>
<string name="pref_title_desaturated_color">Desaturated color</string>
<string name="pref_title_expand_now_playing_panel">Now Playing screen ပြသခြင်း</string>
<string name="pref_title_extra_controls">အပိုထိန်းချုပ်မှုများ</string>
<string name="pref_title_extra_song_info">သီချင်းဖိုင်အချက်အလက် </string>
<string name="pref_title_gapless_playback">လစ်ဟာမှုမရှိ play ခြင်း</string>
<string name="pref_title_general_theme">App theme</string>
<string name="pref_title_home_album_grid_style">Album အကွက်ပုံစံ</string>
<string name="pref_title_home_artist_grid_style">အဆိုတော်အကွက်ပုံစံ</string>
<string name="pref_title_home_banner">Banner</string>
<string name="pref_title_ignore_media_store_artwork">Media Store covers များကိုလျစ်လျူရှုခြင်း</string>
<string name="pref_title_last_added_interval">နောက်ဆုံးသွင်းထားသော playlist ရှိသီချင်းများ</string>
<string name="pref_title_lock_screen">Lockscreen အပြည့် controls</string>
<string name="pref_title_now_playing_screen_appearance">Now playing theme</string>
<string name="pref_title_open_source_licences">Open source licences</string>
<string name="pref_title_tab_text_mode">Tab ခေါင်းစဉ်ပြသခြင်း</string>
<string name="pref_title_toggle_carousel_effect">Carousel effect</string>
<string name="pref_title_toggle_full_screen">App ကို screen အပြည့်ထားမည်</string>
<string name="pref_title_toggle_toggle_headset">အလိုအလျောက် play ခြင်း</string>
<string name="pref_title_toggle_toggle_shuffle">Shuffle mode</string>
<string name="pref_title_toggle_volume">အသံထိန်းချုပ်မှု</string>
<string name="pro">Pro</string>
<string name="pro_summary">Black theme ၊ Now playing themes နှင့် Carousel effect စသည်များ...</string>
<string name="profile">Profile</string>
<string name="purchase">ဝယ်ယူမည်</string>
<string name="queue">နားထောင်နေသည့်စာရင်း</string>
<string name="rate_app">ဤ app ကို star ပေးမည်</string>
<string name="rate_on_google_play_summary">App ကိုကြိုက်ပါသလား။ ယခုထက်ပိုကောင်းမွန်အောင်ဘယ်လိုလုပ်ရမလဲဆိုတာ ကျွန်တော်တို့ကို Google Play Store မှာပြောပြပေးပါ။</string>
<string name="recent_albums">မကြာသေးခင်ကနားထောင်ထားသော Album များ</string>
<string name="recent_artists">မကြာသေးခင်ကနားထောင်ထားသော အဆိုတော်များ</string>
<string name="remove_action">ပယ်ဖျက်မည်</string>
<string name="remove_cover">Cover ကိုဖျက်မည်</string>
<string name="remove_from_blacklist">Blacklist မှဖျက်မည်</string>
<string name="remove_song_from_playlist_title">Playlist မှဖျက်မည်</string>
<string name="remove_song_x_from_playlist"><![CDATA[<b>%1$s</b> ကို Playlist ကဖျက်မှာလား]]></string>
<string name="remove_songs_from_playlist_title">Playlist မှသီချင်းများဖျက်ခြင်း</string>
<string name="remove_x_songs_from_playlist"><![CDATA[သီချင်း <b>%1$d</b> ပုဒ်ကို playlist ကဖျက်မှာလား]]></string>
<string name="rename_playlist_title">Playlist နာမည်ပြင်မည်</string>
<string name="report_an_issue">ပြဿနာတစ်ခုသတင်းပို့မည်</string>
<string name="report_bug">Bug report တင်မည်</string>
<string name="reset_action">Reset</string>
<string name="reset_artist_image">Reset artist image</string>
<string name="restore">ပြန်လည်ရယူမည်</string>
<string name="restored_previous_purchase_please_restart">ယခင်ဝယ်ယူမှုကို ပြန်လည်ရယူပြီးပါပြီ။ Feature အားလုံးအလုပ်လုပ်ရန် app မှထွက်ပြီးပြန်ဝင်ပါ။</string>
<string name="restored_previous_purchases">ယခင်ဝယ်ယူမှုအား ပြန်လည်ရယူပြီးပါပြီ</string>
<string name="restoring_purchase">ယခင်ဝယ်ယူမှုအား ပြန်လည်ရယူနေသည်...</string>
<string name="retro_music_player">Retro Music Player</string>
<string name="retro_music_pro">Retro Music Pro</string>
<string name="ringtone_summary">သီချင်းများကို Ringtone ထားရန် app အား System Settings များကိုပြင်ဆင်ခွင့်ပေးရန်လိုသည်။</string>
<string name="ringtone_title">Ringtone</string>
<string name="saf_delete_failed">ဖိုင်ဖျက်ခြင်းမအောင်မြင်ပါ: %s</string>
<!-- SAF -->
<string name="saf_error_uri">SAF URI ကိုမရယူနိုင်ပါ</string>
<string name="saf_guide_slide1_description">Navigation drawer ကိုဖွင့်ပါ</string>
<string name="saf_guide_slide1_description_before_o">Overflow Menu မှ \'Show SD card\' ကိုနှိပ်ပါ</string>
<!-- SAF guide -->
<string name="saf_guide_slide1_title">%s သည် SD card ကြည့်ရှုခွင့်လိုအပ်သည်</string>
<string name="saf_guide_slide2_description">SD card ၏ ထိပ်ဆုံး Directory ကိုရွေးပေးရန်လိုအပ်သည်</string>
<string name="saf_guide_slide2_title">Navigation drawer တွင် SD card ကိုရွေးချယ်ပါ</string>
<string name="saf_guide_slide3_description">Folder အခွဲများကို မဖွင့်ပါနှင့်</string>
<string name="saf_guide_slide3_title">Screen ၏အောက်ဆုံးတွင်ရှိသော \'select\' ခလုတ်ကိုနှိပ်ပါ</string>
<string name="saf_write_failed">ဖိုင်ပြုပြင်ခြင်းမအောင်မြင်ပါ: %s</string>
<string name="save">မှတ်ထားမည်</string>
<!-- SAF -->
<!-- SAF guide -->
<string name="save_playlist_title">ဖိုင်အဖြစ်သိမ်းမည်</string>
<string name="save_playlists_title">ဖိုင်များအဖြစ်သိမ်းမည်</string>
<string name="saved_playlist_to">%s တွင် playlist ကိုသိမ်းခဲ့သည်</string>
<string name="saving_changes">ပြောင်းလဲမှုများကိုမှတ်သားနေသည်</string>
<string name="scan_media">မီဒီယာစကန်ဖတ်မည်</string>
<string name="scanned_files">ဖိုင် %2$d ခုအနက် %1$d ခုကို စကန်ဖတ်ပြီးပါပြီ</string>
<string name="scrobbles_label">Scrobbles</string>
<string name="select_all">အားလုံးရွေးမည်</string>
<string name="selected">ရွေးချယ်ထားသော</string>
<string name="set">ထားမည်</string>
<string name="set_artist_image">အဆိုတော်ပုံအဖြစ်ထားမည်</string>
<string name="share_app">App ကိုမျှဝေမည်</string>
<string name="share_summary">သင့်မိသားစုနှင့် သူငယ်ချင်းများကိုပြန်လည်မျှဝေလိုက်ပါ</string>
<string name="share_to_stories">Stories သို့မျှဝေမည်</string>
<string name="shuffle">Shuffle</string>
<string name="simple">ရိုးရိုးရှင်းရှင်း</string>
<string name="sleep_timer_canceled">Sleep timer ကိုဖျက်ပြီးပါပြီ</string>
<string name="sleep_timer_set">ယခုမှစတင်၍ Sleep timer ကို %d မိနစ်အချိန်မှတ်ပြီးပါပြီ</string>
<string name="social">Social</string>
<string name="social_stories">Story မျှဝေမည်</string>
<string name="song">သီချင်း</string>
<string name="song_duration">သီချင်းကြာချိန်</string>
<string name="songs">သီချင်းများ</string>
<string name="sort_order">အထားအသိုပြင်မည်</string>
<string name="sort_order_a_z">ငယ်ရာမှကြီးရာ</string>
<string name="sort_order_album">Album</string>
<string name="sort_order_artist">အဆိုတော်</string>
<string name="sort_order_composer">တေးရေးဆရာ</string>
<string name="sort_order_date">ထည့်သွင်းသည့်ရက်</string>
<string name="sort_order_date_modified">ပြင်ဆင်သည့်ရက်</string>
<string name="sort_order_num_songs">အပုဒ်အရေအတွက်</string>
<string name="sort_order_num_songs_desc">အပုဒ်အရေအတွက်ပြောင်းပြန်</string>
<string name="sort_order_year">ထွက်ရှိသည့်နှစ်</string>
<string name="sort_order_z_a">ကြီးရာမှငယ်ရာ</string>
<string name="speech_not_supported">ဆောရီး! သင့် device သည် အသံဖြင့်ပြောဆိုခြင်းအား အထောက်အပံ့မပေးထားပါ</string>
<string name="speech_prompt">သင့် Library တွင်ရှာဖွေခြင်း</string>
<string name="stack">Stack</string>
<string name="start_play_music">သီချင်းစတင် play ပါပြီ</string>
<string name="suggestion_songs">အကြံပြုထားသောသီချင်းများ</string>
<string name="support_development">Support development</string>
<string name="swipe_to_unlock">Swipe to unlock</string>
<string name="synced_lyrics">ချိန်ကိုက်ထားသောသီချင်းစာသား</string>
<!-- Message displayed when tag editing fails -->
<string name="telegram_group">Telegram</string>
<string name="telegram_group_summary">Bugs များကို ဆွေးနွေးရန်၊ အကြံပြုချက်များပေးရန်၊ ကြွားရန်နှင့် စသည်များ...</string>
<string name="thank_you">ကျေးဇူးတင်ပါတယ်</string>
<string name="the_audio_file">အသံဖိုင်</string>
<string name="this_month">ယခုလ</string>
<string name="this_week">ယခုအပတ်</string>
<string name="this_year">ယခုနှစ်</string>
<string name="tiny">Tiny</string>
<string name="tiny_card_style">Tiny card</string>
<string name="title">နာမည်</string>
<string name="today">ယနေ့</string>
<string name="top_albums">ထိပ်ဆုံး Album များ</string>
<string name="top_artists">ထိပ်ဆုံးအဆိုတော်များ</string>
<string name="track_hint">"Track (2 for track 2 or 3004 for CD3 track 4)"</string>
<string name="track_list">အပုဒ်နံပါတ်</string>
<string name="translate">ဘာသာပြန်ခြင်း</string>
<string name="translate_community">App ကိုသင့်ဘာသာစကားသို့ ကူပြန်ပေးပါ</string>
<string name="try_retro_music_premium">Retro Music Premium ကိုစမ်းကြည့်ပါ</string>
<string name="twitter_page">Twitter</string>
<string name="twitter_page_summary">သင့် Retro Music ဒီဇိုင်းများကိုမျှဝေပါ</string>
<string name="unlabeled">Label မထိုးပါ</string>
<string name="unplayable_file">ဤသီချင်းကို မ play နိုင်ပါ</string>
<string name="up_next">လာမည့်အပုဒ်</string>
<string name="update_image">Update image</string>
<string name="updating">အပ်ဒိတ်လုပ်နေသည်…</string>
<string name="user_name">သုံးစွဲသူ</string>
<string name="username">သုံးစွဲသူအမည်</string>
<string name="version">Version</string>
<string name="vertical_flip">ဒေါင်လိုက်ဟိုဘက်ဒီဘက်လှန်ခြင်း</string>
<string name="volume">အသံအတိုးအကျယ်</string>
<string name="web_search">Web search</string>
<string name="welcome">မင်္ဂလာပါ</string>
<string name="what_do_you_want_to_share">ဘာများမျှဝေချင်ပါသလဲ</string>
<string name="whats_new">ဘာအသစ်တွေရှိလဲ</string>
<string name="window">Window</string>
<string name="window_corner_edges">အနားအကွေးပုံစံ</string>
<string name="x_has_been_set_as_ringtone">%1$s ကို Ringtone အဖြစ်ထားပြီးပါပြီ</string>
<string name="x_selected">%1$d ခုကိုရွေးထားသည်</string>
<string name="year">ထွက်ရှိသည့်နှစ်</string>
<string name="you_have_to_select_at_least_one_category">အနည်းဆုံး category တစ်ခုရွေးချယ်ရန်လိုအပ်သည်</string>
<string name="you_will_be_forwarded_to_the_issue_tracker_website">Issue tracker website သို့ခေါ်ဆောင်သွားပါမည်</string>
<string name="your_account_data_is_only_used_for_authentication">သင့်အကောင့်အချက်အလက်ကို အတည်ပြုရန်အတွက်သာအသုံးပြုပါသည်။</string>
</resources>

View file

@ -315,7 +315,7 @@
<string name="next_song">Следующая песня</string> <string name="next_song">Следующая песня</string>
<string name="no_albums">Альбомы отсутствуют</string> <string name="no_albums">Альбомы отсутствуют</string>
<string name="no_artists">Исполнители отсутствую</string> <string name="no_artists">Исполнители отсутствуют</string>
<string name="no_audio_ID">"Сначала проиграйте песню, затем попробуйте заново."</string> <string name="no_audio_ID">"Сначала проиграйте песню, затем попробуйте заново."</string>
<string name="no_equalizer">Эквалайзер не найден</string> <string name="no_equalizer">Эквалайзер не найден</string>
<string name="no_genres">Жанры отсутствуют</string> <string name="no_genres">Жанры отсутствуют</string>
@ -443,7 +443,6 @@
<string name="pref_title_gapless_playback">Непрерывное воспроизведение</string> <string name="pref_title_gapless_playback">Непрерывное воспроизведение</string>
<string name="pref_title_general_theme">Тема приложения</string> <string name="pref_title_general_theme">Тема приложения</string>
<string name="pref_title_home_album_grid_style">Сетка альбома на Главной странице</string> <string name="pref_title_home_album_grid_style">Сетка альбома на Главной странице</string>
<string name="pref_title_home_artist_grid_style">Сетка исполнителя на Главной странице</string>
<string name="pref_title_home_banner">Кнопка Домой</string> <string name="pref_title_home_banner">Кнопка Домой</string>
<string name="pref_title_ignore_media_store_artwork">Игнорировать обложки из хранилища</string> <string name="pref_title_ignore_media_store_artwork">Игнорировать обложки из хранилища</string>
<string name="pref_title_last_added_interval">Дата последнего добавления плейлиста</string> <string name="pref_title_last_added_interval">Дата последнего добавления плейлиста</string>

View file

@ -12,7 +12,7 @@
<dimen name="list_item_image_icon_padding">8dp</dimen> <dimen name="list_item_image_icon_padding">8dp</dimen>
<dimen name="mini_player_height">48dp</dimen> <dimen name="mini_player_height">56dp</dimen>
<dimen name="app_widget_classic_height">96dp</dimen> <dimen name="app_widget_classic_height">96dp</dimen>
<dimen name="app_widget_classic_image_size">96dp</dimen> <dimen name="app_widget_classic_image_size">96dp</dimen>
@ -34,7 +34,7 @@
<dimen name="now_playing_top_margin">12dp</dimen> <dimen name="now_playing_top_margin">12dp</dimen>
<dimen name="icon_notification_dimen">32dp</dimen> <dimen name="icon_notification_dimen">32dp</dimen>
<dimen name="mini_player_height_expanded">104dp</dimen> <dimen name="mini_player_height_expanded">112dp</dimen>
<dimen name="toolbar_margin_horizontal">8dp</dimen> <dimen name="toolbar_margin_horizontal">8dp</dimen>
<dimen name="toolbar_height">48dp</dimen> <dimen name="toolbar_height">48dp</dimen>
<dimen name="item_song_height">52dp</dimen> <dimen name="item_song_height">52dp</dimen>

View file

@ -15,5 +15,6 @@
<resources> <resources>
<declare-styleable name="RetroShapeableImageView"> <declare-styleable name="RetroShapeableImageView">
<attr name="retroCornerSize" format="dimension" /> <attr name="retroCornerSize" format="dimension" />
<attr name="circleShape" format="boolean" />
</declare-styleable> </declare-styleable>
</resources> </resources>

View file

@ -27,8 +27,8 @@ android {
dependencies { dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0-alpha01' implementation 'com.google.android.material:material:1.3.0-alpha04'
implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
// Used for the list preference classes // Used for the list preference classes
def material_dialog_version = "0.9.6.0" def material_dialog_version = "0.9.6.0"

View file

@ -1,13 +1,13 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.4.10' ext.kotlin_version = '1.4.20'
repositories { repositories {
jcenter() jcenter()
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.0.2' classpath 'com.android.tools.build:gradle:4.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
def nav_version = "2.3.0" def nav_version = "2.3.0"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"

View file

@ -1,4 +1,4 @@
#Sat Jun 06 02:12:18 IST 2020 #Thu Dec 03 19:20:35 IST 2020
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME