From a7da2d1cc2da4ad4782d10a0788d4332f40c2791 Mon Sep 17 00:00:00 2001 From: Kieron Quinn Date: Thu, 20 Apr 2023 21:19:06 +0100 Subject: [PATCH] - Fixed On Demand not working via the root method on some devices - Improved Track Listing info, showing more details on tracks where available and fixing the Ask Google button - Crash fixes --- app/build.gradle | 4 ++-- app/release/output-metadata.json | 4 ++-- .../model/recognition/Player.kt | 24 +++++++++++++++---- .../repositories/ShardsListRepository.kt | 23 ++++++++++-------- .../repositories/UpdatesRepository.kt | 8 +++---- .../AmbientMusicModForegroundService.kt | 4 +++- .../ambientmusicmod/service/ShizukuService.kt | 7 ++---- .../backuprestore/BackupRestoreFragment.kt | 5 +++- .../recognition/RecognitionFragment.kt | 14 +++++++---- .../trackinfo/TrackInfoBottomSheetFragment.kt | 8 ++++++- 10 files changed, 66 insertions(+), 35 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9807f7d..4d13ce7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ apply plugin: 'com.google.android.gms.oss-licenses-plugin' String DEFAULT_MANIFEST = "247:https://storage.googleapis.com/music-iq-db/updatable_ytm_db/20230402-030031/manifest.json" String DEFAULT_MANIFEST_V3 = "3048:https://storage.googleapis.com/music-iq-db/updatable_db_v3/20230402-030031/manifest.json" -def tagName = '2.2.1' -def version = 221 +def tagName = '2.2.2' +def version = 222 def getKeystoreProperties() { def properties = new Properties() diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 2cdf0c5..6d2ee39 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 221, - "versionName": "2.2.1", + "versionCode": 222, + "versionName": "2.2.2", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/recognition/Player.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/recognition/Player.kt index 4775221..9923a7b 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/recognition/Player.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/recognition/Player.kt @@ -26,16 +26,19 @@ sealed class Player( private const val PREFIX_YOUTUBE_MUSIC = "https://music.youtube.com" private const val PREFIX_APPLE_MUSIC = "https://music.apple.com" private const val PREFIX_DEEZER = "https://www.deezer.com" + private const val PREFIX_GOOGLE = "/g/" fun getPlayers( context: Context, urls: Array, - googleId: String? + googleId: String?, + trackName: String, + artist: String ): List { val players = ArrayList() val packageManager = context.packageManager - if(googleId != null && packageManager.isAppInstalled(PACKAGE_NAME_GSB)){ - players.add(Assistant(googleId)) + if(googleId?.isValid() == true && packageManager.isAppInstalled(PACKAGE_NAME_GSB)){ + players.add(Assistant(googleId, trackName, artist)) } urls.forEach { getPlayerForUrl(it)?.let { player -> @@ -56,6 +59,13 @@ sealed class Player( else -> null } } + + /** + * /m/ URLs are no longer valid for Assistant, so Chips should not be shown for them + */ + private fun String.isValid(): Boolean { + return startsWith(PREFIX_GOOGLE) + } } open fun getIntent(): Intent { @@ -64,7 +74,11 @@ sealed class Player( } } - data class Assistant(override val url: String): Player( + data class Assistant( + override val url: String, + val trackName: String, + val artist: String + ): Player( url, R.drawable.ic_chip_player_assistant, R.string.recognition_chip_assistant, @@ -76,6 +90,8 @@ sealed class Player( override fun getIntent(): Intent { return Intent("com.google.android.googlequicksearchbox.MUSIC_SEARCH").apply { putExtra("android.soundsearch.extra.RECOGNIZED_TRACK_MID", url) + putExtra("android.soundsearch.extra.RECOGNIZED_TITLE", trackName) + putExtra("android.soundsearch.extra.RECOGNIZED_ARTIST", artist) } } diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/ShardsListRepository.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/ShardsListRepository.kt index 8d3be08..17a50c1 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/ShardsListRepository.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/ShardsListRepository.kt @@ -6,6 +6,7 @@ import android.net.Uri import com.kieronquinn.app.ambientmusicmod.model.database.ShardTrackCacheDatabase import com.kieronquinn.app.ambientmusicmod.model.shards.ShardTrack import com.kieronquinn.app.ambientmusicmod.repositories.ShardsListRepository.GetState +import com.kieronquinn.app.ambientmusicmod.repositories.ShardsRepository.ShardCountry.Companion.CORE_SHARED_FILENAME import com.kieronquinn.app.ambientmusicmod.utils.extensions.contentReceiverAsFlow import com.kieronquinn.app.ambientmusicmod.utils.extensions.isArmv7 import com.kieronquinn.app.ambientmusicmod.utils.extensions.map @@ -259,7 +260,7 @@ class ShardsListRepositoryImpl( private fun List>.merge(): List { //Merge the lists, then group by the shared ID and create the best track, then filter return flatten().groupBy { - it.dbId + "${it.trackName}:${it.artist}" }.map { it.value.createBest() }.distinctBy { @@ -268,17 +269,19 @@ class ShardsListRepositoryImpl( } private fun List.createBest(): ShardTrack { + val preferred = firstOrNull { it.database != CORE_SHARED_FILENAME } ?: first() + val linear = firstOrNull { it.isLinear } return ShardTrack( - first().dbId, - first().id, - first().trackName, - first().artist, - first().googleId, - firstOrNull { it.playerUrls.isNotEmpty() }?.playerUrls ?: emptyArray(), - firstOrNull { it.album != null }?.album, - firstOrNull { it.year != null }?.year, + linear?.dbId ?: preferred.dbId, + preferred.id, + preferred.trackName, + preferred.artist, + preferred.googleId, + map { it.playerUrls.toList() }.flatten().distinct().toTypedArray(), + preferred.album, + preferred.year, any { it.isLinear }, - first().database + preferred.database ) } diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/UpdatesRepository.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/UpdatesRepository.kt index 855559f..a7a65b1 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/UpdatesRepository.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/repositories/UpdatesRepository.kt @@ -69,11 +69,7 @@ class UpdatesRepositoryImpl( } private val packageManager = context.packageManager - - private val updatesCacheDir = File(context.cacheDir, "updates").apply { - mkdirs() - } - + private val updatesCacheDir = File(context.cacheDir, "updates") private val pamProvider = GitHubProvider.getGitHubProvider("NowPlaying") private val ammProvider = GitHubProvider.getGitHubProvider("AmbientMusicMod") @@ -192,6 +188,7 @@ class UpdatesRepositoryImpl( } private fun getUpdateCache(repository: String): GitHubRelease? { + updatesCacheDir.mkdirs() val file = File(updatesCacheDir, "${repository}_${BuildConfig.VERSION_CODE}") if(!file.exists()) return null val cachedRelease = try { @@ -207,6 +204,7 @@ class UpdatesRepositoryImpl( } private fun GitHubRelease.cacheRelease(repository: String) { + updatesCacheDir.mkdirs() val file = File(updatesCacheDir, "${repository}_${BuildConfig.VERSION_CODE}") val cachedRelease = gson.toJson(CachedGitHubRelease(System.currentTimeMillis(), this)) file.writeText(cachedRelease) diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/AmbientMusicModForegroundService.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/AmbientMusicModForegroundService.kt index d313350..40ef3f5 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/AmbientMusicModForegroundService.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/AmbientMusicModForegroundService.kt @@ -533,7 +533,9 @@ class AmbientMusicModForegroundService: LifecycleService() { when(settings.lockscreenOverlayClicked.get()) { LockscreenOnTrackClicked.ASSISTANT -> { val intent = Player.Assistant( - state.recognitionResult.googleId ?: return@whenCreated + state.recognitionResult.googleId ?: return@whenCreated, + state.recognitionResult.trackName, + state.recognitionResult.artist ).getIntent().apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/ShizukuService.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/ShizukuService.kt index 4f95a06..f24c1cc 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/ShizukuService.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/service/ShizukuService.kt @@ -281,11 +281,8 @@ class ShizukuService: IShellProxy.Stub() { if(context.isOnDemandConfigValueSet()) { beginStreamingSearchViaSystem(request, callback) }else{ - if(!isRoot){ - callback.onRecognitionFailed(request, MusicRecognitionManager_RECOGNITION_FAILED_NEEDS_ROOT) - }else{ - beginStreamingSearchViaRoot(request, callback, thread, token) - } + //Assume root is available as UI checks, if not a genuine service error will be shown + beginStreamingSearchViaRoot(request, callback, thread, token) } } diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/backuprestore/BackupRestoreFragment.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/backuprestore/BackupRestoreFragment.kt index e61e9cc..36d1076 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/backuprestore/BackupRestoreFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/backuprestore/BackupRestoreFragment.kt @@ -20,6 +20,7 @@ import com.kieronquinn.app.ambientmusicmod.utils.extensions.takeUriPermission import com.kieronquinn.app.ambientmusicmod.utils.extensions.whenResumed import com.kieronquinn.app.ambientmusicmod.work.PeriodicBackupWorker import org.koin.androidx.viewmodel.ext.android.viewModel +import java.net.URLDecoder import java.time.Instant import java.util.Date @@ -136,7 +137,9 @@ class BackupRestoreFragment: BaseSettingsFragment(), BackAvailable { private fun String.getKnownPathOrNull(): String? { return if(contains("%3A")){ - substring(lastIndexOf("%3A") + 3).replace("%2F", "/") + substring(lastIndexOf("%3A") + 3).let { + URLDecoder.decode(it, "UTF-8") + } }else null } diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/recognition/RecognitionFragment.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/recognition/RecognitionFragment.kt index 4ab065e..e297951 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/recognition/RecognitionFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/recognition/RecognitionFragment.kt @@ -387,10 +387,13 @@ class RecognitionFragment: BoundDialogFragment(Fragm } when(state.result){ is RecogniseResult.Success -> { + val result = state.result.recognitionResult val players = Player.getPlayers( requireContext(), - state.result.recognitionResult.players, - state.result.recognitionResult.googleId + result.players, + result.googleId, + result.trackName, + result.artist ) prepSuccess(state.result, players) } @@ -409,10 +412,13 @@ class RecognitionFragment: BoundDialogFragment(Fragm delay(750L) val newState = when(state.result){ is RecogniseResult.Success -> { + val result = state.result.recognitionResult val players = Player.getPlayers( requireContext(), - state.result.recognitionResult.players, - state.result.recognitionResult.googleId + result.players, + result.googleId, + result.trackName, + result.artist ) State.Success(R.id.recognising_icon_to_success, state.result, players) } diff --git a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/tracklist/trackinfo/TrackInfoBottomSheetFragment.kt b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/tracklist/trackinfo/TrackInfoBottomSheetFragment.kt index f9f91db..0292944 100644 --- a/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/tracklist/trackinfo/TrackInfoBottomSheetFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/tracklist/trackinfo/TrackInfoBottomSheetFragment.kt @@ -37,7 +37,13 @@ class TrackInfoBottomSheetFragment: BaseBottomSheetFragment