From d3597d123df778d54cac050c8ad45e89a737c10a Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 25 Mar 2022 21:43:09 +0530 Subject: [PATCH 01/15] Fixed some Playing queue crashes --- .../code/name/monkey/retromusic/service/MusicService.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 965fd3031..b69eb4941 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -96,6 +96,7 @@ import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition import org.koin.java.KoinJavaComponent.get import java.util.* +import kotlin.collections.ArrayList /** * @author Karim Abou Zeid (kabouzeid), Andrew Neal. Modified by Prathamesh More @@ -175,10 +176,10 @@ class MusicService : MediaBrowserServiceCompat(), private lateinit var mediaStoreObserver: ContentObserver private var musicPlayerHandlerThread: HandlerThread? = null private var notHandledMetaChangedForCurrentTrack = false - private var originalPlayingQueue = mutableListOf() + private var originalPlayingQueue = ArrayList() @JvmField - var playingQueue = mutableListOf() + var playingQueue = ArrayList() var isPausedByTransientLossOfFocus = false private val becomingNoisyReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { @@ -1037,8 +1038,8 @@ class MusicService : MediaBrowserServiceCompat(), SAVED_POSITION_IN_TRACK, -1 ) if (restoredQueue.size > 0 && restoredQueue.size == restoredOriginalQueue.size && restoredPosition != -1) { - originalPlayingQueue = restoredOriginalQueue - playingQueue = restoredQueue + originalPlayingQueue = ArrayList(restoredOriginalQueue) + playingQueue = ArrayList(restoredQueue) position = restoredPosition openCurrent() prepareNext() From b0b552a0609950186ab1a214835e9bb95ef93bac Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 25 Mar 2022 22:09:03 +0530 Subject: [PATCH 02/15] Fixed speech-to-text search --- .../retromusic/fragments/search/SearchFragment.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt index 63f60d2a4..8ce902b03 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt @@ -14,6 +14,7 @@ */ package code.name.monkey.retromusic.fragments.search +import android.app.Activity.RESULT_OK import android.content.ActivityNotFoundException import android.content.Intent import android.content.res.ColorStateList @@ -221,6 +222,16 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa } } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == RESULT_OK) { + val spokenText: String? = + data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) + .let { text -> text?.get(0) } + binding.searchView.setText(spokenText) + } + } + override fun onDestroyView() { hideKeyboard(view) super.onDestroyView() From 97f93e09d67e12e08481dbc4898893cd98372b52 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 26 Mar 2022 18:34:51 +0530 Subject: [PATCH 03/15] Fixed settings change not reflecting in MainActivity --- .../code/name/monkey/retromusic/activities/MainActivity.kt | 6 +++++- .../activities/base/AbsSlidingMusicPanelActivity.kt | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index 5bde635bb..6757172d2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -131,7 +131,6 @@ class MainActivity : AbsCastActivity(), OnSharedPreferenceChangeListener { override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - PreferenceUtil.registerOnSharedPreferenceChangedListener(this) val expand = intent?.extra(EXPAND_PANEL)?.value ?: false if (expand && PreferenceUtil.isExpandPanel) { fromNotification = true @@ -141,6 +140,11 @@ class MainActivity : AbsCastActivity(), OnSharedPreferenceChangeListener { } } + override fun onResume() { + super.onResume() + PreferenceUtil.registerOnSharedPreferenceChangedListener(this) + } + override fun onDestroy() { super.onDestroy() PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index 3cbee691b..598510f2c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -64,7 +64,6 @@ import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.ViewUtil import com.google.android.material.bottomsheet.BottomSheetBehavior.* -import dev.chrisbanes.insetter.applyInsetter import org.koin.androidx.viewmodel.ext.android.viewModel From ead85203331e6406fde2b952285c5cd689a945ad Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 27 Mar 2022 14:36:35 +0530 Subject: [PATCH 04/15] Fixed shuffle button not shuffling songs --- .../code/name/monkey/retromusic/helper/MusicPlayerRemote.kt | 2 +- .../java/code/name/monkey/retromusic/service/MusicService.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index 8e5f60bd3..a8235ad80 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -302,7 +302,7 @@ object MusicPlayerRemote : KoinComponent { fun setShuffleMode(shuffleMode: Int): Boolean { if (musicService != null) { - musicService!!.shuffleMode = shuffleMode + musicService!!.setShuffleMode(shuffleMode) return true } return false diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index b69eb4941..9d177a101 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -541,7 +541,7 @@ class MusicService : MediaBrowserServiceCompat(), return shuffleMode } - private fun setShuffleMode(shuffleMode: Int) { + fun setShuffleMode(shuffleMode: Int) { PreferenceManager.getDefaultSharedPreferences(this) .edit() .putInt(SAVED_SHUFFLE_MODE, shuffleMode) @@ -1224,6 +1224,7 @@ class MusicService : MediaBrowserServiceCompat(), } META_CHANGED -> { playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() } + playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() } updateMediaSessionMetaData() updateMediaSessionPlaybackState() savePosition() From 0c4cabc7551c4f1461fb2a4aab1e1c7cb06915aa Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 27 Mar 2022 14:37:42 +0530 Subject: [PATCH 05/15] Fixed unshuffled songs when restoring the playing queue --- .../name/monkey/retromusic/activities/ErrorActivity.kt | 2 +- .../monkey/retromusic/fragments/songs/SongsFragment.kt | 3 +-- .../name/monkey/retromusic/repository/SongRepository.kt | 9 ++++++++- .../service/notification/PlayingNotificationImpl24.kt | 1 - 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt index 409750bcb..3b3377bb1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt @@ -53,7 +53,7 @@ class ErrorActivity : AppCompatActivity() { ) .setNeutralButton( R.string.customactivityoncrash_error_activity_error_details_share - ) { dialog, which -> + ) { _, _ -> val bugReport = createFile( context = this, diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index c3aaa94ff..acbd45923 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -25,7 +25,6 @@ import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.fragments.GridStyle import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment -import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SortOrder.SongSortOrder import code.name.monkey.retromusic.interfaces.ICabCallback import code.name.monkey.retromusic.interfaces.ICabHolder @@ -66,7 +65,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment + fun sortedSongs(cursor: Cursor?): List + fun songs(query: String): List fun songsByFilePath(filePath: String, ignoreBlacklist: Boolean = false): List @@ -57,7 +59,7 @@ interface SongRepository { class RealSongRepository(private val context: Context) : SongRepository { override fun songs(): List { - return songs(makeSongCursor(null, null)) + return sortedSongs(makeSongCursor(null, null)) } override fun songs(cursor: Cursor?): List { @@ -68,7 +70,12 @@ class RealSongRepository(private val context: Context) : SongRepository { } while (cursor.moveToNext()) } cursor?.close() + return songs + } + + override fun sortedSongs(cursor: Cursor?): List { val collator = Collator.getInstance() + val songs = songs(cursor) return when (PreferenceUtil.songSortOrder) { SortOrder.SongSortOrder.SONG_A_Z -> { songs.sortedWith{ s1, s2 -> collator.compare(s1.title, s2.title) } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt index 92a2cec0b..6ff6cbfe0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt @@ -181,7 +181,6 @@ class PlayingNotificationImpl24( onUpdate() } }) - updateFavorite(song, onUpdate) } private fun buildPlayAction(isPlaying: Boolean): NotificationCompat.Action { From b4dc50306f2bad8fcf4e3186120fc76e21520f77 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 27 Mar 2022 19:55:58 +0530 Subject: [PATCH 06/15] Exit Playlist page when playlist is deleted --- .../name/monkey/retromusic/db/PlaylistDao.kt | 3 +++ .../playlists/PlaylistDetailsFragment.kt | 7 ++++++- .../playlists/PlaylistDetailsViewModel.kt | 17 ++++------------- .../monkey/retromusic/repository/Repository.kt | 6 +++++- .../retromusic/repository/RoomRepository.kt | 4 ++++ 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt index a8369226e..64db1ae43 100644 --- a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt +++ b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt @@ -64,4 +64,7 @@ interface PlaylistDao { @Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId") fun favoritesSongs(playlistId: Long): List + + @Query("SELECT EXISTS(SELECT * FROM PlaylistEntity WHERE playlist_id = :playlistId)") + fun checkPlaylistExists(playlistId: Long): LiveData } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index 2c9771327..f90902a04 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -9,6 +9,7 @@ import androidx.activity.addCallback import androidx.core.view.ViewCompat import androidx.core.view.doOnPreDraw import androidx.core.view.isVisible +import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -58,7 +59,6 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).addTarget(view) returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false) setHasOptionsMenu(true) - mainActivity.addMusicServiceEventListener(viewModel) mainActivity.setSupportActionBar(binding.toolbar) ViewCompat.setTransitionName(binding.container, "playlist") playlist = arguments.extraPlaylist @@ -67,6 +67,11 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli viewModel.getSongs().observe(viewLifecycleOwner) { songs(it.toSongs()) } + viewModel.playlistExists().observe(viewLifecycleOwner) { + if (!it) { + findNavController().navigateUp() + } + } postponeEnterTransition() requireView().doOnPreDraw { startPostponedEnterTransition() } requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt index 3416caa23..fad139742 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt @@ -22,24 +22,15 @@ import code.name.monkey.retromusic.db.SongEntity import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.repository.RealRepository +import code.name.monkey.retromusic.repository.RealRoomRepository class PlaylistDetailsViewModel( private val realRepository: RealRepository, private var playlist: PlaylistWithSongs -) : ViewModel(), IMusicServiceEventListener { - - private val playListSongs = MutableLiveData>() - +) : ViewModel() { fun getSongs(): LiveData> = realRepository.playlistSongs(playlist.playlistEntity.playListId) - override fun onMediaStoreChanged() {} - override fun onServiceConnected() {} - override fun onServiceDisconnected() {} - override fun onQueueChanged() {} - override fun onPlayingMetaChanged() {} - override fun onPlayStateChanged() {} - override fun onRepeatModeChanged() {} - override fun onShuffleModeChanged() {} - override fun onFavoriteStateChanged() {} + fun playlistExists(): LiveData = + realRepository.checkPlaylistExists(playlist.playlistEntity.playListId) } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt index 9ab706a7f..c2e67e584 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt @@ -111,6 +111,7 @@ interface Repository { suspend fun searchAlbums(query: String): List suspend fun isSongFavorite(songId: Long): Boolean fun getSongByGenre(genreId: Long): Song + fun checkPlaylistExists(playListId: Long): LiveData } class RealRepository( @@ -277,6 +278,9 @@ class RealRepository( override suspend fun checkPlaylistExists(playlistName: String): List = roomRepository.checkPlaylistExists(playlistName) + override fun checkPlaylistExists(playListId: Long): LiveData = + roomRepository.checkPlaylistExists(playListId) + override suspend fun createPlaylist(playlistEntity: PlaylistEntity): Long = roomRepository.createPlaylist(playlistEntity) @@ -377,7 +381,7 @@ class RealRepository( } override suspend fun suggestions(): List { - if (!PreferenceUtil.homeSuggestions) return listOf() + if (!PreferenceUtil.homeSuggestions) return listOf() return NotPlayedPlaylist().songs().shuffled().takeIf { it.size > 9 } ?: emptyList() diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt index ab1fa058b..2d6277322 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt @@ -49,6 +49,7 @@ interface RoomRepository { suspend fun blackListPaths(): List suspend fun deleteSongs(songs: List) suspend fun isSongFavorite(context: Context, songId: Long): Boolean + fun checkPlaylistExists(playListId: Long): LiveData } class RealRoomRepository( @@ -97,6 +98,9 @@ class RealRoomRepository( override fun getSongs(playListId: Long): LiveData> = playlistDao.songsFromPlaylist(playListId) + override fun checkPlaylistExists(playListId: Long): LiveData = + playlistDao.checkPlaylistExists(playListId) + override suspend fun deletePlaylistEntities(playlistEntities: List) = playlistDao.deletePlaylists(playlistEntities) From ad51d0967215effff2d00f59ef75d75318bc2ef2 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 27 Mar 2022 21:40:42 +0530 Subject: [PATCH 07/15] Use MediaButtonReceiver from androidx.media to handle headset button actions --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 9 +- .../service/MediaButtonIntentReceiver.kt | 200 ------------------ .../service/MediaSessionCallback.kt | 5 - .../monkey/retromusic/service/MusicService.kt | 18 +- 5 files changed, 11 insertions(+), 222 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/service/MediaButtonIntentReceiver.kt diff --git a/app/build.gradle b/app/build.gradle index 2aa64fffb..41120fe0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -172,4 +172,5 @@ dependencies { implementation 'cat.ereza:customactivityoncrash:2.3.0' implementation 'me.tankery.lib:circularSeekBar:1.3.2' debugImplementation 'com.github.amitshekhariitbhu:Android-Debug-Database:1.0.6' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97eee789a..6351206bf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,8 +38,8 @@ + android:launchMode="singleTop" + android:theme="@style/SplashTheme"> @@ -212,7 +212,7 @@ @@ -323,6 +323,9 @@ + + + { - val clickCount = msg.arg1 - - if (DEBUG) Log.v(TAG, "Handling headset click, count = $clickCount") - val command = when (clickCount) { - 1 -> ACTION_TOGGLE_PAUSE - 2 -> ACTION_SKIP - 3 -> ACTION_REWIND - else -> null - } - - if (command != null) { - val context = msg.obj as Context - startService(context, command) - } - } - } - releaseWakeLockIfHandlerIdle() - } - } - - fun handleIntent(context: Context, intent: Intent): Boolean { - val intentAction = intent.action - if (Intent.ACTION_MEDIA_BUTTON == intentAction) { - val event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) - ?: return false - - val keycode = event.keyCode - val action = event.action - val eventTime = if (event.eventTime != 0L) - event.eventTime - else - System.currentTimeMillis() - - var command: String? = null - when (keycode) { - KeyEvent.KEYCODE_MEDIA_STOP -> command = ACTION_STOP - KeyEvent.KEYCODE_HEADSETHOOK, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> command = - ACTION_TOGGLE_PAUSE - KeyEvent.KEYCODE_MEDIA_NEXT -> command = ACTION_SKIP - KeyEvent.KEYCODE_MEDIA_PREVIOUS -> command = ACTION_REWIND - KeyEvent.KEYCODE_MEDIA_PAUSE -> command = ACTION_PAUSE - KeyEvent.KEYCODE_MEDIA_PLAY -> command = ACTION_PLAY - } - if (command != null) { - if (action == KeyEvent.ACTION_DOWN) { - if (event.repeatCount == 0) { - // Only consider the first event in a sequence, not the repeat events, - // so that we don't trigger in cases where the first event went to - // a different app (e.g. when the user ends a phone call by - // long pressing the headset button) - - // The service may or may not be running, but we need to send it - // a command. - if (keycode == KeyEvent.KEYCODE_HEADSETHOOK || keycode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { - if (eventTime - mLastClickTime >= DOUBLE_CLICK) { - mClickCounter = 0 - } - - mClickCounter++ - if (DEBUG) Log.v(TAG, "Got headset click, count = $mClickCounter") - mHandler.removeMessages(MSG_HEADSET_DOUBLE_CLICK_TIMEOUT) - - val msg = mHandler.obtainMessage( - MSG_HEADSET_DOUBLE_CLICK_TIMEOUT, mClickCounter, 0, context - ) - - val delay = (if (mClickCounter < 3) DOUBLE_CLICK else 0).toLong() - if (mClickCounter >= 3) { - mClickCounter = 0 - } - mLastClickTime = eventTime - acquireWakeLockAndSendMessage(context, msg, delay) - } else { - startService(context, command) - } - return true - } - } - } - } - return false - } - - private fun startService(context: Context, command: String?) { - val intent = Intent(context, MusicService::class.java) - intent.action = command - try { - // IMPORTANT NOTE: (kind of a hack) - // on Android O and above the following crashes when the app is not running - // there is no good way to check whether the app is running so we catch the exception - // we do not always want to use startForegroundService() because then one gets an ANR - // if no notification is displayed via startForeground() - // according to Play analytics this happens a lot, I suppose for example if command = PAUSE - context.startService(intent) - } catch (ignored: IllegalStateException) { - ContextCompat.startForegroundService(context, intent) - } - } - - private fun acquireWakeLockAndSendMessage(context: Context, msg: Message, delay: Long) { - if (wakeLock == null) { - val appContext = context.applicationContext - val pm = appContext.getSystemService() - wakeLock = pm?.newWakeLock( - PowerManager.PARTIAL_WAKE_LOCK, - "RetroMusicApp:Wakelock headset button" - ) - wakeLock!!.setReferenceCounted(false) - } - if (DEBUG) Log.v(TAG, "Acquiring wake lock and sending " + msg.what) - // Make sure we don't indefinitely hold the wake lock under any circumstances - wakeLock!!.acquire(10000) - - mHandler.sendMessageDelayed(msg, delay) - } - - private fun releaseWakeLockIfHandlerIdle() { - if (mHandler.hasMessages(MSG_HEADSET_DOUBLE_CLICK_TIMEOUT)) { - if (DEBUG) Log.v(TAG, "Handler still has messages pending, not releasing wake lock") - return - } - - if (wakeLock != null) { - if (DEBUG) Log.v(TAG, "Releasing wake lock") - wakeLock!!.release() - wakeLock = null - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index b52752be2..e2a29931f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -15,7 +15,6 @@ package code.name.monkey.retromusic.service import android.content.Context -import android.content.Intent import android.os.Bundle import android.provider.MediaStore import android.support.v4.media.session.MediaSessionCompat @@ -179,10 +178,6 @@ class MediaSessionCallback( musicService.seek(pos.toInt()) } - override fun onMediaButtonEvent(mediaButtonIntent: Intent): Boolean { - return MediaButtonIntentReceiver.handleIntent(context, mediaButtonIntent) - } - override fun onCustomAction(action: String, extras: Bundle?) { when (action) { CYCLE_REPEAT -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 9d177a101..56e3e70fa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -14,7 +14,6 @@ package code.name.monkey.retromusic.service import android.app.NotificationManager -import android.app.PendingIntent import android.appwidget.AppWidgetManager import android.bluetooth.BluetoothDevice import android.content.* @@ -47,8 +46,8 @@ import androidx.media.AudioAttributesCompat.CONTENT_TYPE_MUSIC import androidx.media.AudioFocusRequestCompat import androidx.media.AudioManagerCompat import androidx.media.MediaBrowserServiceCompat +import androidx.media.session.MediaButtonReceiver.handleIntent import androidx.preference.PreferenceManager -import code.name.monkey.appthemehelper.util.VersionUtils.hasMarshmallow import code.name.monkey.appthemehelper.util.VersionUtils.hasQ import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.LockScreenActivity @@ -94,6 +93,7 @@ import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener import com.bumptech.glide.RequestBuilder import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition +import com.google.android.gms.cast.framework.media.MediaIntentReceiver import org.koin.java.KoinJavaComponent.get import java.util.* import kotlin.collections.ArrayList @@ -753,6 +753,7 @@ class MusicService : MediaBrowserServiceCompat(), override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if (intent != null && intent.action != null) { + handleIntent(mediaSession, intent) restoreQueuesAndPositionIfNecessary() when (intent.action) { ACTION_TOGGLE_PAUSE -> if (isPlaying) { @@ -1445,24 +1446,13 @@ class MusicService : MediaBrowserServiceCompat(), } private fun setupMediaSession() { - val mediaButtonReceiverComponentName = - ComponentName(applicationContext, MediaButtonIntentReceiver::class.java) - val mediaButtonIntent = Intent(Intent.ACTION_MEDIA_BUTTON) - mediaButtonIntent.component = mediaButtonReceiverComponentName - val mediaButtonReceiverPendingIntent = PendingIntent.getBroadcast( - applicationContext, 0, mediaButtonIntent, - if (hasMarshmallow()) PendingIntent.FLAG_IMMUTABLE else 0 - ) mediaSession = MediaSessionCompat( this, - "RetroMusicPlayer", - mediaButtonReceiverComponentName, - mediaButtonReceiverPendingIntent + "RetroMusicPlayer" ) val mediasessionCallback = MediaSessionCallback(applicationContext, this) mediaSession?.setCallback(mediasessionCallback) mediaSession?.isActive = true - mediaSession?.setMediaButtonReceiver(mediaButtonReceiverPendingIntent) } inner class MusicBinder : Binder() { From 7e3b4404cf647c6e424194610a0d523018277686 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 27 Mar 2022 22:57:05 +0530 Subject: [PATCH 08/15] [Notification] Code Cleanup --- .../service/notification/PlayingNotificationClassic.kt | 6 +++--- .../service/notification/PlayingNotificationImpl24.kt | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt index 93c992085..8bd1bceff 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt @@ -25,6 +25,7 @@ import android.graphics.Color import android.graphics.drawable.Drawable import android.widget.RemoteViews import androidx.core.app.NotificationCompat +import androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle import code.name.monkey.appthemehelper.util.ATHUtil.resolveColor import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper @@ -57,7 +58,6 @@ class PlayingNotificationClassic( val context: Context ) : PlayingNotification(context) { private var primaryColor: Int = 0 - private var isInitialized = false private fun getCombinedRemoteViews(collapsed: Boolean, song: Song): RemoteViews { val remoteViews = RemoteViews( @@ -75,7 +75,6 @@ class PlayingNotificationClassic( } override fun updateMetadata(song: Song, onUpdate: () -> Unit) { - isInitialized = true val notificationLayout = getCombinedRemoteViews(true, song) val notificationLayoutBig = getCombinedRemoteViews(false, song) @@ -98,11 +97,11 @@ class PlayingNotificationClassic( setContentIntent(clickIntent) setDeleteIntent(deleteIntent) setCategory(NotificationCompat.CATEGORY_SERVICE) - setColorized(PreferenceUtil.isColoredNotification) priority = NotificationCompat.PRIORITY_MAX setVisibility(NotificationCompat.VISIBILITY_PUBLIC) setCustomContentView(notificationLayout) setCustomBigContentView(notificationLayoutBig) + setStyle(DecoratedMediaCustomViewStyle()) setOngoing(true) val bigNotificationImageSize = context.resources .getDimensionPixelSize(R.dimen.notification_big_image_size) @@ -164,6 +163,7 @@ class PlayingNotificationClassic( setNotificationContent(ColorUtil.isColorLight(bgColorFinal)) } else { if (PreferenceUtil.isColoredNotification) { + setColorized(true) color = bgColor setNotificationContent(color.isColorLight) } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt index 6ff6cbfe0..b0e1e513d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt @@ -114,11 +114,6 @@ class PlayingNotificationImpl24( .setShowActionsInCompactView(1, 2, 3) ) setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - if (Build.VERSION.SDK_INT <= - Build.VERSION_CODES.O && PreferenceUtil.isColoredNotification - ) { - this.color = color - } } override fun updateMetadata(song: Song, onUpdate: () -> Unit) { From 4dc84c25642f192dc54cdfabe211236d467186a0 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 1 Apr 2022 20:06:25 +0530 Subject: [PATCH 09/15] Code Cleanup --- .../retromusic/service/CrossFadePlayer.kt | 6 + .../retromusic/service/MultiPlayer.java | 1 + .../monkey/retromusic/service/MusicService.kt | 171 +++++++++--------- .../notification/PlayingNotificationImpl24.kt | 5 +- 4 files changed, 92 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index 27eb86768..634a27d2b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -9,6 +9,7 @@ import android.media.MediaPlayer import android.media.audiofx.AudioEffect import android.net.Uri import android.os.PowerManager +import android.util.Log import android.widget.Toast import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -296,6 +297,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion Toast.LENGTH_SHORT ) .show() + Log.e(TAG, what.toString() + extra) return false } @@ -354,6 +356,10 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion override fun setCrossFadeDuration(duration: Int) { crossFadeDuration = duration } + + companion object { + val TAG: String = CrossFadePlayer::class.java.simpleName + } } internal fun crossFadeScope(): CoroutineScope = CoroutineScope(Job() + Dispatchers.Main) \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java index c3768dc17..275300f2b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java @@ -330,6 +330,7 @@ public class MultiPlayer context.getResources().getString(R.string.unplayable_file), Toast.LENGTH_SHORT) .show(); + Log.e(TAG, String.valueOf(what) + extra); } return false; } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 56e3e70fa..c5a4092c8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -48,7 +48,7 @@ import androidx.media.AudioManagerCompat import androidx.media.MediaBrowserServiceCompat import androidx.media.session.MediaButtonReceiver.handleIntent import androidx.preference.PreferenceManager -import code.name.monkey.appthemehelper.util.VersionUtils.hasQ +import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.LockScreenActivity import code.name.monkey.retromusic.appwidgets.* @@ -93,10 +93,8 @@ import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener import com.bumptech.glide.RequestBuilder import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition -import com.google.android.gms.cast.framework.media.MediaIntentReceiver import org.koin.java.KoinJavaComponent.get import java.util.* -import kotlin.collections.ArrayList /** * @author Karim Abou Zeid (kabouzeid), Andrew Neal. Modified by Prathamesh More @@ -824,17 +822,16 @@ class MusicService : MediaBrowserServiceCompat(), } } + @Synchronized fun openTrackAndPrepareNextAt(position: Int): Boolean { - synchronized(this) { - this.position = position - val prepared = openCurrent() - if (prepared) { - prepareNextImpl() - } - notifyChange(META_CHANGED) - notHandledMetaChangedForCurrentTrack = false - return prepared + this.position = position + val prepared = openCurrent() + if (prepared) { + prepareNextImpl() } + notifyChange(META_CHANGED) + notHandledMetaChangedForCurrentTrack = false + return prepared } fun pause() { @@ -858,48 +855,47 @@ class MusicService : MediaBrowserServiceCompat(), } } + @Synchronized fun play() { - synchronized(this) { - if (requestFocus()) { - if (playback != null && !playback!!.isPlaying) { - if (!playback!!.isInitialized) { - playSongAt(getPosition()) - } else { - //Don't Start playing when it's casting - if (isCasting) { - return - } - startFadeAnimator(playback!!, true) { - - // Code when Animator Ends - if (!becomingNoisyReceiverRegistered) { - registerReceiver( - becomingNoisyReceiver, - becomingNoisyReceiverIntentFilter - ) - becomingNoisyReceiverRegistered = true - } - if (notHandledMetaChangedForCurrentTrack) { - handleChangeInternal(META_CHANGED) - notHandledMetaChangedForCurrentTrack = false - } - - // fixes a bug where the volume would stay ducked because the - // AudioManager.AUDIOFOCUS_GAIN event is not sent - playerHandler?.removeMessages(DUCK) - playerHandler?.sendEmptyMessage(UNDUCK) - } - //Start Playback with Animator - playback?.start() - notifyChange(PLAY_STATE_CHANGED) + if (requestFocus()) { + if (playback != null && !playback!!.isPlaying) { + if (!playback!!.isInitialized) { + playSongAt(getPosition()) + } else { + //Don't Start playing when it's casting + if (isCasting) { + return } + startFadeAnimator(playback!!, true) { + + // Code when Animator Ends + if (!becomingNoisyReceiverRegistered) { + registerReceiver( + becomingNoisyReceiver, + becomingNoisyReceiverIntentFilter + ) + becomingNoisyReceiverRegistered = true + } + if (notHandledMetaChangedForCurrentTrack) { + handleChangeInternal(META_CHANGED) + notHandledMetaChangedForCurrentTrack = false + } + + // fixes a bug where the volume would stay ducked because the + // AudioManager.AUDIOFOCUS_GAIN event is not sent + playerHandler?.removeMessages(DUCK) + playerHandler?.sendEmptyMessage(UNDUCK) + } + //Start Playback with Animator + playback?.start() + notifyChange(PLAY_STATE_CHANGED) } - } else { - Toast.makeText( - this, resources.getString(R.string.audio_focus_denied), Toast.LENGTH_SHORT - ) - .show() } + } else { + Toast.makeText( + this, resources.getString(R.string.audio_focus_denied), Toast.LENGTH_SHORT + ) + .show() } } @@ -949,14 +945,13 @@ class MusicService : MediaBrowserServiceCompat(), } } + @Synchronized fun prepareNextImpl() { - synchronized(this) { - try { - val nextPosition = getNextPosition(false) - playback?.setNextDataSource(getTrackUri(getSongAt(nextPosition))) - this.nextPosition = nextPosition - } catch (ignored: Exception) { - } + try { + val nextPosition = getNextPosition(false) + playback?.setNextDataSource(getTrackUri(getSongAt(nextPosition))) + this.nextPosition = nextPosition + } catch (ignored: Exception) { } } @@ -1075,18 +1070,17 @@ class MusicService : MediaBrowserServiceCompat(), savePositionInTrack() } + @Synchronized fun seek(millis: Int): Int { - synchronized(this) { - return try { - var newPosition = 0 - if (playback != null) { - newPosition = playback!!.seek(millis) - } - throttledSeekHandler?.notifySeek() - newPosition - } catch (e: Exception) { - -1 + return try { + var newPosition = 0 + if (playback != null) { + newPosition = playback!!.seek(millis) } + throttledSeekHandler?.notifySeek() + newPosition + } catch (e: Exception) { + -1 } } @@ -1251,19 +1245,19 @@ class MusicService : MediaBrowserServiceCompat(), private fun startForegroundOrNotify() { if (playingNotification != null && currentSong.id != -1L) { - val isPlaying = isPlaying - if (isForeground != isPlaying && !isPlaying) { - // This makes the notification dismissible - // We can't call stopForeground(false) on A12 though, which may result in crashes - // when we call startForeground after that e.g. when Alarm goes off, - if (VERSION.SDK_INT < VERSION_CODES.S) { + if (!VersionUtils.hasS()) { + if (isForeground && !isPlaying) { + // This makes the notification dismissible + // We can't call stopForeground(false) on A12 though, which may result in crashes + // when we call startForeground after that e.g. when Alarm goes off + stopForeground(false) isForeground = false } } - if (!isForeground && isPlaying) { + if (!isForeground) { // Specify that this is a media service, if supported. - if (hasQ()) { + if (VersionUtils.hasQ()) { startForeground( PlayingNotification.NOTIFICATION_ID, playingNotification!!.build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK @@ -1282,7 +1276,6 @@ class MusicService : MediaBrowserServiceCompat(), ) } } - return } private fun stopForegroundAndNotification() { @@ -1291,24 +1284,22 @@ class MusicService : MediaBrowserServiceCompat(), isForeground = false } + @Synchronized private fun openCurrent(): Boolean { - synchronized(this) { - try { - if (playback != null) { - return playback!!.setDataSource( - getTrackUri( - Objects.requireNonNull( - currentSong - ) + return try { + if (playback != null) { + return playback!!.setDataSource( + getTrackUri( + Objects.requireNonNull( + currentSong ) ) - } - } catch (e: Exception) { - e.printStackTrace() - return false - } + ) + } else false + } catch (e: Exception) { + e.printStackTrace() + false } - return false } private fun playFromPlaylist(intent: Intent) { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt index b0e1e513d..9b7123f6f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt @@ -46,7 +46,10 @@ import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroColorUtil import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @SuppressLint("RestrictedApi") class PlayingNotificationImpl24( From 7b3b52e3b0b3ad6cb3ca7bc7b6b684cb7444f073 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 1 Apr 2022 23:50:22 +0530 Subject: [PATCH 10/15] Fixed Song duration not visible in Card & Blur card themes --- .../fragments/player/card/CardPlaybackControlsFragment.kt | 7 +++++++ .../fragments/player/cardblur/CardBlurFragment.kt | 1 + .../player/cardblur/CardBlurPlaybackControlsFragment.kt | 7 +++++++ app/src/main/res/xml/pref_general.xml | 3 ++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt index 4179b28a6..830a7c6f3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt @@ -19,6 +19,7 @@ import android.os.Bundle import android.view.View import android.widget.ImageButton import android.widget.SeekBar +import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil @@ -59,6 +60,12 @@ class CardPlaybackControlsFragment : override val previousButton: ImageButton get() = binding.mediaButton.previousButton + override val songTotalTime: TextView + get() = binding.songTotalTime + + override val songCurrentProgress: TextView + get() = binding.songCurrentProgress + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = FragmentCardPlayerPlaybackControlsBinding.bind(view) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt index ef45e01ca..730456694 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt @@ -155,6 +155,7 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player), super.onResume() PreferenceManager.getDefaultSharedPreferences(requireContext()) .registerOnSharedPreferenceChangeListener(this) + lastRequest = null } override fun onDestroyView() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt index 8a43cfada..614bdc443 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt @@ -20,6 +20,7 @@ import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton import android.widget.SeekBar +import android.widget.TextView import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R @@ -55,6 +56,12 @@ class CardBlurPlaybackControlsFragment : override val previousButton: ImageButton get() = binding.mediaButton.previousButton + override val songTotalTime: TextView + get() = binding.songTotalTime + + override val songCurrentProgress: TextView + get() = binding.songCurrentProgress + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = FragmentCardBlurPlayerPlaybackControlsBinding.bind(view) diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index 9323a3775..a075b334a 100755 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -48,7 +48,8 @@ android:key="wallpaper_accent" android:layout="@layout/list_item_view_switch" android:summary="@string/pref_summary_wallpaper_accent" - android:title="@string/pref_title_wallpaper_accent" /> + android:title="@string/pref_title_wallpaper_accent" + app:isPreferenceVisible="@bool/wallpaper_accent_visible" /> Date: Sat, 2 Apr 2022 11:55:46 +0530 Subject: [PATCH 11/15] Code Cleanup --- .../activities/base/AbsCastActivity.kt | 9 +- .../activities/bugreport/BugReportActivity.kt | 134 +++++------- .../bugreport/model/DeviceInfo.java | 202 ------------------ .../activities/bugreport/model/DeviceInfo.kt | 110 ++++++++++ .../activities/bugreport/model/Report.java | 34 --- .../activities/bugreport/model/Report.kt | 22 ++ .../bugreport/model/github/ExtraInfo.java | 61 ------ .../bugreport/model/github/ExtraInfo.kt | 61 ++++++ .../bugreport/model/github/GithubLogin.java | 40 ---- .../bugreport/model/github/GithubLogin.kt | 25 +++ .../bugreport/model/github/GithubTarget.java | 21 -- .../bugreport/model/github/GithubTarget.kt | 3 + .../activities/tageditor/TagWriter.kt | 4 +- .../fragments/base/AbsMainActivityFragment.kt | 28 --- .../base/AbsPlayerControlsFragment.kt | 4 +- .../fragments/other/VolumeFragment.kt | 1 - .../player/cardblur/CardBlurFragment.kt | 1 - .../fragments/player/color/ColorFragment.kt | 1 - .../volume/AudioVolumeContentObserver.java | 64 ------ .../volume/AudioVolumeContentObserver.kt | 50 +++++ .../res/layout/bug_report_card_report.xml | 6 +- app/src/main/res/values/strings.xml | 1 + 22 files changed, 340 insertions(+), 542 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt index 0217da9ed..d5157bc2b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt @@ -9,6 +9,7 @@ import code.name.monkey.retromusic.cast.RetroWebServer import code.name.monkey.retromusic.helper.MusicPlayerRemote import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.SessionManager import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability @@ -16,7 +17,7 @@ import com.google.android.gms.common.GoogleApiAvailability abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { private var mCastSession: CastSession? = null - private lateinit var castContext: CastContext + private lateinit var sessionManager: SessionManager private var webServer: RetroWebServer? = null private var playServicesAvailable: Boolean = false @@ -87,17 +88,17 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { } private fun setupCast() { - castContext = CastContext.getSharedInstance(this) + sessionManager = CastContext.getSharedInstance(applicationContext).sessionManager } override fun onResume() { if (playServicesAvailable) { - castContext.sessionManager.addSessionManagerListener( + sessionManager.addSessionManagerListener( sessionManagerListener, CastSession::class.java ) if (mCastSession == null) { - mCastSession = castContext.sessionManager.currentCastSession + mCastSession = sessionManager.currentCastSession } } super.onResume() diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt index 22b66929e..0106c892e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt @@ -14,11 +14,8 @@ */ package code.name.monkey.retromusic.activities.bugreport -import android.app.Activity -import android.app.Dialog import android.content.ClipData import android.content.ClipboardManager -import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle @@ -28,8 +25,8 @@ import android.view.inputmethod.EditorInfo import android.widget.Toast import androidx.annotation.StringDef import androidx.annotation.StringRes -import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService +import androidx.lifecycle.lifecycleScope import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.appthemehelper.util.TintHelper @@ -43,10 +40,12 @@ import code.name.monkey.retromusic.activities.bugreport.model.github.GithubLogin import code.name.monkey.retromusic.activities.bugreport.model.github.GithubTarget import code.name.monkey.retromusic.databinding.ActivityBugReportBinding import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto -import code.name.monkey.retromusic.misc.DialogAsyncTask import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.textfield.TextInputLayout +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.eclipse.egit.github.core.Issue import org.eclipse.egit.github.core.client.GitHubClient import org.eclipse.egit.github.core.client.RequestException @@ -226,9 +225,9 @@ open class BugReportActivity : AbsThemeActivity() { onSaveExtraInfo() val report = Report(bugTitle, bugDescription, deviceInfo, extraInfo) - val target = GithubTarget("RetroMusicPlayer", "RetroMusicPlayer") + val target = GithubTarget("prathameshmm02", "RetroMusicPlayer") - ReportIssueAsyncTask.report(this, report, target, login) + reportIssue(report, target, login) } private fun onSaveExtraInfo() {} @@ -240,92 +239,75 @@ open class BugReportActivity : AbsThemeActivity() { return super.onOptionsItemSelected(item) } - private class ReportIssueAsyncTask private constructor( - activity: Activity, - private val report: Report, - private val target: GithubTarget, - private val login: GithubLogin - ) : DialogAsyncTask(activity) { - - override fun createDialog(context: Context): Dialog { - return AlertDialog.Builder(context).show() + private fun reportIssue( + report: Report, + target: GithubTarget, + login: GithubLogin + ) { + val client: GitHubClient = if (login.shouldUseApiToken()) { + GitHubClient().setOAuth2Token(login.apiToken) + } else { + GitHubClient().setCredentials(login.username, login.password) } - @Result - override fun doInBackground(vararg params: Void): String { - val client: GitHubClient = if (login.shouldUseApiToken()) { - GitHubClient().setOAuth2Token(login.apiToken) - } else { - GitHubClient().setCredentials(login.username, login.password) - } + val issue = Issue().setTitle(report.title).setBody(report.getDescription()) - val issue = Issue().setTitle(report.title).setBody(report.description) - try { + lifecycleScope.launch(Dispatchers.IO) { + val result = try { IssueService(client).createIssue(target.username, target.repository, issue) - return RESULT_SUCCESS + RESULT_SUCCESS } catch (e: RequestException) { - return when (e.status) { + when (e.status) { STATUS_BAD_CREDENTIALS -> { if (login.shouldUseApiToken()) RESULT_INVALID_TOKEN else RESULT_BAD_CREDENTIALS } STATUS_ISSUES_NOT_ENABLED -> RESULT_ISSUES_NOT_ENABLED else -> { - e.printStackTrace() RESULT_UNKNOWN + throw e } } } catch (e: IOException) { e.printStackTrace() - return RESULT_UNKNOWN + RESULT_UNKNOWN + } + + withContext(Dispatchers.Main) { + val activity = this@BugReportActivity + when (result) { + RESULT_SUCCESS -> MaterialAlertDialogBuilder(activity) + .setTitle(R.string.bug_report_success) + .setPositiveButton(android.R.string.ok) { _, _ -> tryToFinishActivity() } + .show() + RESULT_BAD_CREDENTIALS -> MaterialAlertDialogBuilder(activity) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_wrong_credentials) + .setPositiveButton(android.R.string.ok, null) + .show() + RESULT_INVALID_TOKEN -> MaterialAlertDialogBuilder(activity) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_invalid_token) + .setPositiveButton(android.R.string.ok, null) + .show() + RESULT_ISSUES_NOT_ENABLED -> MaterialAlertDialogBuilder(activity) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_issues_not_available) + .setPositiveButton(android.R.string.ok, null) + .show() + else -> MaterialAlertDialogBuilder(activity) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_unknown) + .setPositiveButton(android.R.string.ok) { _, _ -> tryToFinishActivity() } + .setNegativeButton(android.R.string.cancel) { _, _ -> tryToFinishActivity() } + .show() + } } } + } - override fun onPostExecute(@Result result: String) { - super.onPostExecute(result) - - val context = context ?: return - - when (result) { - RESULT_SUCCESS -> tryToFinishActivity() - RESULT_BAD_CREDENTIALS -> MaterialAlertDialogBuilder(context) - .setTitle(R.string.bug_report_failed) - .setMessage(R.string.bug_report_failed_wrong_credentials) - .setPositiveButton(android.R.string.ok, null) - .show() - RESULT_INVALID_TOKEN -> MaterialAlertDialogBuilder(context) - .setTitle(R.string.bug_report_failed) - .setMessage(R.string.bug_report_failed_invalid_token) - .setPositiveButton(android.R.string.ok, null).show() - RESULT_ISSUES_NOT_ENABLED -> MaterialAlertDialogBuilder(context) - .setTitle(R.string.bug_report_failed) - .setMessage(R.string.bug_report_failed_issues_not_available) - .setPositiveButton(android.R.string.ok, null) - - else -> MaterialAlertDialogBuilder(context) - .setTitle(R.string.bug_report_failed) - .setMessage(R.string.bug_report_failed_unknown) - .setPositiveButton(android.R.string.ok) { _, _ -> tryToFinishActivity() } - .setNegativeButton(android.R.string.cancel) { _, _ -> tryToFinishActivity() } - } - } - - private fun tryToFinishActivity() { - val context = context - if (context is Activity && !context.isFinishing) { - context.finish() - } - } - - companion object { - - fun report( - activity: Activity, - report: Report, - target: GithubTarget, - login: GithubLogin - ) { - ReportIssueAsyncTask(activity, report, target, login).execute() - } + private fun tryToFinishActivity() { + if (!isFinishing) { + finish() } } @@ -333,6 +315,6 @@ open class BugReportActivity : AbsThemeActivity() { private const val STATUS_BAD_CREDENTIALS = 401 private const val STATUS_ISSUES_NOT_ENABLED = 410 - private const val ISSUE_TRACKER_LINK = "https://github.com/RetroMusicPlayer/RetroMusicPlayer" + private const val ISSUE_TRACKER_LINK = "https://github.com/prathameshmm02/RetroMusicPlayer" } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java deleted file mode 100644 index 9ccd67422..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java +++ /dev/null @@ -1,202 +0,0 @@ -package code.name.monkey.retromusic.activities.bugreport.model; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.os.Build; - -import androidx.annotation.IntRange; -import androidx.annotation.NonNull; - -import java.util.Arrays; -import java.util.Locale; - -import code.name.monkey.retromusic.util.PreferenceUtil; - -public class DeviceInfo { - - @SuppressLint("NewApi") - private final String[] abis = - Build.SUPPORTED_ABIS; - - @SuppressLint("NewApi") - private final String[] abis32Bits = - Build.SUPPORTED_32_BIT_ABIS; - - @SuppressLint("NewApi") - private final String[] abis64Bits = - Build.SUPPORTED_64_BIT_ABIS; - - private final String baseTheme; - - private final String brand = Build.BRAND; - - private final String buildID = Build.DISPLAY; - - private final String buildVersion = Build.VERSION.INCREMENTAL; - - private final String device = Build.DEVICE; - - private final String hardware = Build.HARDWARE; - - private final boolean isAdaptive; - - private final String manufacturer = Build.MANUFACTURER; - - private final String model = Build.MODEL; - - private final String nowPlayingTheme; - - private final String product = Build.PRODUCT; - - private final String releaseVersion = Build.VERSION.RELEASE; - - @IntRange(from = 0) - private final int sdkVersion = Build.VERSION.SDK_INT; - - private final int versionCode; - - private final String versionName; - private final String selectedLang; - - public DeviceInfo(Context context) { - PackageInfo packageInfo; - try { - packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); - } catch (PackageManager.NameNotFoundException e) { - packageInfo = null; - } - if (packageInfo != null) { - versionCode = packageInfo.versionCode; - versionName = packageInfo.versionName; - } else { - versionCode = -1; - versionName = null; - } - baseTheme = PreferenceUtil.INSTANCE.getBaseTheme(); - nowPlayingTheme = - context.getString(PreferenceUtil.INSTANCE.getNowPlayingScreen().getTitleRes()); - isAdaptive = PreferenceUtil.INSTANCE.isAdaptiveColor(); - selectedLang = PreferenceUtil.INSTANCE.getLanguageCode(); - } - - public String toMarkdown() { - return "Device info:\n" - + "---\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "\n" - + "
App version" - + versionName - + "
App version code" - + versionCode - + "
Android build version" - + buildVersion - + "
Android release version" - + releaseVersion - + "
Android SDK version" - + sdkVersion - + "
Android build ID" - + buildID - + "
Device brand" - + brand - + "
Device manufacturer" - + manufacturer - + "
Device name" - + device - + "
Device model" - + model - + "
Device product name" - + product - + "
Device hardware name" - + hardware - + "
ABIs" - + Arrays.toString(abis) - + "
ABIs (32bit)" - + Arrays.toString(abis32Bits) - + "
ABIs (64bit)" - + Arrays.toString(abis64Bits) - + "
Language" - + selectedLang - + "
\n"; - } - - @NonNull - @Override - public String toString() { - return "App version: " - + versionName - + "\n" - + "App version code: " - + versionCode - + "\n" - + "Android build version: " - + buildVersion - + "\n" - + "Android release version: " - + releaseVersion - + "\n" - + "Android SDK version: " - + sdkVersion - + "\n" - + "Android build ID: " - + buildID - + "\n" - + "Device brand: " - + brand - + "\n" - + "Device manufacturer: " - + manufacturer - + "\n" - + "Device name: " - + device - + "\n" - + "Device model: " - + model - + "\n" - + "Device product name: " - + product - + "\n" - + "Device hardware name: " - + hardware - + "\n" - + "ABIs: " - + Arrays.toString(abis) - + "\n" - + "ABIs (32bit): " - + Arrays.toString(abis32Bits) - + "\n" - + "ABIs (64bit): " - + Arrays.toString(abis64Bits) - + "\n" - + "Base theme: " - + baseTheme - + "\n" - + "Now playing theme: " - + nowPlayingTheme - + "\n" - + "Adaptive: " - + isAdaptive - + "\n" - + "System language: " - + Locale.getDefault().toLanguageTag() - + "\n" - + "In-App Language: " - + selectedLang; - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.kt new file mode 100644 index 000000000..98d0a6d55 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.kt @@ -0,0 +1,110 @@ +package code.name.monkey.retromusic.activities.bugreport.model + +import android.annotation.SuppressLint +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import androidx.annotation.IntRange +import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtil.isAdaptiveColor +import code.name.monkey.retromusic.util.PreferenceUtil.languageCode +import code.name.monkey.retromusic.util.PreferenceUtil.nowPlayingScreen +import java.util.* + +class DeviceInfo(context: Context) { + @SuppressLint("NewApi") + private val abis = Build.SUPPORTED_ABIS + + @SuppressLint("NewApi") + private val abis32Bits = Build.SUPPORTED_32_BIT_ABIS + + @SuppressLint("NewApi") + private val abis64Bits = Build.SUPPORTED_64_BIT_ABIS + private val baseTheme: String + private val brand = Build.BRAND + private val buildID = Build.DISPLAY + private val buildVersion = Build.VERSION.INCREMENTAL + private val device = Build.DEVICE + private val hardware = Build.HARDWARE + private val isAdaptive: Boolean + private val manufacturer = Build.MANUFACTURER + private val model = Build.MODEL + private val nowPlayingTheme: String + private val product = Build.PRODUCT + private val releaseVersion = Build.VERSION.RELEASE + + @IntRange(from = 0) + private val sdkVersion = Build.VERSION.SDK_INT + private var versionCode = 0 + private var versionName: String? = null + private val selectedLang: String + fun toMarkdown(): String { + return """ + Device info: + --- + + + + + + + + + + + + + + + + + +
App version$versionName
App version code$versionCode
Android build version$buildVersion
Android release version$releaseVersion
Android SDK version$sdkVersion
Android build ID$buildID
Device brand$brand
Device manufacturer$manufacturer
Device name$device
Device model$model
Device product name$product
Device hardware name$hardware
ABIs${Arrays.toString(abis)}
ABIs (32bit)${Arrays.toString(abis32Bits)}
ABIs (64bit)${Arrays.toString(abis64Bits)}
Language$selectedLang
+ + """.trimIndent() + } + + override fun toString(): String { + return """ + App version: $versionName + App version code: $versionCode + Android build version: $buildVersion + Android release version: $releaseVersion + Android SDK version: $sdkVersion + Android build ID: $buildID + Device brand: $brand + Device manufacturer: $manufacturer + Device name: $device + Device model: $model + Device product name: $product + Device hardware name: $hardware + ABIs: ${Arrays.toString(abis)} + ABIs (32bit): ${Arrays.toString(abis32Bits)} + ABIs (64bit): ${Arrays.toString(abis64Bits)} + Base theme: $baseTheme + Now playing theme: $nowPlayingTheme + Adaptive: $isAdaptive + System language: ${Locale.getDefault().toLanguageTag()} + In-App Language: $selectedLang + """.trimIndent() + } + + init { + val packageInfo = try { + context.packageManager.getPackageInfo(context.packageName, 0) + } catch (e: PackageManager.NameNotFoundException) { + null + } + if (packageInfo != null) { + versionCode = packageInfo.versionCode + versionName = packageInfo.versionName + } else { + versionCode = -1 + versionName = null + } + baseTheme = PreferenceUtil.baseTheme + nowPlayingTheme = context.getString(nowPlayingScreen.titleRes) + isAdaptive = isAdaptiveColor + selectedLang = languageCode + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java deleted file mode 100644 index ee1910c2c..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java +++ /dev/null @@ -1,34 +0,0 @@ -package code.name.monkey.retromusic.activities.bugreport.model; - -import code.name.monkey.retromusic.activities.bugreport.model.github.ExtraInfo; - -public class Report { - - private final String description; - - private final DeviceInfo deviceInfo; - - private final ExtraInfo extraInfo; - - private final String title; - - public Report(String title, String description, DeviceInfo deviceInfo, ExtraInfo extraInfo) { - this.title = title; - this.description = description; - this.deviceInfo = deviceInfo; - this.extraInfo = extraInfo; - } - - public String getDescription() { - return description - + "\n\n" - + "-\n\n" - + deviceInfo.toMarkdown() - + "\n\n" - + extraInfo.toMarkdown(); - } - - public String getTitle() { - return title; - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.kt new file mode 100644 index 000000000..798b2d452 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.kt @@ -0,0 +1,22 @@ +package code.name.monkey.retromusic.activities.bugreport.model + +import code.name.monkey.retromusic.activities.bugreport.model.github.ExtraInfo + +class Report( + val title: String, + private val description: String, + private val deviceInfo: DeviceInfo?, + private val extraInfo: ExtraInfo +) { + fun getDescription(): String { + return """ + $description + + - + + ${deviceInfo?.toMarkdown()} + + ${extraInfo.toMarkdown()} + """.trimIndent() + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java deleted file mode 100644 index 4bc0e4bfb..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java +++ /dev/null @@ -1,61 +0,0 @@ -package code.name.monkey.retromusic.activities.bugreport.model.github; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class ExtraInfo { - - private final Map extraInfo = new LinkedHashMap<>(); - - public void put(String key, String value) { - extraInfo.put(key, value); - } - - public void put(String key, boolean value) { - extraInfo.put(key, Boolean.toString(value)); - } - - public void put(String key, double value) { - extraInfo.put(key, Double.toString(value)); - } - - public void put(String key, float value) { - extraInfo.put(key, Float.toString(value)); - } - - public void put(String key, long value) { - extraInfo.put(key, Long.toString(value)); - } - - public void put(String key, int value) { - extraInfo.put(key, Integer.toString(value)); - } - - public void put(String key, Object value) { - extraInfo.put(key, String.valueOf(value)); - } - - public void remove(String key) { - extraInfo.remove(key); - } - - public String toMarkdown() { - if (extraInfo.isEmpty()) { - return ""; - } - - StringBuilder output = new StringBuilder(); - output.append("Extra info:\n" + "---\n" + "\n"); - for (String key : extraInfo.keySet()) { - output - .append("\n"); - } - output.append("
") - .append(key) - .append("") - .append(extraInfo.get(key)) - .append("
\n"); - - return output.toString(); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.kt new file mode 100644 index 000000000..1cac87e6c --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.kt @@ -0,0 +1,61 @@ +package code.name.monkey.retromusic.activities.bugreport.model.github + +class ExtraInfo { + private val extraInfo: MutableMap = LinkedHashMap() + fun put(key: String, value: String) { + extraInfo[key] = value + } + + fun put(key: String, value: Boolean) { + extraInfo[key] = value.toString() + } + + fun put(key: String, value: Double) { + extraInfo[key] = value.toString() + } + + fun put(key: String, value: Float) { + extraInfo[key] = value.toString() + } + + fun put(key: String, value: Long) { + extraInfo[key] = value.toString() + } + + fun put(key: String, value: Int) { + extraInfo[key] = value.toString() + } + + fun put(key: String, value: Any) { + extraInfo[key] = value.toString() + } + + fun remove(key: String) { + extraInfo.remove(key) + } + + fun toMarkdown(): String { + if (extraInfo.isEmpty()) { + return "" + } + val output = StringBuilder() + output.append( + """ + Extra info: + --- + + + """.trimIndent() + ) + for (key in extraInfo.keys) { + output + .append("\n") + } + output.append("
") + .append(key) + .append("") + .append(extraInfo[key]) + .append("
\n") + return output.toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java deleted file mode 100644 index 71a0ce7b9..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java +++ /dev/null @@ -1,40 +0,0 @@ -package code.name.monkey.retromusic.activities.bugreport.model.github; - -import android.text.TextUtils; - -public class GithubLogin { - - private final String apiToken; - - private final String password; - - private final String username; - - public GithubLogin(String username, String password) { - this.username = username; - this.password = password; - this.apiToken = null; - } - - public GithubLogin(String apiToken) { - this.username = null; - this.password = null; - this.apiToken = apiToken; - } - - public String getApiToken() { - return apiToken; - } - - public String getPassword() { - return password; - } - - public String getUsername() { - return username; - } - - public boolean shouldUseApiToken() { - return TextUtils.isEmpty(username) || TextUtils.isEmpty(password); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.kt new file mode 100644 index 000000000..b75ca6ca2 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.kt @@ -0,0 +1,25 @@ +package code.name.monkey.retromusic.activities.bugreport.model.github + +import android.text.TextUtils + +class GithubLogin { + val apiToken: String? + val password: String? + val username: String? + + constructor(username: String?, password: String?) { + this.username = username + this.password = password + apiToken = null + } + + constructor(apiToken: String?) { + username = null + password = null + this.apiToken = apiToken + } + + fun shouldUseApiToken(): Boolean { + return TextUtils.isEmpty(username) || TextUtils.isEmpty(password) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java deleted file mode 100644 index 9e533bc7c..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java +++ /dev/null @@ -1,21 +0,0 @@ -package code.name.monkey.retromusic.activities.bugreport.model.github; - -public class GithubTarget { - - private final String repository; - - private final String username; - - public GithubTarget(String username, String repository) { - this.username = username; - this.repository = repository; - } - - public String getRepository() { - return repository; - } - - public String getUsername() { - return username; - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.kt new file mode 100644 index 000000000..d1fb5fc6d --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.kt @@ -0,0 +1,3 @@ +package code.name.monkey.retromusic.activities.bugreport.model.github + +class GithubTarget(val username: String, val repository: String) \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/TagWriter.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/TagWriter.kt index 9bc20f100..a78624583 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/TagWriter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/TagWriter.kt @@ -51,7 +51,7 @@ class TagWriter { suspend fun writeTagsToFiles(context: Context, info: AudioTagInfo) { withContext(Dispatchers.IO) { - kotlin.runCatching { + runCatching { var artwork: Artwork? = null var albumArtFile: File? = null if (info.artworkInfo?.artwork != null) { @@ -124,7 +124,7 @@ class TagWriter { suspend fun writeTagsToFilesR(context: Context, info: AudioTagInfo): List = withContext(Dispatchers.IO) { val cacheFiles = mutableListOf() - kotlin.runCatching { + runCatching { var artwork: Artwork? = null var albumArtFile: File? = null if (info.artworkInfo?.artwork != null) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt index 5a7a7ed6d..2118a1092 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMainActivityFragment.kt @@ -15,15 +15,9 @@ package code.name.monkey.retromusic.fragments.base import android.os.Bundle -import android.view.View import androidx.annotation.LayoutRes -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.VersionUtils -import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.MainActivity -import code.name.monkey.retromusic.extensions.setLightStatusBarAuto import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto -import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.fragments.LibraryViewModel import org.koin.androidx.viewmodel.ext.android.sharedViewModel @@ -38,26 +32,4 @@ abstract class AbsMainActivityFragment(@LayoutRes layout: Int) : AbsMusicService setHasOptionsMenu(true) mainActivity.setTaskDescriptionColorAuto() } - - private fun setStatusBarColor(view: View, color: Int) { - val statusBar = view.findViewById(R.id.status_bar) - if (statusBar != null) { - if (VersionUtils.hasMarshmallow()) { - statusBar.setBackgroundColor(color) - mainActivity.setLightStatusBarAuto(color) - } else { - statusBar.setBackgroundColor(color) - } - } - } - - fun setStatusBarColorAuto(view: View) { - val colorPrimary = surfaceColor() - // we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat - if (VersionUtils.hasMarshmallow()) { - setStatusBarColor(view, colorPrimary) - } else { - setStatusBarColor(view, ColorUtil.darkenColor(colorPrimary)) - } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt index ef85f0aa2..bc48c2af5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt @@ -220,9 +220,9 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi childFragmentManager.beginTransaction() .replace(R.id.volumeFragmentContainer, VolumeFragment()).commit() childFragmentManager.executePendingTransactions() - volumeFragment = - childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as? VolumeFragment } + volumeFragment = + childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as? VolumeFragment } override fun onResume() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt index 67f1b7d1f..291ce2ebd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt @@ -137,7 +137,6 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum } companion object { - fun newInstance(): VolumeFragment { return VolumeFragment() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt index 730456694..ef45e01ca 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt @@ -155,7 +155,6 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player), super.onResume() PreferenceManager.getDefaultSharedPreferences(requireContext()) .registerOnSharedPreferenceChangeListener(this) - lastRequest = null } override fun onDestroyView() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt index c952a5903..4197affde 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt @@ -39,7 +39,6 @@ class ColorFragment : AbsPlayerFragment(R.layout.fragment_color_player) { private var _binding: FragmentColorPlayerBinding? = null private val binding get() = _binding!! - override fun playerToolbar(): Toolbar { return binding.playerToolbar } diff --git a/app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.java b/app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.java deleted file mode 100644 index eb0eeec55..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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 code.name.monkey.retromusic.volume; - -import android.database.ContentObserver; -import android.media.AudioManager; -import android.net.Uri; -import android.os.Handler; - -import androidx.annotation.NonNull; - -public class AudioVolumeContentObserver extends ContentObserver { - - private final OnAudioVolumeChangedListener mListener; - - private final AudioManager mAudioManager; - - private final int mAudioStreamType; - - private float mLastVolume; - - AudioVolumeContentObserver( - @NonNull Handler handler, - @NonNull AudioManager audioManager, - int audioStreamType, - @NonNull OnAudioVolumeChangedListener listener) { - - super(handler); - mAudioManager = audioManager; - mAudioStreamType = audioStreamType; - mListener = listener; - mLastVolume = audioManager.getStreamVolume(mAudioStreamType); - } - - /** Depending on the handler this method may be executed on the UI thread */ - @Override - public void onChange(boolean selfChange, Uri uri) { - if (mAudioManager != null && mListener != null) { - int maxVolume = mAudioManager.getStreamMaxVolume(mAudioStreamType); - int currentVolume = mAudioManager.getStreamVolume(mAudioStreamType); - if (currentVolume != mLastVolume) { - mLastVolume = currentVolume; - mListener.onAudioVolumeChanged(currentVolume, maxVolume); - } - } - } - - @Override - public boolean deliverSelfNotifications() { - return super.deliverSelfNotifications(); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.kt b/app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.kt new file mode 100644 index 000000000..a0dde27e1 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/volume/AudioVolumeContentObserver.kt @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2019 Hemanth Savarala. + * + * 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 code.name.monkey.retromusic.volume + +import android.database.ContentObserver +import android.media.AudioManager +import android.net.Uri +import android.os.Handler + +class AudioVolumeContentObserver internal constructor( + handler: Handler, + audioManager: AudioManager, + audioStreamType: Int, + listener: OnAudioVolumeChangedListener +) : ContentObserver(handler) { + private val mListener: OnAudioVolumeChangedListener? + private val mAudioManager: AudioManager? + private val mAudioStreamType: Int + private var mLastVolume: Float + + /** Depending on the handler this method may be executed on the UI thread */ + override fun onChange(selfChange: Boolean, uri: Uri?) { + if (mAudioManager != null && mListener != null) { + val maxVolume = mAudioManager.getStreamMaxVolume(mAudioStreamType) + val currentVolume = mAudioManager.getStreamVolume(mAudioStreamType) + if (currentVolume.toFloat() != mLastVolume) { + mLastVolume = currentVolume.toFloat() + mListener.onAudioVolumeChanged(currentVolume, maxVolume) + } + } + } + + init { + mAudioManager = audioManager + mAudioStreamType = audioStreamType + mListener = listener + mLastVolume = audioManager.getStreamVolume(mAudioStreamType).toFloat() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/bug_report_card_report.xml b/app/src/main/res/layout/bug_report_card_report.xml index f49878e66..85dc9ff93 100644 --- a/app/src/main/res/layout/bug_report_card_report.xml +++ b/app/src/main/res/layout/bug_report_card_report.xml @@ -27,7 +27,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="56dp" - android:layout_marginLeft="56dp" android:orientation="vertical" android:paddingTop="8dp" android:paddingBottom="8dp"> @@ -54,9 +53,7 @@ android:layout_height="wrap_content" android:orientation="vertical" android:paddingStart="72dp" - android:paddingLeft="72dp" - android:paddingEnd="16dp" - android:paddingRight="16dp"> + android:paddingEnd="16dp"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfcadae85..83301254e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -533,4 +533,5 @@ You have to select at least one category. You will be forwarded to the issue tracker website. Your account data is only used for authentication. + Bug report successful From 998655fd48a39bb5d3b2dc12d9c91e10cec2056e Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 2 Apr 2022 15:50:34 +0530 Subject: [PATCH 12/15] Fixed ViewPager transformers --- .../player/PlayerAlbumCoverFragment.kt | 5 +- .../transform/CarousalPagerTransformer.kt | 2 - .../transform/CascadingPageTransformer.kt | 33 ++++++----- .../transform/DefaultTransformer.kt | 8 +++ .../transform/DepthTransformation.kt | 52 ++++++++++------- .../transform/HingeTransformation.kt | 56 +++++++++--------- .../transform/HorizontalFlipTransformation.kt | 50 ++++++++-------- .../transform/NormalPageTransformer.kt | 58 ++++++++++--------- .../transform/ParallaxPagerTransformer.kt | 33 +++++------ .../transform/VerticalFlipTransformation.kt | 50 ++++++++-------- .../transform/VerticalStackTransformer.kt | 13 +++-- app/src/main/res/values/arrays.xml | 2 + 12 files changed, 196 insertions(+), 166 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/transform/DefaultTransformer.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index 9da856bf3..d14b0cc03 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -77,7 +77,10 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe fun removeSlideEffect() { val transformer = ParallaxPagerTransformer(R.id.player_image) transformer.setSpeed(0.3f) - } + lifecycleScope.launchWhenStarted { + viewPager.setPageTransformer(false, transformer) + } +} private fun updateLyrics() { binding.lyricsView.setLabel(context?.getString(R.string.no_lyrics_found)) diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/CarousalPagerTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/CarousalPagerTransformer.kt index 2c4e2b9b2..6ce985bb5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/CarousalPagerTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/CarousalPagerTransformer.kt @@ -49,6 +49,4 @@ class CarousalPagerTransformer(context: Context) : ViewPager.PageTransformer { val m = context.resources.displayMetrics.density return (dipValue * m + 0.5f).toInt() } - - } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/CascadingPageTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/CascadingPageTransformer.kt index 9db5d5b7a..2f256e9d0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/CascadingPageTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/CascadingPageTransformer.kt @@ -22,21 +22,28 @@ class CascadingPageTransformer : ViewPager.PageTransformer { private var mScaleOffset = 40 override fun transformPage(page: View, position: Float) { - if (position <= 0.0f) {//被滑动的那页 position 是-下标~ 0 - page.translationX = 0f - //旋转角度 45° * -0.1 = -4.5° - page.rotation = 45 * position - //X轴偏移 li: 300/3 * -0.1 = -10 - page.translationX = page.width / 3 * position - } else { - //缩放比例 - val scale = (page.width - mScaleOffset * position) / page.width.toFloat() + page.apply { + when { + position < -1 -> { // [-Infinity,-1) + alpha = 0f + } + position <= 0 -> { + alpha = 1f + rotation = 45 * position + translationX = width / 3 * position + } + else -> { + alpha = 1f + rotation = 0f + val scale = (width - mScaleOffset * position) / width.toFloat() - page.scaleX = scale - page.scaleY = scale + scaleX = scale + scaleY = scale - page.translationX = -page.width * position - page.translationY = mScaleOffset * 0.8f * position + translationX = -width * position + translationY = mScaleOffset * 0.8f * position + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/DefaultTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/DefaultTransformer.kt new file mode 100644 index 000000000..c16c2649c --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/transform/DefaultTransformer.kt @@ -0,0 +1,8 @@ +package code.name.monkey.retromusic.transform + +import android.view.View +import androidx.viewpager.widget.ViewPager + +class DefaultTransformer : ViewPager.PageTransformer { + override fun transformPage(page: View, position: Float) {} +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/DepthTransformation.kt b/app/src/main/java/code/name/monkey/retromusic/transform/DepthTransformation.kt index 8f34507aa..7abd4f15d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/DepthTransformation.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/DepthTransformation.kt @@ -20,28 +20,40 @@ import kotlin.math.abs class DepthTransformation : ViewPager.PageTransformer { override fun transformPage(page: View, position: Float) { - when { - position < -1 -> { // [-Infinity,-1) - // This page is way off-screen to the left. - page.alpha = 0f - } - position <= 0 -> { // [-1,0] - page.alpha = 1f - page.translationX = 0f - page.scaleX = 1f - page.scaleY = 1f - } - position <= 1 -> { // (0,1] - page.translationX = -position * page.width - page.alpha = 1 - abs(position) - page.scaleX = 1 - abs(position) - page.scaleY = 1 - abs(position) - } - else -> { // (1,+Infinity] - // This page is way off-screen to the right. - page.alpha = 0f + page.apply { + when { + position < -1 -> { // [-Infinity,-1) + // This page is way off-screen to the left. + alpha = 0f + } + position <= 0 -> { // [-1,0] + // Use the default slide transition when moving to the left page + alpha = 1f + translationX = 0f + scaleX = 1f + scaleY = 1f + } + position <= 1 -> { // (0,1] + // Fade the page out. + alpha = 1 - position + // Counteract the default slide transition + translationX = width * -position + + // Scale the page down (between MIN_SCALE and 1) + val scaleFactor = (MIN_SCALE + (1 - MIN_SCALE) * (1 - abs(position))) + scaleX = scaleFactor + scaleY = scaleFactor + } + else -> { // (1,+Infinity] + // This page is way off-screen to the right. + alpha = 0f + } } } } + + companion object { + private const val MIN_SCALE = 0.5f + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/HingeTransformation.kt b/app/src/main/java/code/name/monkey/retromusic/transform/HingeTransformation.kt index 0006309e4..f4a13ae5c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/HingeTransformation.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/HingeTransformation.kt @@ -21,35 +21,35 @@ import kotlin.math.abs class HingeTransformation : ViewPager.PageTransformer { override fun transformPage(page: View, position: Float) { + page.apply { + translationX = -position * width + pivotX = 0f + pivotY = 0f - page.translationX = -position * page.width - page.pivotX = 0f - page.pivotY = 0f - - - when { - position < -1 -> { // [-Infinity,-1) - // This page is way off-screen to the left. - page.alpha = 0f - // The Page is off-screen but it may still interfere with - // click events of current page if - // it's visibility is not set to Gone - page.isVisible = false - } - position <= 0 -> { // [-1,0] - page.rotation = 90 * abs(position) - page.alpha = 1 - abs(position) - page.isVisible = true - } - position <= 1 -> { // (0,1] - page.rotation = 0f - page.alpha = 1f - page.isVisible = true - } - else -> { // (1,+Infinity] - // This page is way off-screen to the right. - page.alpha = 0f - page.isVisible = false + when { + position < -1 -> { // [-Infinity,-1) + // This page is way off-screen to the left. + alpha = 0f + // The Page is off-screen but it may still interfere with + // click events of current page if + // it's visibility is not set to Gone + isVisible = false + } + position <= 0 -> { // [-1,0] + rotation = 90 * abs(position) + alpha = 1 - abs(position) + isVisible = true + } + position <= 1 -> { // (0,1] + rotation = 0f + alpha = 1f + isVisible = true + } + else -> { // (1,+Infinity] + // This page is way off-screen to the right. + alpha = 0f + isVisible = false + } } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/HorizontalFlipTransformation.kt b/app/src/main/java/code/name/monkey/retromusic/transform/HorizontalFlipTransformation.kt index 4752430cb..1b0084162 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/HorizontalFlipTransformation.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/HorizontalFlipTransformation.kt @@ -22,33 +22,33 @@ import kotlin.math.abs class HorizontalFlipTransformation : ViewPager.PageTransformer { override fun transformPage(page: View, position: Float) { + page.apply { + page.translationX = -position * page.width + page.cameraDistance = 20000f - page.translationX = -position * page.width - page.cameraDistance = 20000f - - if (position < 0.5 && position > -0.5) { - page.isVisible = true - } else { - page.isInvisible = true - } - - - when { - position < -1 -> { // [-Infinity,-1) - // This page is way off-screen to the left. - page.alpha = 0f + if (position < 0.5 && position > -0.5) { + page.isVisible = true + } else { + page.isInvisible = true } - position <= 0 -> { // [-1,0] - page.alpha = 1f - page.rotationX = 180 * (1 - abs(position) + 1) - } - position <= 1 -> { // (0,1] - page.alpha = 1f - page.rotationX = -180 * (1 - abs(position) + 1) - } - else -> { // (1,+Infinity] - // This page is way off-screen to the right. - page.alpha = 0f + + when { + position < -1 -> { // [-Infinity,-1) + // This page is way off-screen to the left. + page.alpha = 0f + } + position <= 0 -> { // [-1,0] + page.alpha = 1f + page.rotationX = 180 * (1 - abs(position) + 1) + } + position <= 1 -> { // (0,1] + page.alpha = 1f + page.rotationX = -180 * (1 - abs(position) + 1) + } + else -> { // (1,+Infinity] + // This page is way off-screen to the right. + page.alpha = 0f + } } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/NormalPageTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/NormalPageTransformer.kt index aeada0319..d0049e5a6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/NormalPageTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/NormalPageTransformer.kt @@ -25,39 +25,41 @@ import kotlin.math.max class NormalPageTransformer : ViewPager.PageTransformer { - override fun transformPage(view: View, position: Float) { - val pageWidth = view.width - val pageHeight = view.height + override fun transformPage(page: View, position: Float) { + page.apply { + val pageWidth = width + val pageHeight = height - when { - position < -1 -> { // [-Infinity,-1) - // This page is way off-screen to the left. - view.alpha = 1f - view.scaleY = 0.7f - } - position <= 1 -> { // [-1,1] - // Modify the default slide transition to shrink the page as well - val scaleFactor = max(MIN_SCALE, 1 - abs(position)) - val vertMargin = pageHeight * (1 - scaleFactor) / 2 - val horzMargin = pageWidth * (1 - scaleFactor) / 2 - if (position < 0) { - view.translationX = horzMargin - vertMargin / 2 - } else { - view.translationX = -horzMargin + vertMargin / 2 + when { + position < -1 -> { // [-Infinity,-1) + // This page is way off-screen to the left. + alpha = 1f + scaleY = 0.7f } + position <= 1 -> { // [-1,1] + // Modify the default slide transition to shrink the page as well + val scaleFactor = max(MIN_SCALE, 1 - abs(position)) + val vertMargin = pageHeight * (1 - scaleFactor) / 2 + val horzMargin = pageWidth * (1 - scaleFactor) / 2 + translationX = if (position < 0) { + horzMargin - vertMargin / 2 + } else { + -horzMargin + vertMargin / 2 + } - // Scale the page down (between MIN_SCALE and 1) - view.scaleX = scaleFactor - view.scaleY = scaleFactor + // Scale the page down (between MIN_SCALE and 1) + scaleX = scaleFactor + scaleY = scaleFactor - // Fade the page relative to its size. - //view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); + // Fade the page relative to its size. + //setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); - } - else -> { // (1,+Infinity] - // This page is way off-screen to the right. - view.alpha = 1f - view.scaleY = 0.7f + } + else -> { // (1,+Infinity] + // This page is way off-screen to the right. + alpha = 1f + scaleY = 0.7f + } } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/ParallaxPagerTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/ParallaxPagerTransformer.kt index ba25df770..fa454dfb7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/ParallaxPagerTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/ParallaxPagerTransformer.kt @@ -14,8 +14,6 @@ package code.name.monkey.retromusic.transform -import android.annotation.TargetApi -import android.os.Build import android.view.View import androidx.viewpager.widget.ViewPager @@ -27,22 +25,21 @@ class ParallaxPagerTransformer(private val id: Int) : ViewPager.PageTransformer private var border = 0 private var speed = 0.2f - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - override fun transformPage(view: View, position: Float) { - - val parallaxView = view.findViewById(id) - - if (parallaxView != null) { - if (position > -1 && position < 1) { - val width = parallaxView.width.toFloat() - parallaxView.translationX = -(position * width * speed) - val sc = (view.width.toFloat() - border) / view.width - if (position == 0f) { - view.scaleX = 1f - view.scaleY = 1f - } else { - view.scaleX = sc - view.scaleY = sc + override fun transformPage(page: View, position: Float) { + val parallaxView = page.findViewById(id) + page.apply { + if (parallaxView != null) { + if (position > -1 && position < 1) { + val width = parallaxView.width.toFloat() + parallaxView.translationX = -(position * width * speed) + val sc = (width - border) / width + if (position == 0f) { + scaleX = 1f + scaleY = 1f + } else { + scaleX = sc + scaleY = sc + } } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/VerticalFlipTransformation.kt b/app/src/main/java/code/name/monkey/retromusic/transform/VerticalFlipTransformation.kt index ee87d3ecc..d73674820 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/VerticalFlipTransformation.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/VerticalFlipTransformation.kt @@ -22,37 +22,35 @@ import kotlin.math.abs class VerticalFlipTransformation : ViewPager.PageTransformer { override fun transformPage(page: View, position: Float) { + page.apply { + translationX = -position * width + cameraDistance = 100000f - page.translationX = -position * page.width - page.cameraDistance = 100000f - - if (position < 0.5 && position > -0.5) { - page.isVisible = true - } else { - page.isInvisible = true - } - - - when { - position < -1 -> { // [-Infinity,-1) - // This page is way off-screen to the left. - page.alpha = 0f + if (position < 0.5 && position > -0.5) { + isVisible = true + } else { + isInvisible = true } - position <= 0 -> { // [-1,0] - page.alpha = 1f - page.rotationY = 180 * (1 - abs(position) + 1) - } - position <= 1 -> { // (0,1] - page.alpha = 1f - page.rotationY = -180 * (1 - abs(position) + 1) - } - else -> { // (1,+Infinity] - // This page is way off-screen to the right. - page.alpha = 0f + when { + position < -1 -> { // [-Infinity,-1) + // This page is way off-screen to the left. + alpha = 0f + } + position <= 0 -> { // [-1,0] + alpha = 1f + rotationY = 180 * (1 - abs(position) + 1) + } + position <= 1 -> { // (0,1] + alpha = 1f + rotationY = -180 * (1 - abs(position) + 1) + } + else -> { // (1,+Infinity] + // This page is way off-screen to the right. + alpha = 0f + } } } - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt index b4b09f5be..bb1b95973 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt @@ -19,11 +19,14 @@ import androidx.viewpager.widget.ViewPager class VerticalStackTransformer : ViewPager.PageTransformer { override fun transformPage(page: View, position: Float) { - if (position >= 0) { - page.scaleX = (0.9f - 0.05f * position) - page.scaleY = 0.9f - page.translationX = -page.width * position - page.translationY = -30 * position + page.apply { + if (position >= 0) { + scaleX = (0.9f - 0.05f * position) + scaleY = 0.9f + translationX = -width * position + translationY = -30 * position + } } + } } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 978a637f0..6e6eee156 100755 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,6 +8,7 @@ @string/horizontal_flip @string/hinge @string/stack + @string/classic @@ -18,6 +19,7 @@ 4 5 6 + 7 From 882e8c15cf2e0deb972cf91fb11d5ef4a85e00f4 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 3 Apr 2022 18:09:57 +0530 Subject: [PATCH 13/15] Added more languages to in-app language chooser --- .../strings.xml | 1 - app/src/main/res/values/arrays.xml | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) rename app/src/main/res/{values-es-rUS => values-b+es+419}/strings.xml (99%) diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-b+es+419/strings.xml similarity index 99% rename from app/src/main/res/values-es-rUS/strings.xml rename to app/src/main/res/values-b+es+419/strings.xml index c95a8ba71..480a97c59 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -74,7 +74,6 @@ Canciones más reproducidas Imagen completa Tarjeta - @cadena/círculo Clásico MD3 Pequeño diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 6e6eee156..a1122eb94 100755 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -127,6 +127,7 @@ Arabic Basque Bengali + Burmese Catalan Simplified Chinese Traditional Chinese(Hong Kong) @@ -137,6 +138,7 @@ Dutch English Finnish + Filipino French German Greek @@ -154,15 +156,18 @@ Oriya Persian Polish - Portuguese + Portuguese(Brazil) + Portuguese(Portugal) Romanian Russian Serbian Slovak - Spain + Spanish + Spanish(Latin America) Swedish Tamil Telugu + Thai Turkish Ukrainian Urdu @@ -174,6 +179,7 @@ ar-SA eu-ES bn-IN + my-MM ca-ES zh-CN zh-HK @@ -184,6 +190,7 @@ nl-NL en fi-FI + fil-PH fr de el @@ -201,16 +208,19 @@ or fa pl - pt + pt-BR + pt-PT ro ru sr sk es + es-419 sv ta te tr + th-TH uk ur vi From 45a40b1faa1160187e73993bdbe78ad3c80e3541 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 4 Apr 2022 19:43:33 +0530 Subject: [PATCH 14/15] Updated Kotlin --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 008a095dc..48eeb5ad0 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - kotlin_version = '1.6.10' + kotlin_version = '1.6.20' navigation_version = '2.4.1' mdc_version = '1.6.0-beta01' preference_version = '1.2.0' From a5346609dd160ffe893a2a4af8749812fe32ecd0 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Thu, 7 Apr 2022 19:29:05 +0530 Subject: [PATCH 15/15] Bump versionCode and update changelog --- app/build.gradle | 2 +- app/src/main/assets/retro-changelog.html | 9 +++++++-- build.gradle | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 41120fe0a..d5bca44df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 10570 + versionCode 10573 versionName '5.8.0' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index b6f6e0e80..1d9e08272 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -63,16 +63,21 @@
-
March 13, 2022
+
April 8, 2022

v5.8.0

What's New

  • Updated translations
  • -
  • Minor UI improvements

Fixed

  • Fixed Classic Notification crash
  • +
  • Fixed crash when clicking on Playlist in the Search Tab
  • +
  • Fixed settings change not reflecting immediately
  • +
  • Fixed shuffle
  • +
  • Fixed Song duration not visible in Card & Blur card themes
  • +
  • Fixed some Album skip styles
  • +
  • Minor bug fixes & UI improvements
diff --git a/build.gradle b/build.gradle index 48eeb5ad0..5b1dfca69 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { ext { kotlin_version = '1.6.20' - navigation_version = '2.4.1' + navigation_version = '2.4.2' mdc_version = '1.6.0-beta01' preference_version = '1.2.0' appcompat_version = '1.4.1'