diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index cad869d04..f03f09679 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -16,6 +16,9 @@ assignees: '' **Have you read the [FAQ](https://www.github.com/h4h13/RetroMusicPlayer/tree/dev/FAQ.md)?** [Yes/No] +**Has the bug already been reported? Please search in GitHub issue tab before creating an issue.** +[Yes/No] + **Describe the bug** A clear and concise description of what the bug is. diff --git a/app/build.gradle b/app/build.gradle index eb73f26fc..cb78c07bc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ apply plugin: "androidx.navigation.safeargs.kotlin" android { compileSdkVersion 29 - buildToolsVersion = '30.0.2' + buildToolsVersion = '30.0.3' defaultConfig { minSdkVersion 21 @@ -69,14 +69,14 @@ dependencies { implementation "androidx.cardview:cardview:1.0.0" implementation 'androidx.appcompat:appcompat:1.2.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.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.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-fragment-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-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' implementation "com.squareup.retrofit2:retrofit:$retrofit_version" diff --git a/app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt b/app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt index 56a289c1f..889859df2 100644 --- a/app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt +++ b/app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt @@ -50,6 +50,7 @@ import io.github.muntashirakon.music.TOGGLE_SEPARATE_LINE import io.github.muntashirakon.music.TOGGLE_VOLUME import io.github.muntashirakon.music.USER_NAME 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.helper.MusicPlayerRemote 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.repository.PlaylistSongsLoader import io.github.muntashirakon.music.service.MusicService +import io.github.muntashirakon.music.util.AppRater import io.github.muntashirakon.music.util.PreferenceUtil import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch @@ -66,7 +68,6 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis companion object { const val TAG = "MainActivity" const val EXPAND_PANEL = "expand_panel" - const val APP_UPDATE_REQUEST_CODE = 9002 } override fun createContentView(): View { @@ -83,17 +84,10 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis hideStatusBar() updateTabs() - // NavigationUI.setupWithNavController(getBottomNavigationView(), findNavController(R.id.fragment_container)) setupNavigationController() if (!hasPermissions()) { findNavController(R.id.fragment_container).navigate(R.id.permissionFragment) } - - showPromotionalDialog() - } - - private fun showPromotionalDialog() { - } private fun setupNavigationController() { @@ -115,27 +109,27 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis override fun onResume() { super.onResume() PreferenceUtil.registerOnSharedPreferenceChangedListener(this) - if (intent.hasExtra(EXPAND_PANEL) && - intent.getBooleanExtra(EXPAND_PANEL, false) && - PreferenceUtil.isExpandPanel - ) { + val expand = extra(EXPAND_PANEL).value ?: false + if (expand && PreferenceUtil.isExpandPanel) { expandPanel() intent.removeExtra(EXPAND_PANEL) } } + override fun onDestroy() { + super.onDestroy() + PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) + } + 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() } } override fun onServiceConnected() { super.onServiceConnected() - if (intent == null) { - return - } + intent ?: return handlePlaybackIntent(intent) } diff --git a/app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt index ae594a210..47d48191d 100644 --- a/app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt @@ -56,7 +56,6 @@ import io.github.muntashirakon.music.helper.MusicPlayerRemote import io.github.muntashirakon.music.model.CategoryInfo import io.github.muntashirakon.music.util.PreferenceUtil import io.github.muntashirakon.music.views.BottomNavigationBarTinted -import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.* import kotlinx.android.synthetic.main.sliding_music_panel_layout.* import org.koin.androidx.viewmodel.ext.android.viewModel @@ -97,6 +96,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { onPanelCollapsed() dimBackground.hide() } + else -> { println("Do something") } @@ -114,11 +114,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { setupBottomSheet() 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.setOnClickListener { println("dimBackground") - + collapsePanel() } } @@ -132,7 +132,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) { postRecreate() } - if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) { + if (bottomSheetBehavior.state == STATE_EXPANDED) { setMiniPlayerAlphaProgress(1f) } } @@ -154,6 +154,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { fun collapsePanel() { bottomSheetBehavior.state = STATE_COLLAPSED + setMiniPlayerAlphaProgress(0f) } fun expandPanel() { @@ -324,14 +325,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { }) } - fun setBottomBarVisibility(visible: Int) { - bottomNavigationView.visibility = visible + fun setBottomBarVisibility(visible: Boolean) { + bottomNavigationView.isVisible = visible hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty()) } private fun hideBottomBar(hide: Boolean) { 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 if (hide) { bottomSheetBehavior.isHideable = true @@ -345,10 +346,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { ViewCompat.setElevation(slidingPanel, 10f) ViewCompat.setElevation(bottomNavigationView, 10f) if (isVisible) { - bottomSheetBehavior.peekHeight = heightOfBarWithTabs - bottomNavigationView.translateYAnimate(0f) + println("List") + bottomSheetBehavior.peekHeight = heightOfBarWithTabs - 22 } else { - bottomNavigationView.translateYAnimate(150f) + println("Details") bottomSheetBehavior.peekHeight = heightOfBar } } diff --git a/app/src/main/java/io/github/muntashirakon/music/activities/tageditor/WriteTagsAsyncTask.java b/app/src/main/java/io/github/muntashirakon/music/activities/tageditor/WriteTagsAsyncTask.java index 7c6851aa1..8b203f1ac 100644 --- a/app/src/main/java/io/github/muntashirakon/music/activities/tageditor/WriteTagsAsyncTask.java +++ b/app/src/main/java/io/github/muntashirakon/music/activities/tageditor/WriteTagsAsyncTask.java @@ -98,7 +98,8 @@ public class WriteTagsAsyncTask extends DialogAsyncTask) = + private fun artistsAdapter(artists: List) = ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this) - fun albumAdapter(albums: List) = + private fun albumAdapter(albums: List) = 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) { activity.findNavController(R.id.fragment_container).navigate( diff --git a/app/src/main/java/io/github/muntashirakon/music/adapter/SongFileAdapter.kt b/app/src/main/java/io/github/muntashirakon/music/adapter/SongFileAdapter.kt index 8523164e8..3d460fbec 100644 --- a/app/src/main/java/io/github/muntashirakon/music/adapter/SongFileAdapter.kt +++ b/app/src/main/java/io/github/muntashirakon/music/adapter/SongFileAdapter.kt @@ -42,10 +42,10 @@ class SongFileAdapter( private val activity: AppCompatActivity, private var dataSet: List, private val itemLayoutRes: Int, - private val ICallbacks: ICallbacks?, - ICabHolder: ICabHolder? + private val iCallbacks: ICallbacks?, + iCabHolder: ICabHolder? ) : AbsMultiSelectAdapter( - activity, ICabHolder, R.menu.menu_media_selection + activity, iCabHolder, R.menu.menu_media_selection ), PopupTextProvider { init { @@ -135,8 +135,8 @@ class SongFileAdapter( } override fun onMultipleItemAction(menuItem: MenuItem, selection: List) { - if (ICallbacks == null) return - ICallbacks.onMultipleItemAction(menuItem, selection as ArrayList) + if (iCallbacks == null) return + iCallbacks.onMultipleItemAction(menuItem, selection as ArrayList) } override fun getPopupText(position: Int): String { @@ -150,11 +150,11 @@ class SongFileAdapter( inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { init { - if (menu != null && ICallbacks != null) { + if (menu != null && iCallbacks != null) { menu?.setOnClickListener { v -> val position = layoutPosition if (isPositionInRange(position)) { - ICallbacks.onFileMenuClicked(dataSet[position], v) + iCallbacks.onFileMenuClicked(dataSet[position], v) } } } @@ -169,7 +169,7 @@ class SongFileAdapter( if (isInQuickSelectMode) { toggleChecked(position) } else { - ICallbacks?.onFileSelected(dataSet[position]) + iCallbacks?.onFileSelected(dataSet[position]) } } } diff --git a/app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt b/app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt index f38361771..d575801c6 100644 --- a/app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt +++ b/app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt @@ -15,20 +15,17 @@ package io.github.muntashirakon.music.adapter.album import android.content.res.ColorStateList -import android.content.res.Resources import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.core.view.ViewCompat import androidx.fragment.app.FragmentActivity -import com.bumptech.glide.Glide import io.github.muntashirakon.music.R import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import io.github.muntashirakon.music.glide.AlbumGlideRequest 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.menu.SongsMenuHelper 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.PreferenceUtil import io.github.muntashirakon.music.util.color.MediaNotificationProcessor +import com.bumptech.glide.Glide import me.zhanghai.android.fastscroll.PopupTextProvider open class AlbumAdapter( - protected val activity: FragmentActivity, + val activity: FragmentActivity, var dataSet: List, - protected var itemLayoutRes: Int, - ICabHolder: ICabHolder?, - private val albumClickListener: IAlbumClickListener? + var itemLayoutRes: Int, + iCabHolder: ICabHolder?, + val listener: IAlbumClickListener? ) : AbsMultiSelectAdapter( activity, - ICabHolder, + iCabHolder, R.menu.menu_media_selection ), PopupTextProvider { @@ -62,12 +60,7 @@ open class AlbumAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = - try { - LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) - } catch (e: Resources.NotFoundException) { - LayoutInflater.from(activity).inflate(R.layout.item_grid, parent, false) - } + val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) return createViewHolder(view, viewType) } @@ -99,7 +92,7 @@ open class AlbumAdapter( holder.paletteColorContainer?.setBackgroundColor(color.backgroundColor) } holder.mask?.backgroundTintList = ColorStateList.valueOf(color.primaryTextColor) - } + holder.imageContainerCard?.setCardBackgroundColor(color.backgroundColor) } protected open fun loadAlbumCover(album: Album, holder: ViewHolder) { if (holder.image == null) { @@ -177,8 +170,11 @@ open class AlbumAdapter( if (isInQuickSelectMode) { toggleChecked(layoutPosition) } else { - ViewCompat.setTransitionName(itemView, "album") - albumClickListener?.onAlbumClick(dataSet[layoutPosition].id, itemView) + image?.let { + ViewCompat.setTransitionName(it, "album") + listener?.onAlbumClick(dataSet[layoutPosition].id, it) + } + } } diff --git a/app/src/main/java/io/github/muntashirakon/music/adapter/artist/ArtistAdapter.kt b/app/src/main/java/io/github/muntashirakon/music/adapter/artist/ArtistAdapter.kt index 8e2d3821b..a59f27ac0 100644 --- a/app/src/main/java/io/github/muntashirakon/music/adapter/artist/ArtistAdapter.kt +++ b/app/src/main/java/io/github/muntashirakon/music/adapter/artist/ArtistAdapter.kt @@ -85,7 +85,7 @@ class ArtistAdapter( loadArtistImage(artist, holder) } - fun setColors(processor: MediaNotificationProcessor, holder: ViewHolder) { + private fun setColors(processor: MediaNotificationProcessor, holder: ViewHolder) { holder.mask?.backgroundTintList = ColorStateList.valueOf(processor.primaryTextColor) if (holder.paletteColorContainer != null) { holder.paletteColorContainer?.setBackgroundColor(processor.backgroundColor) @@ -155,8 +155,8 @@ class ArtistAdapter( toggleChecked(layoutPosition) } else { image?.let { - ViewCompat.setTransitionName(itemView, "album") - IArtistClickListener.onArtist(dataSet[layoutPosition].id, itemView) + ViewCompat.setTransitionName(it, "artist") + IArtistClickListener.onArtist(dataSet[layoutPosition].id, it) } } } diff --git a/app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java b/app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java index 2d2fbe292..cb0bdace7 100644 --- a/app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java +++ b/app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java @@ -16,103 +16,122 @@ package io.github.muntashirakon.music.adapter.base; import android.graphics.Color; import android.view.View; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatImageView; import androidx.recyclerview.widget.RecyclerView; + import io.github.muntashirakon.music.R; + import com.google.android.material.card.MaterialCardView; import com.h6ah4i.android.widget.advrecyclerview.utils.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) { - super(itemView); - title = itemView.findViewById(R.id.title); - text = itemView.findViewById(R.id.text); - text2 = itemView.findViewById(R.id.text2); + public MediaEntryViewHolder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + text = itemView.findViewById(R.id.text); + text2 = itemView.findViewById(R.id.text2); - image = itemView.findViewById(R.id.image); - artistImage = itemView.findViewById(R.id.artistImage); - playerImage = itemView.findViewById(R.id.player_image); - time = itemView.findViewById(R.id.time); + image = itemView.findViewById(R.id.image); + artistImage = itemView.findViewById(R.id.artistImage); + playerImage = itemView.findViewById(R.id.player_image); + time = itemView.findViewById(R.id.time); - imageText = itemView.findViewById(R.id.imageText); - imageTextContainer = itemView.findViewById(R.id.imageTextContainer); - imageContainerCard = itemView.findViewById(R.id.imageContainerCard); + imageText = itemView.findViewById(R.id.imageText); + imageTextContainer = itemView.findViewById(R.id.imageTextContainer); + imageContainerCard = itemView.findViewById(R.id.imageContainerCard); - menu = itemView.findViewById(R.id.menu); - dragView = itemView.findViewById(R.id.drag_view); - paletteColorContainer = itemView.findViewById(R.id.paletteColorContainer); - recyclerView = itemView.findViewById(R.id.recycler_view); - mask = itemView.findViewById(R.id.mask); - dummyContainer = itemView.findViewById(R.id.dummy_view); + menu = itemView.findViewById(R.id.menu); + dragView = itemView.findViewById(R.id.drag_view); + paletteColorContainer = itemView.findViewById(R.id.paletteColorContainer); + recyclerView = itemView.findViewById(R.id.recycler_view); + mask = itemView.findViewById(R.id.mask); + dummyContainer = itemView.findViewById(R.id.dummy_view); - if (imageContainerCard != null) { - imageContainerCard.setCardBackgroundColor(Color.TRANSPARENT); + if (imageContainerCard != null) { + imageContainerCard.setCardBackgroundColor(Color.TRANSPARENT); + } + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); } - itemView.setOnClickListener(this); - itemView.setOnLongClickListener(this); - } - @Nullable - @Override - public View getSwipeableContainerView() { - return null; - } + @Nullable + @Override + public View getSwipeableContainerView() { + return null; + } - @Override - public void onClick(View v) {} + @Override + public void onClick(View v) { + } - @Override - public boolean onLongClick(View v) { - return false; - } + @Override + public boolean onLongClick(View v) { + return false; + } - public void setImageTransitionName(@NonNull String transitionName) { - itemView.setTransitionName(transitionName); + public void setImageTransitionName(@NonNull String transitionName) { + itemView.setTransitionName(transitionName); /* if (imageContainerCard != null) { imageContainerCard.setTransitionName(transitionName); } if (image != null) { image.setTransitionName(transitionName); }*/ - } + } } diff --git a/app/src/main/java/io/github/muntashirakon/music/adapter/song/PlaylistSongAdapter.kt b/app/src/main/java/io/github/muntashirakon/music/adapter/song/PlaylistSongAdapter.kt index 05f941dbd..e287ba880 100644 --- a/app/src/main/java/io/github/muntashirakon/music/adapter/song/PlaylistSongAdapter.kt +++ b/app/src/main/java/io/github/muntashirakon/music/adapter/song/PlaylistSongAdapter.kt @@ -25,13 +25,13 @@ import io.github.muntashirakon.music.dialogs.RemoveSongFromPlaylistDialog import io.github.muntashirakon.music.interfaces.ICabHolder import io.github.muntashirakon.music.model.Song -open class PlaylistSongAdapter( +class PlaylistSongAdapter( private val playlist: PlaylistEntity, activity: FragmentActivity, dataSet: MutableList, itemLayoutRes: Int, - ICabHolder: ICabHolder? -) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) { + iCabHolder: ICabHolder? +) : SongAdapter(activity, dataSet, itemLayoutRes, iCabHolder) { init { this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection) diff --git a/app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt b/app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt index 3dcdfcffc..b9cff0d54 100644 --- a/app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt +++ b/app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt @@ -15,15 +15,18 @@ package io.github.muntashirakon.music.adapter.song 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.extensions.applyColor +import io.github.muntashirakon.music.extensions.applyOutlineColor import io.github.muntashirakon.music.helper.MusicPlayerRemote import io.github.muntashirakon.music.interfaces.ICabHolder import io.github.muntashirakon.music.model.Song import com.google.android.material.button.MaterialButton class ShuffleButtonSongAdapter( - activity: AppCompatActivity, + activity: FragmentActivity, dataSet: MutableList, itemLayoutRes: Int, ICabHolder: ICabHolder? @@ -35,16 +38,19 @@ class ShuffleButtonSongAdapter( override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { if (holder.itemViewType == OFFSET_ITEM) { + val color = ThemeStore.accentColor(activity) val viewHolder = holder as ViewHolder viewHolder.playAction?.let { it.setOnClickListener { MusicPlayerRemote.openQueue(dataSet, 0, true) } + it.applyOutlineColor(color) } viewHolder.shuffleAction?.let { it.setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(dataSet, true) } + it.applyColor(color) } } else { super.onBindViewHolder(holder, position - 1) diff --git a/app/src/main/java/io/github/muntashirakon/music/db/RetroDatabase.kt b/app/src/main/java/io/github/muntashirakon/music/db/RetroDatabase.kt index aece1301f..a0ddffc43 100644 --- a/app/src/main/java/io/github/muntashirakon/music/db/RetroDatabase.kt +++ b/app/src/main/java/io/github/muntashirakon/music/db/RetroDatabase.kt @@ -19,7 +19,7 @@ import androidx.room.RoomDatabase @Database( entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class], - version = 22, + version = 23, exportSchema = false ) abstract class RetroDatabase : RoomDatabase() { diff --git a/app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsDialog.kt b/app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsDialog.kt index 2274ee881..b67c7f6f1 100644 --- a/app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsDialog.kt +++ b/app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsDialog.kt @@ -16,6 +16,7 @@ package io.github.muntashirakon.music.dialogs import android.app.Dialog import android.os.Bundle +import androidx.core.os.bundleOf import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment import io.github.muntashirakon.music.EXTRA_SONG @@ -40,11 +41,11 @@ class DeleteSongsDialog : DialogFragment() { } fun create(songs: List): DeleteSongsDialog { - val dialog = DeleteSongsDialog() - val args = Bundle() - args.putParcelableArrayList(EXTRA_SONG, ArrayList(songs)) - dialog.arguments = args - return dialog + return DeleteSongsDialog().apply { + arguments = bundleOf( + EXTRA_SONG to ArrayList(songs) + ) + } } } diff --git a/app/src/main/java/io/github/muntashirakon/music/dialogs/SleepTimerDialog.kt b/app/src/main/java/io/github/muntashirakon/music/dialogs/SleepTimerDialog.kt index 2d95c0373..b9d57e0d6 100755 --- a/app/src/main/java/io/github/muntashirakon/music/dialogs/SleepTimerDialog.kt +++ b/app/src/main/java/io/github/muntashirakon/music/dialogs/SleepTimerDialog.kt @@ -164,7 +164,6 @@ class SleepTimerDialog : DialogFragment() { ) { override fun onTick(millisUntilFinished: Long) { - println("onTick: $millisUntilFinished") seekBar.progress = millisUntilFinished.toInt() } diff --git a/app/src/main/java/io/github/muntashirakon/music/dialogs/SongDetailDialog.kt b/app/src/main/java/io/github/muntashirakon/music/dialogs/SongDetailDialog.kt index 58cf58d25..e7335f7cf 100644 --- a/app/src/main/java/io/github/muntashirakon/music/dialogs/SongDetailDialog.kt +++ b/app/src/main/java/io/github/muntashirakon/music/dialogs/SongDetailDialog.kt @@ -23,6 +23,7 @@ import android.util.Log import android.view.LayoutInflater import android.widget.TextView import androidx.annotation.NonNull +import androidx.core.os.bundleOf import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment import io.github.muntashirakon.music.EXTRA_SONG @@ -155,11 +156,11 @@ class SongDetailDialog : DialogFragment() { val TAG: String = SongDetailDialog::class.java.simpleName fun create(song: Song): SongDetailDialog { - val dialog = SongDetailDialog() - val args = Bundle() - args.putParcelable(EXTRA_SONG, song) - dialog.arguments = args - return dialog + return SongDetailDialog().apply { + arguments = bundleOf( + EXTRA_SONG to song + ) + } } private fun makeTextWithTitle(context: Context, titleResId: Int, text: String?): Spanned { diff --git a/app/src/main/java/io/github/muntashirakon/music/dialogs/SongShareDialog.kt b/app/src/main/java/io/github/muntashirakon/music/dialogs/SongShareDialog.kt index 9236b1648..7a6bdb03d 100644 --- a/app/src/main/java/io/github/muntashirakon/music/dialogs/SongShareDialog.kt +++ b/app/src/main/java/io/github/muntashirakon/music/dialogs/SongShareDialog.kt @@ -17,6 +17,7 @@ package io.github.muntashirakon.music.dialogs import android.app.Dialog import android.content.Intent import android.os.Bundle +import androidx.core.os.bundleOf import androidx.fragment.app.DialogFragment import io.github.muntashirakon.music.EXTRA_SONG import io.github.muntashirakon.music.R @@ -93,11 +94,11 @@ class SongShareDialog : DialogFragment() { companion object { fun create(song: Song): SongShareDialog { - val dialog = SongShareDialog() - val args = Bundle() - args.putParcelable(EXTRA_SONG, song) - dialog.arguments = args - return dialog + return SongShareDialog().apply { + arguments = bundleOf( + EXTRA_SONG to song + ) + } } } } diff --git a/app/src/main/java/io/github/muntashirakon/music/extensions/ColorExt.kt b/app/src/main/java/io/github/muntashirakon/music/extensions/ColorExt.kt index 236620e1e..256b5e652 100644 --- a/app/src/main/java/io/github/muntashirakon/music/extensions/ColorExt.kt +++ b/app/src/main/java/io/github/muntashirakon/music/extensions/ColorExt.kt @@ -38,7 +38,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper import com.google.android.material.button.MaterialButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton 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.TextInputLayout import io.github.muntashirakon.music.App @@ -95,13 +95,7 @@ fun SeekBar.addAccentColor() { thumbTintList = colorState } -fun Button.accentTextColor() { - setTextColor(ThemeStore.accentColor(App.getContext())) -} - -fun MaterialButton.accentTextColor() { - setTextColor(ThemeStore.accentColor(App.getContext())) -} +fun Button.accentTextColor() = setTextColor(ThemeStore.accentColor(App.getContext())) fun MaterialButton.accentBackgroundColor() { backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(App.getContext())) @@ -154,9 +148,7 @@ fun MaterialButton.applyColor(color: Int) { iconTint = textColorColorStateList } -fun MaterialButton.accentColor(){ - this.applyColor(ThemeStore.accentColor(context)) -} +fun MaterialButton.accentColor() = applyColor(ThemeStore.accentColor(context)) fun MaterialButton.applyOutlineColor(color: Int) { val textColorColorStateList = ColorStateList.valueOf(color) @@ -172,23 +164,18 @@ fun TextInputLayout.accentColor() { isHintAnimationEnabled = true } -fun ProgressIndicator.accentColor() { - val accentColor = ThemeStore.accentColor(context) - indicatorColors = intArrayOf(accentColor) - trackColor = ColorUtil.withAlpha(accentColor, 0.2f) -} - -fun ProgressIndicator.applyColor(color: Int) { - indicatorColors = intArrayOf(color) +fun CircularProgressIndicator.accentColor() { + val color = ThemeStore.accentColor(context) + setIndicatorColor(color) 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 { - return ThemeStore.accentColor(context) -} +fun AppCompatImageView.accentColor(): Int = ThemeStore.accentColor(context) @CheckResult fun Drawable.tint(@ColorInt color: Int): Drawable { @@ -198,9 +185,8 @@ fun Drawable.tint(@ColorInt color: Int): Drawable { } @CheckResult -fun Drawable.tint(context: Context, @ColorRes color: Int): Drawable { - return tint(context.getColorCompat(color)) -} +fun Drawable.tint(context: Context, @ColorRes color: Int): Drawable = + tint(context.getColorCompat(color)) @ColorInt fun Context.getColorCompat(@ColorRes colorRes: Int): Int { diff --git a/app/src/main/java/io/github/muntashirakon/music/extensions/DrawableExt.kt b/app/src/main/java/io/github/muntashirakon/music/extensions/DrawableExt.kt index d425411a9..299b7a40c 100644 --- a/app/src/main/java/io/github/muntashirakon/music/extensions/DrawableExt.kt +++ b/app/src/main/java/io/github/muntashirakon/music/extensions/DrawableExt.kt @@ -48,15 +48,4 @@ fun Drawable.getBitmapDrawable(): Bitmap { val canvas = Canvas(bmp) draw(canvas) 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)!! - } -} +} \ No newline at end of file diff --git a/app/src/main/java/io/github/muntashirakon/music/extensions/ViewExtensions.kt b/app/src/main/java/io/github/muntashirakon/music/extensions/ViewExtensions.kt index 12c3df0cc..47f7eb222 100644 --- a/app/src/main/java/io/github/muntashirakon/music/extensions/ViewExtensions.kt +++ b/app/src/main/java/io/github/muntashirakon/music/extensions/ViewExtensions.kt @@ -27,6 +27,8 @@ import androidx.core.animation.doOnStart import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.TintHelper import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.imageview.ShapeableImageView +import com.google.android.material.shape.ShapeAppearanceModel @Suppress("UNCHECKED_CAST") fun ViewGroup.inflate(@LayoutRes layout: Int): T { @@ -112,4 +114,11 @@ fun View.focusAndShowKeyboard() { } }) } -} \ No newline at end of file +} + +fun ShapeableImageView.setCircleShape(boolean: Boolean) { + addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + val radius = width / 2f + shapeAppearanceModel = ShapeAppearanceModel().withCornerSize(radius) + } +} \ No newline at end of file diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/CoroutineViewModel.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/CoroutineViewModel.kt deleted file mode 100644 index ac696776d..000000000 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/CoroutineViewModel.kt +++ /dev/null @@ -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() - } -} diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt index 314c3ee67..c840e25d2 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt @@ -26,15 +26,16 @@ import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver import io.github.muntashirakon.music.* import io.github.muntashirakon.music.adapter.album.AlbumAdapter 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.db.toSong 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.interfaces.IAlbumClickListener import io.github.muntashirakon.music.interfaces.IArtistClickListener import io.github.muntashirakon.music.model.Album import io.github.muntashirakon.music.model.Artist -import io.github.muntashirakon.music.state.NowPlayingPanelState import io.github.muntashirakon.music.util.RetroUtil 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?) { super.onActivityCreated(savedInstanceState) - mainActivity.setBottomBarVisibility(View.GONE) + mainActivity.setBottomBarVisibility(false) mainActivity.setSupportActionBar(toolbar) progressIndicator.hide() when (args.type) { - 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_ALBUMS -> { - loadAlbums(R.string.recent_albums, RECENT_ALBUMS) - } + 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_ALBUMS -> loadAlbums(R.string.recent_albums, RECENT_ALBUMS) FAVOURITES -> loadFavorite() HISTORY_PLAYLIST -> loadHistory() LAST_ADDED_PLAYLIST -> lastAddedSongs() @@ -77,7 +70,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de private fun lastAddedSongs() { toolbar.setTitle(R.string.last_added) - val songAdapter = SongAdapter( + val songAdapter = ShuffleButtonSongAdapter( requireActivity(), mutableListOf(), R.layout.item_list, null @@ -93,7 +86,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de private fun topPlayed() { toolbar.setTitle(R.string.my_top_tracks) - val songAdapter = SongAdapter( + val songAdapter = ShuffleButtonSongAdapter( requireActivity(), mutableListOf(), R.layout.item_list, null @@ -110,7 +103,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de private fun loadHistory() { toolbar.setTitle(R.string.history) - val songAdapter = SongAdapter( + val songAdapter = ShuffleButtonSongAdapter( requireActivity(), mutableListOf(), R.layout.item_list, null diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/VolumeFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/VolumeFragment.kt index 64f5d20cc..8b89fd647 100755 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/VolumeFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/VolumeFragment.kt @@ -122,10 +122,6 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum volumeSeekBar.applyColor(color) } - fun removeThumb() { - volumeSeekBar.thumb = null - } - private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) { if (PreferenceUtil.isPauseOnZeroVolume) if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume) diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt index da3956f3d..3e307c049 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt @@ -16,6 +16,7 @@ package io.github.muntashirakon.music.fragments.albums import android.app.ActivityOptions import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.view.* import androidx.appcompat.app.AppCompatActivity @@ -31,7 +32,6 @@ import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.appthemehelper.common.ATHToolbarActivity.getToolbarBackgroundColor -import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import io.github.muntashirakon.music.EXTRA_ALBUM_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.dialogs.AddToPlaylistDialog import io.github.muntashirakon.music.dialogs.DeleteSongsDialog -import io.github.muntashirakon.music.extensions.applyColor -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.extensions.* import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment import io.github.muntashirakon.music.glide.AlbumGlideRequest import io.github.muntashirakon.music.glide.ArtistGlideRequest import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import io.github.muntashirakon.music.glide.SingleColorTarget 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.model.Album 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.color.MediaNotificationProcessor 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.MaterialElevationScale import kotlinx.android.synthetic.main.fragment_album_content.* import kotlinx.android.synthetic.main.fragment_album_details.* import kotlinx.coroutines.Dispatchers @@ -89,25 +91,26 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det private val savedSortOrder: String get() = PreferenceUtil.albumDetailSongSortOrder - private fun setUpTransitions() { - val transform = MaterialContainerTransform() - transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface)) - sharedElementEnterTransition = transform - } - override fun onCreate(savedInstanceState: Bundle?) { 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?) { super.onViewCreated(view, savedInstanceState) setHasOptionsMenu(true) - mainActivity.setBottomBarVisibility(View.GONE) + mainActivity.setBottomBarVisibility(false) mainActivity.addMusicServiceEventListener(detailsViewModel) mainActivity.setSupportActionBar(toolbar) + toolbar.title = " " - ViewCompat.setTransitionName(container, "album") + ViewCompat.setTransitionName(albumCoverContainer, "album") postponeEnterTransition() detailsViewModel.getAlbum().observe(viewLifecycleOwner, Observer { startPostponedEnterTransition() @@ -117,6 +120,12 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det setupRecyclerView() artistImage.setOnClickListener { artistView -> ViewCompat.setTransitionName(artistView, "artist") + exitTransition = MaterialElevationScale(false).apply { + duration = 300L + } + reenterTransition = MaterialElevationScale(true).apply { + duration = 300L + } findActivityNavController(R.id.fragment_container) .navigate( R.id.artistDetailsFragment, @@ -125,8 +134,9 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det FragmentNavigatorExtras(artistView to "artist") ) } - playAction.setOnClickListener { MusicPlayerRemote.openQueue(album.songs, 0, true) } - + playAction.setOnClickListener { + MusicPlayerRemote.openQueue(album.songs, 0, true) + } shuffleAction.setOnClickListener { MusicPlayerRemote.openAndShuffleQueue( album.songs, @@ -141,9 +151,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det aboutAlbumText.maxLines = 4 } } - image.apply { - transitionName = getString(R.string.transition_album_art) - } } override fun onDestroy() { @@ -255,7 +262,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det } private fun loadArtistImage(artist: Artist) { - detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner, Observer { + detailsViewModel.getMoreAlbums(artist).observe(viewLifecycleOwner, { moreAlbums(it) }) 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) { + exitTransition = MaterialElevationScale(false).apply { + duration = 300L + } + reenterTransition = MaterialElevationScale(false).apply { + duration = 300L + } findNavController().navigate( R.id.albumDetailsFragment, bundleOf(EXTRA_ALBUM_ID to albumId), @@ -356,13 +369,10 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det ) return true } - /*Sort*/ - R.id.action_sort_order_title -> sortOrder = SortOrder.AlbumSongSortOrder.SONG_A_Z - R.id.action_sort_order_title_desc -> sortOrder = SortOrder.AlbumSongSortOrder.SONG_Z_A - R.id.action_sort_order_track_list -> sortOrder = - SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST - R.id.action_sort_order_artist_song_duration -> - sortOrder = SortOrder.AlbumSongSortOrder.SONG_DURATION + R.id.action_sort_order_title -> sortOrder = SONG_A_Z + R.id.action_sort_order_title_desc -> sortOrder = SONG_Z_A + R.id.action_sort_order_track_list -> sortOrder = SONG_TRACK_LIST + R.id.action_sort_order_artist_song_duration -> sortOrder = SONG_DURATION } if (sortOrder != null) { item.isChecked = true @@ -373,36 +383,34 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det private fun setUpSortOrderMenu(sortOrder: SubMenu) { when (savedSortOrder) { - SortOrder.AlbumSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title) - .isChecked = true - SortOrder.AlbumSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc) - .isChecked = true - SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST -> sortOrder.findItem(R.id.action_sort_order_track_list) - .isChecked = true - SortOrder.AlbumSongSortOrder.SONG_DURATION -> sortOrder.findItem(R.id.action_sort_order_artist_song_duration) - .isChecked = true + SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked = true + SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = true + SONG_TRACK_LIST -> + sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = true + SONG_DURATION -> + sortOrder.findItem(R.id.action_sort_order_artist_song_duration).isChecked = true } } private fun setSaveSortOrder(sortOrder: String) { PreferenceUtil.albumDetailSongSortOrder = 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( o2.trackNumber ) } - SortOrder.AlbumSongSortOrder.SONG_A_Z -> album.songs.sortedWith { o1, o2 -> + SONG_A_Z -> album.songs.sortedWith { o1, o2 -> o1.title.compareTo( o2.title ) } - SortOrder.AlbumSongSortOrder.SONG_Z_A -> album.songs.sortedWith { o1, o2 -> + SONG_Z_A -> album.songs.sortedWith { o1, o2 -> o2.title.compareTo( o1.title ) } - SortOrder.AlbumSongSortOrder.SONG_DURATION -> album.songs.sortedWith { o1, o2 -> + SONG_DURATION -> album.songs.sortedWith { o1, o2 -> o1.duration.compareTo( o2.duration ) diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt index b0572460b..1322fdde5 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt @@ -17,7 +17,6 @@ package io.github.muntashirakon.music.fragments.albums import android.os.Bundle import android.view.* import androidx.core.os.bundleOf -import androidx.lifecycle.Observer import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.findNavController 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.fragments.ReloadType 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.interfaces.IAlbumClickListener 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.RetroUtil import com.afollestad.materialcab.MaterialCab +import com.google.android.material.transition.MaterialElevationScale class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(), IAlbumClickListener, ICabHolder { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - libraryViewModel.getAlbums().observe(viewLifecycleOwner, Observer { + libraryViewModel.getAlbums().observe(viewLifecycleOwner, { if (it.isNotEmpty()) adapter?.swapDataSet(it) else @@ -115,6 +114,12 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(), IArtistClickListener, ICabHolder { @@ -114,6 +115,12 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment 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_card_color -> - subMenu.findItem(R.id.action_layout_colored_card).isChecked = true - R.layout.item_grid_circle -> - subMenu.findItem(R.id.action_layout_circular).isChecked = true + R.layout.item_card_color -> subMenu.findItem(R.id.action_layout_colored_card).isChecked = + true + R.layout.item_grid_circle -> subMenu.findItem(R.id.action_layout_circular).isChecked = + true R.layout.image -> subMenu.findItem(R.id.action_layout_image).isChecked = true - R.layout.item_image_gradient -> - subMenu.findItem(R.id.action_layout_gradient_image).isChecked = true + R.layout.item_image_gradient -> subMenu.findItem(R.id.action_layout_gradient_image).isChecked = + true } } @@ -275,21 +282,11 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment, LM : Recycle override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivity.setBottomBarVisibility(View.VISIBLE) + + postponeEnterTransition() + view.doOnPreDraw { startPostponedEnterTransition() } + + mainActivity.setBottomBarVisibility(true) mainActivity.setSupportActionBar(toolbar) mainActivity.supportActionBar?.title = null initLayoutManager() @@ -78,7 +83,6 @@ abstract class AbsRecyclerViewFragment, LM : Recycle layoutManager = this@AbsRecyclerViewFragment.layoutManager adapter = this@AbsRecyclerViewFragment.adapter val fastScroller = create(this) - } checkForPadding() } diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/folder/FoldersFragment.java b/app/src/main/java/io/github/muntashirakon/music/fragments/folder/FoldersFragment.java index 567b8d7c6..a05b9dea4 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/folder/FoldersFragment.java +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/folder/FoldersFragment.java @@ -166,7 +166,7 @@ public class FoldersFragment extends AbsMainActivityFragment @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { getMainActivity().addMusicServiceEventListener(getLibraryViewModel()); - getMainActivity().setBottomBarVisibility(View.VISIBLE); + getMainActivity().setBottomBarVisibility(true); getMainActivity().setSupportActionBar(toolbar); getMainActivity().getSupportActionBar().setTitle(null); setStatusBarColorAuto(view); diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt index a9ddd803a..d424b7633 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt @@ -14,6 +14,7 @@ */ package io.github.muntashirakon.music.fragments.genres +import android.graphics.Color import android.os.Bundle import android.view.Menu import android.view.MenuInflater @@ -24,14 +25,15 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import code.name.monkey.appthemehelper.util.ATHUtil import io.github.muntashirakon.music.R import io.github.muntashirakon.music.adapter.song.SongAdapter 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.helper.menu.GenreMenuHelper import io.github.muntashirakon.music.model.Genre import io.github.muntashirakon.music.model.Song +import com.google.android.material.transition.MaterialArcMotion import com.google.android.material.transition.MaterialContainerTransform import kotlinx.android.synthetic.main.fragment_playlist_detail.* 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 songAdapter: SongAdapter - private fun setUpTransitions() { - val transform = MaterialContainerTransform() - transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface)) - sharedElementEnterTransition = transform - } override fun onCreate(savedInstanceState: Bundle?) { 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?) { super.onViewCreated(view, savedInstanceState) setHasOptionsMenu(true) - mainActivity.setBottomBarVisibility(View.GONE) + mainActivity.setBottomBarVisibility(false) mainActivity.addMusicServiceEventListener(detailsViewModel) mainActivity.setSupportActionBar(toolbar) ViewCompat.setTransitionName(container, "genre") diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt index 433ab63e0..5f6b1b36a 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt @@ -27,6 +27,7 @@ import io.github.muntashirakon.music.adapter.GenreAdapter import io.github.muntashirakon.music.fragments.base.AbsRecyclerViewFragment import io.github.muntashirakon.music.interfaces.IGenreClickListener import io.github.muntashirakon.music.model.Genre +import com.google.android.material.transition.MaterialElevationScale class GenresFragment : AbsRecyclerViewFragment(), IGenreClickListener { @@ -63,6 +64,12 @@ class GenresFragment : AbsRecyclerViewFragment? = null - - @SuppressLint("StaticFieldLeak") fun updateIsFavorite() { - if (updateIsFavoriteTask != null) { - updateIsFavoriteTask?.cancel(false) - } - updateIsFavoriteTask = object : AsyncTask() { - override fun doInBackground(vararg params: Song): Boolean? { - val activity = activity - return if (activity != null) { - MusicUtil.isFavorite(requireActivity(), params[0]) - } else { - cancel(false) - 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) + lifecycleScope.launch(Dispatchers.IO) { + val playlist: PlaylistEntity? = libraryViewModel.favoritePlaylist() + if (playlist != null) { + val song: SongEntity = + MusicPlayerRemote.currentSong.toSongEntity(playlist.playListId) + val isFavorite: Boolean = libraryViewModel.isFavoriteSong(song).isNotEmpty() + withContext(Dispatchers.Main) { + val icon = + if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border + val drawable = TintHelper.createTintedDrawable(activity, icon, Color.WHITE) 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() { diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt index 9e59ac5a9..8457d5ecf 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt @@ -1,5 +1,6 @@ package io.github.muntashirakon.music.fragments.playlists +import android.graphics.Color import android.os.Bundle import android.view.Menu import android.view.MenuInflater @@ -12,14 +13,15 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.util.ATHUtil 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.toSongs 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.helper.menu.PlaylistMenuHelper 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 kotlinx.android.synthetic.main.fragment_playlist_detail.* 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 playlistSongAdapter: PlaylistSongAdapter - - private fun setUpTransitions() { - val transform = MaterialContainerTransform() - transform.setAllContainerColors(ATHUtil.resolveColor(requireContext(), R.attr.colorSurface)) - sharedElementEnterTransition = transform - } + private lateinit var playlistSongAdapter: ShuffleButtonSongAdapter override fun onCreate(savedInstanceState: Bundle?) { 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?) { super.onViewCreated(view, savedInstanceState) setHasOptionsMenu(true) - mainActivity.setBottomBarVisibility(View.GONE) + mainActivity.setBottomBarVisibility(false) mainActivity.addMusicServiceEventListener(viewModel) mainActivity.setSupportActionBar(toolbar) ViewCompat.setTransitionName(container, "playlist") @@ -61,8 +63,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli } private fun setUpRecyclerView() { - playlistSongAdapter = PlaylistSongAdapter( - playlist.playlistEntity, + playlistSongAdapter = ShuffleButtonSongAdapter( requireActivity(), ArrayList(), R.layout.item_list, diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt index db627ee18..c8fd467f6 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt @@ -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.interfaces.IPlaylistClickListener import io.github.muntashirakon.music.util.PreferenceUtil +import com.google.android.material.transition.MaterialElevationScale import kotlinx.android.synthetic.main.fragment_library.* class PlaylistsFragment : @@ -183,6 +184,12 @@ class PlaylistsFragment : } override fun onPlaylistClick(playlistWithSongs: PlaylistWithSongs, view: View) { + exitTransition = MaterialElevationScale(false).apply { + duration = 300L + } + reenterTransition = MaterialElevationScale(true).apply { + duration = 300L + } findNavController().navigate( R.id.playlistDetailsFragment, bundleOf(EXTRA_PLAYLIST to playlistWithSongs), diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt index a6d21b789..b436d0efc 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt @@ -15,12 +15,15 @@ package io.github.muntashirakon.music.fragments.search import android.content.ActivityNotFoundException +import android.content.Context import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.speech.RecognizerIntent import android.text.Editable import android.text.TextWatcher import android.view.View +import android.view.inputmethod.InputMethodManager import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager @@ -28,12 +31,11 @@ import androidx.recyclerview.widget.RecyclerView import androidx.transition.TransitionManager import io.github.muntashirakon.music.R import io.github.muntashirakon.music.adapter.SearchAdapter -import io.github.muntashirakon.music.extensions.accentColor -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.extensions.* import io.github.muntashirakon.music.fragments.base.AbsMainActivityFragment 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 java.util.* import kotlin.collections.ArrayList @@ -47,18 +49,30 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa private lateinit var searchAdapter: SearchAdapter 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?) { super.onViewCreated(view, savedInstanceState) - mainActivity.setBottomBarVisibility(View.GONE) + mainActivity.setBottomBarVisibility(false) mainActivity.setSupportActionBar(toolbar) libraryViewModel.clearSearchResult() setupRecyclerView() + + voiceSearch.setOnClickListener { startMicSearch() } + clearText.setOnClickListener { searchView.clearText() } searchView.apply { addTextChangedListener(this@SearchFragment) focusAndShowKeyboard() } - voiceSearch.setOnClickListener { startMicSearch() } - clearText.setOnClickListener { searchView.clearText() } keyboardPopup.apply { accentColor() setOnClickListener { @@ -143,6 +157,19 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa 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() { diff --git a/app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt b/app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt index f03a9ddc8..d4506543d 100644 --- a/app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt @@ -20,6 +20,7 @@ import androidx.annotation.LayoutRes import androidx.lifecycle.Observer import androidx.recyclerview.widget.GridLayoutManager 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.extensions.surfaceColor import io.github.muntashirakon.music.fragments.ReloadType @@ -35,7 +36,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = - true + 1 -> gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = true 2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true 3 -> gridSizeMenu.findItem(R.id.action_grid_size_3).isChecked = true 4 -> gridSizeMenu.findItem(R.id.action_grid_size_4).isChecked = true diff --git a/app/src/main/java/io/github/muntashirakon/music/preferences/LibraryPreference.kt b/app/src/main/java/io/github/muntashirakon/music/preferences/LibraryPreference.kt index ac54a5815..035db6af1 100644 --- a/app/src/main/java/io/github/muntashirakon/music/preferences/LibraryPreference.kt +++ b/app/src/main/java/io/github/muntashirakon/music/preferences/LibraryPreference.kt @@ -71,7 +71,7 @@ class LibraryPreferenceDialog : DialogFragment() { categoryAdapter.categoryInfos = PreferenceUtil.defaultCategories } .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok) { _, _ -> updateCategories(categoryAdapter.categoryInfos) } + .setPositiveButton( R.string.done) { _, _ -> updateCategories(categoryAdapter.categoryInfos) } .setView(view) .create() .colorButtons() diff --git a/app/src/main/java/io/github/muntashirakon/music/repository/RoomRepository.kt b/app/src/main/java/io/github/muntashirakon/music/repository/RoomRepository.kt index f410080c4..bfaca2be5 100644 --- a/app/src/main/java/io/github/muntashirakon/music/repository/RoomRepository.kt +++ b/app/src/main/java/io/github/muntashirakon/music/repository/RoomRepository.kt @@ -100,7 +100,6 @@ class RealRoomRepository( playlistDao.insertSongsToPlaylist(songs) } - override fun getSongs(playListId: Long): LiveData> = playlistDao.songsFromPlaylist(playListId) @@ -160,10 +159,9 @@ class RealRoomRepository( ) override suspend fun favoritePlaylistSongs(favorite: String): List = - if (playlistDao.isPlaylistExists(favorite).isNotEmpty()) - playlistDao.favoritesSongs( - playlistDao.isPlaylistExists(favorite).first().playListId - ) else emptyList() + if (playlistDao.isPlaylistExists(favorite).isNotEmpty()) playlistDao.favoritesSongs( + playlistDao.isPlaylistExists(favorite).first().playListId + ) else emptyList() override suspend fun insertSongInPlayCount(playCountEntity: PlayCountEntity) = playCountDao.insertSongInPlayCount(playCountEntity) @@ -192,10 +190,8 @@ class RealRoomRepository( override suspend fun blackListPaths(): List = blackListStoreDao.blackListPaths() - override suspend fun deleteSongs(songs: List) { - songs.forEach { - playCountDao.deleteSong(it.id) - } + override suspend fun deleteSongs(songs: List) = songs.forEach { + playCountDao.deleteSong(it.id) } override suspend fun deleteBlacklistPath(blackListStoreEntity: BlackListStoreEntity) = diff --git a/app/src/main/java/io/github/muntashirakon/music/util/MusicUtil.kt b/app/src/main/java/io/github/muntashirakon/music/util/MusicUtil.kt index 3548d055b..f49427e07 100644 --- a/app/src/main/java/io/github/muntashirakon/music/util/MusicUtil.kt +++ b/app/src/main/java/io/github/muntashirakon/music/util/MusicUtil.kt @@ -94,7 +94,7 @@ object MusicUtil : KoinComponent { fun deleteAlbumArt(context: Context, albumId: Long) { val contentResolver = context.contentResolver 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) } @@ -165,7 +165,7 @@ object MusicUtil : KoinComponent { try { val newLyrics = FileUtil.read(f) - if (newLyrics != null && !newLyrics.trim { it <= ' ' }.isEmpty()) { + if (newLyrics != null && newLyrics.trim { it <= ' ' }.isNotEmpty()) { if (AbsSynchronizedLyrics.isSynchronized(newLyrics)) { return newLyrics } @@ -283,9 +283,8 @@ object MusicUtil : KoinComponent { path: String? ) { val contentResolver = context.contentResolver - val artworkUri = - Uri.parse("content://media/external/audio/albumart") - contentResolver.delete(ContentUris.withAppendedId(artworkUri, albumId.toLong()), null, null) + val artworkUri = Uri.parse("content://media/external/audio/albumart") + contentResolver.delete(ContentUris.withAppendedId(artworkUri, albumId), null, null) val values = ContentValues() values.put("album_id", albumId) values.put("_data", path) @@ -444,9 +443,7 @@ object MusicUtil : KoinComponent { } fun deleteTracks(context: Context, songs: List) { - val projection = arrayOf( - BaseColumns._ID, MediaStore.MediaColumns.DATA - ) + val projection = arrayOf(BaseColumns._ID, MediaStore.MediaColumns.DATA) val selection = StringBuilder() selection.append(BaseColumns._ID + " IN (") for (i in songs.indices) { diff --git a/app/src/main/java/io/github/muntashirakon/music/util/ViewUtil.kt b/app/src/main/java/io/github/muntashirakon/music/util/ViewUtil.kt index 42a86e73a..10ca1260a 100644 --- a/app/src/main/java/io/github/muntashirakon/music/util/ViewUtil.kt +++ b/app/src/main/java/io/github/muntashirakon/music/util/ViewUtil.kt @@ -27,7 +27,7 @@ import androidx.core.view.ViewCompat import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper -import com.google.android.material.progressindicator.ProgressIndicator +import com.google.android.material.progressindicator.CircularProgressIndicator object ViewUtil { @@ -77,9 +77,9 @@ object ViewUtil { ) } - fun setProgressDrawable(progressIndicator: ProgressIndicator, newColor: Int) { - progressIndicator.indicatorColors = intArrayOf(newColor) - progressIndicator.trackColor = ColorUtil.withAlpha(newColor, 0.2f) + fun setProgressDrawable(indicator: CircularProgressIndicator, newColor: Int) { + indicator.setIndicatorColor(newColor) + indicator.trackColor = ColorUtil.withAlpha(newColor, 0.2f) } fun hitTest(v: View, x: Int, y: Int): Boolean { diff --git a/app/src/main/java/io/github/muntashirakon/music/views/RetroShapeableImageView.kt b/app/src/main/java/io/github/muntashirakon/music/views/RetroShapeableImageView.kt index 35a2ddd50..d8f22110e 100644 --- a/app/src/main/java/io/github/muntashirakon/music/views/RetroShapeableImageView.kt +++ b/app/src/main/java/io/github/muntashirakon/music/views/RetroShapeableImageView.kt @@ -31,9 +31,12 @@ class RetroShapeableImageView @JvmOverloads constructor( init { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.RetroShapeableImageView, defStyle, -1) - val cornerSize = - typedArray.getDimension(R.styleable.RetroShapeableImageView_retroCornerSize, 0f) - updateCornerSize(cornerSize) + val cornerSize = typedArray.getDimension(R.styleable.RetroShapeableImageView_retroCornerSize, 0f) + val circleShape = typedArray.getBoolean(R.styleable.RetroShapeableImageView_circleShape, false) + addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + val radius = width / 2f + shapeAppearanceModel = ShapeAppearanceModel().withCornerSize(radius) + } typedArray.recycle() } diff --git a/app/src/main/res/layout/fragment_mini_player.xml b/app/src/main/res/layout/fragment_mini_player.xml index fdbba3162..54eb9d776 100644 --- a/app/src/main/res/layout/fragment_mini_player.xml +++ b/app/src/main/res/layout/fragment_mini_player.xml @@ -60,15 +60,11 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical"> - - diff --git a/app/src/main/res/layout/item_grid_circle.xml b/app/src/main/res/layout/item_grid_circle.xml index b448122dd..decd698b3 100644 --- a/app/src/main/res/layout/item_grid_circle.xml +++ b/app/src/main/res/layout/item_grid_circle.xml @@ -9,7 +9,7 @@ android:padding="4dp" tools:ignore="MissingPrefix"> - diff --git a/app/src/main/res/layout/item_list_quick_actions.xml b/app/src/main/res/layout/item_list_quick_actions.xml index 524f3b848..1194bb555 100644 --- a/app/src/main/res/layout/item_list_quick_actions.xml +++ b/app/src/main/res/layout/item_list_quick_actions.xml @@ -12,59 +12,48 @@ ~ See the GNU General Public License for more details. --> - + 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" /> + 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" /> - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/loading.xml b/app/src/main/res/layout/loading.xml index 6ae871577..b1757aa47 100644 --- a/app/src/main/res/layout/loading.xml +++ b/app/src/main/res/layout/loading.xml @@ -13,16 +13,19 @@ --> + android:padding="14dp" + app:layout_gravity="center"> \ No newline at end of file diff --git a/app/src/main/res/layout/preference_dialog_library_categories_listitem.xml b/app/src/main/res/layout/preference_dialog_library_categories_listitem.xml index 22b376fc4..8ab634aa3 100644 --- a/app/src/main/res/layout/preference_dialog_library_categories_listitem.xml +++ b/app/src/main/res/layout/preference_dialog_library_categories_listitem.xml @@ -20,6 +20,7 @@ android:background="?attr/rectSelector" android:descendantFocusability="blocksDescendants" android:focusable="true" + android:minHeight="@dimen/md_listitem_height" android:orientation="horizontal" android:paddingStart="16dp" android:paddingEnd="0dp" @@ -41,11 +42,7 @@ android:layout_weight="1" android:ellipsize="end" android:gravity="center_vertical" - android:minHeight="@dimen/md_listitem_height" - 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:paddingHorizontal="16dp" android:singleLine="true" android:textAppearance="@style/TextViewNormal" android:textColor="?android:attr/textColorPrimary" diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index ac201c507..426641031 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -20,8 +20,8 @@ Aller au genre Aller au dossier de départ Accorder - Taille de la grille - Taille de la grille (paysage) + Taille de l\'affichage + Taille de l\'affichage (paysage) Nouvelle liste de lecture… Suivant Lecture @@ -540,7 +540,7 @@ Artiste Compositeur Date - Date modified + Date de modification Année Descendant diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml new file mode 100644 index 000000000..776cc1fe4 --- /dev/null +++ b/app/src/main/res/values-my/strings.xml @@ -0,0 +1,659 @@ + + + About %s + အဖွဲ့နှင့် လူမှုကွန်ယက်လင့်ခ်များ + + Accent Color + The theme accent color (ခရမ်းရောင်သည်မူလအရောင်) + + About + အကြိုက်ဆုံးသို့ထည့်မည် + နားထောင်နေသည့်စာရင်းထဲသို့ထည့်မည် + Playlist သို့ထည့်မည် + နားထောင်နေသည့်စာရင်းအားရှင်းမည် + Cycle repeat mode + ဖျက်မည် + Device မှဖျက်မည် + အသေးစိတ် + Album သို့သွားမည် + အဆိုတော်သို့သွားမည် + အမျိုးအစားသို့သွားမည် + Directory အစသို့သွားမည် + ခွင့်ပြုမည် + အကွက်အရွယ်အစား + အကွက်အရွယ်အစား (land) + Playlist အသစ် + နောက်တစ်ပုဒ် + Play မည် + အားလုံး play မည် + Play next + Play/ခေတ္တရပ် + ယခင်အပုဒ် + အကြိုက်ဆုံးမှထုတ်မည် + နားထောင်နေသည့်စာရင်းမှထုတ်မည် + Playlist မှထုတ်မည် + နာမည်ပြင်မည် + နားထောင်နေသည့်စာရင်းအားသိမ်းမည် + စကန်ဖတ်မည် + ရှာမည် + စမည် + Ringtone အဖြစ်ထားမည် + Directory အစအဖြစ်ထားမည် + "Settings" + မျှဝေမည် + အားလုံး Shuffle play မည် + Playlist အား Shuffle play မည် + Sleep Timer + အထားအသိုပြင်မည် + Tag တည်းဖြတ်ခြင်း + Toggle favorite + Toggle shuffle mode + + Adaptive + + ထည့်မည် + "အောက်ပါ Playlist သို့ထည့်မည်" + + "နားထောင်နေသည့်စာရင်းထဲသို့ ၁ ပုဒ်ပေါင်းထည့်ခဲ့သည်" + နားထောင်နေသည့်စာရင်းထဲသို့ %1$d ပုဒ်ပေါင်းထည့်ခဲ့သည် + + Album + + + သီချင်း + သီချင်းများ + + + Album အားသီဆိုသူ + + Albums + + Album + Albums + + + Always + + ဟေ့ အရမ်းမိုက်တဲ့ဒီ Music Player ကိုတစ်ချက်ကြည့်ကြည့်! https://play.google.com/store/apps/details?id=%s + Shuffle + ထိပ်ဆုံးသီချင်းများ + ပုံအပြည့် + ကတ် + ရိုးရိုး + အသေး + စာပါဝင်မှုနည်း + + အဆိုတော် + + အဆိုတော်များ + + အသံအာရုံစိုက်ခြင်းအား ပယ်ဖျက်ခဲ့သည် + အသံ Settings များပြောင်းလဲရန်နှင့် Equalizer ချိန်ညှိရန် + + အလိုအလျောက် + + အတ္ထုပတ္တိ + + အနက်ရောင်သာ + + လစ်လျူရှုမည့်စာရင်း + + Blur + ကတ်အဝါး + + သတင်းပို့၍မရနိုင်ပါ + မမှန်ကန်သော Access token ဖြစ်သည်။ ကျေးဇူးပြု၍ App ရေးသားသူအားဆက်သွယ်ပါ။ + ရွေးချယ်ထားသော Repository အတွက် Issue ဖွင့်ခွင့်မပေးထားပါ။ ကျေးဇူးပြု၍ App ရေးသားသူအားဆက်သွယ်ပါ။ + မသိထားသော Error တက်သွားခဲ့သည်။ ကျေးဇူးပြု၍ App ရေးသားသူအားဆက်သွယ်ပါ။ + Username (သို့မဟုတ်) Password မှားနေသည် + အကြောင်းအရာ + ကိုယ်တိုင်အသေးစိတ်သတင်းပို့မည် + ကျေးဇူးပြု၍ အကြောင်းအရာအသေးစိတ်ကိုဖြည့်သွင်းပါ + ကျေးဇူးပြု၍ မှန်ကန်သော Github password ကိုဖြည့်သွင်းပါ + ကျေးဇူးပြု၍အကြောင်းအရာခေါင်းစဉ်အားဖြည့်သွင်းပါ + ကျေးဇူးပြု၍ မှန်ကန်သော Github username ကိုဖြည့်သွင်းပါ + မသိထားတဲ့ Error တစ်ခုတက်ခဲ့တယ်ဆိုပါစို့။ ဆက်ပြီး Crash ဖြစ်နေတယ်ဆိုရင် \"Clear App Data\" လုပ်ပါ (ဒါမှမဟုတ်) အီးမေးလ်ပို့ပါ။ + GitHub အကောင့်ဖြင့်ပို့မည် + + ယခုဝယ်မည် + + ပယ်ဖျက်မည် + + ကတ် + အရောင်ပါသောကတ် + လေးထောင့်ကတ် + ကတ် + + Now Playing Screen ပေါ်တွင် Carousel effect + + Cascading + + ပြောင်းလဲမှုမှတ်တမ်း + Telegram channel ရှိ ပြောင်းလဲမှုမှတ်တမ်း + + အဝိုင်း + + အဝိုင်း + + ရိုးရိုး + + ရှင်းမည် + Blacklist အားရှင်းမည် + နားထောင်နေသည့်စာရင်းအားရှင်းမည် + + အရောင် + + အရောင်များ + + တေးရေးဆရာ + + Device အချက်အလက်အား Clipboard သို့ ကော်ပီကူးခဲ့ပြီး + + Playlist ဖန်တီး၍မရပါ + "ကိုက်ညီသော Album Cover ကို Download မလုပ်နိုင်ပါ" + ဝယ်ယူမှုကိုပြန်မရယူနိုင်ပါ + ဖိုင် %d ခုကိုစကန်မဖတ်နိုင်ပါ + + ဖန်တီးမည် + + ဖန်တီးထားသော Playlist %1$s ခု + + အဖွဲ့ဝင်များနှင့် ကူညီသူများ + + %2$s သီဆိုထားသော %1$s ကိုယခုနားထောင်နေသည် + + အနက်ရောင်ဆန်ဆန် + + Playlist ဖျက်ခြင်း + %1$s Playlist ကိုဖျက်မှာလား]]> + Playlist များဖျက်ခြင်း + သီချင်းဖျက်ခြင်း + %1$s? သီချင်းကိုဖျက်မှာလား]]> + သီချင်းများဖျက်ခြင်း + %1$d ခုကိုဖျက်မှာလား]]> + %1$d ပုဒ်ကိုဖျက်မှာလား]]> + + သီချင်း %1$d ပုဒ်ကိုဖျက်ပစ်ခဲ့သည် + + Depth + + အကြောင်းအရာအသေးစိတ် + + Device အချက်အလက် + + အသံ Settings ပြုပြင်ရန် Retro Music ကိုခွင့်ပြုချက်ပေးပါ + Ringtone ထားခြင်း + + Blacklist ကိုရှင်းလင်းလိုပါသလား + %1$s ကိုဖယ်ရှားလိုပါသလား]]> + + လှူဒါန်းမည် + ကျွန်တော့်ရဲ့လက်ရာအတွက် မုန့်ဖိုးရဖို့ထိုက်တန်တယ်လို့ထင်ရင် ဒီမှာပေးသွားလိုက်ပါ။ + + ဝယ်ပေးမယ်: + + ပြီးပြီ + + Drive mode + + ဘာမှမရှိပါ + + Equalizer + + မေးလေ့ရှိသောမေးခွန်းများ + + အကြိုက်ဆုံး + + Finish last song + + အနေတော် + + အပြားပုံစံ + + Folders + + System အတိုင်း + + သင့်အတွက် + + အခမဲ့ + + အပြည့် + ကတ်အပြည့်ပုံစံ + + App Theme နှင့် အရောင်များကိုပြောင်းလဲရန် + Look and Feel + + အမျိုးအစား + + အမျိုးအစားများ + + Project ကို GitHub မှာ Fork လုပ်ပါ + + Gradient + + + + + + + + + + အကွက်စတိုင် + + အကူအညီထပ်လိုပါသေးလား + + Hinge + + မှတ်တမ်း + + မူလ + + ရေပြင်ညီအတိုင်းဟိုဘက်ဒီဘက်လှန်ခြင်း + + ဓာတ်ပုံ + Gradient ပုံ + အဆိုတော်ပုံအား ဒေါင်းလုဒ်ဆွဲခြင်း Settings များ + + Import + Import playlist + Android မီဒီယာစတိုးမှ Playlist များကိုသီချင်းများနှင့်အတူ import လုပ်သွားမည်ဖြစ်ပြီး ရှိပြီးသား Playlist ဖြစ်ပါကသီချင်းများကိုထည့်ပေါင်းသွားပါမည်။ + + Playlist %2$s သို့သီချင်း %1$d ပုဒ်ထည့်ပြီးပါပြီ + + Instagram + သင့်ရဲ့ Retro Music setup ကို Instagram တွင်ပြသလိုက်ပါ + + ကီးဘုတ် + + Bitrate + အမျိုးအစား + ဖိုင်နာမည် + ဖိုင်နေရာ + အရွယ်အစား + %s ၏နောက်ထပ် Album များ + Sampling rate + ကြာချိန် + + Label ထိုးထားမည် + + နောက်ဆုံးသွင်းထားသော + နောက်ဆုံးအပုဒ် + + Tab အမျိုးအစားများ + + လိုင်စင်များ + + အဖြူရောင်သက်သက် + + နားဆင်သူများ + + ဖိုင်ပြန်စီနေသည်... + + ခဏစောင့်ပါ... + + Login + + သီချင်းစာသား + + အိန္ဒိယနိုင်ငံတွင် ❤️ များဖြင့် ဖန်တီးသည် + + Material + + Error + Storage ခွင့်ပြုချက် error + + နာမည် + အများဆုံးနားထောင်ခဲ့သော + + ဘယ်တော့မှ + + Playlist အသစ် + %s ဟာ Directory အစဖြစ်သွားပါပြီ + + နောက်တစ်ပုဒ် + + Album တစ်ခုမှမရှိပါ + အဆိုတော်တစ်ယောက်မှမရှိပါ + "သီချင်းတစ်ပုဒ်အရင် play ကြည့်ပြီးမှ ပြန်ကြိုးစားပါ" + Equalizer တစ်ခုမှရှာမတွေ့ပါ + အမျိုးအစားခွဲစရာတစ်ခုမှမရှိပါ + သီချင်းစာသားရှာမတွေ့ပါ + သီချင်းတစ်ပုဒ်မှ play မထားပါ + Playlist တစ်ခုမှမရှိပါ + ဝယ်ယူထားမှုမရှိပါ + ရှာမတွေ့ပါ + သီချင်းတစ်ပုဒ်မှမရှိပါ + + ပုံမှန် + ပုံမှန်သီချင်းစာသား + + %s သည် Android မီဒီယာစတိုးတွင် မရှိပါ]]> + မကြာသေးခင်က play မထားပါ + + စကန်ဖတ်စရာမရှိပါ + ကြည့်စရာတစ်ခုမှမရှိပါ + + Notification + Notification ပုံစံကို စိတ်ကြိုက်ပြင်ဆင်မည် + + Now playing + Now playing queue + Now playing screen ကိုစိတ်ကြိုက်ပြင်ခြင်း + Now playing theme (၉) ခုအထက် ရရှိခြင်း + + Wi-Fi ဖြင့်သာ + + အဆင့်မြင့် Settings များ + + အခြား + + Password + + လွန်ခဲ့သော (၃)လ + + Peak ပုံစံ + + External Storage ကြည့်ရှုခွင့်အားငြင်းပယ်ခဲ့သည်။ + သီချင်းဖွင့်ရန်အတွက် ယခု App အား Storage ကြည့်ရှုခွင့်ပေးရန်လိုသည်။ + Storage ကြည့်ရှုခွင့် + + ခွင့်ပြုချက်ငြင်းပယ်ခံရသည် + + မိမိစိတ်ကြိုက် + Now Playing နှင့် UI controls များကိုစိတ်ကြိုက်ပြင်ဆင်မည် + + Local Storage မှ ရွေးမည် + + Pinterest + Retro Music ဒီဇိုင်းအကြံဉာဏ်ကောင်းများအတွက် Pinterest page ကို follow ပါ + + ရှင်းရှင်းလင်းလင်းပုံစံ + + Playing notification သည် play/pause ခလုတ် စသည့်တို့ကိုဖော်ပြပေးသည် + Playing notification + + Playlist တွင်ဘာမှမရှိပါ + Playlist နာမည် + + Playlists + + Blur Themes များအတွက်သက်ရောက်သော အဝါးပမာဏဖြစ်ပြီး ပမာဏနည်းလေ ပိုမြန်လေဖြစ်သည် + အဝါးပမာဏ + ကြာချိန်ဖြင့်သီချင်းစစ်ထုတ်မည် + သီချင်းကြာချိန်စစ်ထုတ်ခြင်း + ပိုမိုဆန်းသစ်သော + Album စတိုင် + အသံပိုင်းဆိုင်ရာ + Blacklist + ထိန်းချုပ်မှုဆိုင်ရာ + Theme + Images + Library + Lockscreen + Playlists + Volume သုညရောက်သွားပါက သီချင်းရပ်ပြီး Volume ပြန်ကျယ်လာသည့်အခါ ပြန် play မည်ဖြစ်သည်။ App ထဲဝင်မထားသော်လည်းအလုပ်လုပ်သည်။ + သုည၌ရပ်ခြင်း + ဤ feature ဖွင့်ထားပါက ဘက်ထရီသက်တမ်းထိခိုက်နိုင်ပါသည် + Screen တစ်ချိန်လုံးဖွင့်ထားမည် + ဘာသာစကားရွေးချယ်မည် + ယခု play နေသောသီချင်း Album cover ပုံအား Lockscreen wallpaper အဖြစ်ထားမည် + Album သီဆိုသူများကိုလည်း အဆိုတော် Category တွင်ထားမည် + System Sound (သို့) Notification တစ်ခုရောက်လာသည့်အခါ သီချင်းအသံကိုတိုးမည် + Blacklist folder သိို့သွင်းထားသည်များကို Library တွင်မြင်ရမည်မဟုတ်ပါ + Bluetooth device နှင့်ချိတ်ဆက်လိုက်သည်နှင့် သီချင်းစဖွင့်မည် + Lockscreen တွင် Album cover ပုံကိုဝါးထားမည်။ Third-party app နှင့် Widget များတွင် ပြဿနာတက်နိုင်သည်။ + Now Playing screen မှ Album cover အတွက် Carousel effect ဖြစ်သည်။ ဤ effect ကြောင့် ကတ်နှင့် ကတ်အဝါး Theme များအလုပ်လုပ်မည်မဟုတ်ပါ။ + Android ၏ Notification ဒီဇိုင်းအဟောင်းကိုသုံးမည် + နောက်ခံအရောင်နှင့်ထိန်းချုပ်ခလုတ်အရောင်များသည် Now Playing screen မှ Album cover အရောင်အတိုင်း ပြောင်းလဲပါမည် + Accent color မှ App shortcuts များကိုအရောင်ပြောင်းလဲသည်။ Accent color ပြောင်းသည့်အခါတိုင်း App ကိုသက်ရောက်မှုရှိစေရန် ဤခလုတ်ကိုအဖွင့်၊အပိတ်လုပ်ပေးပါ။ + "Notification အရောင်ကို Album cover မှထင်ရှားသည့်အရောင်အတိုင်း ပြောင်းမည်" + Material ဒီဇိုင်းညွှန်ကြားချက်များအရ Dark Mode ဖွင့်ထားချိန်တွင်အရောင်များမှိန်နေသင့်သည် + Notification ကိုနှိပ်သည့်အခါ Home screen သို့ရောက်မည့်အစား Now Playing screen သို့တိုက်ရိုက်ရောက်သွားမည် + Mini player တွင် ထိန်းချုပ်ခလုတ်အပိုများထပ်ပေါင်းမည် + သီချင်းဖိုင်၏အသေးစိတ်အချက်အလက်များ ပြသမည်၊ ဥပမာ - ဖိုင်အမျိုးအစား၊ bitrate နှင့် ကြိမ်နှုန်း + "အချို့ device များတွင် playback ပြဿနာများဖြစ်ပေါ်နိုင်သည်" + Home banner အား ပြသခြင်း၊ ဖျောက်ထားခြင်း + Album cover အရည်အသွေးပိုမိုကောင်းမွန်လာနိုင်သော်လည်း Loading time ပိုကြာနိုင်သည်။ အရည်အသွေးနိမ့်သောပုံများနှင့်အဆင်မပြေမှသာလျှင် ဤခလုတ်ကိုဖွင့်ပါ။ + Library category များ ဖော်ခြင်း၊ ဖျောက်ခြင်းနှင့် အထားအသိုများ ချိန်ညှိမည် + Retro Music ၏ ပြင်ဆင်ထားသော Lockscreen controls များကိုသုံးမည် + Open Source software အတွက် လိုင်စင်အချက်အလက်များ + Immersive mode + နားကြပ်နှင့်ချိတ်ဆက်ပြီးသည့်နှင့် စတင် play မည် + သီချင်းဖွင့်မည့်စာရင်း\'အသစ်\'ကို play သည့်အခါ Shuffle Mode ပိတ်သွားပါမည် + နေရာလုံလုံလောက်လောက်ရှိပါက Now Playing screen တွင် အသံအတိုးအကျယ်ခလုတ်များပြသမည် + Album cover ပြသခြင်း + Album သီဆိုသူဖြင့် ရှာဖွေခြင်း + Album cover theme + Album cover skip + Colored App shortcuts + Reduce volume on focus loss + အဆိုတော်ဓာတ်ပုံများကို အလိုအလျောက်ဒေါင်းလုဒ်ဆွဲခြင်း + Blacklist + Bluetooth playback + Album cover အဝါး + Notification ဒီဇိုင်းအဟောင်း + Adaptive color + အရောင်ပါသော notification + Desaturated color + Now Playing screen ပြသခြင်း + အပိုထိန်းချုပ်မှုများ + သီချင်းဖိုင်အချက်အလက် + လစ်ဟာမှုမရှိ play ခြင်း + App theme + Album အကွက်ပုံစံ + အဆိုတော်အကွက်ပုံစံ + Banner + Media Store covers များကိုလျစ်လျူရှုခြင်း + နောက်ဆုံးသွင်းထားသော playlist ရှိသီချင်းများ + Lockscreen အပြည့် controls + Now playing theme + Open source licences + Tab ခေါင်းစဉ်ပြသခြင်း + Carousel effect + App ကို screen အပြည့်ထားမည် + အလိုအလျောက် play ခြင်း + Shuffle mode + အသံထိန်းချုပ်မှု + + Pro + Black theme ၊ Now playing themes နှင့် Carousel effect စသည်များ... + + Profile + + ဝယ်ယူမည် + + နားထောင်နေသည့်စာရင်း + + ဤ app ကို star ပေးမည် + App ကိုကြိုက်ပါသလား။ ယခုထက်ပိုကောင်းမွန်အောင်ဘယ်လိုလုပ်ရမလဲဆိုတာ ကျွန်တော်တို့ကို Google Play Store မှာပြောပြပေးပါ။ + + မကြာသေးခင်ကနားထောင်ထားသော Album များ + မကြာသေးခင်ကနားထောင်ထားသော အဆိုတော်များ + + ပယ်ဖျက်မည် + Cover ကိုဖျက်မည် + Blacklist မှဖျက်မည် + Playlist မှဖျက်မည် + %1$s ကို Playlist ကဖျက်မှာလား]]> + Playlist မှသီချင်းများဖျက်ခြင်း + %1$d ပုဒ်ကို playlist ကဖျက်မှာလား]]> + + Playlist နာမည်ပြင်မည် + + ပြဿနာတစ်ခုသတင်းပို့မည် + Bug report တင်မည် + + Reset + Reset artist image + + ပြန်လည်ရယူမည် + + ယခင်ဝယ်ယူမှုကို ပြန်လည်ရယူပြီးပါပြီ။ Feature အားလုံးအလုပ်လုပ်ရန် app မှထွက်ပြီးပြန်ဝင်ပါ။ + ယခင်ဝယ်ယူမှုအား ပြန်လည်ရယူပြီးပါပြီ + + ယခင်ဝယ်ယူမှုအား ပြန်လည်ရယူနေသည်... + + Retro Music Player + Retro Music Pro + + သီချင်းများကို Ringtone ထားရန် app အား System Settings များကိုပြင်ဆင်ခွင့်ပေးရန်လိုသည်။ + Ringtone + + ဖိုင်ဖျက်ခြင်းမအောင်မြင်ပါ: %s + + SAF URI ကိုမရယူနိုင်ပါ + Navigation drawer ကိုဖွင့်ပါ + Overflow Menu မှ \'Show SD card\' ကိုနှိပ်ပါ + + %s သည် SD card ကြည့်ရှုခွင့်လိုအပ်သည် + SD card ၏ ထိပ်ဆုံး Directory ကိုရွေးပေးရန်လိုအပ်သည် + Navigation drawer တွင် SD card ကိုရွေးချယ်ပါ + Folder အခွဲများကို မဖွင့်ပါနှင့် + Screen ၏အောက်ဆုံးတွင်ရှိသော \'select\' ခလုတ်ကိုနှိပ်ပါ + ဖိုင်ပြုပြင်ခြင်းမအောင်မြင်ပါ: %s + + မှတ်ထားမည် + + + ဖိုင်အဖြစ်သိမ်းမည် + ဖိုင်များအဖြစ်သိမ်းမည် + + %s တွင် playlist ကိုသိမ်းခဲ့သည် + + ပြောင်းလဲမှုများကိုမှတ်သားနေသည် + + မီဒီယာစကန်ဖတ်မည် + + ဖိုင် %2$d ခုအနက် %1$d ခုကို စကန်ဖတ်ပြီးပါပြီ + + Scrobbles + + အားလုံးရွေးမည် + + ရွေးချယ်ထားသော + + ထားမည် + အဆိုတော်ပုံအဖြစ်ထားမည် + + App ကိုမျှဝေမည် + သင့်မိသားစုနှင့် သူငယ်ချင်းများကိုပြန်လည်မျှဝေလိုက်ပါ + Stories သို့မျှဝေမည် + + Shuffle + + ရိုးရိုးရှင်းရှင်း + + Sleep timer ကိုဖျက်ပြီးပါပြီ + ယခုမှစတင်၍ Sleep timer ကို %d မိနစ်အချိန်မှတ်ပြီးပါပြီ + + Social + Story မျှဝေမည် + + သီချင်း + သီချင်းကြာချိန် + + သီချင်းများ + + အထားအသိုပြင်မည် + ငယ်ရာမှကြီးရာ + Album + အဆိုတော် + တေးရေးဆရာ + ထည့်သွင်းသည့်ရက် + ပြင်ဆင်သည့်ရက် + အပုဒ်အရေအတွက် + အပုဒ်အရေအတွက်ပြောင်းပြန် + ထွက်ရှိသည့်နှစ် + ကြီးရာမှငယ်ရာ + + ဆောရီး! သင့် device သည် အသံဖြင့်ပြောဆိုခြင်းအား အထောက်အပံ့မပေးထားပါ + သင့် Library တွင်ရှာဖွေခြင်း + + Stack + + သီချင်းစတင် play ပါပြီ + + အကြံပြုထားသောသီချင်းများ + + Support development + + Swipe to unlock + + ချိန်ကိုက်ထားသောသီချင်းစာသား + + + Telegram + Bugs များကို ဆွေးနွေးရန်၊ အကြံပြုချက်များပေးရန်၊ ကြွားရန်နှင့် စသည်များ... + + ကျေးဇူးတင်ပါတယ် + + အသံဖိုင် + + ယခုလ + ယခုအပတ် + ယခုနှစ် + + Tiny + Tiny card + + နာမည် + + ယနေ့ + + ထိပ်ဆုံး Album များ + ထိပ်ဆုံးအဆိုတော်များ + + "Track (2 for track 2 or 3004 for CD3 track 4)" + အပုဒ်နံပါတ် + + ဘာသာပြန်ခြင်း + App ကိုသင့်ဘာသာစကားသို့ ကူပြန်ပေးပါ + + Retro Music Premium ကိုစမ်းကြည့်ပါ + + Twitter + သင့် Retro Music ဒီဇိုင်းများကိုမျှဝေပါ + + Label မထိုးပါ + + ဤသီချင်းကို မ play နိုင်ပါ + + လာမည့်အပုဒ် + + Update image + + အပ်ဒိတ်လုပ်နေသည်… + + သုံးစွဲသူ + + သုံးစွဲသူအမည် + + Version + + ဒေါင်လိုက်ဟိုဘက်ဒီဘက်လှန်ခြင်း + + အသံအတိုးအကျယ် + + Web search + + မင်္ဂလာပါ + + ဘာများမျှဝေချင်ပါသလဲ + + ဘာအသစ်တွေရှိလဲ + + Window + အနားအကွေးပုံစံ + + %1$s ကို Ringtone အဖြစ်ထားပြီးပါပြီ + %1$d ခုကိုရွေးထားသည် + + ထွက်ရှိသည့်နှစ် + + အနည်းဆုံး category တစ်ခုရွေးချယ်ရန်လိုအပ်သည် + Issue tracker website သို့ခေါ်ဆောင်သွားပါမည် + + သင့်အကောင့်အချက်အလက်ကို အတည်ပြုရန်အတွက်သာအသုံးပြုပါသည်။ + \ No newline at end of file diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index ab893bf60..fc9d1f04a 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -10,7 +10,7 @@ Добавить в избранное Добавить в очередь воспроизведения Добавить в плейлист - Очистить очередь воспроизведения + Очистить очередь воспроизведения Режим циклического повтора Удалить Удалить с устройства @@ -315,7 +315,7 @@ Следующая песня Альбомы отсутствуют - Исполнители отсутствую + Исполнители отсутствуют "Сначала проиграйте песню, затем попробуйте заново." Эквалайзер не найден Жанры отсутствуют @@ -443,7 +443,6 @@ Непрерывное воспроизведение Тема приложения Сетка альбома на Главной странице - Сетка исполнителя на Главной странице Кнопка Домой Игнорировать обложки из хранилища Дата последнего добавления плейлиста diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index bf65574b5..e9aa38af3 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -12,7 +12,7 @@ 8dp - 48dp + 56dp 96dp 96dp @@ -34,7 +34,7 @@ 12dp 32dp - 104dp + 112dp 8dp 48dp 52dp diff --git a/app/src/main/res/values/shapeable_imageview.xml b/app/src/main/res/values/shapeable_imageview.xml index b8051fd3e..2ced73f07 100644 --- a/app/src/main/res/values/shapeable_imageview.xml +++ b/app/src/main/res/values/shapeable_imageview.xml @@ -15,5 +15,6 @@ + \ No newline at end of file diff --git a/appthemehelper/build.gradle b/appthemehelper/build.gradle index fc331de28..32d5fd286 100644 --- a/appthemehelper/build.gradle +++ b/appthemehelper/build.gradle @@ -27,8 +27,8 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0-alpha01' - implementation 'androidx.preference:preference:1.1.1' + implementation 'com.google.android.material:material:1.3.0-alpha04' + implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.cardview:cardview:1.0.0' // Used for the list preference classes def material_dialog_version = "0.9.6.0" diff --git a/build.gradle b/build.gradle index c6c313625..71f131e57 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.10' + ext.kotlin_version = '1.4.20' repositories { jcenter() google() } 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" def nav_version = "2.3.0" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f0ff23148..4394daddf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Sat Jun 06 02:12:18 IST 2020 +#Thu Dec 03 19:20:35 IST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME