├── .gitignore ├── LICENSE ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ ├── baselineProfiles │ │ ├── 0 │ │ │ └── app-release.dm │ │ └── 1 │ │ │ └── app-release.dm │ └── output-metadata.json └── src │ └── main │ ├── AndroidManifest.xml │ ├── aidl │ └── com │ │ └── kieronquinn │ │ └── app │ │ ├── ambientmusicmod │ │ ├── IMicrophoneDisabledStateCallback.aidl │ │ ├── IRecognitionCallback.aidl │ │ └── IShellProxy.aidl │ │ └── pixelambientmusic │ │ ├── IRecognitionCallback.aidl │ │ ├── IRecognitionService.aidl │ │ └── model │ │ ├── PermissionResult.aidl │ │ ├── RecognitionCallbackMetadata.aidl │ │ ├── RecognitionFailure.aidl │ │ ├── RecognitionMetadata.aidl │ │ ├── RecognitionResult.aidl │ │ └── SettingsStateChange.aidl │ ├── java │ └── com │ │ └── kieronquinn │ │ └── app │ │ ├── ambientmusicmod │ │ ├── AmbientMusicMod.kt │ │ ├── components │ │ │ ├── blur │ │ │ │ ├── BlurProvider.kt │ │ │ │ ├── BlurProvider29.kt │ │ │ │ ├── BlurProvider30.kt │ │ │ │ └── BlurProvider31.kt │ │ │ ├── musicrecognition │ │ │ │ └── RootMusicRecognitionManager.kt │ │ │ ├── navigation │ │ │ │ └── Navigation.kt │ │ │ └── notifications │ │ │ │ └── Notifications.kt │ │ ├── model │ │ │ ├── backup │ │ │ │ ├── Backup.kt │ │ │ │ ├── FavouritesItem.kt │ │ │ │ ├── HistoryItem.kt │ │ │ │ ├── LinearItem.kt │ │ │ │ └── SettingsBackup.kt │ │ │ ├── database │ │ │ │ ├── ShardTrackCacheDatabase.kt │ │ │ │ └── ShardTrackDao.kt │ │ │ ├── github │ │ │ │ └── GitHubRelease.kt │ │ │ ├── lockscreenoverlay │ │ │ │ ├── LockscreenOverlayState.kt │ │ │ │ └── LockscreenOverlayStyle.kt │ │ │ ├── recognition │ │ │ │ └── Player.kt │ │ │ ├── settings │ │ │ │ ├── BannerMessage.kt │ │ │ │ └── SettingsItem.kt │ │ │ ├── shards │ │ │ │ ├── CachedShardManifest.kt │ │ │ │ ├── ShardManifest.kt │ │ │ │ └── ShardTrack.kt │ │ │ └── update │ │ │ │ ├── CachedGitHubRelease.kt │ │ │ │ └── Release.kt │ │ ├── providers │ │ │ ├── AlbumArtProvider.kt │ │ │ ├── AmbientMusicModWidget.kt │ │ │ ├── AmbientMusicModWidget41.kt │ │ │ ├── AmbientMusicModWidget42.kt │ │ │ ├── AmbientMusicModWidgetDynamic.kt │ │ │ ├── AmbientMusicModWidgetMinimal.kt │ │ │ ├── GitHubProvider.kt │ │ │ ├── SettingsProvider.kt │ │ │ └── ShardsProvider.kt │ │ ├── receivers │ │ │ ├── BootReceiver.kt │ │ │ └── ExternalAccessReceiver.kt │ │ ├── repositories │ │ │ ├── AccessibilityRepository.kt │ │ │ ├── AmbientServiceRepository.kt │ │ │ ├── ApiRepository.kt │ │ │ ├── BackupRestoreRepository.kt │ │ │ ├── BaseSettingsRepository.kt │ │ │ ├── BatteryOptimisationRepository.kt │ │ │ ├── BedtimeRepository.kt │ │ │ ├── DeviceConfigRepository.kt │ │ │ ├── EncryptedSettingsRepository.kt │ │ │ ├── ExternalAccessRepository.kt │ │ │ ├── JobsRepository.kt │ │ │ ├── RecognitionRepository.kt │ │ │ ├── RemoteSettingsRepository.kt │ │ │ ├── SettingsRepository.kt │ │ │ ├── ShardsListRepository.kt │ │ │ ├── ShardsRepository.kt │ │ │ ├── ShizukuServiceRepository.kt │ │ │ ├── UpdatesRepository.kt │ │ │ └── WidgetRepository.kt │ │ ├── service │ │ │ ├── AmbientMusicModForegroundService.kt │ │ │ ├── LockscreenOverlayAccessibilityService.kt │ │ │ ├── QuickSettingTileService.kt │ │ │ ├── ShellProxyService.kt │ │ │ └── ShizukuService.kt │ │ ├── ui │ │ │ ├── activities │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainActivityViewModel.kt │ │ │ │ └── RecognitionModalActivity.kt │ │ │ ├── base │ │ │ │ ├── BaseBottomSheetFragment.kt │ │ │ │ ├── BaseContainerFragment.kt │ │ │ │ ├── BaseContainerViewModel.kt │ │ │ │ ├── BoundDialogFragment.kt │ │ │ │ ├── BoundFragment.kt │ │ │ │ ├── FragmentOptions.kt │ │ │ │ └── settings │ │ │ │ │ ├── BaseSettingsAdapter.kt │ │ │ │ │ └── BaseSettingsFragment.kt │ │ │ ├── screens │ │ │ │ ├── backuprestore │ │ │ │ │ ├── BackupRestoreAdapter.kt │ │ │ │ │ ├── BackupRestoreFragment.kt │ │ │ │ │ ├── BackupRestoreViewModel.kt │ │ │ │ │ ├── backup │ │ │ │ │ │ ├── BackupRestoreBackupFragment.kt │ │ │ │ │ │ └── BackupRestoreBackupViewModel.kt │ │ │ │ │ ├── restore │ │ │ │ │ │ ├── BackupRestoreRestoreFragment.kt │ │ │ │ │ │ └── BackupRestoreRestoreViewModel.kt │ │ │ │ │ └── restoreoptions │ │ │ │ │ │ ├── BackupRestoreOptionsAdapter.kt │ │ │ │ │ │ ├── BackupRestoreOptionsFragment.kt │ │ │ │ │ │ └── BackupRestoreOptionsViewModel.kt │ │ │ │ ├── batteryoptimisation │ │ │ │ │ ├── BatteryOptimisationAdapter.kt │ │ │ │ │ ├── BatteryOptimisationFragment.kt │ │ │ │ │ └── BatteryOptimisationViewModel.kt │ │ │ │ ├── container │ │ │ │ │ ├── ContainerFragment.kt │ │ │ │ │ └── ContainerViewModel.kt │ │ │ │ ├── contributors │ │ │ │ │ ├── ContributorsAdapter.kt │ │ │ │ │ ├── ContributorsFragment.kt │ │ │ │ │ └── ContributorsViewModel.kt │ │ │ │ ├── faq │ │ │ │ │ └── FaqFragment.kt │ │ │ │ ├── lockscreen │ │ │ │ │ ├── LockScreenAdapter.kt │ │ │ │ │ ├── LockScreenFragment.kt │ │ │ │ │ ├── LockScreenViewModel.kt │ │ │ │ │ ├── action │ │ │ │ │ │ ├── LockScreenActionAdapter.kt │ │ │ │ │ │ ├── LockScreenActionFragment.kt │ │ │ │ │ │ └── LockScreenActionViewModel.kt │ │ │ │ │ ├── ownerinfo │ │ │ │ │ │ ├── LockScreenOwnerInfoAdapter.kt │ │ │ │ │ │ ├── LockScreenOwnerInfoFragment.kt │ │ │ │ │ │ ├── LockScreenOwnerInfoViewModel.kt │ │ │ │ │ │ └── fallback │ │ │ │ │ │ │ ├── LockScreenOwnerInfoFallbackBottomSheetFragment.kt │ │ │ │ │ │ │ └── LockScreenOwnerInfoFallbackBottomSheetViewModel.kt │ │ │ │ │ ├── position │ │ │ │ │ │ ├── LockScreenPositionFragment.kt │ │ │ │ │ │ └── LockScreenPositionViewModel.kt │ │ │ │ │ └── textcolour │ │ │ │ │ │ ├── LockScreenTextColourAdapter.kt │ │ │ │ │ │ ├── LockScreenTextColourFragment.kt │ │ │ │ │ │ ├── LockScreenTextColourViewModel.kt │ │ │ │ │ │ └── custom │ │ │ │ │ │ ├── LockScreenCustomTextColourFragment.kt │ │ │ │ │ │ ├── LockScreenCustomTextColourViewPagerAdapter.kt │ │ │ │ │ │ ├── custom │ │ │ │ │ │ ├── LockScreenCustomTextColourCustomFragment.kt │ │ │ │ │ │ └── LockScreenCustomTextColourCustomViewModel.kt │ │ │ │ │ │ └── monet │ │ │ │ │ │ ├── LockScreenCustomTextColourMonetAdapter.kt │ │ │ │ │ │ ├── LockScreenCustomTextColourMonetFragment.kt │ │ │ │ │ │ ├── LockScreenCustomTextColourMonetInnerAdapter.kt │ │ │ │ │ │ └── LockScreenCustomTextColourMonetViewModel.kt │ │ │ │ ├── nowplaying │ │ │ │ │ ├── NowPlayingAdapter.kt │ │ │ │ │ ├── NowPlayingFragment.kt │ │ │ │ │ └── NowPlayingViewModel.kt │ │ │ │ ├── ondemand │ │ │ │ │ ├── OnDemandAdapter.kt │ │ │ │ │ ├── OnDemandFragment.kt │ │ │ │ │ └── OnDemandViewModel.kt │ │ │ │ ├── recognition │ │ │ │ │ ├── RecognitionChipsAdapter.kt │ │ │ │ │ ├── RecognitionFragment.kt │ │ │ │ │ └── RecognitionViewModel.kt │ │ │ │ ├── root │ │ │ │ │ └── RootFragment.kt │ │ │ │ ├── settings │ │ │ │ │ ├── SettingsAdapter.kt │ │ │ │ │ ├── SettingsFragment.kt │ │ │ │ │ ├── SettingsViewModel.kt │ │ │ │ │ ├── advanced │ │ │ │ │ │ ├── SettingsAdvancedAdapter.kt │ │ │ │ │ │ ├── SettingsAdvancedFragment.kt │ │ │ │ │ │ ├── SettingsAdvancedViewModel.kt │ │ │ │ │ │ ├── externalaccess │ │ │ │ │ │ │ ├── SettingsAdvancedExternalAccessAdapter.kt │ │ │ │ │ │ │ ├── SettingsAdvancedExternalAccessFragment.kt │ │ │ │ │ │ │ └── SettingsAdvancedExternalAccessViewModel.kt │ │ │ │ │ │ └── gain │ │ │ │ │ │ │ ├── SettingsAdvancedGainBottomSheetFragment.kt │ │ │ │ │ │ │ └── SettingsAdvancedGainBottomSheetViewModel.kt │ │ │ │ │ ├── batteryoptimisation │ │ │ │ │ │ └── BatteryOptimisationSettingsFragment.kt │ │ │ │ │ ├── bedtime │ │ │ │ │ │ ├── SettingsBedtimeAdapter.kt │ │ │ │ │ │ ├── SettingsBedtimeFragment.kt │ │ │ │ │ │ └── SettingsBedtimeViewModel.kt │ │ │ │ │ ├── extracountrypicker │ │ │ │ │ │ ├── SettingsExtraCountryPickerAdapter.kt │ │ │ │ │ │ ├── SettingsExtraCountryPickerFragment.kt │ │ │ │ │ │ └── SettingsExtraCountryPickerViewModel.kt │ │ │ │ │ ├── recognitionbuffer │ │ │ │ │ │ ├── SettingsRecognitionBufferAdapter.kt │ │ │ │ │ │ ├── SettingsRecognitionBufferFragment.kt │ │ │ │ │ │ └── SettingsRecognitionBufferViewModel.kt │ │ │ │ │ └── recognitionperiod │ │ │ │ │ │ ├── SettingsRecognitionPeriodAdapter.kt │ │ │ │ │ │ ├── SettingsRecognitionPeriodFragment.kt │ │ │ │ │ │ └── SettingsRecognitionPeriodViewModel.kt │ │ │ │ ├── setup │ │ │ │ │ ├── batteryoptimisation │ │ │ │ │ │ ├── SetupBatteryOptimisationFragment.kt │ │ │ │ │ │ └── SetupBatteryOptimisationViewModel.kt │ │ │ │ │ ├── complete │ │ │ │ │ │ ├── SetupCompleteFragment.kt │ │ │ │ │ │ └── SetupCompleteViewModel.kt │ │ │ │ │ ├── container │ │ │ │ │ │ ├── SetupContainerFragment.kt │ │ │ │ │ │ └── SetupContainerViewModel.kt │ │ │ │ │ ├── countrypicker │ │ │ │ │ │ ├── SetupCountryPickerAdapter.kt │ │ │ │ │ │ ├── SetupCountryPickerFragment.kt │ │ │ │ │ │ └── SetupCountryPickerViewModel.kt │ │ │ │ │ ├── datausage │ │ │ │ │ │ ├── SetupDataUsageAdapter.kt │ │ │ │ │ │ ├── SetupDataUsageFragment.kt │ │ │ │ │ │ └── SetupDataUsageViewModel.kt │ │ │ │ │ ├── installpam │ │ │ │ │ │ ├── SetupInstallPAMFragment.kt │ │ │ │ │ │ └── SetupInstallPAMViewModel.kt │ │ │ │ │ ├── landing │ │ │ │ │ │ ├── SetupLandingFragment.kt │ │ │ │ │ │ └── SetupLandingViewModel.kt │ │ │ │ │ ├── permissions │ │ │ │ │ │ ├── SetupPermissionsFragment.kt │ │ │ │ │ │ └── SetupPermissionsViewModel.kt │ │ │ │ │ └── shizuku │ │ │ │ │ │ ├── SetupShizukuFragment.kt │ │ │ │ │ │ └── SetupShizukuViewModel.kt │ │ │ │ ├── tracklist │ │ │ │ │ ├── TracklistFragment.kt │ │ │ │ │ ├── TracklistViewModel.kt │ │ │ │ │ ├── artists │ │ │ │ │ │ ├── TracklistArtistsAdapter.kt │ │ │ │ │ │ ├── TracklistArtistsFragment.kt │ │ │ │ │ │ ├── TracklistArtistsViewModel.kt │ │ │ │ │ │ └── artisttracks │ │ │ │ │ │ │ ├── TracklistArtistTracksAdapter.kt │ │ │ │ │ │ │ ├── TracklistArtistTracksFragment.kt │ │ │ │ │ │ │ └── TracklistArtistTracksViewModel.kt │ │ │ │ │ ├── edit │ │ │ │ │ │ ├── TrackEditFragment.kt │ │ │ │ │ │ └── TrackEditViewModel.kt │ │ │ │ │ ├── generic │ │ │ │ │ │ ├── GenericTracklistAdapter.kt │ │ │ │ │ │ ├── GenericTracklistFragment.kt │ │ │ │ │ │ └── GenericTracklistViewModel.kt │ │ │ │ │ ├── trackinfo │ │ │ │ │ │ ├── TrackInfoBottomSheetAdapter.kt │ │ │ │ │ │ ├── TrackInfoBottomSheetFragment.kt │ │ │ │ │ │ └── TrackInfoBottomSheetViewModel.kt │ │ │ │ │ └── tracks │ │ │ │ │ │ ├── TracklistTracksAdapter.kt │ │ │ │ │ │ ├── TracklistTracksFragment.kt │ │ │ │ │ │ └── TracklistTracksViewModel.kt │ │ │ │ ├── updates │ │ │ │ │ ├── UpdatesAdapter.kt │ │ │ │ │ ├── UpdatesFragment.kt │ │ │ │ │ ├── UpdatesViewModel.kt │ │ │ │ │ ├── country │ │ │ │ │ │ ├── CountryPickerAdapter.kt │ │ │ │ │ │ ├── CountryPickerFragment.kt │ │ │ │ │ │ └── CountryPickerViewModel.kt │ │ │ │ │ └── download │ │ │ │ │ │ ├── UpdatesDownloadFragment.kt │ │ │ │ │ │ └── UpdatesDownloadViewModel.kt │ │ │ │ └── wallpapercolourpicker │ │ │ │ │ ├── WallpaperColourPickerAdapter.kt │ │ │ │ │ └── WallpaperColourPickerBottomSheetFragment.kt │ │ │ └── views │ │ │ │ ├── LifecycleAwareRecyclerView.kt │ │ │ │ ├── MonetSwitch.kt │ │ │ │ └── NestedSurfaceView.kt │ │ ├── utils │ │ │ ├── accessibility │ │ │ │ └── LifecycleAccessibilityService.kt │ │ │ ├── alarm │ │ │ │ └── AlarmTimeout.kt │ │ │ ├── appbar │ │ │ │ └── DragDisabledAppBarLayoutBehaviour.kt │ │ │ ├── context │ │ │ │ └── ShellContext.kt │ │ │ ├── extensions │ │ │ │ ├── Extensions+Animator.kt │ │ │ │ ├── Extensions+AppBarLayout.kt │ │ │ │ ├── Extensions+Architecture.kt │ │ │ │ ├── Extensions+Audio.kt │ │ │ │ ├── Extensions+AudioPlaybackConfiguration.kt │ │ │ │ ├── Extensions+AudioRecordingConfiguration.kt │ │ │ │ ├── Extensions+CharSequence.kt │ │ │ │ ├── Extensions+Color.kt │ │ │ │ ├── Extensions+ColorPickerView.kt │ │ │ │ ├── Extensions+CompoundButton.kt │ │ │ │ ├── Extensions+ContentResolver.kt │ │ │ │ ├── Extensions+Context.kt │ │ │ │ ├── Extensions+Coroutines.kt │ │ │ │ ├── Extensions+Cursor.kt │ │ │ │ ├── Extensions+EditText.kt │ │ │ │ ├── Extensions+EncryptedSharedPreferences.kt │ │ │ │ ├── Extensions+ExtendedFloatingActionButton.kt │ │ │ │ ├── Extensions+Flow.kt │ │ │ │ ├── Extensions+Fragment.kt │ │ │ │ ├── Extensions+Handler.kt │ │ │ │ ├── Extensions+IActivityManager.kt │ │ │ │ ├── Extensions+IShellProxy.kt │ │ │ │ ├── Extensions+Inset.kt │ │ │ │ ├── Extensions+Intent.kt │ │ │ │ ├── Extensions+JSONArray.kt │ │ │ │ ├── Extensions+Keyguard.kt │ │ │ │ ├── Extensions+Koin.kt │ │ │ │ ├── Extensions+Lifecycle.kt │ │ │ │ ├── Extensions+LocalDateTime.kt │ │ │ │ ├── Extensions+Lottie.kt │ │ │ │ ├── Extensions+MonetCompat.kt │ │ │ │ ├── Extensions+MotionLayout.kt │ │ │ │ ├── Extensions+MusicRecognitionManager.kt │ │ │ │ ├── Extensions+Navigation.kt │ │ │ │ ├── Extensions+NestedScrollView.kt │ │ │ │ ├── Extensions+PackageManager.kt │ │ │ │ ├── Extensions+ParcelFileDescriptor.kt │ │ │ │ ├── Extensions+ProgressIndicator.kt │ │ │ │ ├── Extensions+Random.kt │ │ │ │ ├── Extensions+RecyclerView.kt │ │ │ │ ├── Extensions+Resources.kt │ │ │ │ ├── Extensions+Service.kt │ │ │ │ ├── Extensions+Settings.kt │ │ │ │ ├── Extensions+Slider.kt │ │ │ │ ├── Extensions+Snackbar.kt │ │ │ │ ├── Extensions+SystemProperties.kt │ │ │ │ ├── Extensions+TabLayout.kt │ │ │ │ ├── Extensions+Toolbar.kt │ │ │ │ ├── Extensions+View.kt │ │ │ │ └── Extensions+Wallpaper.kt │ │ │ ├── lifecycle │ │ │ │ └── LifecycleTileService.kt │ │ │ ├── monetcompat │ │ │ │ └── MonetElevationOverlayProvider.kt │ │ │ └── room │ │ │ │ └── GsonConverter.kt │ │ └── work │ │ │ ├── BedtimeWorker.kt │ │ │ ├── PeriodicBackupWorker.kt │ │ │ └── UpdateWorker.kt │ │ └── pixelambientmusic │ │ └── model │ │ ├── PermissionResult.kt │ │ ├── RecognitionCallbackMetadata.kt │ │ ├── RecognitionFailure.kt │ │ ├── RecognitionFailureReason.kt │ │ ├── RecognitionMetadata.kt │ │ ├── RecognitionResult.kt │ │ ├── RecognitionSource.kt │ │ ├── SettingsState.kt │ │ └── SettingsStateChange.kt │ ├── jniLibs │ ├── arm64-v8a │ │ └── libfakelibrary.so │ ├── armeabi-v7a │ │ └── libfakelibrary.so │ └── x86_64 │ │ └── libfakelibrary.so │ ├── proto │ └── history_data.proto │ └── res │ ├── anim │ ├── fast_out_extra_slow_in.xml │ ├── slide_in_left.xml │ ├── slide_in_right.xml │ ├── slide_out_left.xml │ └── slide_out_right.xml │ ├── drawable-nodpi │ ├── widget_preview_4_1.png │ ├── widget_preview_4_2.png │ └── widget_preview_minimal.png │ ├── drawable-v24 │ ├── audioanim_no_music.xml │ ├── ic_back.xml │ ├── ic_chip_player_apple_music.xml │ ├── ic_chip_player_assistant.xml │ ├── ic_chip_player_deezer.xml │ ├── ic_chip_player_spotify.xml │ ├── ic_chip_player_youtube.xml │ ├── ic_chip_player_youtube_music.xml │ ├── ic_community.xml │ ├── ic_donate.xml │ ├── ic_github.xml │ ├── ic_launcher_foreground.xml │ ├── ic_libraries.xml │ ├── ic_nowplaying_history.xml │ ├── ic_nowplaying_ondemand.xml │ ├── ic_twitter.xml │ └── ic_xda.xml │ ├── drawable-v31 │ ├── background_widget.xml │ └── ic_splash.xml │ ├── drawable │ ├── audioanim_animation.xml │ ├── audioanim_animation_classic.xml │ ├── audioanim_animation_progress.xml │ ├── audioanim_animation_progress_sprite_00.xml │ ├── audioanim_animation_progress_sprite_01.xml │ ├── audioanim_animation_progress_sprite_02.xml │ ├── audioanim_animation_progress_sprite_03.xml │ ├── audioanim_animation_progress_sprite_04.xml │ ├── audioanim_animation_progress_sprite_05.xml │ ├── audioanim_animation_progress_sprite_06.xml │ ├── audioanim_animation_progress_sprite_07.xml │ ├── audioanim_animation_progress_sprite_08.xml │ ├── audioanim_animation_progress_sprite_09.xml │ ├── audioanim_animation_progress_sprite_10.xml │ ├── audioanim_animation_progress_sprite_11.xml │ ├── audioanim_animation_progress_sprite_12.xml │ ├── audioanim_animation_progress_sprite_13.xml │ ├── audioanim_animation_progress_sprite_14.xml │ ├── audioanim_animation_progress_sprite_15.xml │ ├── audioanim_animation_progress_sprite_16.xml │ ├── audioanim_animation_progress_sprite_17.xml │ ├── audioanim_animation_progress_sprite_18.xml │ ├── audioanim_animation_progress_sprite_19.xml │ ├── audioanim_animation_progress_sprite_20.xml │ ├── audioanim_animation_progress_sprite_21.xml │ ├── audioanim_animation_progress_sprite_22.xml │ ├── audioanim_animation_progress_sprite_23.xml │ ├── audioanim_animation_progress_sprite_24.xml │ ├── audioanim_no_music_progress.xml │ ├── audioanim_no_music_progress_sprite_00.xml │ ├── audioanim_no_music_progress_sprite_01.xml │ ├── audioanim_no_music_progress_sprite_02.xml │ ├── audioanim_no_music_progress_sprite_03.xml │ ├── audioanim_no_music_progress_sprite_04.xml │ ├── audioanim_no_music_progress_sprite_05.xml │ ├── audioanim_no_music_progress_sprite_06.xml │ ├── audioanim_no_music_progress_sprite_07.xml │ ├── audioanim_no_music_progress_sprite_08.xml │ ├── audioanim_no_music_progress_sprite_09.xml │ ├── audioanim_no_music_progress_sprite_10.xml │ ├── audioanim_no_music_progress_sprite_11.xml │ ├── audioanim_no_music_progress_sprite_12.xml │ ├── audioanim_no_music_progress_sprite_13.xml │ ├── audioanim_no_music_progress_sprite_14.xml │ ├── audioanim_no_music_progress_sprite_15.xml │ ├── audioanim_waveform_progress.xml │ ├── audioanim_waveform_progress_sprite_00.xml │ ├── audioanim_waveform_progress_sprite_01.xml │ ├── audioanim_waveform_progress_sprite_02.xml │ ├── audioanim_waveform_progress_sprite_03.xml │ ├── audioanim_waveform_progress_sprite_04.xml │ ├── audioanim_waveform_progress_sprite_05.xml │ ├── audioanim_waveform_progress_sprite_06.xml │ ├── audioanim_waveform_progress_sprite_07.xml │ ├── audioanim_waveform_progress_sprite_08.xml │ ├── audioanim_waveform_progress_sprite_09.xml │ ├── audioanim_waveform_progress_sprite_10.xml │ ├── audioanim_waveform_progress_sprite_11.xml │ ├── audioanim_waveform_progress_sprite_12.xml │ ├── audioanim_waveform_progress_sprite_13.xml │ ├── audioanim_waveform_progress_sprite_14.xml │ ├── audioanim_waveform_progress_sprite_15.xml │ ├── audioanim_waveform_progress_sprite_16.xml │ ├── audioanim_waveform_progress_sprite_17.xml │ ├── audioanim_waveform_progress_sprite_18.xml │ ├── audioanim_waveform_progress_sprite_19.xml │ ├── audioanim_waveform_progress_sprite_20.xml │ ├── audioanim_waveform_progress_sprite_21.xml │ ├── audioanim_waveform_progress_sprite_22.xml │ ├── audioanim_waveform_progress_sprite_23.xml │ ├── audioanim_waveform_progress_sprite_24.xml │ ├── audioanim_waveform_progress_sprite_25.xml │ ├── audioanim_waveform_progress_sprite_26.xml │ ├── audioanim_waveform_progress_sprite_27.xml │ ├── audioanim_waveform_progress_sprite_28.xml │ ├── audioanim_waveform_progress_sprite_29.xml │ ├── audioanim_waveform_progress_sprite_30.xml │ ├── audioanim_waveform_progress_sprite_31.xml │ ├── audioanim_waveform_progress_sprite_32.xml │ ├── audioanim_waveform_progress_sprite_33.xml │ ├── audioanim_waveform_progress_sprite_34.xml │ ├── audioanim_waveform_progress_sprite_35.xml │ ├── avd_play_to_stop.xml │ ├── avd_stop_to_play.xml │ ├── background_item_country_picker.xml │ ├── background_item_tracklist_icon.xml │ ├── background_lockscreen_header.xml │ ├── background_lockscreen_style.xml │ ├── background_lottie_nowplaying.xml │ ├── background_menu.xml │ ├── background_nowplaying_banner.xml │ ├── background_nowplaying_finished_circle.xml │ ├── background_radio.xml │ ├── background_recognition.xml │ ├── background_setup_controls.xml │ ├── background_setup_country_picker_header.xml │ ├── background_shards_countries_circle.xml │ ├── background_switch.xml │ ├── background_tabs.xml │ ├── background_textview_selected.xml │ ├── background_updates_item.xml │ ├── background_updates_shards_country.xml │ ├── background_widget.xml │ ├── background_widget_item.xml │ ├── bottom_sheet_rounded_bg_dark.xml │ ├── bottom_sheet_rounded_bg_light.xml │ ├── ic_add.xml │ ├── ic_advanced_clear_album_art_cache.xml │ ├── ic_advanced_require_charging.xml │ ├── ic_advanced_require_wifi.xml │ ├── ic_advanced_suppress_sensor_privacy.xml │ ├── ic_ambient_music.xml │ ├── ic_ambient_music_mod.xml │ ├── ic_backup_periodic.xml │ ├── ic_backup_periodic_interval.xml │ ├── ic_backup_periodic_location.xml │ ├── ic_backup_restore.xml │ ├── ic_backup_restore_backup.xml │ ├── ic_backup_restore_options_favourites.xml │ ├── ic_backup_restore_options_favourites_delete.xml │ ├── ic_backup_restore_options_history.xml │ ├── ic_backup_restore_options_history_delete.xml │ ├── ic_backup_restore_options_linear.xml │ ├── ic_backup_restore_options_linear_delete.xml │ ├── ic_backup_restore_options_settings.xml │ ├── ic_backup_restore_restore.xml │ ├── ic_bottom_nav_settings.xml │ ├── ic_check.xml │ ├── ic_check_circle.xml │ ├── ic_contributions_icons.xml │ ├── ic_country_picker_automatic.xml │ ├── ic_delete.xml │ ├── ic_download.xml │ ├── ic_error_circle.xml │ ├── ic_fab_recognise.xml │ ├── ic_faq.xml │ ├── ic_flag_ar.xml │ ├── ic_flag_au.xml │ ├── ic_flag_br.xml │ ├── ic_flag_ca.xml │ ├── ic_flag_ch.xml │ ├── ic_flag_de.xml │ ├── ic_flag_es.xml │ ├── ic_flag_fr.xml │ ├── ic_flag_gb.xml │ ├── ic_flag_ie.xml │ ├── ic_flag_in.xml │ ├── ic_flag_it.xml │ ├── ic_flag_jp.xml │ ├── ic_flag_mx.xml │ ├── ic_flag_nl.xml │ ├── ic_flag_ru.xml │ ├── ic_flag_us.xml │ ├── ic_global.xml │ ├── ic_google_play.xml │ ├── ic_info.xml │ ├── ic_launcher_background.xml │ ├── ic_launcher_monochrome.xml │ ├── ic_lock_screen_owner_info.xml │ ├── ic_lockscreen_change_position.xml │ ├── ic_lockscreen_click_action.xml │ ├── ic_lockscreen_enhanced.xml │ ├── ic_lockscreen_footer.xml │ ├── ic_lockscreen_overlay_text_colour.xml │ ├── ic_lockscreen_owner_info_show_note.xml │ ├── ic_music_database.xml │ ├── ic_nav_now_playing.xml │ ├── ic_nav_tracklist_artists.xml │ ├── ic_nav_tracklist_tracks.xml │ ├── ic_nav_updates.xml │ ├── ic_next.xml │ ├── ic_notification.xml │ ├── ic_nowplaying_banner_attention_high.xml │ ├── ic_nowplaying_banner_attention_low.xml │ ├── ic_nowplaying_banner_attention_medium.xml │ ├── ic_nowplaying_lock_screen.xml │ ├── ic_nowplaying_notifications.xml │ ├── ic_nowplaying_settings.xml │ ├── ic_nowplaying_shield.xml │ ├── ic_on_demand_vibrate.xml │ ├── ic_ondemand_save.xml │ ├── ic_open.xml │ ├── ic_quick_setting_disabled.xml │ ├── ic_quick_setting_enabled.xml │ ├── ic_recognition_circle_failed.xml │ ├── ic_recognition_circle_success.xml │ ├── ic_recognition_retry.xml │ ├── ic_recognition_save.xml │ ├── ic_recognition_success_playback.xml │ ├── ic_save.xml │ ├── ic_search.xml │ ├── ic_search_clear.xml │ ├── ic_settings_advanced_alternative_encoding.xml │ ├── ic_settings_advanced_external_access_require_token.xml │ ├── ic_settings_advanced_external_access_toggle.xml │ ├── ic_settings_advanced_external_access_token.xml │ ├── ic_settings_advanced_gain.xml │ ├── ic_settings_advanced_logging.xml │ ├── ic_settings_advanced_poke_jobscheduler.xml │ ├── ic_settings_advanced_small_cores.xml │ ├── ic_settings_battery_optimisation.xml │ ├── ic_settings_bedtime.xml │ ├── ic_settings_bedtime_end_time.xml │ ├── ic_settings_bedtime_start_time.xml │ ├── ic_settings_external_access.xml │ ├── ic_settings_history_summary_days.xml │ ├── ic_settings_recognition_buffer.xml │ ├── ic_settings_recognition_period.xml │ ├── ic_settings_show_album_art.xml │ ├── ic_settings_trigger_when_screen_on.xml │ ├── ic_setup_data_usage.xml │ ├── ic_setup_install_pam_download_complete.xml │ ├── ic_setup_install_pam_install.xml │ ├── ic_setup_permissions_audio.xml │ ├── ic_setup_permissions_grant.xml │ ├── ic_setup_permissions_phone.xml │ ├── ic_shadow.xml │ ├── ic_shortcut_foreground.xml │ ├── ic_shortcut_monochrome.xml │ ├── ic_source_picker_nnfp.xml │ ├── ic_source_picker_on_demand.xml │ ├── ic_splash.xml │ ├── ic_test.xml │ ├── ic_track_info_year.xml │ ├── ic_update_download_done.xml │ ├── ic_updates_automatic_database_updates.xml │ ├── ic_warning.xml │ ├── indicator_tabs.xml │ ├── monet_color_picker_circle_background.xml │ ├── monet_color_picker_circle_foreground_selected.xml │ ├── rounded_ripple_36.xml │ ├── search_box_background.xml │ └── switch_background_ripple.xml │ ├── font │ ├── google_sans_mono.ttf │ ├── google_sans_text.xml │ ├── google_sans_text_bold.ttf │ ├── google_sans_text_bold_italic.ttf │ ├── google_sans_text_italic.ttf │ ├── google_sans_text_medium.ttf │ ├── google_sans_text_medium_italic.ttf │ └── google_sans_text_regular.ttf │ ├── layout │ ├── activity_main.xml │ ├── activity_recognition_modal.xml │ ├── fragment_backup_restore_backup_fragment.xml │ ├── fragment_backup_restore_options.xml │ ├── fragment_backup_restore_restore_fragment.xml │ ├── fragment_container.xml │ ├── fragment_faq.xml │ ├── fragment_lockscreen_custom_text_colour.xml │ ├── fragment_lockscreen_custom_text_colour_custom.xml │ ├── fragment_lockscreen_owner_info_fallback_bottom_sheet.xml │ ├── fragment_lockscreen_position.xml │ ├── fragment_now_playing.xml │ ├── fragment_recognition.xml │ ├── fragment_root.xml │ ├── fragment_settings_advanced_gain_bottom_sheet.xml │ ├── fragment_settings_base.xml │ ├── fragment_setup_complete.xml │ ├── fragment_setup_container.xml │ ├── fragment_setup_country_picker.xml │ ├── fragment_setup_data_usage.xml │ ├── fragment_setup_install_pam.xml │ ├── fragment_setup_landing.xml │ ├── fragment_setup_permissions.xml │ ├── fragment_setup_shizuku.xml │ ├── fragment_track_edit.xml │ ├── fragment_track_info_bottom_sheet.xml │ ├── fragment_tracklist.xml │ ├── fragment_tracklist_generic.xml │ ├── fragment_updates.xml │ ├── fragment_updates_download_fragment.xml │ ├── fragment_wallpaper_color_picker_bottom_sheet.xml │ ├── include_recognition_circle.xml │ ├── include_recognition_circle_background.xml │ ├── include_recognition_failed.xml │ ├── include_recognition_loading.xml │ ├── include_recognition_playback.xml │ ├── include_recognition_recording.xml │ ├── include_recognition_source_picker.xml │ ├── include_recognition_success.xml │ ├── include_search.xml │ ├── item_battery_optimisation_footer.xml │ ├── item_color_picker.xml │ ├── item_contributors_linked_setting.xml │ ├── item_country_picker.xml │ ├── item_country_picker_settings_header.xml │ ├── item_country_picker_setup_header.xml │ ├── item_lockscreen_action.xml │ ├── item_lockscreen_custom_text_colour_monet.xml │ ├── item_lockscreen_custom_text_colour_monet_colour.xml │ ├── item_lockscreen_footer.xml │ ├── item_lockscreen_header.xml │ ├── item_lockscreen_owner_info_banner.xml │ ├── item_lockscreen_owner_info_footer.xml │ ├── item_lockscreen_owner_info_header.xml │ ├── item_lockscreen_text_colour.xml │ ├── item_nowplaying_banner.xml │ ├── item_nowplaying_footer.xml │ ├── item_nowplaying_header.xml │ ├── item_ondemand_banner.xml │ ├── item_ondemand_header.xml │ ├── item_recognition_success_player_chip.xml │ ├── item_settings_advanced_external_access_footer.xml │ ├── item_settings_bedtime_header.xml │ ├── item_settings_header.xml │ ├── item_settings_recognition_buffer.xml │ ├── item_settings_recognition_period.xml │ ├── item_settings_switch.xml │ ├── item_settings_switch_item.xml │ ├── item_settings_text_item.xml │ ├── item_track_info_country.xml │ ├── item_track_info_players.xml │ ├── item_tracklist.xml │ ├── item_updates_about.xml │ ├── item_updates_amm.xml │ ├── item_updates_pam.xml │ ├── item_updates_shards.xml │ ├── overlay_now_playing.xml │ ├── overlay_now_playing_classic.xml │ ├── view_monet_switch.xml │ ├── widget_4_1.xml │ ├── widget_4_2.xml │ ├── widget_minimal.xml │ ├── widget_minimal_no_shadow.xml │ ├── widget_minimal_shadow.xml │ ├── widget_preview.xml │ └── widget_preview_minimal.xml │ ├── menu │ ├── menu_bottom_nav.xml │ ├── menu_bottom_nav_tracklist.xml │ ├── menu_now_playing.xml │ └── menu_track_edit.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ ├── ic_launcher_round.xml │ └── ic_shortcut.xml │ ├── navigation │ ├── nav_graph_activity.xml │ ├── nav_graph_main.xml │ ├── nav_graph_now_playing.xml │ ├── nav_graph_root.xml │ ├── nav_graph_setup.xml │ ├── nav_graph_tracklist.xml │ ├── nav_graph_tracklist_artists.xml │ ├── nav_graph_tracklist_tracks.xml │ └── nav_graph_updates.xml │ ├── raw │ ├── faq.md │ ├── lottie_bedtime.json │ ├── lottie_bedtime_note_1.json │ ├── lottie_bedtime_note_2.json │ ├── lottie_bedtime_note_3.json │ ├── lottie_nowplaying.json │ ├── lottie_recording.json │ └── lottie_setup_complete.json │ ├── values-land │ ├── dimens.xml │ └── styles.xml │ ├── values-night-v31 │ └── colors.xml │ ├── values-night │ ├── bools.xml │ └── colors.xml │ ├── values-v31 │ ├── colors.xml │ ├── dimens.xml │ ├── overscroll.xml │ └── themes.xml │ ├── values │ ├── attrs.xml │ ├── bools.xml │ ├── colors.xml │ ├── dimens.xml │ ├── overscroll.xml │ ├── strings.xml │ ├── styles.xml │ ├── themes.xml │ └── values.xml │ └── xml │ ├── accessibilityservice.xml │ ├── appwidgetprovider_41.xml │ ├── appwidgetprovider_42.xml │ ├── appwidgetprovider_dynamic.xml │ ├── appwidgetprovider_minimal.xml │ ├── data_extraction_rules.xml │ ├── fragment_recognition_scene.xml │ ├── item_ondemand_header_scene.xml │ ├── item_settings_bedtime_header_scene.xml │ ├── provider_paths.xml │ ├── samsung_widget.xml │ └── shortcuts.xml ├── astrea ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── google │ │ └── android │ │ └── as │ │ └── oss │ │ ├── common │ │ ├── ExecutorAnnotations.java │ │ ├── Executors.java │ │ ├── ExecutorsModule.java │ │ ├── base │ │ │ └── SafeInitializer.java │ │ ├── config │ │ │ ├── AbstractConfigReader.java │ │ │ ├── AbstractFlagManager.java │ │ │ ├── ConfigReader.java │ │ │ ├── Consumer.java │ │ │ ├── FlagListener.java │ │ │ ├── FlagManager.java │ │ │ ├── FlagManagerFactory.java │ │ │ ├── FlagNamespace.java │ │ │ ├── Listenable.java │ │ │ ├── ListenableValue.java │ │ │ ├── MulticastListenable.java │ │ │ ├── MuteMulticastListenable.java │ │ │ ├── ValueListener.java │ │ │ └── impl │ │ │ │ ├── DeviceConfigProxy.java │ │ │ │ ├── DeviceFlagManager.java │ │ │ │ ├── DeviceFlagManagerFactory.java │ │ │ │ └── FlagManagerModule.java │ │ ├── futures │ │ │ └── MoreFutures.java │ │ └── initializer │ │ │ ├── InitializersModule.java │ │ │ └── PcsInitializer.java │ │ ├── grpc │ │ ├── Annotations.java │ │ ├── AstreaGrpcService.java │ │ ├── ContextKeys.java │ │ ├── GrpcServerEndpointConfiguration.java │ │ ├── GrpcServerEndpointConfigurator.java │ │ ├── GrpcStatusProto.java │ │ ├── PcsGrpcModule.java │ │ ├── config │ │ │ ├── PcsGrpcConfig.java │ │ │ └── impl │ │ │ │ ├── PcsGrpcConfigModule.java │ │ │ │ └── PcsGrpcConfigReader.java │ │ ├── impl │ │ │ ├── GrpcServerEndpointConfiguratorImpl.java │ │ │ ├── MetadataExtractionServerInterceptor.java │ │ │ ├── OnDeviceChannelModule.java │ │ │ ├── PcsSecurityPolicies.java │ │ │ └── ServerModule.java │ │ └── perapp │ │ │ └── PcsGrpcConstantsModule.java │ │ ├── http │ │ ├── config │ │ │ ├── PcsHttpConfig.java │ │ │ └── impl │ │ │ │ ├── PcsHttpConfigModule.java │ │ │ │ └── PcsHttpConfigReader.java │ │ └── service │ │ │ ├── HttpGrpcBindableService.java │ │ │ └── HttpGrpcModule.java │ │ └── networkusage │ │ ├── db │ │ ├── ConnectionDetails.java │ │ ├── Converters.java │ │ ├── NetworkUsageEntity.java │ │ ├── NetworkUsageEntityTtl.java │ │ ├── NetworkUsageLogRepository.java │ │ ├── NetworkUsageLogUtils.java │ │ ├── Status.java │ │ └── noop │ │ │ ├── NetworkUsageLogNoOpModule.java │ │ │ └── NetworkUsageLogRepositoryNoOpImpl.java │ │ └── ui │ │ └── content │ │ ├── NetworkUsageLogContentMap.java │ │ └── UnrecognizedNetworkRequestException.java │ └── proto │ ├── connection_key.proto │ ├── http.proto │ ├── policy_proto.proto │ └── status.proto ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── ondemandoverlay ├── .gitignore ├── README.md ├── build.gradle ├── module │ ├── META-INF │ │ └── com │ │ │ └── google │ │ │ └── android │ │ │ ├── update-binary │ │ │ └── updater-script │ ├── customize.sh │ └── module.prop ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── res │ └── values │ └── strings.xml ├── readme.md ├── settings.gradle └── systemstubs ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── aidl ├── android │ ├── app │ │ ├── IApplicationThread.aidl │ │ └── IServiceConnection.aidl │ ├── content │ │ └── pm │ │ │ └── ParceledListSlice.aidl │ ├── media │ │ └── musicrecognition │ │ │ ├── IMusicRecognitionAttributionTagCallback.aidl │ │ │ ├── IMusicRecognitionManagerCallback.aidl │ │ │ ├── IMusicRecognitionService.aidl │ │ │ └── IMusicRecognitionServiceCallback.aidl │ └── view │ │ └── IWindowManager.aidl └── com │ ├── android │ └── internal │ │ ├── policy │ │ └── IKeyguardDismissCallback.aidl │ │ └── widget │ │ └── ILockSettings.aidl │ └── kieronquinn │ └── app │ └── ambientmusicmod │ └── utils │ └── parcel │ └── WindowListSparseArray.aidl └── java ├── android ├── app │ └── IActivityManager.java ├── content │ └── pm │ │ ├── BaseParceledListSlice.java │ │ └── ParceledListSlice.java ├── hardware │ └── SensorPrivacyManagerHidden.java ├── media │ └── musicrecognition │ │ ├── MusicRecognitionManager.java │ │ └── RecognitionRequest.java └── provider │ └── DeviceConfig.java └── com └── kieronquinn └── app └── ambientmusicmod └── utils └── parcel └── WindowListSparseArray.java /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/release/baselineProfiles/0/app-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/release/baselineProfiles/0/app-release.dm -------------------------------------------------------------------------------- /app/release/baselineProfiles/1/app-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/release/baselineProfiles/1/app-release.dm -------------------------------------------------------------------------------- /app/release/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "com.kieronquinn.app.ambientmusicmod", 8 | "variantName": "release", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 240, 15 | "versionName": "2.4", 16 | "outputFile": "app-release.apk" 17 | } 18 | ], 19 | "elementType": "File", 20 | "baselineProfiles": [ 21 | { 22 | "minApi": 28, 23 | "maxApi": 30, 24 | "baselineProfiles": [ 25 | "baselineProfiles/1/app-release.dm" 26 | ] 27 | }, 28 | { 29 | "minApi": 31, 30 | "maxApi": 2147483647, 31 | "baselineProfiles": [ 32 | "baselineProfiles/0/app-release.dm" 33 | ] 34 | } 35 | ], 36 | "minSdkVersionForDexing": 28 37 | } -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/ambientmusicmod/IMicrophoneDisabledStateCallback.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod; 2 | 3 | interface IMicrophoneDisabledStateCallback { 4 | oneway void onMicrophoneDisabledStateChanged(boolean disabled); 5 | } -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/ambientmusicmod/IRecognitionCallback.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod; 2 | 3 | interface IRecognitionCallback { 4 | 5 | void onRecognitionSucceeded(in RecognitionRequest recognitionRequest, in MediaMetadata result, in Bundle extras); 6 | void onRecognitionFailed(in RecognitionRequest recognitionRequest, int failureCode); 7 | void onAudioStreamClosed(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/IRecognitionCallback.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic; 2 | 3 | import com.kieronquinn.app.pixelambientmusic.model.RecognitionResult; 4 | import com.kieronquinn.app.pixelambientmusic.model.RecognitionFailure; 5 | import com.kieronquinn.app.pixelambientmusic.model.RecognitionMetadata; 6 | 7 | interface IRecognitionCallback { 8 | 9 | oneway void onRecordingStarted(); 10 | oneway void onRecognitionStarted(); 11 | oneway void onRecognitionSucceeded(in RecognitionResult result, in RecognitionMetadata metadata); 12 | oneway void onRecognitionFailed(in RecognitionFailure result); 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/IRecognitionService.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic; 2 | 3 | import com.kieronquinn.app.pixelambientmusic.IRecognitionCallback; 4 | import com.kieronquinn.app.pixelambientmusic.model.SettingsStateChange; 5 | import com.kieronquinn.app.pixelambientmusic.model.RecognitionResult; 6 | import com.kieronquinn.app.pixelambientmusic.model.RecognitionCallbackMetadata; 7 | 8 | interface IRecognitionService { 9 | 10 | boolean ping(); 11 | String addRecognitionCallback(in IRecognitionCallback callback, in RecognitionCallbackMetadata callbackMetadata); 12 | boolean removeRecognitionCallback(String id); 13 | void requestRecognition(); 14 | void requestOnDemandRecognition(); 15 | oneway void onConfigChanged(in List configNames); 16 | 17 | oneway void updateSettingsState(in SettingsStateChange change); 18 | oneway void clearAlbumArtCache(); 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/model/PermissionResult.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model; 2 | 3 | parcelable PermissionResult; -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/model/RecognitionCallbackMetadata.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model; 2 | 3 | parcelable RecognitionCallbackMetadata; -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/model/RecognitionFailure.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model; 2 | 3 | parcelable RecognitionFailure; -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/model/RecognitionMetadata.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model; 2 | 3 | parcelable RecognitionMetadata; -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/model/RecognitionResult.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model; 2 | 3 | parcelable RecognitionResult; -------------------------------------------------------------------------------- /app/src/main/aidl/com/kieronquinn/app/pixelambientmusic/model/SettingsStateChange.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model; 2 | 3 | parcelable SettingsStateChange; -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/components/blur/BlurProvider29.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.components.blur 2 | 3 | import android.view.View 4 | import android.view.Window 5 | 6 | class BlurProvider29: BlurProvider() { 7 | 8 | override val minBlurRadius = 0f 9 | override val maxBlurRadius = 0f 10 | 11 | override fun applyDialogBlur(dialogWindow: Window, appWindow: Window, ratio: Float) { 12 | applyBlurToWindow(dialogWindow, ratio) 13 | } 14 | 15 | override fun applyBlurToWindow(window: Window, ratio: Float) { 16 | window.addDimming() 17 | } 18 | 19 | override fun applyBlurToView(view: View, ratio: Float): Boolean { 20 | return false //Unsupported 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/backup/Backup.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.backup 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Backup( 6 | @SerializedName("version") 7 | val version: Int = VERSION, 8 | @SerializedName("history") 9 | val history: List, 10 | @SerializedName("linear") 11 | val linear: List, 12 | @SerializedName("linear_v3") 13 | val linearv3: List, 14 | @SerializedName("favourites") 15 | val favourites: List, 16 | @SerializedName("settings") 17 | val settingsBackup: SettingsBackup 18 | ) { 19 | 20 | companion object { 21 | const val VERSION = 1 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/database/ShardTrackDao.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.database 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import com.kieronquinn.app.ambientmusicmod.model.shards.ShardTrack 8 | 9 | @Dao 10 | interface ShardTrackDao { 11 | 12 | @Query("select * from ShardTrack") 13 | fun getAll(): List 14 | 15 | @Insert(onConflict = OnConflictStrategy.REPLACE) 16 | fun insert(shardTracks: List) 17 | 18 | @Query("delete from ShardTrack") 19 | fun clear() 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/github/GitHubRelease.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.github 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | class GitHubRelease { 6 | 7 | @SerializedName("html_url") 8 | val gitHubUrl: String? = null 9 | 10 | @SerializedName("tag_name") 11 | val tag: String? = null 12 | 13 | @SerializedName("name") 14 | val versionName: String? = null 15 | 16 | @SerializedName("body") 17 | val body: String? = null 18 | 19 | @SerializedName("assets") 20 | val assets: Array? = null 21 | 22 | class Asset { 23 | @SerializedName("browser_download_url") 24 | val downloadUrl: String? = null 25 | 26 | @SerializedName("content_type") 27 | val contentType: String? = null 28 | 29 | @SerializedName("name") 30 | val fileName: String? = null 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/lockscreenoverlay/LockscreenOverlayStyle.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.lockscreenoverlay 2 | 3 | import androidx.annotation.DrawableRes 4 | import com.kieronquinn.app.ambientmusicmod.R 5 | 6 | enum class LockscreenOverlayStyle(@DrawableRes val icon: Int) { 7 | NEW(R.drawable.audioanim_animation), CLASSIC(R.drawable.audioanim_animation_classic) 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/shards/CachedShardManifest.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.shards 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class CachedShardManifest( 6 | @SerializedName("timestamp") 7 | val timestamp: Long, 8 | @SerializedName("shard_manifest") 9 | val shardManifest: ShardManifest 10 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/shards/ShardManifest.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.shards 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ShardManifest( 6 | @SerializedName("url") 7 | val url: String, 8 | @SerializedName("versionCode") 9 | val versionCode: String, 10 | @SerializedName("date") 11 | val date: String, 12 | @SerializedName("time") 13 | val time: String 14 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/model/update/CachedGitHubRelease.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.model.update 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.kieronquinn.app.ambientmusicmod.model.github.GitHubRelease 5 | 6 | data class CachedGitHubRelease( 7 | @SerializedName("timestamp") 8 | val timestamp: Long, 9 | @SerializedName("release") 10 | val release: GitHubRelease 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/AmbientMusicModWidget.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | import android.appwidget.AppWidgetProvider 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.kieronquinn.app.ambientmusicmod.repositories.WidgetRepository 7 | import org.koin.core.component.KoinComponent 8 | import org.koin.core.component.inject 9 | 10 | abstract class AmbientMusicModWidget: AppWidgetProvider(), KoinComponent { 11 | 12 | private val widgetRepository by inject() 13 | 14 | override fun onReceive(context: Context?, intent: Intent?) { 15 | super.onReceive(context, intent) 16 | widgetRepository.notifyChanged() 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/AmbientMusicModWidget41.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | class AmbientMusicModWidget41: AmbientMusicModWidget() -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/AmbientMusicModWidget42.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | class AmbientMusicModWidget42: AmbientMusicModWidget() -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/AmbientMusicModWidgetDynamic.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | class AmbientMusicModWidgetDynamic: AmbientMusicModWidget() -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/AmbientMusicModWidgetMinimal.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | class AmbientMusicModWidgetMinimal: AmbientMusicModWidget() -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/GitHubProvider.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.github.GitHubRelease 4 | import retrofit2.Call 5 | import retrofit2.Retrofit 6 | import retrofit2.converter.gson.GsonConverterFactory 7 | import retrofit2.http.GET 8 | 9 | interface GitHubProvider { 10 | 11 | companion object { 12 | fun getGitHubProvider(repository: String): GitHubProvider = Retrofit.Builder() 13 | .baseUrl("https://api.github.com/repos/KieronQuinn/$repository/") 14 | .addConverterFactory(GsonConverterFactory.create()) 15 | .build() 16 | .create(GitHubProvider::class.java) 17 | } 18 | 19 | @GET("releases") 20 | fun getReleases(): Call> 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/providers/ShardsProvider.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.providers 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.shards.ShardManifest 4 | import retrofit2.Call 5 | import retrofit2.Retrofit 6 | import retrofit2.converter.gson.GsonConverterFactory 7 | import retrofit2.http.GET 8 | 9 | interface ShardsProvider { 10 | 11 | companion object { 12 | fun getShardsProvider(): ShardsProvider = Retrofit.Builder() 13 | .baseUrl("https://raw.githubusercontent.com/") 14 | .addConverterFactory(GsonConverterFactory.create()) 15 | .build() 16 | .create(ShardsProvider::class.java) 17 | } 18 | 19 | @GET("KieronQuinn/AmbientMusicManifest/main/release.json") 20 | fun getShardsManifest(): Call 21 | 22 | @GET("KieronQuinn/AmbientMusicManifest/main/release_v3.json") 23 | fun getShardsManifestV3(): Call 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/receivers/BootReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.kieronquinn.app.ambientmusicmod.service.AmbientMusicModForegroundService 7 | 8 | class BootReceiver: BroadcastReceiver() { 9 | 10 | override fun onReceive(context: Context, intent: Intent) { 11 | if(intent.action != Intent.ACTION_BOOT_COMPLETED) return 12 | AmbientMusicModForegroundService.start(context, true) 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/base/BaseContainerViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.base 2 | 3 | interface BaseContainerViewModel { 4 | fun onBackPressed() 5 | fun onParentBackPressed(): Boolean 6 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/base/FragmentOptions.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.base 2 | 3 | import android.view.Menu 4 | import android.view.MenuInflater 5 | import android.view.MenuItem 6 | 7 | interface BackAvailable 8 | interface LockCollapsed 9 | interface NoToolbar 10 | 11 | interface Root 12 | 13 | interface ProvidesBack { 14 | fun onBackPressed(): Boolean 15 | } 16 | 17 | interface ProvidesTitle { 18 | fun getTitle(): CharSequence? 19 | } 20 | 21 | interface ProvidesOverflow { 22 | fun inflateMenu(menuInflater: MenuInflater, menu: Menu) 23 | fun onMenuItemSelected(menuItem: MenuItem): Boolean 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/backuprestore/BackupRestoreAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.backuprestore 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.settings.BaseSettingsItem 4 | import com.kieronquinn.app.ambientmusicmod.ui.base.settings.BaseSettingsAdapter 5 | import com.kieronquinn.app.ambientmusicmod.ui.views.LifecycleAwareRecyclerView 6 | 7 | class BackupRestoreAdapter( 8 | recyclerView: LifecycleAwareRecyclerView, 9 | items: List 10 | ): BaseSettingsAdapter(recyclerView, items) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/backuprestore/restoreoptions/BackupRestoreOptionsAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.backuprestore.restoreoptions 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.settings.BaseSettingsItem 4 | import com.kieronquinn.app.ambientmusicmod.ui.base.settings.BaseSettingsAdapter 5 | import com.kieronquinn.app.ambientmusicmod.ui.views.LifecycleAwareRecyclerView 6 | 7 | class BackupRestoreOptionsAdapter( 8 | recyclerView: LifecycleAwareRecyclerView, 9 | override var items: List 10 | ): BaseSettingsAdapter(recyclerView, items) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/lockscreen/textcolour/custom/LockScreenCustomTextColourViewPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.lockscreen.textcolour.custom 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.viewpager2.adapter.FragmentStateAdapter 5 | import com.kieronquinn.app.ambientmusicmod.ui.screens.lockscreen.textcolour.custom.custom.LockScreenCustomTextColourCustomFragment 6 | import com.kieronquinn.app.ambientmusicmod.ui.screens.lockscreen.textcolour.custom.monet.LockScreenCustomTextColourMonetFragment 7 | 8 | class LockScreenCustomTextColourViewPagerAdapter(fragment: Fragment): FragmentStateAdapter(fragment) { 9 | 10 | override fun getItemCount() = 2 11 | 12 | override fun createFragment(position: Int): Fragment { 13 | return when(position){ 14 | 0 -> LockScreenCustomTextColourMonetFragment() 15 | 1 -> LockScreenCustomTextColourCustomFragment() 16 | else -> throw RuntimeException("Invalid position $position") 17 | } 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/settings/SettingsAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.settings 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.settings.BaseSettingsItem 4 | import com.kieronquinn.app.ambientmusicmod.ui.base.settings.BaseSettingsAdapter 5 | import com.kieronquinn.app.ambientmusicmod.ui.views.LifecycleAwareRecyclerView 6 | 7 | class SettingsAdapter( 8 | recyclerView: LifecycleAwareRecyclerView, 9 | override var items: List 10 | ): BaseSettingsAdapter(recyclerView, items) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/settings/advanced/SettingsAdvancedAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.settings.advanced 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.settings.BaseSettingsItem 4 | import com.kieronquinn.app.ambientmusicmod.ui.base.settings.BaseSettingsAdapter 5 | import com.kieronquinn.app.ambientmusicmod.ui.views.LifecycleAwareRecyclerView 6 | 7 | class SettingsAdvancedAdapter( 8 | recyclerView: LifecycleAwareRecyclerView, 9 | override var items: List 10 | ): BaseSettingsAdapter(recyclerView, items) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/settings/batteryoptimisation/BatteryOptimisationSettingsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.settings.batteryoptimisation 2 | 3 | import com.kieronquinn.app.ambientmusicmod.ui.screens.batteryoptimisation.BatteryOptimisationFragment 4 | 5 | class BatteryOptimisationSettingsFragment: BatteryOptimisationFragment() { 6 | 7 | override fun onAcceptabilityChanged(acceptable: Boolean) { 8 | //No-op 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/setup/batteryoptimisation/SetupBatteryOptimisationFragment.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.setup.batteryoptimisation 2 | 3 | import com.kieronquinn.app.ambientmusicmod.ui.base.BackAvailable 4 | import com.kieronquinn.app.ambientmusicmod.ui.screens.batteryoptimisation.BatteryOptimisationFragment 5 | import org.koin.androidx.viewmodel.ext.android.viewModel 6 | 7 | class SetupBatteryOptimisationFragment: BatteryOptimisationFragment(), BackAvailable { 8 | 9 | private val viewModel by viewModel() 10 | 11 | override fun onAcceptabilityChanged(acceptable: Boolean) { 12 | if(acceptable) viewModel.moveToNext() 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/setup/datausage/SetupDataUsageAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.setup.datausage 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.settings.BaseSettingsItem 4 | import com.kieronquinn.app.ambientmusicmod.ui.base.settings.BaseSettingsAdapter 5 | import com.kieronquinn.app.ambientmusicmod.ui.views.LifecycleAwareRecyclerView 6 | 7 | class SetupDataUsageAdapter( 8 | recyclerView: LifecycleAwareRecyclerView, 9 | override var items: List 10 | ): BaseSettingsAdapter(recyclerView, items) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/setup/landing/SetupLandingViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.setup.landing 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.kieronquinn.app.ambientmusicmod.components.navigation.RootNavigation 6 | import kotlinx.coroutines.launch 7 | 8 | abstract class SetupLandingViewModel: ViewModel() { 9 | 10 | abstract fun onGetStartedClicked() 11 | 12 | } 13 | 14 | class SetupLandingViewModelImpl( 15 | private val rootNavigation: RootNavigation 16 | ): SetupLandingViewModel() { 17 | 18 | override fun onGetStartedClicked() { 19 | viewModelScope.launch { 20 | rootNavigation.navigate(SetupLandingFragmentDirections.actionSetupLandingFragmentToSetupContainerFragment()) 21 | } 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/tracklist/artists/TracklistArtistsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.tracklist.artists 2 | 3 | import com.kieronquinn.app.ambientmusicmod.ui.screens.tracklist.artists.TracklistArtistsViewModel.ShardArtist 4 | import com.kieronquinn.app.ambientmusicmod.ui.screens.tracklist.generic.GenericTracklistFragment 5 | import org.koin.androidx.viewmodel.ext.android.viewModel 6 | 7 | class TracklistArtistsFragment: GenericTracklistFragment() { 8 | 9 | override val adapter by lazy { 10 | TracklistArtistsAdapter( 11 | binding.tracklistGenericRecyclerview, viewModel::onArtistClicked, emptyList() 12 | ) 13 | } 14 | 15 | override val viewModel by viewModel() 16 | 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/ui/screens/tracklist/tracks/TracklistTracksFragment.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.ui.screens.tracklist.tracks 2 | 3 | import com.kieronquinn.app.ambientmusicmod.model.shards.ShardTrack 4 | import com.kieronquinn.app.ambientmusicmod.ui.screens.tracklist.generic.GenericTracklistFragment 5 | import org.koin.androidx.viewmodel.ext.android.viewModel 6 | 7 | class TracklistTracksFragment: GenericTracklistFragment() { 8 | 9 | override val adapter by lazy { 10 | TracklistTracksAdapter( 11 | binding.tracklistGenericRecyclerview, 12 | ::onOnDemandClicked, 13 | viewModel::onTrackClicked, 14 | emptyList() 15 | ) 16 | } 17 | 18 | override val viewModel by viewModel() 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/appbar/DragDisabledAppBarLayoutBehaviour.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.appbar 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import com.google.android.material.appbar.AppBarLayout 6 | 7 | class DragDisabledAppBarLayoutBehaviour: AppBarLayout.Behavior { 8 | 9 | constructor(): super() 10 | constructor(context: Context?, attrs: AttributeSet?): super(context, attrs) 11 | 12 | init { 13 | setDragCallback(object: DragCallback() { 14 | override fun canDrag(appBarLayout: AppBarLayout): Boolean { 15 | return false 16 | } 17 | }) 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Animator.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.animation.Animator 4 | import kotlinx.coroutines.suspendCancellableCoroutine 5 | import kotlin.coroutines.resume 6 | 7 | suspend fun Animator.runAndJoin() = suspendCancellableCoroutine { 8 | val listener = object: Animator.AnimatorListener { 9 | override fun onAnimationStart(p0: Animator) { 10 | //No-op 11 | } 12 | 13 | override fun onAnimationEnd(p0: Animator) { 14 | removeListener(this) 15 | it.resume(Unit) 16 | } 17 | 18 | override fun onAnimationCancel(p0: Animator) { 19 | //No-op 20 | } 21 | 22 | override fun onAnimationRepeat(p0: Animator) { 23 | //No-op 24 | } 25 | } 26 | addListener(listener) 27 | start() 28 | it.invokeOnCancellation { 29 | cancel() 30 | removeListener(listener) 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Audio.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import java.nio.ByteBuffer 4 | 5 | fun ShortArray.toByteArray(): ByteArray { 6 | return ByteBuffer.allocate(size * 2).apply { 7 | asShortBuffer().put(this@toByteArray) 8 | }.array() 9 | } 10 | 11 | fun ShortArray.applyGain(gain: Float): ShortArray { 12 | if (isNotEmpty()) { 13 | for (i in indices) { 14 | this[i] = (this[i] * gain).toInt().coerceAtMost(Short.MAX_VALUE.toInt()).toShort() 15 | } 16 | } 17 | return this 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+AudioPlaybackConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.media.AudioPlaybackConfiguration 4 | 5 | fun AudioPlaybackConfiguration.getClientUid(): Int? { 6 | return try { 7 | AudioPlaybackConfiguration::class.java.getMethod("getClientUid").invoke(this) as Int 8 | }catch (e: SecurityException){ 9 | //Don't have the permission for some reason, absorb 10 | null 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+AudioRecordingConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.media.AudioRecordingConfiguration 4 | 5 | fun AudioRecordingConfiguration.getClientUid(): Int? { 6 | return try { 7 | AudioRecordingConfiguration::class.java.getMethod("getClientUid").invoke(this) as Int 8 | }catch (e: SecurityException){ 9 | //Don't have the permission for some reason, absorb 10 | null 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+CharSequence.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.text.TextPaint 4 | import android.text.TextUtils 5 | 6 | fun CharSequence.ellipsizeToSize(textPaint: TextPaint, width: Float): CharSequence { 7 | return TextUtils.ellipsize(this, textPaint, width, TextUtils.TruncateAt.END) 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Color.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.text.InputFilter 4 | import androidx.core.graphics.ColorUtils 5 | 6 | fun Int.toHexString(): String { 7 | return "#" + Integer.toHexString(this) 8 | } 9 | 10 | fun Int.isColorDark(): Boolean { 11 | return ColorUtils.calculateLuminance(this) < 0.5 12 | } 13 | 14 | private val HEX_REGEX = "[^A-F0-9]".toRegex() 15 | 16 | fun hexColorFilter() = InputFilter { source, _, _, dest, _, _ -> 17 | source.toString() 18 | .uppercase() 19 | .replace(HEX_REGEX, "") 20 | } 21 | 22 | fun Int.toHexColor(includeHash: Boolean = true): String { 23 | val format = if(includeHash) "#%06X" else "%06X" 24 | return String.format("#%06X", (0xFFFFFF and this)) 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+ColorPickerView.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import kotlinx.coroutines.channels.awaitClose 4 | import kotlinx.coroutines.flow.callbackFlow 5 | import top.defaults.colorpicker.ColorObserver 6 | import top.defaults.colorpicker.ColorPickerView 7 | import top.defaults.colorpicker.ColorWheelView 8 | 9 | fun ColorPickerView.onChanged() = callbackFlow { 10 | val observer = ColorObserver { color, fromUser, _ -> 11 | if(fromUser) trySend(color) 12 | } 13 | subscribe(observer) 14 | awaitClose { 15 | unsubscribe(observer) 16 | } 17 | } 18 | 19 | fun ColorPickerView.setColor(color: Int) { 20 | val colorWheelView = ColorPickerView::class.java.getDeclaredField("colorWheelView").apply { 21 | isAccessible = true 22 | }.get(this) as ColorWheelView 23 | colorWheelView.setColor(color, false) 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+CompoundButton.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.widget.CompoundButton 4 | import kotlinx.coroutines.channels.awaitClose 5 | import kotlinx.coroutines.flow.callbackFlow 6 | import kotlinx.coroutines.flow.debounce 7 | 8 | fun CompoundButton.onChanged() = callbackFlow { 9 | val listener = CompoundButton.OnCheckedChangeListener { _, checked -> 10 | trySend(checked) 11 | } 12 | setOnCheckedChangeListener(listener) 13 | awaitClose { 14 | setOnCheckedChangeListener(null) 15 | } 16 | }.debounce(TAP_DEBOUNCE) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Coroutines.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import kotlinx.coroutines.CancellableContinuation 4 | import kotlinx.coroutines.suspendCancellableCoroutine 5 | import kotlinx.coroutines.withTimeoutOrNull 6 | import kotlin.coroutines.Continuation 7 | 8 | suspend inline fun suspendCoroutineWithTimeout(timeout: Long, crossinline block: (Continuation) -> Unit ) : T? { 9 | var finalValue : T? = null 10 | withTimeoutOrNull(timeout) { 11 | finalValue = suspendCancellableCoroutine(block = block) 12 | } 13 | return finalValue 14 | } 15 | 16 | suspend inline fun suspendCancellableCoroutineWithTimeout(timeout: Long, crossinline block: (CancellableContinuation) -> Unit ) : T? { 17 | var finalValue : T? = null 18 | withTimeoutOrNull(timeout) { 19 | finalValue = suspendCancellableCoroutine(block = block) 20 | } 21 | return finalValue 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+ExtendedFloatingActionButton.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton 4 | import kotlin.coroutines.resume 5 | import kotlin.coroutines.suspendCoroutine 6 | 7 | suspend fun ExtendedFloatingActionButton.collapse() = suspendCoroutine { 8 | if(!isExtended) { 9 | it.resume(Unit) 10 | return@suspendCoroutine 11 | } 12 | val callback = object: ExtendedFloatingActionButton.OnChangedCallback() { 13 | override fun onShrunken(extendedFab: ExtendedFloatingActionButton?) { 14 | super.onShrunken(extendedFab) 15 | it.resume(Unit) 16 | } 17 | } 18 | shrink(callback) 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Flow.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import kotlinx.coroutines.delay 4 | import kotlinx.coroutines.flow.Flow 5 | import kotlinx.coroutines.flow.channelFlow 6 | import kotlinx.coroutines.flow.collectLatest 7 | import kotlinx.coroutines.flow.first 8 | 9 | suspend fun Flow.await(check: (T) -> Boolean): T { 10 | return first { 11 | check(it) 12 | } 13 | } 14 | 15 | fun Flow.autoClearAfterBy(delay: suspend (T) -> Long?): Flow = channelFlow { 16 | val original = this@autoClearAfterBy 17 | original.collectLatest { newValue -> 18 | send(newValue) 19 | val delayTime = delay(newValue) ?: return@collectLatest 20 | delay(delayTime) 21 | send(null) 22 | } 23 | } 24 | 25 | suspend fun Flow.firstNotNull(): T { 26 | return first { it != null }!! 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Handler.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | 6 | fun runOnUiThread(block: () -> Unit) { 7 | Handler(Looper.getMainLooper()).post { 8 | block() 9 | } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+IShellProxy.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import com.android.internal.policy.IKeyguardDismissCallback 4 | import com.kieronquinn.app.ambientmusicmod.IShellProxy 5 | 6 | fun IShellProxy.dismissKeyguard(onSuccess: () -> Unit, message: String) { 7 | val callback = object: IKeyguardDismissCallback.Stub() { 8 | override fun onDismissSucceeded() { 9 | onSuccess() 10 | } 11 | 12 | override fun onDismissCancelled() { 13 | //No-op 14 | } 15 | 16 | override fun onDismissError() { 17 | //No-op 18 | } 19 | }.asBinder() 20 | dismissKeyguard(callback, message) 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Intent.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.app.PendingIntent 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.kieronquinn.app.ambientmusicmod.BuildConfig 7 | import com.kieronquinn.app.ambientmusicmod.ui.activities.MainActivity 8 | 9 | private const val INTENT_KEY_SECURITY_TAG = "security_tag" 10 | private const val PENDING_INTENT_REQUEST_CODE = 999 11 | 12 | fun Intent.applySecurity(context: Context) { 13 | val securityTag = PendingIntent.getActivity( 14 | context, 15 | PENDING_INTENT_REQUEST_CODE, 16 | Intent(context, MainActivity::class.java), 17 | PendingIntent.FLAG_IMMUTABLE 18 | ) 19 | putExtra(INTENT_KEY_SECURITY_TAG, securityTag) 20 | } 21 | 22 | fun Intent.verifySecurity() { 23 | getParcelableExtra(INTENT_KEY_SECURITY_TAG)?.let { 24 | if(it.creatorPackage == BuildConfig.APPLICATION_ID) return 25 | } 26 | throw SecurityException("Unauthorised access") 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+JSONArray.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import org.json.JSONArray 4 | 5 | fun JSONArray.toStringArray(): Array { 6 | return ArrayList().apply { 7 | for(i in 0 until length()){ 8 | add(getString(i)) 9 | } 10 | }.toTypedArray() 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Keyguard.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.content.IntentFilter 7 | import kotlinx.coroutines.channels.awaitClose 8 | import kotlinx.coroutines.flow.callbackFlow 9 | 10 | fun Context.onKeyguardStateChanged() = callbackFlow { 11 | val receiver = object: BroadcastReceiver() { 12 | override fun onReceive(context: Context?, intent: Intent?) { 13 | trySend(Unit) 14 | } 15 | } 16 | registerReceiverCompat( 17 | receiver, 18 | IntentFilter().apply { 19 | addAction(Intent.ACTION_SCREEN_OFF) 20 | addAction(Intent.ACTION_SCREEN_ON) 21 | addAction(Intent.ACTION_USER_PRESENT) 22 | } 23 | ) 24 | awaitClose { 25 | unregisterReceiver(receiver) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Koin.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import org.koin.core.scope.Scope 4 | import org.koin.core.scope.ScopeCallback 5 | 6 | fun Scope.runOnClose(block: () -> Unit) { 7 | registerCallback(object: ScopeCallback { 8 | override fun onScopeClose(scope: Scope) { 9 | block() 10 | } 11 | }) 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+LocalDateTime.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import java.time.LocalDateTime 4 | import java.time.ZoneId 5 | import java.util.* 6 | 7 | fun LocalDateTime.toDate(): Date { 8 | return Date.from(atZone(ZoneId.systemDefault()).toInstant()) 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Lottie.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.graphics.PorterDuff 4 | import android.graphics.PorterDuffColorFilter 5 | import androidx.annotation.ColorInt 6 | import com.airbnb.lottie.LottieAnimationView 7 | import com.airbnb.lottie.LottieProperty 8 | import com.airbnb.lottie.model.KeyPath 9 | 10 | fun LottieAnimationView.filterColour( 11 | vararg keyPath: String, 12 | @ColorInt filter: Int 13 | ) { 14 | addValueCallback(KeyPath(*keyPath), LottieProperty.COLOR_FILTER) { 15 | PorterDuffColorFilter( 16 | filter, 17 | PorterDuff.Mode.SRC_ATOP 18 | ) 19 | } 20 | } 21 | 22 | fun LottieAnimationView.replaceColour(vararg keyPath: String, replaceWith: Int) { 23 | addValueCallback(KeyPath(*keyPath), LottieProperty.COLOR) { 24 | replaceWith 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+MonetCompat.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.content.Context 4 | import com.kieronquinn.monetcompat.core.MonetCompat 5 | import com.kieronquinn.monetcompat.extensions.toArgb 6 | 7 | fun MonetCompat.getColorSurface(context: Context): Int { 8 | return if(context.isDarkMode){ 9 | getMonetColors().neutral1[900]!!.toArgb() 10 | }else{ 11 | getMonetColors().neutral1[10]!!.toArgb() 12 | } 13 | } 14 | 15 | fun MonetCompat.getColorOnSurface(context: Context): Int { 16 | return if(context.isDarkMode){ 17 | getMonetColors().neutral1[100]!!.toArgb() 18 | }else{ 19 | getMonetColors().neutral1[900]!!.toArgb() 20 | } 21 | } 22 | 23 | fun MonetCompat.getColorOnSurfaceVariant(context: Context): Int { 24 | return if(context.isDarkMode){ 25 | getMonetColors().neutral2[200]!!.toArgb() 26 | }else{ 27 | getMonetColors().neutral2[700]!!.toArgb() 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+MusicRecognitionManager.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.media.musicrecognition.IMusicRecognitionAttributionTagCallback 4 | import android.media.musicrecognition.IMusicRecognitionService 5 | import kotlinx.coroutines.suspendCancellableCoroutine 6 | import kotlin.coroutines.resume 7 | 8 | const val MusicRecognitionManager_RECOGNITION_FAILED_NEEDS_ROOT: Int = -2 9 | 10 | suspend fun IMusicRecognitionService.getAttributionTag() = suspendCancellableCoroutine { 11 | getAttributionTag(object: IMusicRecognitionAttributionTagCallback.Stub() { 12 | override fun onAttributionTag(attributionTag: String) { 13 | it.resume(attributionTag) 14 | } 15 | }) 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Navigation.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import androidx.activity.OnBackPressedCallback 4 | import androidx.navigation.NavController 5 | import kotlinx.coroutines.channels.awaitClose 6 | import kotlinx.coroutines.flow.callbackFlow 7 | import kotlinx.coroutines.flow.debounce 8 | 9 | fun NavController.onDestinationChanged() = callbackFlow { 10 | val listener = NavController.OnDestinationChangedListener { _, destination, _ -> 11 | trySend(destination) 12 | } 13 | addOnDestinationChangedListener(listener) 14 | awaitClose { 15 | removeOnDestinationChangedListener(listener) 16 | } 17 | }.debounce(TAP_DEBOUNCE) 18 | 19 | fun NavController.setOnBackPressedCallback(callback: OnBackPressedCallback) { 20 | NavController::class.java.getDeclaredField("onBackPressedCallback").apply { 21 | isAccessible = true 22 | }.set(this, callback) 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+ProgressIndicator.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.animation.ValueAnimator 4 | import com.google.android.material.progressindicator.BaseProgressIndicator 5 | 6 | fun BaseProgressIndicator<*>.animateProgress(start: Int, duration: Long): ValueAnimator { 7 | progress = start 8 | return ValueAnimator.ofInt(start, 100).apply { 9 | setDuration(duration) 10 | addUpdateListener { 11 | progress = it.animatedValue as Int 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Random.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import java.security.SecureRandom 4 | import java.util.Base64 5 | 6 | fun randomSecureString(length: Int): String { 7 | val bytes = ByteArray(length) 8 | SecureRandom().apply { 9 | nextBytes(bytes) 10 | } 11 | return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes) 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+RecyclerView.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import kotlinx.coroutines.channels.awaitClose 5 | import kotlinx.coroutines.flow.callbackFlow 6 | import kotlinx.coroutines.flow.debounce 7 | import kotlinx.coroutines.flow.distinctUntilChanged 8 | 9 | fun RecyclerView.shouldShrinkFab() = callbackFlow { 10 | val listener = object: RecyclerView.OnScrollListener() { 11 | override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { 12 | trySend(dy > 0) 13 | } 14 | } 15 | addOnScrollListener(listener) 16 | awaitClose { 17 | removeOnScrollListener(listener) 18 | } 19 | }.distinctUntilChanged().debounce(TAP_DEBOUNCE) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Resources.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.content.res.Resources 4 | import androidx.annotation.ArrayRes 5 | 6 | fun Resources.getResourceIdArray(@ArrayRes resourceId: Int): Array { 7 | val array = obtainTypedArray(resourceId) 8 | val items = mutableListOf() 9 | for(i in 0 until array.length()){ 10 | items.add(array.getResourceId(i, 0)) 11 | } 12 | array.recycle() 13 | return items.toTypedArray() 14 | } 15 | 16 | fun Resources.dip(value: Int): Int = (value * displayMetrics.density).toInt() -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Service.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.app.Notification 4 | import android.app.Service 5 | import android.content.pm.ServiceInfo 6 | import android.os.Build 7 | import com.kieronquinn.app.ambientmusicmod.components.notifications.NotificationId 8 | 9 | fun Service.startForeground(notificationId: NotificationId, notification: Notification) { 10 | try { 11 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { 12 | startForeground( 13 | notificationId.ordinal, 14 | notification, 15 | ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE 16 | ) 17 | }else{ 18 | startForeground(notificationId.ordinal, notification) 19 | } 20 | }catch (e: Exception) { 21 | //Caches ForegroundServiceStartNotAllowedException on S+ when unable to startForeground 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Slider.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import com.google.android.material.slider.Slider 4 | import kotlinx.coroutines.channels.awaitClose 5 | import kotlinx.coroutines.flow.callbackFlow 6 | 7 | fun Slider.onChanged() = callbackFlow { 8 | val listener = Slider.OnChangeListener { _, value, fromUser -> 9 | if(fromUser) { 10 | trySend(value) 11 | } 12 | } 13 | addOnChangeListener(listener) 14 | awaitClose { 15 | removeOnChangeListener(listener) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Snackbar.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.graphics.Typeface 4 | import android.widget.TextView 5 | import com.google.android.material.snackbar.Snackbar 6 | 7 | fun Snackbar.setTypeface(typeface: Typeface?): Snackbar { 8 | val tv = view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView 9 | val actionTv = view.findViewById(com.google.android.material.R.id.snackbar_action) as TextView 10 | tv.typeface = typeface 11 | actionTv.typeface = typeface 12 | return this 13 | } 14 | 15 | fun Snackbar.onSwipeDismissed(block: () -> Unit) { 16 | addCallback(object: Snackbar.Callback() { 17 | override fun onDismissed(transientBottomBar: Snackbar?, event: Int) { 18 | super.onDismissed(transientBottomBar, event) 19 | if(event == DISMISS_EVENT_SWIPE){ 20 | block() 21 | } 22 | } 23 | }) 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+TabLayout.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import com.google.android.material.tabs.TabLayout 4 | import kotlinx.coroutines.channels.awaitClose 5 | import kotlinx.coroutines.flow.callbackFlow 6 | 7 | fun TabLayout.selectTab(position: Int){ 8 | selectTab(getTabAt(position)) 9 | } 10 | 11 | fun TabLayout.onSelected(includeReselection: Boolean = false) = callbackFlow { 12 | val listener = object: TabLayout.OnTabSelectedListener { 13 | override fun onTabSelected(tab: TabLayout.Tab) { 14 | trySend(tab.position) 15 | } 16 | 17 | override fun onTabUnselected(tab: TabLayout.Tab) { 18 | //No-op 19 | } 20 | 21 | override fun onTabReselected(tab: TabLayout.Tab) { 22 | if(includeReselection){ 23 | trySend(tab.position) 24 | } 25 | } 26 | } 27 | addOnTabSelectedListener(listener) 28 | awaitClose { 29 | removeOnTabSelectedListener(listener) 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/extensions/Extensions+Toolbar.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.extensions 2 | 3 | import android.view.View 4 | import androidx.appcompat.widget.Toolbar 5 | import kotlinx.coroutines.channels.awaitClose 6 | import kotlinx.coroutines.flow.callbackFlow 7 | import kotlinx.coroutines.flow.debounce 8 | 9 | fun Toolbar.onNavigationIconClicked() = callbackFlow { 10 | setNavigationOnClickListener { 11 | trySend(it) 12 | } 13 | awaitClose { 14 | setOnClickListener(null) 15 | } 16 | }.debounce(TAP_DEBOUNCE) -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/utils/room/GsonConverter.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.room 2 | 3 | import androidx.room.TypeConverter 4 | import com.google.gson.Gson 5 | import com.google.gson.reflect.TypeToken 6 | import org.koin.core.component.KoinComponent 7 | import org.koin.core.component.inject 8 | 9 | object GsonConverter: KoinComponent { 10 | 11 | private val gson by inject() 12 | private val setType = object: TypeToken>(){}.type 13 | 14 | @TypeConverter 15 | fun fromString(value: String): Array { 16 | return gson.fromJson(value, setType) 17 | } 18 | 19 | @TypeConverter 20 | fun fromArray(array: Array): String { 21 | return gson.toJson(array) 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/ambientmusicmod/work/BedtimeWorker.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.work 2 | 3 | import android.content.Context 4 | import androidx.work.Worker 5 | import androidx.work.WorkerParameters 6 | import com.kieronquinn.app.ambientmusicmod.repositories.BedtimeRepository 7 | import kotlinx.coroutines.GlobalScope 8 | import kotlinx.coroutines.launch 9 | import org.koin.core.component.KoinComponent 10 | import org.koin.core.component.inject 11 | 12 | class BedtimeWorker( 13 | context: Context, workerParams: WorkerParameters 14 | ) : Worker(context, workerParams), KoinComponent { 15 | 16 | private val bedtimeRepository by inject() 17 | 18 | override fun doWork(): Result { 19 | GlobalScope.launch { 20 | bedtimeRepository.checkTimeAndSyncWorkers() 21 | } 22 | return Result.success() 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/PermissionResult.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class PermissionResult( 8 | val requiredPermissions: List, 9 | val shouldShowPermissionRationale: Boolean 10 | ): Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/RecognitionCallbackMetadata.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class RecognitionCallbackMetadata( 8 | val recognitionSource: RecognitionSource, 9 | val includeAudio: Boolean 10 | ): Parcelable -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/RecognitionFailureReason.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | sealed class RecognitionFailureReason: Parcelable { 7 | @Parcelize 8 | object NoMatch: RecognitionFailureReason() 9 | @Parcelize 10 | object SkippedOnCall: RecognitionFailureReason() 11 | @Parcelize 12 | object SkippedSystemUserNotInForeground: RecognitionFailureReason() 13 | @Parcelize 14 | object SkippedMusicPlaying: RecognitionFailureReason() 15 | @Parcelize 16 | object SkippedAudioRecordFailed: RecognitionFailureReason() 17 | @Parcelize 18 | data class MusicRecognitionError(val errorCode: Int): RecognitionFailureReason() 19 | @Parcelize 20 | data class Busy(val otherRunningRecognitionSource: RecognitionSource): RecognitionFailureReason() 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/RecognitionMetadata.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class RecognitionMetadata( 8 | val recognitionTime: Long, 9 | val currentPos: Long, 10 | val remainingTime: Long 11 | ): Parcelable -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/RecognitionSource.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | enum class RecognitionSource { 4 | NNFP, ON_DEMAND 5 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/SettingsState.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class SettingsState( 8 | val mainEnabled: Boolean, 9 | val onDemandEnabled: Boolean, 10 | val notificationsEnabled: Boolean, 11 | val bannerMessage: BannerMessage?, 12 | val lastRecognisedSong: LastRecognisedSong? 13 | ): Parcelable 14 | 15 | @Parcelize 16 | data class LastRecognisedSong( 17 | val track: String, 18 | val artist: String, 19 | val timestamp: Long, 20 | val recognitionSource: RecognitionSource 21 | ): Parcelable 22 | 23 | enum class BannerMessage { 24 | PERMISSIONS_NEEDED, //Local 25 | DOWNLOADING, //Service 26 | NO_INTERNET, //Local 27 | SEARCH_BUTTON_BEING_SET_UP, //Service 28 | WAITING_FOR_UNMETERED_INTERNET, //Local 29 | DO_NOT_DISTURB_ENABLED, //Local 30 | APP_USING_DEVICE_AUDIO, //Local 31 | APP_RECORDING_AUDIO, //Local 32 | GOOGLE_APP_INVALID, //Local 33 | MICROPHONE_DISABLED //Shizuku 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/kieronquinn/app/pixelambientmusic/model/SettingsStateChange.kt: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.pixelambientmusic.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class SettingsStateChange( 8 | val mainEnabled: Boolean? = null, 9 | val onDemandEnabled: Boolean? = null 10 | ): Parcelable -------------------------------------------------------------------------------- /app/src/main/jniLibs/arm64-v8a/libfakelibrary.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/jniLibs/arm64-v8a/libfakelibrary.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi-v7a/libfakelibrary.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/jniLibs/armeabi-v7a/libfakelibrary.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/x86_64/libfakelibrary.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/jniLibs/x86_64/libfakelibrary.so -------------------------------------------------------------------------------- /app/src/main/proto/history_data.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "com.google.audio.ambientmusic"; 4 | option java_outer_classname = "HistoryData"; 5 | 6 | message Item { 7 | 8 | string timezone = 7; 9 | Track track = 9; 10 | string source = 11; 11 | 12 | message Track { 13 | string title = 3; 14 | string artist = 4; 15 | string album = 13; 16 | string year = 14; 17 | repeated Player player = 9; 18 | 19 | message Player { 20 | string url = 2; 21 | } 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/fast_out_extra_slow_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/widget_preview_4_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/drawable-nodpi/widget_preview_4_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/widget_preview_4_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/drawable-nodpi/widget_preview_4_2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/widget_preview_minimal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/drawable-nodpi/widget_preview_minimal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_chip_player_apple_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_chip_player_assistant.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_chip_player_deezer.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_chip_player_spotify.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_chip_player_youtube.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_chip_player_youtube_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_community.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_github.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_libraries.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_nowplaying_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_nowplaying_ondemand.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_twitter.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v31/background_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_item_country_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_item_tracklist_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_lockscreen_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_lockscreen_style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_lottie_nowplaying.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_nowplaying_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_nowplaying_finished_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_radio.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_recognition.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_setup_controls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_setup_country_picker_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_shards_countries_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_switch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_textview_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_updates_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_updates_shards_country.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_widget_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_sheet_rounded_bg_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_sheet_rounded_bg_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_advanced_clear_album_art_cache.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ambient_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ambient_music_mod.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_periodic.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_periodic_interval.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_periodic_location.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_backup.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_options_favourites.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_options_favourites_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_options_history.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_options_linear.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_options_linear_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_restore_restore.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_error_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fab_recognise.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_ar.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_br.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_ca.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_ch.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_de.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_fr.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_gb.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_ie.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_in.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_it.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_jp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_nl.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_ru.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_flag_us.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_google_play.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_screen_owner_info.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lockscreen_change_position.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lockscreen_click_action.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lockscreen_enhanced.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lockscreen_footer.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lockscreen_owner_info_show_note.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_database.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nav_now_playing.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nav_tracklist_artists.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nav_tracklist_tracks.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nav_updates.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_next.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notification.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_banner_attention_high.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_banner_attention_low.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_banner_attention_medium.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_lock_screen.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_notifications.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_on_demand_vibrate.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_open.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_quick_setting_enabled.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_recognition_circle_failed.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_recognition_circle_success.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_recognition_retry.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_recognition_save.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_recognition_success_playback.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_clear.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_advanced_alternative_encoding.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_advanced_external_access_require_token.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_advanced_external_access_toggle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_advanced_poke_jobscheduler.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_battery_optimisation.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_bedtime.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_bedtime_end_time.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_bedtime_start_time.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_external_access.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_recognition_period.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_show_album_art.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_trigger_when_screen_on.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setup_data_usage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setup_install_pam_download_complete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setup_install_pam_install.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setup_permissions_audio.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setup_permissions_grant.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setup_permissions_phone.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shadow.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_source_picker_nnfp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_source_picker_on_demand.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_track_info_year.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_update_download_done.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_updates_automatic_database_updates.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_warning.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/indicator_tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/monet_color_picker_circle_background.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/monet_color_picker_circle_foreground_selected.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_ripple_36.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_box_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/switch_background_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_mono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_mono.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_text_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_text_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_text_bold_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_text_bold_italic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_text_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_text_italic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_text_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_text_medium.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_text_medium_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_text_medium_italic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans_text_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/app/src/main/res/font/google_sans_text_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_recognition_modal.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_faq.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_lockscreen_position.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_root.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/include_recognition_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/include_recognition_circle_background.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_lockscreen_footer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_lockscreen_owner_info_footer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_settings_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_settings_switch.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_track_info_players.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_minimal_no_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_minimal_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_preview_minimal.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_bottom_nav.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_bottom_nav_tracklist.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_now_playing.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_track_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_shortcut.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph_tracklist.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 88dp 4 | 80dp 5 | 0dp 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-night-v31/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @android:color/system_neutral1_900 4 | @android:color/system_accent2_600 5 | @android:color/system_accent1_100 6 | @android:color/system_neutral1_900 7 | @android:color/system_neutral1_700 8 | 9 | ?android:attr/colorBackground 10 | @android:color/system_accent2_800 11 | 12 | @android:color/system_accent1_300 13 | @android:color/system_accent1_500 14 | @android:color/system_accent1_700 15 | @android:color/system_accent1_100 16 | @android:color/system_neutral1_800 17 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @color/black 4 | @color/black 5 | 6 | #fff28b82 7 | #ff81c995 8 | #fffdd663 9 | #ff3b2d2c 10 | #ff2b3328 11 | #ff333121 12 | #757575 13 | 14 | @color/system_neutral1_900 15 | @color/system_accent1_600 16 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @android:color/system_neutral1_50 4 | @android:color/system_accent2_100 5 | @android:color/system_accent1_700 6 | @android:color/system_neutral1_50 7 | @android:color/system_neutral1_100 8 | 9 | ?android:attr/colorBackground 10 | @android:color/system_accent2_100 11 | 12 | @android:color/system_accent1_200 13 | @android:color/system_accent1_400 14 | @android:color/system_accent1_600 15 | @android:color/system_neutral2_700 16 | @android:color/system_accent1_100 17 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1px 4 | 32px 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/overscroll.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 0 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/overscroll.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 2 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/values.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/xml/accessibilityservice.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/appwidgetprovider_41.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/appwidgetprovider_42.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/appwidgetprovider_dynamic.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/appwidgetprovider_minimal.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/xml/samsung_widget.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/xml/shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /astrea/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /astrea/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/astrea/consumer-rules.pro -------------------------------------------------------------------------------- /astrea/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /astrea/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /astrea/src/main/java/com/google/android/as/oss/common/config/ValueListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.android.as.oss.common.config; 18 | 19 | /** Observer of value updates. */ 20 | public interface ValueListener { 21 | /** 22 | * Notifies when the value has changed. 23 | * 24 | * @param value the updated value 25 | * @param previous value in use before this update 26 | */ 27 | void onUpdate(T value, T previous); 28 | } 29 | -------------------------------------------------------------------------------- /astrea/src/main/java/com/google/android/as/oss/networkusage/db/NetworkUsageEntityTtl.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.android.as.oss.networkusage.db; 18 | 19 | import java.lang.annotation.Retention; 20 | import java.lang.annotation.RetentionPolicy; 21 | import javax.inject.Qualifier; 22 | 23 | /** Qualifier for the TTL of entities in the network usage log. */ 24 | @Qualifier 25 | @Retention(RetentionPolicy.RUNTIME) 26 | public @interface NetworkUsageEntityTtl {} 27 | -------------------------------------------------------------------------------- /astrea/src/main/java/com/google/android/as/oss/networkusage/db/Status.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.android.as.oss.networkusage.db; 18 | 19 | /** Success status of the download. */ 20 | public enum Status { 21 | SUCCEEDED, 22 | FAILED, 23 | } 24 | -------------------------------------------------------------------------------- /astrea/src/main/proto/policy_proto.proto: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | syntax = "proto2"; 16 | 17 | package arcs.core.data; 18 | 19 | option java_multiple_files = true; 20 | option java_package = "arcs.core.data.proto"; 21 | 22 | message PolicyProto { 23 | required bool isInitialized = 1; 24 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Sep 07 17:33:51 BST 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /ondemandoverlay/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /ondemandoverlay/README.md: -------------------------------------------------------------------------------- 1 | ## On Demand Overlay 2 | 3 | This directory contains a Magisk module for enabling the On Demand Music recognition service. 4 | 5 | `customize.sh` contains code based on and modified from [QuickSwitch](https://github.com/skittles9823/QuickSwitch), to dynamically copy the APK to the right folder. -------------------------------------------------------------------------------- /ondemandoverlay/module/META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | ################# 4 | # Initialization 5 | ################# 6 | 7 | umask 022 8 | 9 | # echo before loading util_functions 10 | ui_print() { echo "$1"; } 11 | 12 | require_new_magisk() { 13 | ui_print "*******************************" 14 | ui_print " Please install Magisk v20.4+! " 15 | ui_print "*******************************" 16 | exit 1 17 | } 18 | 19 | ######################### 20 | # Load util_functions.sh 21 | ######################### 22 | 23 | OUTFD=$2 24 | ZIPFILE=$3 25 | 26 | mount /data 2>/dev/null 27 | 28 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk 29 | . /data/adb/magisk/util_functions.sh 30 | [ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk 31 | 32 | install_module 33 | exit 0 -------------------------------------------------------------------------------- /ondemandoverlay/module/META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK -------------------------------------------------------------------------------- /ondemandoverlay/module/module.prop: -------------------------------------------------------------------------------- 1 | id=OnDemandOverlay 2 | name=Ambient Music Mod: On Demand Overlay 3 | version=1.1 4 | versionCode=11 5 | author=Kieron Quinn / Quinny899 6 | description=Enables On Demand with supported Google App versions (See FAQ) -------------------------------------------------------------------------------- /ondemandoverlay/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /ondemandoverlay/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /ondemandoverlay/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | com.google.android.googlequicksearchbox/com.google.android.apps.search.soundsearch.service.SoundSearchService 3 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | maven { url 'https://jitpack.io' } 14 | } 15 | } 16 | rootProject.name = "Ambient Music Mod" 17 | include ':app' 18 | include ':astrea' 19 | include ':systemstubs' 20 | include ':ondemandoverlay' 21 | -------------------------------------------------------------------------------- /systemstubs/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /systemstubs/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | } 4 | 5 | android { 6 | compileSdk 32 7 | 8 | defaultConfig { 9 | minSdk 29 10 | targetSdk 32 11 | 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | consumerProguardFiles "consumer-rules.pro" 14 | } 15 | 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | compileOptions { 23 | sourceCompatibility JavaVersion.VERSION_17 24 | targetCompatibility JavaVersion.VERSION_17 25 | } 26 | buildFeatures { 27 | aidl true 28 | } 29 | namespace 'com.kieronquinn.app.systemstubs' 30 | } 31 | 32 | dependencies { 33 | implementation 'androidx.core:core-ktx:1.13.1' 34 | 35 | annotationProcessor "dev.rikka.tools.refine:annotation-processor:$refine_version" 36 | compileOnly "dev.rikka.tools.refine:annotation:$refine_version" 37 | } -------------------------------------------------------------------------------- /systemstubs/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KieronQuinn/AmbientMusicMod/061cc6458f1731108fd2e16605d13e57207dc64f/systemstubs/consumer-rules.pro -------------------------------------------------------------------------------- /systemstubs/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /systemstubs/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/app/IApplicationThread.aidl: -------------------------------------------------------------------------------- 1 | package android.app; 2 | 3 | interface IApplicationThread { 4 | //Stub! 5 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/app/IServiceConnection.aidl: -------------------------------------------------------------------------------- 1 | /* //device/java/android/android/app/IServiceConnection.aidl 2 | ** 3 | ** Copyright 2007, The Android Open Source Project 4 | ** 5 | ** Licensed under the Apache License, Version 2.0 (the "License"); 6 | ** you may not use this file except in compliance with the License. 7 | ** You may obtain a copy of the License at 8 | ** 9 | ** http://www.apache.org/licenses/LICENSE-2.0 10 | ** 11 | ** Unless required by applicable law or agreed to in writing, software 12 | ** distributed under the License is distributed on an "AS IS" BASIS, 13 | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | ** See the License for the specific language governing permissions and 15 | ** limitations under the License. 16 | */ 17 | 18 | package android.app; 19 | 20 | import android.content.ComponentName; 21 | 22 | interface IServiceConnection { 23 | void connected(in ComponentName name, IBinder service, boolean dead); 24 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/content/pm/ParceledListSlice.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2011, The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package android.content.pm; 17 | 18 | parcelable ParceledListSlice; -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/media/musicrecognition/IMusicRecognitionAttributionTagCallback.aidl: -------------------------------------------------------------------------------- 1 | package android.media.musicrecognition; 2 | 3 | /** 4 | * Interface from {@link MusicRecognitionService} to system to pass attribution tag. 5 | */ 6 | oneway interface IMusicRecognitionAttributionTagCallback { 7 | void onAttributionTag(in String attributionTag); 8 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/media/musicrecognition/IMusicRecognitionManagerCallback.aidl: -------------------------------------------------------------------------------- 1 | package android.media.musicrecognition; 2 | 3 | import android.os.Bundle; 4 | import android.media.MediaMetadata; 5 | 6 | /** 7 | * Callback used by system server to notify invoker of {@link MusicRecognitionManager} of the result 8 | */ 9 | oneway interface IMusicRecognitionManagerCallback { 10 | void onRecognitionSucceeded(in MediaMetadata result, in Bundle extras); 11 | void onRecognitionFailed(int failureCode); 12 | void onAudioStreamClosed(); 13 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/media/musicrecognition/IMusicRecognitionService.aidl: -------------------------------------------------------------------------------- 1 | package android.media.musicrecognition; 2 | 3 | import android.media.AudioFormat; 4 | import android.os.ParcelFileDescriptor; 5 | import android.os.IBinder; 6 | import android.media.musicrecognition.IMusicRecognitionServiceCallback; 7 | import android.media.musicrecognition.IMusicRecognitionAttributionTagCallback; 8 | 9 | /** 10 | * Interface from the system to a {@link MusicRecognitionService}. 11 | */ 12 | oneway interface IMusicRecognitionService { 13 | void onAudioStreamStarted( 14 | in ParcelFileDescriptor fd, 15 | in AudioFormat audioFormat, 16 | in IMusicRecognitionServiceCallback callback); 17 | 18 | void getAttributionTag(in IMusicRecognitionAttributionTagCallback callback); 19 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/media/musicrecognition/IMusicRecognitionServiceCallback.aidl: -------------------------------------------------------------------------------- 1 | package android.media.musicrecognition; 2 | 3 | import android.os.Bundle; 4 | import android.media.MediaMetadata; 5 | 6 | /** 7 | * Interface from a {@MusicRecognitionService} to the system. 8 | */ 9 | oneway interface IMusicRecognitionServiceCallback { 10 | void onRecognitionSucceeded(in MediaMetadata result, in Bundle extras); 11 | 12 | void onRecognitionFailed(int failureCode); 13 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/android/view/IWindowManager.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | ** Copyright 2006, The Android Open Source Project 3 | ** 4 | ** Licensed under the Apache License, Version 2.0 (the "License"); 5 | ** you may not use this file except in compliance with the License. 6 | ** You may obtain a copy of the License at 7 | ** 8 | ** http://www.apache.org/licenses/LICENSE-2.0 9 | ** 10 | ** Unless required by applicable law or agreed to in writing, software 11 | ** distributed under the License is distributed on an "AS IS" BASIS, 12 | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | ** See the License for the specific language governing permissions and 14 | ** limitations under the License. 15 | */ 16 | 17 | package android.view; 18 | 19 | import com.android.internal.policy.IKeyguardDismissCallback; 20 | 21 | interface IWindowManager { 22 | 23 | void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message); 24 | 25 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/com/android/internal/policy/IKeyguardDismissCallback.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.android.internal.policy; 18 | 19 | oneway interface IKeyguardDismissCallback { 20 | void onDismissError(); 21 | void onDismissSucceeded(); 22 | void onDismissCancelled(); 23 | } -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/com/android/internal/widget/ILockSettings.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.android.internal.widget; 18 | 19 | interface ILockSettings { 20 | void setBoolean(in String key, in boolean value, in int userId) = 1; 21 | void setString(in String key, in String value, in int userId) = 3; 22 | } 23 | -------------------------------------------------------------------------------- /systemstubs/src/main/aidl/com/kieronquinn/app/ambientmusicmod/utils/parcel/WindowListSparseArray.aidl: -------------------------------------------------------------------------------- 1 | package com.kieronquinn.app.ambientmusicmod.utils.parcel; 2 | 3 | parcelable WindowListSparseArray; 4 | 5 | --------------------------------------------------------------------------------