Compare commits

...

346 commits
v5.8.5 ... dev

Author SHA1 Message Date
Muntashir Al-Islam
32e0a24358 Prepare for v6.1.0
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-04-04 13:52:05 +06:00
Muntashir Al-Islam
bfa08fc032 Merge remote-tracking branch 'main/dev' into dev
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-04-03 22:20:23 +06:00
Daksh P. Jain
eb4876a6d6
Merge pull request #1476 from RetroMusicPlayer/dev-alpha
Bump versionCode
2023-04-02 13:37:06 +05:30
Prathamesh More
feb89bb51a Bump versionCode 2023-04-02 10:10:27 +05:30
Prathamesh More
3d766d70f3
Merge pull request #1475 from Tilizar/support-room-upsert
Support room @Upsert
2023-04-02 10:04:53 +05:30
Prathamesh More
b0ee223b9e
Merge pull request #1474 from Tilizar/fix-fdroid-variant-compilation
Add required parameter for seek method in CastPlayer
2023-04-02 09:58:49 +05:30
Andrei M
e27b7b07fe Add Upsert to HistoryDao 2023-04-01 23:36:25 +03:00
Andrei M
025e908c22 Add Upsert to PlayCountDao 2023-04-01 23:36:24 +03:00
Andrei M
2ea920019c Add required parameter for seek method in CastPlayer 2023-04-01 22:27:04 +03:00
Daksh P. Jain
8024700b7d
Merge pull request #1471 from RetroMusicPlayer/dev-alpha
Android 13 API changes
2023-03-29 22:03:01 +05:30
Prathamesh More
d0b0a03bd9 Update version and changelog 2023-03-29 21:50:44 +05:30
Prathamesh More
803c74c513 Merge branch 'dev' into dev-alpha 2023-03-29 21:27:37 +05:30
Prathamesh More
731f8d56e5 Update dependencies 2023-03-29 21:26:14 +05:30
Daksh P. Jain
6cd52f7c51
New Crowdin updates (#1388)
* New translations strings.xml (Japanese)

* New translations strings.xml (Greek)

* New translations strings.xml (Greek)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Latvian)

* New translations strings.xml (Latvian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Kurmanji (Kurdish))

* New translations strings.xml (Kurmanji (Kurdish))

* New translations strings.xml (Kurmanji (Kurdish))

* New translations strings.xml (French)

* New translations strings.xml (Turkish)

* New translations strings.xml (Tamil)

* New translations strings.xml (Tamil)

* New translations strings.xml (Japanese)

* New translations strings.xml (Tamil)

* New translations strings.xml (Tamil)

* New translations strings.xml (Tamil)

* New translations strings.xml (Thai)

* New translations strings.xml (Arabic)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Romanian)

* New translations strings.xml (Russian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Russian)

* New translations strings.xml (Russian)

* New translations strings.xml (Korean)

* New translations strings.xml (Hindi)

* New translations strings.xml (German)

* New translations strings.xml (Spanish)

* New translations strings.xml (Japanese)

* New translations strings.xml (Japanese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Arabic)

* New translations strings.xml (Arabic)

* New translations strings.xml (Persian)

* New translations strings.xml (Persian)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Spanish)

* New translations strings.xml (Spanish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Arabic)

* New translations strings.xml (Arabic)

* New translations strings.xml (Dutch)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Persian)

* New translations strings.xml (Persian)

* New translations strings.xml (Tamil)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Dutch)

* New translations strings.xml (Dutch)

* Update strings.xml

* Update strings.xml

* Update strings.xml

* New translations strings.xml (Tamil)

* New translations strings.xml (Tamil)

* fix: Fix build errors

* New translations strings.xml (Spanish, Latin America)

* Update strings.xml

---------

Co-authored-by: Prathamesh More <prathameshmm02@gmail.com>
2023-03-27 10:13:25 +05:30
Prathamesh More
f6002b0c6c Code cleanup 2023-03-20 17:12:23 +05:30
Prathamesh More
80b0ecb490 Optimized imports 2023-03-20 16:13:41 +05:30
Prathamesh More
4a0c83b0a2 fix: Adjust the cross-fade duration according to the Global animator speed 2023-03-20 00:34:57 +05:30
Prathamesh More
bf165c7eff fix: Fix cross-fade not working when the app was cleared from background 2023-03-20 00:33:55 +05:30
Prathamesh More
36f15ffe9e Bump version and update changelog 2023-03-18 20:36:38 +05:30
Prathamesh More
4e78813c28 Update MDC 2023-03-18 17:58:28 +05:30
Prathamesh More
dbaf396f81 fix: Remove Album art on lock screen setting on A13+ devices 2023-03-18 15:56:18 +05:30
Prathamesh More
e483038b6c feat: Add A13 per-app language preference compatibility with the existing language chooser 2023-03-18 15:50:50 +05:30
Prathamesh More
4e557fffae feat: Add A13 granular permissions 2023-03-18 15:08:07 +05:30
Prathamesh More
25fcb84ea8 fix: Fix corrupting of files when writing tags to unsupported files 2023-03-18 14:28:53 +05:30
Prathamesh More
256dbc55b2
Merge pull request #1462 from milindgoel15/dev
fix monochrome icon on some devices
2023-03-16 12:55:19 +05:30
Prathamesh More
3d7e89e270 fix: Fix incorrect color of Top App Bar in Home tab in Landscape mode 2023-03-15 19:27:55 +05:30
Milind Goel
21b142d341 fix monochrome icon on some devices 2023-03-15 18:31:20 +05:30
Prathamesh More
8772bcb0b7 fix: Use ShapeableImageView and added top margin to artist name in song item 2023-03-15 12:10:51 +05:30
Prathamesh More
ab16d7e105 fix: Fix playlist reordering crash 2023-03-15 12:09:53 +05:30
Muntashir Al-Islam
2c9547c621 Cleanup unnecessary files
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-03-15 12:37:12 +06:00
Muntashir Al-Islam
46ad05a832 Merge RetroMusicPlayer/dev into dev
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-03-15 11:42:02 +06:00
Muntashir Al-Islam
e1b127d282 Fix build failure
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-03-15 00:50:27 +06:00
Muntashir Al-Islam
8dcb690a9c Update gradle-wrapper
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-03-15 00:28:19 +06:00
Muntashir Al-Islam
2845945763 Reinstate package name
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-03-15 00:26:47 +06:00
Prathamesh More
3e93dcfc4d feat: Add a function to check for Android 13 2023-03-14 18:50:18 +05:30
Prathamesh More
71b2f8bc32 fix: Fix activity recreate logic when downloading split language apk 2023-03-14 18:48:22 +05:30
Muntashir Al-Islam
9971c25649 Update gradle dependencies
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2023-03-14 14:32:23 +06:00
Prathamesh More
6ec2e6ee9a Code Cleanup 2023-03-14 13:36:07 +05:30
Prathamesh More
ccf3b7f6a5 fix: Remove Blurred album art on lockscreen feature for Android 11 and above
Hide Blur album art preference on Android 11+ devices as the lockscreen album art feature was removed by Google. And even if the feature is present in some Custom ROMs there is also an option to set blur so this preference is unnecessary on Android 11 and above.
2023-03-14 13:34:42 +05:30
Prathamesh More
931e59319a fix: Fix Home tab title 2023-03-14 13:34:17 +05:30
Prathamesh More
23da382b22 refactor: Migrate to Photo picker to select images 2023-03-14 12:48:10 +05:30
Prathamesh More
dd628ed6f1 Update targetSdk to 33 2023-03-14 12:48:10 +05:30
Daksh P. Jain
74b317e159
Merge pull request #1456 from RetroMusicPlayer/dev-alpha
Release 6.0.4
2023-03-13 18:52:02 +05:30
Prathamesh More
ea8d455c05 fix: Fix indentation 2023-03-13 18:34:49 +05:30
Prathamesh More
885d6900a2 Release stable 2023-03-13 10:27:12 +05:30
Prathamesh More
836cdf28a9 Add looking for contributors message 2023-03-13 10:24:24 +05:30
Prathamesh More
9fc5893f42 Bump version code 2023-03-11 12:40:34 +05:30
Prathamesh More
0d205b310e fix: Fix toolbar color in Share story activity 2023-03-11 12:40:19 +05:30
Prathamesh More
979c26ff40 Update dependencies 2023-03-10 16:04:28 +05:30
Daksh P. Jain
da8ff7bc64
Update README.md 2023-03-10 15:30:17 +05:30
Prathamesh More
a2389ca61e fix: Fix back button in settings 2023-03-10 11:44:19 +05:30
Prathamesh More
3ae38cb1de fix: Fix status bar background in Home tab when Collapsing App Bar mode is enabled 2023-03-10 11:12:37 +05:30
Prathamesh More
ea5072945e fix: Fix wrong version in change log 2023-03-10 11:09:48 +05:30
Prathamesh More
2fbe025bf9 Revert "fix: PermissionActivity extends AbsBaseActivity now instead of AbsMusicServiceActivity"
This reverts commit 35c54829a8.
2023-03-10 11:07:13 +05:30
Prathamesh More
ec6220a97d Bump version and update change-log 2023-03-09 18:03:14 +05:30
Prathamesh More
35c54829a8 fix: PermissionActivity extends AbsBaseActivity now instead of AbsMusicServiceActivity 2023-03-09 17:53:40 +05:30
Prathamesh More
fb1d6990c1 fix: Fix for ForegroundServiceDidNotStartInTimeException 2023-03-09 16:47:36 +05:30
Prathamesh More
3c84274e2d fix: Fixed a typo in MusicService 2023-03-09 16:03:00 +05:30
Prathamesh More
ba59bf8216 fix: Remove unnecessary FrameLayouts in some fragments 2023-03-09 12:45:39 +05:30
Prathamesh More
bb99213848 feat: App bar mode is also reflected in Home tab and Settings now (Compact / Expanded) 2023-03-09 12:08:26 +05:30
Prathamesh More
210d9afa1a fix: Fix Breadcrumbs disappearing when resuming the folders tab 2023-03-09 10:46:11 +05:30
Prathamesh More
125681b938 fix: Fix Playlist image loading 2023-03-08 18:41:22 +05:30
Prathamesh More
b9f3e7979b feat: Minor redesign in Playlist details page 2023-03-08 17:29:25 +05:30
Prathamesh More
c6dd54d200 fix: Implement onBackPressedDispatcher in AbsSlidingMusicPanelActivity 2023-03-06 22:47:45 +05:30
Prathamesh More
9f334c09b2 fix: Fixed some deprecations 2023-03-06 21:58:18 +05:30
Prathamesh More
71f112673b fix: Added startForegroundService calls inside handler.post to avoid android.app.RemoteServiceException
Fixes Context.startForegroundService() did not then call Service.startForeground() (probably)
2023-03-06 21:43:10 +05:30
Prathamesh More
de92e1d9a7 fix: Fix an issue where app would crash when song is changed after seeking when cross-fading 2023-03-06 21:40:26 +05:30
Prathamesh More
c441674943 Update Gradle wrapper and other dependencies 2023-03-06 21:38:41 +05:30
Prathamesh More
57b14460dc fix: Fix dependency updates plugin implementation 2023-03-06 21:08:14 +05:30
Prathamesh More
ae60624744 Remove kapt 2023-03-06 18:52:53 +05:30
Prathamesh More
054c09d999 Migrate to ksp and fixed some deprecations 2023-03-06 18:52:50 +05:30
Prathamesh More
4236a134ad Update dependencies & compileSdkVersion 2023-03-06 18:50:36 +05:30
Prathamesh More
d6a21ee42b
Merge pull request #1442 from michaellee123/dev
Fixed something about notification and lockscreen.
2023-03-06 18:49:17 +05:30
Prathamesh More
533c5c1489 Revert some changes in LockScreenActivity and MusicService 2023-03-06 18:39:11 +05:30
Prathamesh More
e7c97e07a5
Merge pull request #1448 from dmyTRUEk/fix/file-popup-in-folders-tab
Fix file popup onClick in Folders tab
2023-01-31 23:48:14 +05:30
dmyTRUEk
8926a79cca Fix file popup onClick in Folders tab 2023-01-22 21:01:43 +02:00
michaellee123
94bc86b5d4 1. Fixed album art image is not clear enough and always shows the previous song's cover;
2. Change Setting -> Personalize -> LOCKSCREEN (Show album cover, Blur album cover, Fullscreen controls) only about lockscreen, without change notification style anymore;
3. Lockscreen adapt landscape mode;
4. Move lockscreen image to the top, keep looks like player's style;
5. Change some defStyleAttr default value frome -1 to 0, to make Android Studio to preview;
6. Fitting more pages can display circular buttons.
2022-12-27 21:52:10 +08:00
michaellee123
4ce212a6e6 Fixed album art image is not clear enough and always shows the previous song's cover in Android 13 (test device: Sony Xperia 1 IV) 2022-12-26 15:34:55 +08:00
biaji
78faa0ea14
Fix click on miniPlayerFragment not function 2022-11-11 20:20:32 +06:00
Daksh P. Jain
e6267ef6a2
Update README.md 2022-11-10 11:03:26 +05:30
Daksh P. Jain
9d88c871d9
Merge pull request #1416 from RetroMusicPlayer/dev-alpha
Fix #1415
2022-09-03 10:43:03 +05:30
Prathamesh More
644640c14f Fixed Last track of queue playing again when gapless playback is on 2022-08-31 23:51:13 +05:30
Prathamesh More
9dc8d55897 Updated dependencies and removed ksp for now as Glide doesn't support it yet 2022-08-31 23:51:12 +05:30
rustzz
388674b05e
Update RU strings.xml (#89)
words go to another line
2022-08-27 00:00:10 +06:00
Daksh P. Jain
b70cd181d6
Merge pull request #1411 from RetroMusicPlayer/dev-alpha
Dev alpha
2022-08-14 19:09:46 +05:30
Prathamesh More
676c0a444c Fix build error 2022-08-14 14:13:48 +05:30
Prathamesh More
06e0bdf333 Updated dependencies 2022-08-14 13:42:40 +05:30
Prathamesh More
c3a189d64f Update dependencies 2022-08-06 11:23:40 +05:30
Prathamesh More
6c0f1941af Merge remote-tracking branch 'origin/dev' into dev-alpha
# Conflicts:
#	app/build.gradle
#	app/src/main/assets/contributors.json
#	build.gradle
2022-08-06 11:21:08 +05:30
Daksh P. Jain
0d976516a7
Merge pull request #1410 from milindgoel15/dev
update link
2022-08-05 16:52:59 +05:30
Milind Goel
9ad119d3fb update link 2022-08-05 15:56:13 +05:30
Prathamesh More
2068025cdd
Merge pull request #1404 from Goooler/modernize
Speedup a bit
2022-07-29 10:00:48 +05:30
Prathamesh More
50f2719832 Update dependencies 2022-07-28 21:41:25 +05:30
Goooler
41497b5f91 Migrate to nonTransitiveRClass 2022-07-25 12:41:39 +08:00
Goooler
bdd4039785 Split lint & assemble tasks on CI 2022-07-24 10:22:02 +08:00
Goooler
bd8278343f Use room's ksp 2022-07-24 10:21:34 +08:00
Goooler
bc83f0a497 Enable configuration cache & gradle enterprise 2022-07-24 10:21:34 +08:00
Goooler
2423822615 Enable Kotlin's new incremental build flag 2022-07-24 09:53:47 +08:00
Goooler
0622858d3a Cleanup gradle.properties 2022-07-24 09:49:59 +08:00
Prathamesh More
14d331c91a
Merge pull request #1402 from Goooler/modernize
Modernize a bit
2022-07-23 17:32:40 +05:30
Goooler
8682b1c09f Use debug signingConfig if retro.properties doesn't exist 2022-07-22 15:35:59 +08:00
Goooler
a85b546e1f Use namespace dsl 2022-07-22 15:08:02 +08:00
Goooler
b8ba0cc8e8 Remove duplicate .gitignore 2022-07-22 14:57:34 +08:00
Goooler
efb047775f Optimize CI a bit 2022-07-22 14:56:43 +08:00
Goooler
781b9ec61f Update dependencies 2022-07-22 14:53:49 +08:00
Goooler
52085af6d1 Configure dependencyUpdates to detect stable versions only 2022-07-22 14:50:54 +08:00
Goooler
49a6742eb7 Bump Kotlin to 1.7.10 2022-07-22 14:50:21 +08:00
Goooler
58c98afb48 Bump Gradle to 7.5 2022-07-22 14:44:19 +08:00
Goooler
1f54da6d55 Add .gitattributes 2022-07-22 14:41:30 +08:00
Daksh P. Jain
63e48d7ec3
Merge pull request #1401 from Kareem-dev/Kareem-dev-patch-1
Fixed a typo
2022-07-20 12:54:49 +05:30
Prathamesh More
80df8aa037 Fixed blank playlist icon in light theme with grid size 1 2022-07-17 21:50:46 +05:30
Prathamesh More
9eebaf1a1f Update dependencies 2022-07-17 14:07:50 +05:30
Kareem Osama
c907ec2508
Fixed a typo 2022-07-16 20:33:42 +02:00
Prathamesh More
7a409b795f Fix a Lockscreen crash 2022-07-16 11:28:51 +05:30
Prathamesh More
383908ec7f Update Kotlin 2022-07-08 17:47:44 +05:30
Prathamesh More
7c0547b085 Fixed lyrics editing dialog 2022-07-07 18:55:07 +05:30
Prathamesh More
f30578d5fc Bump version 2022-07-06 18:34:15 +05:30
Prathamesh More
1de4bbcdec Fix next previous drawable size 2022-07-06 18:10:43 +05:30
Prathamesh More
31df20ffe5 Partially fix Lockscreen controls 2022-07-06 17:53:41 +05:30
Prathamesh More
f5063de70f Using Android's Action Mode instead of Material Cab 2022-07-06 17:53:41 +05:30
Prathamesh More
b1992e8d54 Migrated almost all icons to Material symbols 2022-07-06 17:53:41 +05:30
Prathamesh More
f7e3b65274 Added donation links 2022-07-04 22:43:24 +05:30
Prathamesh More
cbd000259a Fixed blank album crash 2022-07-04 12:12:51 +05:30
Prathamesh More
cff50fda3b Update dependencies 2022-07-04 11:33:13 +05:30
Daksh P. Jain
6e68da67e2
Merge pull request #1392 from RetroMusicPlayer/prathameshmm02-patch-1
Update README.md
2022-06-28 14:47:22 +05:30
Prathamesh More
2e5dddafde
Update README.md
App has internet permission (for artist images and last.fm scrobbling) so "offline" feels a bit contradicting.
2022-06-28 11:27:24 +05:30
Prathamesh More
3493ad40ab Removed Sending bug report with GitHub account as it doesn't work anymore 2022-06-25 17:45:09 +05:30
Prathamesh More
c881bbfa98 Black background color for widgets on pre-A12 devices 2022-06-24 11:37:02 +05:30
Prathamesh More
778025e989 Disable artist image downloading on fdroid flavor by default 2022-06-24 11:34:04 +05:30
Prathamesh More
01c5c10def Converted contributor image urls to assets 2022-06-24 11:14:22 +05:30
Prathamesh More
7b15930093 Update changelog 2022-06-23 14:08:25 +05:30
Prathamesh More
31caedd7ed Optimized imports 2022-06-23 14:08:25 +05:30
Prathamesh More
96ef1416f8 Fix visibility of lyrics views in LyricsFragment 2022-06-23 14:08:25 +05:30
Daksh P. Jain
70e28e3e0f
Merge pull request #1387 from prathameshmm02/dev
Fixed language codes for language switcher
2022-06-22 12:34:08 +05:30
Prathamesh More
9933fcf5fd Update Coroutines version 2022-06-22 12:29:54 +05:30
Prathamesh More
9a589d5b46 Fixed language codes and language switcher not working on f-droid flavor 2022-06-22 12:28:22 +05:30
Daksh P. Jain
10367f64de
Merge pull request #1385 from prathameshmm02/dev
Playback speed and pitch fix
2022-06-22 11:53:47 +05:30
Daksh P. Jain
6aae0f2d5e
Merge pull request #1375 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2022-06-22 11:53:28 +05:30
Prathamesh More
26d7012e46
Merge branch 'dev' into l10n_dev 2022-06-21 23:26:47 +05:30
Prathamesh More
f9bfa48f00 Suppress MissingTranslation errors 2022-06-21 23:13:54 +05:30
Daksh P. Jain
717b8f380b
Update strings.xml 2022-06-21 19:58:50 +05:30
Daksh P. Jain
40888c3073
Update strings.xml 2022-06-21 19:15:19 +05:30
Daksh P. Jain
5edcd9b49b New translations strings.xml (Persian) 2022-06-21 19:13:35 +05:30
Daksh P. Jain
48058e9416 New translations strings.xml (French) 2022-06-21 18:03:35 +05:30
Prathamesh More
e1221c4924 Added API version check when setting playback params 2022-06-21 18:03:25 +05:30
Daksh P. Jain
597c787834
Update strings.xml 2022-06-21 17:12:05 +05:30
Prathamesh More
059c0324c1 Removed date versionNameSuffix 2022-06-21 15:14:12 +05:30
Prathamesh More
20ab3dad0d Added ability to share multiple songs 2022-06-21 15:14:12 +05:30
Prathamesh More
ad4467af93 Revert back to old logic for "Bluetooth playback" 2022-06-21 15:14:12 +05:30
Prathamesh More
111546bc4c Fixed playback speed and pitch issues 2022-06-21 15:14:12 +05:30
Daksh P. Jain
e8f931f213
Merge pull request #1384 from prathameshmm02/dev
Update gradle wrapper jar to 7.3.3
2022-06-21 11:31:42 +05:30
Daksh P. Jain
117a730583 New translations strings.xml (Kannada) 2022-06-20 22:43:40 +05:30
Daksh P. Jain
509e41bf76 New translations strings.xml (Turkish) 2022-06-20 22:43:39 +05:30
Daksh P. Jain
aa78da75dd New translations strings.xml (Russian) 2022-06-20 22:43:38 +05:30
Daksh P. Jain
70438ee0ed New translations strings.xml (Chinese Simplified) 2022-06-20 22:43:37 +05:30
Daksh P. Jain
80028c6207 New translations strings.xml (Spanish, Latin America) 2022-06-20 22:43:36 +05:30
Daksh P. Jain
ee6aff3824 New translations strings.xml (Latvian) 2022-06-20 22:43:35 +05:30
Daksh P. Jain
d4727072af New translations strings.xml (Chinese Traditional) 2022-06-20 22:43:34 +05:30
Daksh P. Jain
dce1acbb80 New translations strings.xml (Serbian (Cyrillic)) 2022-06-20 22:43:33 +05:30
Daksh P. Jain
ea1d3b5848 New translations strings.xml (Swedish) 2022-06-20 22:43:32 +05:30
Daksh P. Jain
04063a9916 New translations strings.xml (Ukrainian) 2022-06-20 22:43:30 +05:30
Daksh P. Jain
c72f469ab3 New translations strings.xml (Vietnamese) 2022-06-20 22:43:29 +05:30
Daksh P. Jain
08c46605f1 New translations strings.xml (Indonesian) 2022-06-20 22:43:28 +05:30
Daksh P. Jain
3bc06025d9 New translations strings.xml (Persian) 2022-06-20 22:43:27 +05:30
Daksh P. Jain
db85bde641 New translations strings.xml (Kurmanji (Kurdish)) 2022-06-20 22:43:26 +05:30
Daksh P. Jain
459ddf29ba New translations strings.xml (Malayalam) 2022-06-20 22:43:25 +05:30
Daksh P. Jain
cb5761e116 New translations strings.xml (Filipino) 2022-06-20 22:43:24 +05:30
Daksh P. Jain
031b2014f5 New translations strings.xml (Burmese) 2022-06-20 22:43:23 +05:30
Daksh P. Jain
5917dffd65 New translations strings.xml (Portuguese, Brazilian) 2022-06-20 22:43:22 +05:30
Daksh P. Jain
dec0b2d265 New translations strings.xml (Hindi) 2022-06-20 22:43:20 +05:30
Daksh P. Jain
edc7e7a8f5 New translations strings.xml (Tamil) 2022-06-20 22:43:19 +05:30
Daksh P. Jain
bf799edb76 New translations strings.xml (Croatian) 2022-06-20 22:43:16 +05:30
Daksh P. Jain
2914a30cf0 New translations strings.xml (Thai) 2022-06-20 22:43:15 +05:30
Daksh P. Jain
307bddcae7 New translations strings.xml (Greek) 2022-06-20 22:43:14 +05:30
Daksh P. Jain
1467776c6c New translations strings.xml (German) 2022-06-20 22:43:13 +05:30
Daksh P. Jain
9489d93943 New translations strings.xml (Romanian) 2022-06-20 22:43:12 +05:30
Daksh P. Jain
71ca960987 New translations strings.xml (French) 2022-06-20 22:43:11 +05:30
Daksh P. Jain
a98d6c516a New translations strings.xml (Hungarian) 2022-06-20 22:43:10 +05:30
Daksh P. Jain
31c4dab36a New translations strings.xml (Polish) 2022-06-20 22:43:09 +05:30
Daksh P. Jain
2a846edca4 New translations strings.xml (Portuguese) 2022-06-20 22:43:08 +05:30
Daksh P. Jain
c5411c1c93 New translations strings.xml (Dutch) 2022-06-20 22:43:07 +05:30
Daksh P. Jain
1e560590a2 New translations strings.xml (Korean) 2022-06-20 22:43:06 +05:30
Daksh P. Jain
89107af3c3 New translations strings.xml (Spanish) 2022-06-20 22:43:05 +05:30
Daksh P. Jain
e120550513 New translations strings.xml (Arabic) 2022-06-20 22:43:03 +05:30
Daksh P. Jain
6bd671126b New translations strings.xml (Czech) 2022-06-20 22:43:02 +05:30
Daksh P. Jain
dea78a0ce8 New translations strings.xml (Italian) 2022-06-20 22:43:01 +05:30
Daksh P. Jain
68a277076f New translations strings.xml (Japanese) 2022-06-20 22:43:00 +05:30
Daksh P. Jain
b01f30900a Update source file strings.xml 2022-06-20 22:42:56 +05:30
Prathamesh More
2edb3184b2 Update gradle wrapper jar to 7.3.3 2022-06-20 21:23:59 +05:30
Daksh P. Jain
faf065ea73
Merge pull request #1383 from prathameshmm02/dev
Bug fixes
2022-06-20 20:52:42 +05:30
Prathamesh More
dba4edd8ef Fixed a rare crash because of notifyDataSetChanged in Now playing ViewPager 2022-06-20 20:08:07 +05:30
Prathamesh More
88b0299ef9 Update changelog 2022-06-20 19:46:35 +05:30
Prathamesh More
c3309175a6 Colored lyrics text for Full and Gradient themes 2022-06-20 17:40:20 +05:30
Prathamesh More
0c6917c775 Moved player toolbar for Blur Card theme to bottom 2022-06-20 15:37:57 +05:30
Prathamesh More
62372ec205 Common screen for Normal and Synced the later is preferred 2022-06-20 14:43:06 +05:30
Prathamesh More
dd59459786 Use Coroutines in LrcView 2022-06-20 14:42:59 +05:30
Prathamesh More
0f66d005c7 Fixed music playing automatically after setting playback speed and pitch 2022-06-20 14:33:06 +05:30
Prathamesh More
5ac1b2bcc6 Release 6.0.2 2022-06-20 14:33:05 +05:30
Prathamesh More
b0f866c889 Changed lyrics icon 2022-06-20 14:33:05 +05:30
Prathamesh More
e626803e9f Initial fastlane structure 2022-06-20 14:33:05 +05:30
Prathamesh More
91b7eeeb45 Fixed a lyrics crash 2022-06-20 14:33:05 +05:30
Prathamesh More
7a82883f57 Fixed queue reset when a song is clicked in Playing queue fragment 2022-06-20 14:33:05 +05:30
Prathamesh More
2f818ce65f Tint NavigationRailView 2022-06-20 14:33:05 +05:30
Prathamesh More
17eb5bff05 Update dependencies 2022-06-20 14:33:05 +05:30
Prathamesh More
d2ce889962 Initialize BillingManager 2022-06-20 14:33:05 +05:30
Prathamesh More
525c5f8aa4 Fixed Language download 2022-06-20 14:33:05 +05:30
Prathamesh More
0c8ed326bf [ChromeCast] Use default notification when casting 2022-06-20 14:33:05 +05:30
Prathamesh More
a1e4916ae3 Moved ChromeCast entries of normal flavor manifest 2022-06-20 14:33:05 +05:30
Prathamesh More
2a5e6d7756 Added F-Droid FOSS flavor 2022-06-20 14:33:05 +05:30
Daksh P. Jain
a12d8dd8a6 New translations strings.xml (Spanish, Latin America) 2022-06-17 07:35:09 +05:30
Daksh P. Jain
48efc1fa48 New translations strings.xml (Portuguese) 2022-06-15 20:40:24 +05:30
Daksh P. Jain
7abd2d56f6 New translations strings.xml (Polish) 2022-06-15 14:33:48 +05:30
Daksh P. Jain
00c6a72671 New translations strings.xml (German) 2022-06-14 19:25:25 +05:30
Daksh P. Jain
bc39d3a462
Merge pull request #1378 from prathameshmm02/dev
Bug fixes
2022-06-14 14:24:09 +05:30
Daksh P. Jain
d8317b2979 New translations strings.xml (Japanese) 2022-06-13 21:58:53 +05:30
Daksh P. Jain
cac91eb0fe New translations strings.xml (Spanish) 2022-06-13 21:58:51 +05:30
Prathamesh More
3dc26974b4 Update change-log 2022-06-13 17:28:23 +05:30
Prathamesh More
df382cb539 Fixed CrossFade not working when Fade Audio is enabled 2022-06-13 17:28:22 +05:30
Daksh P. Jain
cc862669b2 New translations strings.xml (Spanish) 2022-06-13 16:01:46 +05:30
Daksh P. Jain
b45e61f756 New translations strings.xml (Spanish) 2022-06-13 09:45:29 +05:30
Prathamesh More
8e3a7a097a Decreased progress update interval for playing states 2022-06-12 21:15:35 +05:30
Prathamesh More
6f12a7b24a Fix Slider crashes 2022-06-12 20:56:58 +05:30
Prathamesh More
8f56663059 Code Cleanup 2022-06-12 20:16:52 +05:30
Prathamesh More
e4a6906231 Revert "Use MediaButtonReceiver from androidx.media to handle headset button actions"
This reverts commit ad51d09672.
2022-06-12 20:15:43 +05:30
Prathamesh More
192b5c2ac7 Enabled WRITE_EXTERNAL_STORAGE for A10 to avoid crashes 2022-06-11 19:02:00 +05:30
Prathamesh More
3aea91eb1e Safely show toasts in MusicService 2022-06-11 17:28:17 +05:30
Prathamesh More
cf4c773a67 [MiniPlayer] Code Cleanup 2022-06-11 17:19:24 +05:30
Prathamesh More
3ab5e1ddc3 Added Scrollbar to Playlist details fragments 2022-06-11 10:43:47 +05:30
Prathamesh More
aedabb8b74 Update Changelog 2022-06-11 00:46:03 +05:30
Prathamesh More
ed6ca486d6 Fixed ChromeCast crashes 2022-06-10 23:48:59 +05:30
Daksh P. Jain
aad2f2e6db New translations strings.xml (Chinese Simplified) 2022-06-10 20:43:57 +05:30
Prathamesh More
9966ddad9d Update dependencies 2022-06-10 19:55:05 +05:30
Daksh P. Jain
3ee49bbaa2 New translations strings.xml (Chinese Traditional) 2022-06-10 05:20:37 +05:30
Daksh P. Jain
eb7729e09a New translations strings.xml (Spanish) 2022-06-09 23:21:45 +05:30
Daksh P. Jain
fe189ba4d4 New translations strings.xml (Turkish) 2022-06-09 23:21:44 +05:30
Daksh P. Jain
c5e5643164
Merge pull request #1376 from prathameshmm02/dev
Bug fixes
2022-06-09 21:46:28 +05:30
Daksh P. Jain
6ec0bcc184 New translations strings.xml (Spanish) 2022-06-09 17:08:14 +05:30
Daksh P. Jain
54e0c66d8b New translations strings.xml (French) 2022-06-09 17:08:13 +05:30
Prathamesh More
bca9fb0b5a Fixed some landscape layouts 2022-06-09 17:07:51 +05:30
Daksh P. Jain
96dc850ee0 New translations strings.xml (Kannada) 2022-06-09 01:56:53 +05:30
Daksh P. Jain
1512dae014 New translations strings.xml (Kurmanji (Kurdish)) 2022-06-09 01:56:52 +05:30
Daksh P. Jain
d591955145 New translations strings.xml (Italian) 2022-06-09 01:56:51 +05:30
Daksh P. Jain
4501def29f New translations strings.xml (Polish) 2022-06-09 01:56:49 +05:30
Daksh P. Jain
044d19d46d New translations strings.xml (Turkish) 2022-06-09 01:56:48 +05:30
Prathamesh More
75a4648e13 Fixed CrossFade duration not changing instantly 2022-06-09 01:06:56 +05:30
Prathamesh More
ceec034a4f Revert "Start audio fade animator on Main thread"
This reverts commit 46f713e688.
2022-06-08 23:20:43 +05:30
Prathamesh More
3660a8bd78 Revert "[Playback] Code Cleanup"
This reverts commit 7efbbc3f11.
2022-06-08 23:17:15 +05:30
Daksh P. Jain
8ed5d8a3dc New translations strings.xml (Kannada) 2022-06-08 19:51:45 +05:30
Daksh P. Jain
6befc92ee5 New translations strings.xml (Indonesian) 2022-06-08 19:51:44 +05:30
Daksh P. Jain
6a912f98f5
New Crowdin updates (#1342) 2022-06-08 19:25:25 +05:30
Daksh P. Jain
477948a495
Merge pull request #1371 from prathameshmm02/dev
V6 beta
2022-06-08 09:15:17 +05:30
Prathamesh More
e17aeecf77 Update changelog 2022-06-07 18:27:18 +05:30
Prathamesh More
8ce316561b Disabled Jetifier 2022-06-07 18:09:48 +05:30
Prathamesh More
b28d5678bc Added MD3 switch 2022-06-06 21:35:58 +05:30
Prathamesh More
33a0d113b8 Fixed Splash screen issues 2022-06-06 20:39:41 +05:30
Prathamesh More
2ef5a5903d Fixed BottomSheet height when Peek now playing theme is selected or was selected before changing to other theme 2022-06-06 17:30:54 +05:30
Prathamesh More
46f713e688 Start audio fade animator on Main thread 2022-06-06 17:27:22 +05:30
Prathamesh More
c25eff4c0d Bump version and update changelog 2022-06-06 16:36:07 +05:30
Prathamesh More
52fa8ebf42 Added default sort order for MediaStore's default sort order 2022-06-06 10:27:39 +05:30
Prathamesh More
ce5a8292e2 Disable wallpaper accent by default 2022-06-06 00:12:37 +05:30
Prathamesh More
7b5e7ecef8 Show remaining time in Sleep timer dialog 2022-06-06 00:08:03 +05:30
Prathamesh More
d2a7588861 Added NavigationRailView for Landscape 2022-06-05 23:48:37 +05:30
Prathamesh More
7efbbc3f11 [Playback] Code Cleanup 2022-06-05 23:19:25 +05:30
Prathamesh More
7186071772 Fixed Splash screen when theme settings are changed 2022-06-05 22:36:22 +05:30
Prathamesh More
ad04c4e2ed Fixed Now playing viewpager lag 2022-06-05 21:59:15 +05:30
Prathamesh More
67d65a1532 Save only visible tabs when save last tab is enabled 2022-06-05 21:59:08 +05:30
Prathamesh More
aee5bfdf50 Fix resume playback from Quick Settings 2022-05-31 16:45:04 +05:30
Prathamesh More
931a0345a4 [CrossFade] Cleanup 2022-05-31 16:41:18 +05:30
Prathamesh More
61895b666c Added fade transition to artist and album detail fragments 2022-05-31 13:57:46 +05:30
Prathamesh More
45a3899a0d Better implementation for insets and bottom padding 2022-05-31 13:08:36 +05:30
Prathamesh More
97e37dd7b9 Fixed permission numbers on pre-A12 devices 2022-05-30 20:30:22 +05:30
Prathamesh More
6b071deb96 Fixed activity not recreating correctly after settings change 2022-05-30 19:57:03 +05:30
Prathamesh More
999cb08aef Fixed Github action workflow error 2022-05-30 19:40:46 +05:30
Prathamesh More
da0a4d5c13 Fixed Now playing viewpager lag 2022-05-30 19:34:43 +05:30
Prathamesh More
1edd4acd9c Fixed headphones auto-play not working 2022-05-30 19:27:45 +05:30
Prathamesh More
88ccd667ab Fix menu not visible in Folders tab 2022-05-30 19:27:45 +05:30
Prathamesh More
5551240519 Update dependencies 2022-05-30 19:27:45 +05:30
Prathamesh More
b2b9bac42d Finally fixed wrong/previous cover art in notification 2022-05-28 22:39:18 +05:30
Prathamesh More
1f7a00e999 Use LocalPlayback class to handle headset disconnection (AudioBecomingNoisy) and focus change, somewhat like in Shuttle and relieve PlaybackHandler of it's duties 2022-05-28 16:26:17 +05:30
Prathamesh More
14f31eae37 Fixed leaks in some fragments 2022-05-28 00:09:49 +05:30
Prathamesh More
be6b48f8e0 Fixed Favorites Home tab crash 2022-05-28 00:00:39 +05:30
Prathamesh More
054b46560c Cleanup Layouts 2022-05-26 23:54:38 +05:30
Prathamesh More
b17013f5bb Fixed MusicSeekSkipTouchListener 2022-05-26 22:08:01 +05:30
Prathamesh More
5d0b5b91b0 Merge branch 'Better_Player' into dev
# Conflicts:
#	app/build.gradle
2022-05-26 20:16:44 +05:30
Prathamesh More
cd8bf4a68d Update AGP 2022-05-26 19:45:39 +05:30
Prathamesh More
558eaf833a Fix Playback 2022-05-26 19:45:31 +05:30
Prathamesh More
d77ce4e0cc Smooth (Maybe) ViewPager skip in now playing 2022-05-26 19:42:40 +05:30
Prathamesh More
b47029cb57 Fixed MusicSeekSkipTouchListener 2022-05-26 19:42:07 +05:30
Daksh P. Jain
85cf3738e7
Merge pull request #1366 from prathameshmm02/dev
Fixed BottomNavigation crashes #1357 #1353
2022-05-26 16:23:01 +05:30
Prathamesh More
097d646635 Fixed BottomNavigation crashes 2022-05-26 15:55:43 +05:30
Prathamesh More
87f1172481 Update MDC 2022-05-26 15:06:50 +05:30
Prathamesh More
f04bf4c3aa Fixed Material Slider crashes 2022-05-26 14:52:31 +05:30
Prathamesh More
cee51eb2cc Add PlagiarismUtil 2022-05-24 19:15:43 +05:30
Prathamesh More
c15bd77b39 Optimized imports 2022-05-24 18:22:06 +05:30
Prathamesh More
ca39b928bb Reverted to SeekBars for Card, Classic, Fit and Flat now playing theme 2022-05-24 18:18:21 +05:30
Prathamesh More
f916a826b5 Fixed UserInfo fragment for Landscape 2022-05-24 12:43:15 +05:30
Prathamesh More
2786d8abed Changed Seekbar with Sliders 2022-05-23 20:18:40 +05:30
Prathamesh More
b9f0adc9c2 Correctly set playback speed and pitch 2022-05-21 02:00:26 +05:30
Prathamesh More
d6c4d5e133 Show sleep timer icon always in the player screen 2022-05-21 00:15:14 +05:30
Prathamesh More
fb7f29bdf4 Also broadcast albumArt uri for queue items 2022-05-20 23:15:54 +05:30
Prathamesh More
b971dbbe4b Fix player not working after quitting from notification 2022-05-20 23:11:31 +05:30
Prathamesh More
bc04472b6f Added LogUtil 2022-05-20 16:59:56 +05:30
Prathamesh More
1b544d62c3 Code Cleanup 2022-05-20 16:46:00 +05:30
Prathamesh More
51f298be8f Fix crashes due to SharedPreferences listener 2022-05-20 16:44:56 +05:30
Prathamesh More
01f7a4874d Fix string formatting issues which lead to crashes 2022-05-20 16:43:42 +05:30
Prathamesh More
d8295cd677 Enabled abortOnError to better identify bugs which can lead to crashes 2022-05-20 16:43:09 +05:30
Prathamesh More
4f1895bc50 Cleanup layouts 2022-05-20 16:25:28 +05:30
Prathamesh More
e9340b429a [Share] Cleanup Sharing of bug report and backup 2022-05-20 15:53:08 +05:30
Prathamesh More
f6a44672be Removed GenericFileProvider 2022-05-20 15:50:19 +05:30
Prathamesh More
7aab762712 Replaced CircularImageView with ShapeableImageView 2022-05-20 14:41:19 +05:30
Prathamesh More
95fd195df8 Update dependencies 2022-05-20 14:32:40 +05:30
Prathamesh More
d0a600e016 Improved app startup time 2022-05-19 23:52:26 +05:30
Prathamesh More
6b83421cab Fixed expanded header for Folders tab 2022-05-18 16:17:18 +05:30
Prathamesh More
cd2dfe1962 Fix restart button not working in crash activity 2022-05-18 16:06:53 +05:30
Prathamesh More
0b54044752 Code Cleanup 2022-05-18 16:00:54 +05:30
Prathamesh More
077089c94c Fixed all Blacklist related crashes 2022-05-18 15:13:40 +05:30
Prathamesh More
d65feb30b4 Fixed crash because of wrong string formatting 2022-05-18 15:10:05 +05:30
Prathamesh More
d877bfbdfb [MusicService] Save songs to history and play count with Coroutines 2022-05-18 11:18:02 +05:30
Prathamesh More
17f104b27a Removed Classic notification style 2022-05-17 19:53:13 +05:30
Prathamesh More
fcc31f90ad Added Room migration for version upgrade 2022-05-17 19:53:13 +05:30
Prathamesh More
ed890c3c30 Added gradle-versions-plugin 2022-05-17 10:54:39 +05:30
Prathamesh More
9ce60c896c Bump version 2022-05-17 10:35:56 +05:30
Prathamesh More
197e7ff085 Fixed Top/Recent Artists/Albums order 2022-05-17 10:28:27 +05:30
Prathamesh More
6779eb0e2b Code Cleanup 2022-05-17 08:07:12 +05:30
Prathamesh More
860fa9d8b4 Fixed swipe anywhere not working immediately after changing in settings 2022-05-17 07:27:45 +05:30
Prathamesh More
0d9364e7c8 Disabled animation when player bottom sheet is expanded 2022-05-17 07:25:53 +05:30
Prathamesh More
d65f8f8a4f [Settings] Mini player in Settings (Converted Settings activity to fragment) 2022-05-17 00:41:32 +05:30
Prathamesh More
aa96993584 Removed Blacklist and Lyrics Room tables 2022-05-16 16:50:26 +05:30
Prathamesh More
08df1b2958 Removed some uses of GlobalScope 2022-05-16 16:50:25 +05:30
Prathamesh More
28d83d9437 Suppress deprecations 2022-05-16 13:37:32 +05:30
Prathamesh More
ebd35bf026 [Settings] Added kurmanji kurdish to the Language chooser list 2022-05-16 13:29:47 +05:30
Prathamesh More
dfcc5b6b92 [MusicService] Removed unused methods and observers
We don't use legacy playlists and also it's deprecated.
2022-05-16 12:53:15 +05:30
Prathamesh More
7e2881b5f0 [MusicService] Code Cleanup 2022-05-16 12:51:06 +05:30
Prathamesh More
32e6daf36d Fix Seekbar in MD3 theme 2022-05-16 12:49:14 +05:30
Prathamesh More
30dd58af93 Fixed a crash when setting playback speed for Crossfade 2022-05-16 10:47:29 +05:30
Prathamesh More
3956d84310 [Cast] Removed ExpandedControlsActivity 2022-05-15 17:37:44 +05:30
Prathamesh More
bd2d5068d7 Bump version 2022-05-14 13:55:58 +05:30
Prathamesh More
0fd8ab0ade Fix Playback speed and pitch for PlaybackManager 2022-05-14 13:43:12 +05:30
Prathamesh More
1033711357 Release PlaybackManager when quitting MusicService 2022-05-14 13:43:11 +05:30
Prathamesh More
165d180fe6 Fixed a crash when casting 2022-05-14 13:43:11 +05:30
Prathamesh More
2791ac49c5 Code Cleanup 2022-05-14 13:43:11 +05:30
Prathamesh More
4b4aadcc5b Better Cast
Now there won't be any need of ugly cast mini player as cast will be able to respond to UI events of app like seek, changing song, pause
2022-05-14 13:43:11 +05:30
Prathamesh More
70e323eb0a Handle playback with PlaybackManager 2022-05-14 13:43:10 +05:30
Prathamesh More
b58d971457 Rename .java to .kt 2022-05-14 13:43:10 +05:30
Prathamesh More
4a2ba10d45 Added PlaybackManager 2022-05-14 13:43:08 +05:30
Prathamesh More
4c59089c29 Fixed crash when only one bottom navigation tab is enabled 2022-05-14 12:37:10 +05:30
758 changed files with 14396 additions and 13437 deletions

4
.gitattributes vendored Normal file
View file

@ -0,0 +1,4 @@
* text=auto eol=lf
*.bat text eol=crlf
*.jar binary

View file

@ -7,28 +7,28 @@ on:
branches: [ dev ] branches: [ dev ]
jobs: jobs:
build: check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 10
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: set up JDK 11 - uses: gradle/wrapper-validation-action@v1
uses: actions/setup-java@v2 - uses: actions/setup-java@v3
with: with:
java-version: '11' distribution: 'zulu'
distribution: 'temurin' java-version: 17
cache: gradle - uses: gradle/gradle-build-action@v2
- name: Lint Android
run: ./gradlew lint
- name: Generate temporary keystore build:
run: keytool -genkey -v -storetype pkcs12 -keystore store.p12 -storepass android -alias android -keyalg RSA -keysize 2048 -validity 10000 -dname CN=CI runs-on: ubuntu-latest
- name: Write retro.properties steps:
run: | - uses: actions/checkout@v3
cat >retro.properties <<EOF - uses: actions/setup-java@v3
storeFile=$PWD/store.p12 with:
keyAlias=android java-version: '17'
storePassword=android distribution: 'zulu'
keyPassword=android - uses: gradle/gradle-build-action@v2
EOF - name: Build
- name: Build with Gradle run: ./gradlew app:assemble
run: ./gradlew build

View file

@ -8,24 +8,21 @@ Material Design music player for Android music lovers
alt="Get it on F-Droid" alt="Get it on F-Droid"
height="80">](https://f-droid.org/en/packages/io.github.muntashirakon.Music/) height="80">](https://f-droid.org/en/packages/io.github.muntashirakon.Music/)
[<img src="https://camo.githubusercontent.com/70bffd8873ab81e1bb0bccc44e488c3a989e3bd5/68747470733a2f2f692e6962622e636f2f71306d6463345a2f6765742d69742d6f6e2d6769746875622e706e67"
alt="Get it on GitHub"
height="80">](https://github.com/MuntashirAkon/Metro/releases)
## Differences between Metro and [RetroMusicPlayer](https://github.com/h4h13/RetroMusicPlayer) ## Differences between Metro and [RetroMusicPlayer](https://github.com/h4h13/RetroMusicPlayer)
- Google Play libraries removed (fully libre) - Google Play libraries removed (fully libre)
- Pro features available for free - Pro features available for free
- Fully offline (INTERNET permission removed)
- Bug fixes - Bug fixes
- Minor differences in UI - Minor differences in UI
## 📱 Screenshots ## 📱 Screenshots
### App Themes ### App Themes
| <img src="screenshots/home_light.jpg" width="200"/> | <img src="screenshots/home_dark.jpg" width="200"/> | <img src="screenshots/home_black.jpg" width="200"/> | | <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg" width="200"/> | <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg" width="200"/> | <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg" width="200"/> |
|:---:|:---:|:---:| |:---:|:---:|:---:|
|Clearly white| Kinda dark | Just black| |Clearly white| Kinda dark | Just black|
### Player screen ### Player screen
| <img src="screenshots/home_light.jpg" width="200"/>| <img src="screenshots/songs.jpg" width="200"/>| <img src="screenshots/albums.jpg" width="200"/>| <img src="screenshots/artists.jpg" width="200"/>| <img src="screenshots/settings.jpg" width="200"/>| | <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg" width="200"/>| <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg" width="200"/>| <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg" width="200"/>| <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/7.jpg" width="200"/>| <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8.jpg" width="200"/>|
|:---:|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|:---:|
| Home | Songs | Albums | Artists | Settings | | Home | Songs | Albums | Artists | Settings |
@ -40,7 +37,7 @@ Material Design music player for Android music lovers
| Synced Replace Cover light | Synced Replace Cover dark | Synced Replace Cover black | | Synced Replace Cover light | Synced Replace Cover dark | Synced Replace Cover black |
### 10+ Now playing themes ### 10+ Now playing themes
| <img src="screenshots/normal.jpg" width="200"/> |<img src="screenshots/fit.jpg" width="200"/>| <img src="screenshots/flat.jpg" width="200"/> | <img src="screenshots/color.jpg" width="200"/> | <img src="screenshots/material.jpg" width="200"/> | | <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg" width="200"/> |<img src="screenshots/fit.jpg" width="200"/>| <img src="screenshots/flat.jpg" width="200"/> | <img src="screenshots/color.jpg" width="200"/> | <img src="screenshots/material.jpg" width="200"/> |
|:-----: |:-----: |:-----: |:-----: |:-----: | |:-----: |:-----: |:-----: |:-----: |:-----: |
| Normal | Fit | Flat | Color | Material | | Normal | Fit | Flat | Color | Material |

View file

@ -1,29 +1,30 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: "androidx.navigation.safeargs.kotlin" apply plugin: "androidx.navigation.safeargs.kotlin"
apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-parcelize'
apply plugin: 'com.google.devtools.ksp'
android { android {
compileSdk 32 compileSdk 33
buildToolsVersion = '30.0.3' namespace "code.name.monkey.retromusic"
defaultConfig { defaultConfig {
minSdk 21 minSdk 21
targetSdk 32 targetSdk 33
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
applicationId 'io.github.muntashirakon.Music' applicationId 'io.github.muntashirakon.Music'
versionCode 10580 versionCode 10603
versionName '5.8.5' versionName '6.1.0'
multiDexEnabled true multiDexEnabled true
} }
buildTypes { buildTypes {
release { release {
minifyEnabled false shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} }
debug { debug {
applicationIdSuffix '.debug' applicationIdSuffix '.debug'
@ -40,8 +41,8 @@ android {
} }
} }
lint { lint {
abortOnError false abortOnError true
disable 'MissingTranslation', 'InvalidPackage' warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation'
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
@ -50,8 +51,11 @@ android {
kotlinOptions { kotlinOptions {
jvmTarget = "1.8" jvmTarget = "1.8"
} }
dependenciesInfo {
configurations.all { includeInApk = false
includeInBundle = false
}
configurations.configureEach {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
} }
} }
@ -60,35 +64,37 @@ android {
dependencies { dependencies {
implementation project(':appthemehelper') implementation project(':appthemehelper')
implementation "androidx.gridlayout:gridlayout:1.0.0" implementation "androidx.gridlayout:gridlayout:1.0.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.appcompat:appcompat:$appcompat_version" implementation "androidx.appcompat:appcompat:$appcompat_version"
implementation 'androidx.annotation:annotation:1.3.0' implementation 'androidx.annotation:annotation:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.recyclerview:recyclerview:1.3.0'
implementation "androidx.preference:preference-ktx:$preference_version" implementation "androidx.preference:preference-ktx:$preference_version"
implementation 'androidx.core:core-ktx:1.7.0' implementation "androidx.core:core-ktx:$core_version"
implementation 'androidx.palette:palette-ktx:1.0.0' implementation 'androidx.palette:palette-ktx:1.0.0'
implementation "androidx.media:media:1.6.0" implementation 'androidx.mediarouter:mediarouter:1.3.1'
implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version" implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
def room_version = '2.4.2' def room_version = '2.5.1'
implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version" implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version" ksp "androidx.room:room-compiler:$room_version"
def lifecycle_version = "2.5.0-rc01"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.core:core-splashscreen:1.0.0-beta02" implementation "androidx.core:core-splashscreen:1.0.0"
implementation "com.google.android.material:material:$mdc_version" implementation "com.google.android.material:material:$mdc_version"
implementation 'com.google.code.gson:gson:2.9.0'
def retrofit_version = '2.9.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
def material_dialog_version = "3.3.0" def material_dialog_version = "3.3.0"
implementation "com.afollestad.material-dialogs:core:$material_dialog_version" implementation "com.afollestad.material-dialogs:core:$material_dialog_version"
@ -97,19 +103,15 @@ dependencies {
implementation 'com.afollestad:material-cab:2.0.1' implementation 'com.afollestad:material-cab:2.0.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
def kotlin_coroutines_version = '1.6.1' def koin_version = '3.4.0'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
def koin_version = '3.2.0'
implementation "io.insert-koin:koin-core:$koin_version" implementation "io.insert-koin:koin-core:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version" implementation "io.insert-koin:koin-android:$koin_version"
def glide_version = '4.13.2' def glide_version = '4.15.1'
implementation "com.github.bumptech.glide:glide:$glide_version" implementation "com.github.bumptech.glide:glide:$glide_version"
kapt "com.github.bumptech.glide:compiler:$glide_version" ksp "com.github.bumptech.glide:ksp:$glide_version"
implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0' implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0'
@ -124,8 +126,7 @@ dependencies {
implementation 'com.r0adkll:slidableactivity:2.1.0' implementation 'com.r0adkll:slidableactivity:2.1.0'
implementation 'com.heinrichreimersoftware:material-intro:2.0.0' implementation 'com.heinrichreimersoftware:material-intro:2.0.0'
implementation 'com.github.dhaval2404:imagepicker:2.1' implementation 'com.github.dhaval2404:imagepicker:2.1'
implementation 'me.zhanghai.android.fastscroll:library:1.1.8' implementation 'me.zhanghai.android.fastscroll:library:1.2.0'
implementation 'cat.ereza:customactivityoncrash:2.3.0' implementation 'cat.ereza:customactivityoncrash:2.4.0'
implementation 'me.tankery.lib:circularSeekBar:1.3.2' implementation 'me.tankery.lib:circularSeekBar:1.4.2'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
} }

View file

@ -66,6 +66,6 @@
-keep class * extends androidx.fragment.app.Fragment{} -keep class * extends androidx.fragment.app.Fragment{}
-keepnames class * extends android.os.Parcelable -keepnames class * extends android.os.Parcelable
-keepnames class * extends java.io.Serializable -keepnames class * extends java.io.Serializable
-keep class io.github.muntashirakon.music.network.model.** { *; } -keep class code.name.monkey.retromusic.network.model.** { *; }
-keep class io.github.muntashirakon.music.model.** { *; } -keep class code.name.monkey.retromusic.model.** { *; }
-keep class com.google.android.material.bottomsheet.** { *; } -keep class com.google.android.material.bottomsheet.** { *; }

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="io.github.muntashirakon.music" package="code.name.monkey.retromusic"
android:installLocation="auto"> android:installLocation="auto">
<uses-permission <uses-permission
@ -11,36 +11,47 @@
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" /> android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission <uses-permission
android:name="android.permission.WRITE_SETTINGS" android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" /> tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission
android:name="android.permission.BLUETOOTH_CONNECT"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
<application <application
android:name=".App" android:name=".App"
android:allowBackup="@bool/allowBackup" android:allowBackup="@bool/allowBackup"
android:appCategory="audio"
android:configChanges="locale|layoutDirection" android:configChanges="locale|layoutDirection"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:localeConfig="@xml/locales_config"
android:requestLegacyExternalStorage="true"
android:restoreAnyVersion="true" android:restoreAnyVersion="true"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.RetroMusic.FollowSystem" android:theme="@style/Theme.RetroMusic.FollowSystem"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:ignore="AllowBackup,GoogleAppIndexingWarning" tools:ignore="UnusedAttribute">
tools:targetApi="q">
<activity <activity
android:name=".activities.MainActivity" android:name=".activities.MainActivity"
android:exported="true" android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/SplashTheme"> android:theme="@style/Theme.RetroMusic.SplashScreen">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MUSIC_PLAYER" /> <action android:name="android.intent.action.MUSIC_PLAYER" />
@ -51,7 +62,6 @@
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@ -111,7 +121,6 @@
<data android:mimeType="vnd.android.cursor.dir/audio" /> <data android:mimeType="vnd.android.cursor.dir/audio" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".activities.SettingsActivity" />
<activity android:name=".activities.tageditor.AlbumTagEditorActivity" /> <activity android:name=".activities.tageditor.AlbumTagEditorActivity" />
<activity android:name=".activities.tageditor.SongTagEditorActivity" /> <activity android:name=".activities.tageditor.SongTagEditorActivity" />
<activity android:name=".activities.LicenseActivity" /> <activity android:name=".activities.LicenseActivity" />
@ -119,8 +128,11 @@
<activity android:name=".activities.ShareInstagramStory" /> <activity android:name=".activities.ShareInstagramStory" />
<activity android:name=".activities.DriveModeActivity" /> <activity android:name=".activities.DriveModeActivity" />
<activity android:name=".activities.PermissionActivity" /> <activity android:name=".activities.PermissionActivity" />
<activity android:name=".activities.LockScreenActivity" /> <activity
<activity android:name=".activities.saf.SAFRequestActivity" /> android:name=".activities.LockScreenActivity"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:showOnLockScreen="true" />
<activity <activity
android:name=".fragments.backup.RestoreActivity" android:name=".fragments.backup.RestoreActivity"
android:excludeFromRecents="false" android:excludeFromRecents="false"
@ -175,16 +187,6 @@
</intent-filter> </intent-filter>
</activity> </activity>
<provider
android:name=".misc.GenericFileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}" android:authorities="${applicationId}"
@ -196,7 +198,7 @@
</provider> </provider>
<receiver <receiver
android:name="androidx.media.session.MediaButtonReceiver" android:name=".service.MediaButtonIntentReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" /> <action android:name="android.intent.action.MEDIA_BUTTON" />
@ -300,16 +302,12 @@
<service <service
android:name=".service.MusicService" android:name=".service.MusicService"
android:enabled="true"
android:exported="true" android:exported="true"
android:foregroundServiceType="mediaPlayback" android:foregroundServiceType="mediaPlayback"
android:label="@string/app_name"> android:label="@string/app_name">
<intent-filter> <intent-filter>
<action android:name="android.media.browse.MediaBrowserService" /> <action android:name="android.media.browse.MediaBrowserService" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service> </service>
<meta-data <meta-data
@ -330,6 +328,16 @@
<meta-data <meta-data
android:name="com.google.android.gms.car.notification.SmallIcon" android:name="com.google.android.gms.car.notification.SmallIcon"
android:resource="@drawable/ic_notification" /> android:resource="@drawable/ic_notification" />
<!-- For auto-storage of locale on Android 12 and lower -->
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>
</application> </application>
<!-- <!--

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -62,6 +62,81 @@
</head> </head>
<body> <body>
<div>
<h5>March 30, 2023</h5>
<h2>v6.1.0</h2>
<h3>What's New</h3>
<ul>
<li>App now targets Android 13, support for Granular media permissions, Photo picker, Per-app language preferences & Predictive back gesture</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed playlist reordering crash</li>
<li>Other minor bugs fixes and improvements</li>
</ul>
</div>
<div>
<h5>March 13, 2023</h5>
<h2>v6.0.4</h2>
<h3>What's New</h3>
<ul>
<li>Minor redesign in Playlist details screen</li>
<li>Updated translations</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed file popup menu actions in Folders tab</li>
<li>Fixed playlist image loading</li>
<li>Fixed blurry album art in Android 13</li>
<li>Minor bug fixes and improvements</li>
</ul>
</div>
<div>
<h5>July 10, 2022</h5>
<h2>v6.0.3<span class="tag"><i>Beta</i></span></h2>
<h3>Fixed</h3>
<ul>
<li>Migrated icons to Material symbols</li>
</ul>
</div>
<div>
<h5>June 21, 2022</h5>
<h2>v6.0.2<span class="tag"><i>Beta</i></span></h2>
<h3>Fixed</h3>
<ul>
<li>Minor bug fixes and improvements</li>
</ul>
</div>
<div>
<h5>June 13, 2022</h5>
<h2>v6.0.1<span class="tag"><i>Beta</i></span></h2>
<h3>Fixed</h3>
<ul>
<li>Fixed ChromeCast crash</li>
<li>Fixed Slider crashes</li>
<li>Fixed storage related crashes on Android 10</li>
<li>Fixed CrossFade not working Fade Audio is not working</li>
</ul>
</div>
<div>
<h5>June 7, 2022</h5>
<h2>v6.0.0<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Better Cast</li>
<li>Mini player in settings screen</li>
<li>Changed Seekbar with Sliders</li>
<li>Added NavigationRailView for Landscape</li>
<li>Show remaining time in Sleep timer dialog</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Top/Recent Artists/Albums not updating (Wrong sort order)</li>
<li>Fixed all Blacklist related crashes</li>
<li>Fix restart button not working in crash activity</li>
</ul>
</div>
<div> <div>
<h5>May 25, 2022</h5> <h5>May 25, 2022</h5>
<h2>v5.8.5</h2> <h2>v5.8.5</h2>

View file

@ -10,16 +10,19 @@
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*
*/ */
package io.github.muntashirakon.music package code.name.monkey.retromusic
import android.app.Application import android.app.Application
import androidx.preference.PreferenceManager
import cat.ereza.customactivityoncrash.config.CaocConfig import cat.ereza.customactivityoncrash.config.CaocConfig
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.activities.ErrorActivity import code.name.monkey.retromusic.activities.ErrorActivity
import io.github.muntashirakon.music.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.helper.WallpaperAccentManager import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
import code.name.monkey.retromusic.helper.WallpaperAccentManager
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
@ -38,7 +41,7 @@ class App : Application() {
// default theme // default theme
if (!ThemeStore.isConfigured(this, 3)) { if (!ThemeStore.isConfigured(this, 3)) {
ThemeStore.editTheme(this) ThemeStore.editTheme(this)
.accentColorRes(R.color.md_deep_purple_A200) .accentColorRes(code.name.monkey.appthemehelper.R.color.md_deep_purple_A200)
.coloredNavigationBar(true) .coloredNavigationBar(true)
.commit() .commit()
} }
@ -48,7 +51,12 @@ class App : Application() {
DynamicShortcutManager(this).initDynamicShortcuts() DynamicShortcutManager(this).initDynamicShortcuts()
// setting Error activity // setting Error activity
CaocConfig.Builder.create().errorActivity(ErrorActivity::class.java).apply() CaocConfig.Builder.create().errorActivity(ErrorActivity::class.java)
.restartActivity(MainActivity::class.java).apply()
// Set Default values for now playing preferences
// This will reduce startup time for now playing settings fragment as Preference listener of AbsSlidingMusicPanelActivity won't be called
PreferenceManager.setDefaultValues(this, R.xml.pref_now_playing_screen, false)
} }
override fun onTerminate() { override fun onTerminate() {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music package code.name.monkey.retromusic
import android.provider.BaseColumns import android.provider.BaseColumns
import android.provider.MediaStore import android.provider.MediaStore
@ -79,12 +79,7 @@ const val CIRCULAR_ALBUM_ART = "circular_album_art"
const val USER_NAME = "user_name" const val USER_NAME = "user_name"
const val TOGGLE_FULL_SCREEN = "toggle_full_screen" const val TOGGLE_FULL_SCREEN = "toggle_full_screen"
const val TOGGLE_VOLUME = "toggle_volume" const val TOGGLE_VOLUME = "toggle_volume"
const val ROUND_CORNERS = "corner_window"
const val TOGGLE_GENRE = "toggle_genre"
const val PROFILE_IMAGE_PATH = "profile_image_path"
const val BANNER_IMAGE_PATH = "banner_image_path"
const val ADAPTIVE_COLOR_APP = "adaptive_color_app" const val ADAPTIVE_COLOR_APP = "adaptive_color_app"
const val TOGGLE_SEPARATE_LINE = "toggle_separate_line"
const val HOME_ARTIST_GRID_STYLE = "home_artist_grid_style" const val HOME_ARTIST_GRID_STYLE = "home_artist_grid_style"
const val HOME_ALBUM_GRID_STYLE = "home_album_grid_style" const val HOME_ALBUM_GRID_STYLE = "home_album_grid_style"
const val TOGGLE_ADD_CONTROLS = "toggle_add_controls" const val TOGGLE_ADD_CONTROLS = "toggle_add_controls"
@ -92,6 +87,7 @@ const val ALBUM_COVER_STYLE = "album_cover_style_id"
const val ALBUM_COVER_TRANSFORM = "album_cover_transform" const val ALBUM_COVER_TRANSFORM = "album_cover_transform"
const val TAB_TEXT_MODE = "tab_text_mode" const val TAB_TEXT_MODE = "tab_text_mode"
const val LANGUAGE_NAME = "language_name" const val LANGUAGE_NAME = "language_name"
const val LOCALE_AUTO_STORE_ENABLED = "locale_auto_store_enabled"
const val SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_song" const val SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_song"
const val ALBUM_GRID_STYLE = "album_grid_style_home" const val ALBUM_GRID_STYLE = "album_grid_style_home"
const val ARTIST_GRID_STYLE = "artist_grid_style_home" const val ARTIST_GRID_STYLE = "artist_grid_style_home"
@ -99,7 +95,6 @@ const val SAF_SDCARD_URI = "saf_sdcard_uri"
const val SONG_SORT_ORDER = "song_sort_order" const val SONG_SORT_ORDER = "song_sort_order"
const val SONG_GRID_SIZE = "song_grid_size" const val SONG_GRID_SIZE = "song_grid_size"
const val GENRE_SORT_ORDER = "genre_sort_order" const val GENRE_SORT_ORDER = "genre_sort_order"
const val LAST_PAGE = "last_start_page"
const val BLUETOOTH_PLAYBACK = "bluetooth_playback" const val BLUETOOTH_PLAYBACK = "bluetooth_playback"
const val INITIALIZED_BLACKLIST = "initialized_blacklist" const val INITIALIZED_BLACKLIST = "initialized_blacklist"
const val ARTIST_SORT_ORDER = "artist_sort_order" const val ARTIST_SORT_ORDER = "artist_sort_order"
@ -116,7 +111,6 @@ const val ARTIST_GRID_SIZE_LAND = "artist_grid_size_land"
const val PLAYLIST_GRID_SIZE = "playlist_grid_size" const val PLAYLIST_GRID_SIZE = "playlist_grid_size"
const val PLAYLIST_GRID_SIZE_LAND = "playlist_grid_size_land" const val PLAYLIST_GRID_SIZE_LAND = "playlist_grid_size_land"
const val COLORED_APP_SHORTCUTS = "colored_app_shortcuts" const val COLORED_APP_SHORTCUTS = "colored_app_shortcuts"
const val AUDIO_DUCKING = "audio_ducking"
const val LAST_ADDED_CUTOFF = "last_added_interval" const val LAST_ADDED_CUTOFF = "last_added_interval"
const val LAST_SLEEP_TIMER_VALUE = "last_sleep_timer_value" const val LAST_SLEEP_TIMER_VALUE = "last_sleep_timer_value"
const val NEXT_SLEEP_TIMER_ELAPSED_REALTIME = "next_sleep_timer_elapsed_real_time" const val NEXT_SLEEP_TIMER_ELAPSED_REALTIME = "next_sleep_timer_elapsed_real_time"
@ -132,7 +126,6 @@ const val ARTIST_DETAIL_SONG_SORT_ORDER = "artist_detail_song_sort_order"
const val LYRICS_OPTIONS = "lyrics_tab_position" const val LYRICS_OPTIONS = "lyrics_tab_position"
const val CHOOSE_EQUALIZER = "choose_equalizer" const val CHOOSE_EQUALIZER = "choose_equalizer"
const val EQUALIZER = "equalizer" const val EQUALIZER = "equalizer"
const val TOGGLE_SHUFFLE = "toggle_shuffle"
const val SONG_GRID_STYLE = "song_grid_style" const val SONG_GRID_STYLE = "song_grid_style"
const val PAUSE_ON_ZERO_VOLUME = "pause_on_zero_volume" const val PAUSE_ON_ZERO_VOLUME = "pause_on_zero_volume"
const val FILTER_SONG = "filter_song" const val FILTER_SONG = "filter_song"

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music package code.name.monkey.retromusic
import androidx.annotation.IntDef import androidx.annotation.IntDef

View file

@ -1,24 +1,16 @@
package io.github.muntashirakon.music package code.name.monkey.retromusic
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import code.name.monkey.retromusic.auto.AutoMusicProvider
import androidx.sqlite.db.SupportSQLiteDatabase import code.name.monkey.retromusic.db.MIGRATION_23_24
import io.github.muntashirakon.music.auto.AutoMusicProvider import code.name.monkey.retromusic.db.RetroDatabase
import io.github.muntashirakon.music.db.BlackListStoreDao import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.db.BlackListStoreEntity import code.name.monkey.retromusic.fragments.albums.AlbumDetailsViewModel
import io.github.muntashirakon.music.db.PlaylistWithSongs import code.name.monkey.retromusic.fragments.artists.ArtistDetailsViewModel
import io.github.muntashirakon.music.db.RetroDatabase import code.name.monkey.retromusic.fragments.genres.GenreDetailsViewModel
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.playlists.PlaylistDetailsViewModel
import io.github.muntashirakon.music.fragments.albums.AlbumDetailsViewModel import code.name.monkey.retromusic.model.Genre
import io.github.muntashirakon.music.fragments.artists.ArtistDetailsViewModel import code.name.monkey.retromusic.repository.*
import io.github.muntashirakon.music.fragments.genres.GenreDetailsViewModel
import io.github.muntashirakon.music.fragments.playlists.PlaylistDetailsViewModel
import io.github.muntashirakon.music.model.Genre
import io.github.muntashirakon.music.repository.*
import io.github.muntashirakon.music.util.FilePathUtil
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.bind import org.koin.dsl.bind
@ -28,32 +20,14 @@ private val roomModule = module {
single { single {
Room.databaseBuilder(androidContext(), RetroDatabase::class.java, "playlist.db") Room.databaseBuilder(androidContext(), RetroDatabase::class.java, "playlist.db")
.allowMainThreadQueries() .addMigrations(MIGRATION_23_24)
.addCallback(object : RoomDatabase.Callback() {
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
GlobalScope.launch(IO) {
FilePathUtil.blacklistFilePaths().map {
get<BlackListStoreDao>().insertBlacklistPath(BlackListStoreEntity(it))
}
}
}
})
.fallbackToDestructiveMigration()
.build() .build()
} }
factory {
get<RetroDatabase>().lyricsDao()
}
factory { factory {
get<RetroDatabase>().playlistDao() get<RetroDatabase>().playlistDao()
} }
factory {
get<RetroDatabase>().blackListStore()
}
factory { factory {
get<RetroDatabase>().playCountDao() get<RetroDatabase>().playCountDao()
} }
@ -63,7 +37,7 @@ private val roomModule = module {
} }
single { single {
RealRoomRepository(get(), get(), get(), get(), get()) RealRoomRepository(get(), get(), get())
} bind RoomRepository::class } bind RoomRepository::class
} }
private val autoModule = module { private val autoModule = module {
@ -164,10 +138,10 @@ private val viewModules = module {
) )
} }
viewModel { (playlist: PlaylistWithSongs) -> viewModel { (playlistId: Long) ->
PlaylistDetailsViewModel( PlaylistDetailsViewModel(
get(), get(),
playlist playlistId
) )
} }

View file

@ -12,35 +12,32 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.animation.ObjectAnimator
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.os.Bundle import android.os.Bundle
import android.view.animation.LinearInterpolator
import android.widget.SeekBar
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import io.github.muntashirakon.music.databinding.ActivityDriveModeBinding import code.name.monkey.retromusic.databinding.ActivityDriveModeBinding
import io.github.muntashirakon.music.db.toSongEntity import code.name.monkey.retromusic.db.toSongEntity
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.extensions.drawAboveSystemBars import code.name.monkey.retromusic.extensions.drawAboveSystemBars
import io.github.muntashirakon.music.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.glide.BlurTransformation
import io.github.muntashirakon.music.glide.BlurTransformation import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import io.github.muntashirakon.music.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
import io.github.muntashirakon.music.helper.MusicProgressViewUpdateHelper.Callback import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import io.github.muntashirakon.music.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.repository.RealRepository
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.repository.RealRepository import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.service.MusicService import com.bumptech.glide.Glide
import io.github.muntashirakon.music.util.MusicUtil import com.google.android.material.slider.Slider
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -68,7 +65,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
lastPlaybackControlsColor = accentColor() lastPlaybackControlsColor = accentColor()
binding.close.setOnClickListener { binding.close.setOnClickListener {
onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.repeatButton.drawAboveSystemBars() binding.repeatButton.drawAboveSystemBars()
} }
@ -113,17 +110,15 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
} }
private fun setUpProgressSlider() { private fun setUpProgressSlider() {
binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { binding.progressSlider.addOnChangeListener { _: Slider, progress: Float, fromUser: Boolean ->
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) { if (fromUser) {
MusicPlayerRemote.seekTo(progress) MusicPlayerRemote.seekTo(progress.toInt())
onUpdateProgressViews( onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis, MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis MusicPlayerRemote.songDurationMillis
) )
} }
} }
})
} }
override fun onPause() { override fun onPause() {
@ -191,6 +186,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
lastPlaybackControlsColor, lastPlaybackControlsColor,
PorterDuff.Mode.SRC_IN PorterDuff.Mode.SRC_IN
) )
else -> binding.shuffleButton.setColorFilter( else -> binding.shuffleButton.setColorFilter(
lastDisabledPlaybackControlsColor, lastDisabledPlaybackControlsColor,
PorterDuff.Mode.SRC_IN PorterDuff.Mode.SRC_IN
@ -207,6 +203,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
PorterDuff.Mode.SRC_IN PorterDuff.Mode.SRC_IN
) )
} }
MusicService.REPEAT_MODE_ALL -> { MusicService.REPEAT_MODE_ALL -> {
binding.repeatButton.setImageResource(R.drawable.ic_repeat) binding.repeatButton.setImageResource(R.drawable.ic_repeat)
binding.repeatButton.setColorFilter( binding.repeatButton.setColorFilter(
@ -214,6 +211,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
PorterDuff.Mode.SRC_IN PorterDuff.Mode.SRC_IN
) )
} }
MusicService.REPEAT_MODE_THIS -> { MusicService.REPEAT_MODE_THIS -> {
binding.repeatButton.setImageResource(R.drawable.ic_repeat_one) binding.repeatButton.setImageResource(R.drawable.ic_repeat_one)
binding.repeatButton.setColorFilter( binding.repeatButton.setColorFilter(
@ -241,7 +239,7 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
binding.songTitle.text = song.title binding.songTitle.text = song.title
binding.songText.text = song.artistName binding.songText.text = song.artistName
GlideApp.with(this) Glide.with(this)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.songCoverOptions(song) .songCoverOptions(song)
.transform(BlurTransformation.Builder(this).build()) .transform(BlurTransformation.Builder(this).build())
@ -249,12 +247,10 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
} }
override fun onUpdateProgressViews(progress: Int, total: Int) { override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.progressSlider.max = total binding.progressSlider.run {
valueTo = total.toFloat()
val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress) value = progress.toFloat().coerceIn(valueFrom, valueTo)
animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME }
animator.interpolator = LinearInterpolator()
animator.start()
binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong())
binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong()) binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong())

View file

@ -1,34 +1,34 @@
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.os.Bundle import android.os.Bundle
import android.widget.Button import android.widget.Button
import android.widget.ImageView import android.widget.ImageView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import cat.ereza.customactivityoncrash.CustomActivityOnCrash import cat.ereza.customactivityoncrash.CustomActivityOnCrash
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.util.FileUtils.createFile import code.name.monkey.retromusic.util.FileUtils.createFile
import io.github.muntashirakon.music.util.Share.shareFile import code.name.monkey.retromusic.util.Share.shareFile
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.text.DateFormat import java.text.DateFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
class ErrorActivity : AppCompatActivity() { class ErrorActivity : AppCompatActivity() {
private val dayFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) private val dayFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
private val ReportPrefix = "bug_report-" private val reportPrefix = "bug_report-"
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.customactivityoncrash_default_error_activity) setContentView(cat.ereza.customactivityoncrash.R.layout.customactivityoncrash_default_error_activity)
val restartButton = val restartButton =
findViewById<Button>(R.id.customactivityoncrash_error_activity_restart_button) findViewById<Button>(cat.ereza.customactivityoncrash.R.id.customactivityoncrash_error_activity_restart_button)
val config = CustomActivityOnCrash.getConfigFromIntent(intent) val config = CustomActivityOnCrash.getConfigFromIntent(intent)
if (config == null) { if (config == null) {
finish() finish()
return return
} }
restartButton.setText(R.string.customactivityoncrash_error_activity_restart_app) restartButton.setText(cat.ereza.customactivityoncrash.R.string.customactivityoncrash_error_activity_restart_app)
restartButton.setOnClickListener { restartButton.setOnClickListener {
CustomActivityOnCrash.restartApplication( CustomActivityOnCrash.restartApplication(
this@ErrorActivity, this@ErrorActivity,
@ -36,11 +36,11 @@ class ErrorActivity : AppCompatActivity() {
) )
} }
val moreInfoButton = val moreInfoButton =
findViewById<Button>(R.id.customactivityoncrash_error_activity_more_info_button) findViewById<Button>(cat.ereza.customactivityoncrash.R.id.customactivityoncrash_error_activity_more_info_button)
moreInfoButton.setOnClickListener { //We retrieve all the error data and show it moreInfoButton.setOnClickListener { //We retrieve all the error data and show it
AlertDialog.Builder(this@ErrorActivity) MaterialAlertDialogBuilder(this@ErrorActivity)
.setTitle(R.string.customactivityoncrash_error_activity_error_details_title) .setTitle(cat.ereza.customactivityoncrash.R.string.customactivityoncrash_error_activity_error_details_title)
.setMessage( .setMessage(
CustomActivityOnCrash.getAllErrorDetailsFromIntent( CustomActivityOnCrash.getAllErrorDetailsFromIntent(
this@ErrorActivity, this@ErrorActivity,
@ -48,7 +48,7 @@ class ErrorActivity : AppCompatActivity() {
) )
) )
.setPositiveButton( .setPositiveButton(
R.string.customactivityoncrash_error_activity_error_details_close, cat.ereza.customactivityoncrash.R.string.customactivityoncrash_error_activity_error_details_close,
null null
) )
.setNeutralButton( .setNeutralButton(
@ -58,19 +58,19 @@ class ErrorActivity : AppCompatActivity() {
val bugReport = createFile( val bugReport = createFile(
context = this, context = this,
"Bug Report", "Bug Report",
"$ReportPrefix${dayFormat.format(Date())}", "$reportPrefix${dayFormat.format(Date())}",
CustomActivityOnCrash.getAllErrorDetailsFromIntent( CustomActivityOnCrash.getAllErrorDetailsFromIntent(
this@ErrorActivity, this@ErrorActivity,
intent intent
), ".txt" ), ".txt"
) )
shareFile(this, bugReport) shareFile(this, bugReport, "text/*")
} }
.show() .show()
} }
val errorActivityDrawableId = config.errorDrawable val errorActivityDrawableId = config.errorDrawable
val errorImageView = val errorImageView =
findViewById<ImageView>(R.id.customactivityoncrash_error_activity_image) findViewById<ImageView>(cat.ereza.customactivityoncrash.R.id.customactivityoncrash_error_activity_image)
if (errorActivityDrawableId != null) { if (errorActivityDrawableId != null) {
errorImageView.setImageResource( errorImageView.setImageResource(
errorActivityDrawableId errorActivityDrawableId

View file

@ -11,7 +11,7 @@
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
@ -19,11 +19,11 @@ import android.view.MenuItem
import code.name.monkey.appthemehelper.util.ATHUtil.isWindowBackgroundDark import code.name.monkey.appthemehelper.util.ATHUtil.isWindowBackgroundDark
import code.name.monkey.appthemehelper.util.ColorUtil.lightenColor import code.name.monkey.appthemehelper.util.ColorUtil.lightenColor
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import io.github.muntashirakon.music.activities.base.AbsThemeActivity import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import io.github.muntashirakon.music.databinding.ActivityLicenseBinding import code.name.monkey.retromusic.databinding.ActivityLicenseBinding
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.extensions.drawAboveSystemBars import code.name.monkey.retromusic.extensions.drawAboveSystemBars
import io.github.muntashirakon.music.extensions.surfaceColor import code.name.monkey.retromusic.extensions.surfaceColor
import java.io.BufferedReader import java.io.BufferedReader
import java.io.InputStreamReader import java.io.InputStreamReader
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
@ -77,7 +77,7 @@ class LicenseActivity : AbsThemeActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) { if (item.itemId == android.R.id.home) {
onBackPressed() onBackPressedDispatcher.onBackPressed()
return true return true
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)

View file

@ -12,25 +12,27 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.app.KeyguardManager import android.app.KeyguardManager
import android.os.Bundle import android.os.Bundle
import android.view.WindowManager import android.view.WindowManager
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import io.github.muntashirakon.music.databinding.ActivityLockScreenBinding import code.name.monkey.retromusic.databinding.ActivityLockScreenBinding
import io.github.muntashirakon.music.extensions.hideStatusBar import code.name.monkey.retromusic.extensions.hideStatusBar
import io.github.muntashirakon.music.extensions.setTaskDescriptionColorAuto import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import io.github.muntashirakon.music.extensions.whichFragment import code.name.monkey.retromusic.extensions.whichFragment
import io.github.muntashirakon.music.fragments.player.lockscreen.LockScreenControlsFragment import code.name.monkey.retromusic.fragments.player.lockscreen.LockScreenControlsFragment
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import com.r0adkll.slidr.Slidr import com.r0adkll.slidr.Slidr
import com.r0adkll.slidr.model.SlidrConfig import com.r0adkll.slidr.model.SlidrConfig
import com.r0adkll.slidr.model.SlidrListener import com.r0adkll.slidr.model.SlidrListener
@ -84,12 +86,11 @@ class LockScreenActivity : AbsMusicServiceActivity() {
private fun lockScreenInit() { private fun lockScreenInit() {
if (VersionUtils.hasOreoMR1()) { if (VersionUtils.hasOreoMR1()) {
setShowWhenLocked(true) setShowWhenLocked(true)
val keyguardManager = getSystemService<KeyguardManager>() //setTurnScreenOn(true)
keyguardManager?.requestDismissKeyguard(this, null)
} else { } else {
this.window.addFlags( window.addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
// or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
) )
} }
} }
@ -106,7 +107,7 @@ class LockScreenActivity : AbsMusicServiceActivity() {
private fun updateSongs() { private fun updateSongs() {
val song = MusicPlayerRemote.currentSong val song = MusicPlayerRemote.currentSong
GlideApp.with(this) Glide.with(this)
.asBitmapPalette() .asBitmapPalette()
.songCoverOptions(song) .songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))

View file

@ -12,43 +12,37 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.provider.MediaStore import android.provider.MediaStore
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.contains import androidx.navigation.contains
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import io.github.muntashirakon.music.* import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.base.AbsSlidingMusicPanelActivity import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity
import io.github.muntashirakon.music.databinding.SlidingMusicPanelLayoutBinding import code.name.monkey.retromusic.extensions.*
import io.github.muntashirakon.music.extensions.* import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SearchQueryHelper.getSongs
import io.github.muntashirakon.music.helper.SearchQueryHelper.getSongs import code.name.monkey.retromusic.interfaces.IScrollHelper
import io.github.muntashirakon.music.interfaces.IScrollHelper import code.name.monkey.retromusic.model.CategoryInfo
import io.github.muntashirakon.music.model.CategoryInfo import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.repository.PlaylistSongsLoader
import io.github.muntashirakon.music.repository.PlaylistSongsLoader import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.logE
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.android.ext.android.get import org.koin.android.ext.android.get
class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeListener { class MainActivity : AbsSlidingMusicPanelActivity() {
companion object { companion object {
const val TAG = "MainActivity" const val TAG = "MainActivity"
const val EXPAND_PANEL = "expand_panel" const val EXPAND_PANEL = "expand_panel"
} }
override fun createContentView(): SlidingMusicPanelLayoutBinding {
return wrapSlidingMusicPanel()
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setTaskDescriptionColorAuto() setTaskDescriptionColorAuto()
@ -56,9 +50,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
updateTabs() updateTabs()
setupNavigationController() setupNavigationController()
if (!hasPermissions()) {
findNavController(R.id.fragment_container).navigate(R.id.permissionFragment)
}
WhatsNewFragment.showChangeLog(this) WhatsNewFragment.showChangeLog(this)
} }
@ -84,9 +76,9 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
) )
} }
navController.graph = navGraph navController.graph = navGraph
bottomNavigationView.setupWithNavController(navController) navigationView.setupWithNavController(navController)
// Scroll Fragment to top // Scroll Fragment to top
bottomNavigationView.setOnItemReselectedListener { navigationView.setOnItemReselectedListener {
currentFragment(R.id.fragment_container).apply { currentFragment(R.id.fragment_container).apply {
if (this is IScrollHelper) { if (this is IScrollHelper) {
scrollToTop() scrollToTop()
@ -118,8 +110,10 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
} }
private fun saveTab(id: Int) { private fun saveTab(id: Int) {
if (PreferenceUtil.libraryCategory.firstOrNull { it.category.id == id }?.visible == true) {
PreferenceUtil.lastTab = id PreferenceUtil.lastTab = id
} }
}
override fun onSupportNavigateUp(): Boolean = override fun onSupportNavigateUp(): Boolean =
findNavController(R.id.fragment_container).navigateUp() findNavController(R.id.fragment_container).navigateUp()
@ -135,22 +129,6 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
} }
} }
override fun onResume() {
super.onResume()
PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
}
override fun onDestroy() {
super.onDestroy()
PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == GENERAL_THEME || key == MATERIAL_YOU || key == WALLPAPER_ACCENT || key == BLACK_THEME || key == ADAPTIVE_COLOR_APP || key == USER_NAME || key == TOGGLE_FULL_SCREEN || key == TOGGLE_VOLUME || key == ROUND_CORNERS || key == CAROUSEL_EFFECT || key == NOW_PLAYING_SCREEN_ID || key == TOGGLE_GENRE || key == BANNER_IMAGE_PATH || key == PROFILE_IMAGE_PATH || key == CIRCULAR_ALBUM_ART || key == KEEP_SCREEN_ON || key == TOGGLE_SEPARATE_LINE || key == TOGGLE_HOME_BANNER || key == TOGGLE_ADD_CONTROLS || key == ALBUM_COVER_STYLE || key == HOME_ARTIST_GRID_STYLE || key == ALBUM_COVER_TRANSFORM || key == DESATURATED_COLOR || key == EXTRA_SONG_INFO || key == TAB_TEXT_MODE || key == LANGUAGE_NAME || key == LIBRARY_CATEGORIES || key == CUSTOM_FONT || key == APPBAR_MODE || key == CIRCLE_PLAY_BUTTON || key == SWIPE_DOWN_DISMISS) {
postRecreate()
}
}
override fun onServiceConnected() { override fun onServiceConnected() {
super.onServiceConnected() super.onServiceConnected()
intent ?: return intent ?: return
@ -218,7 +196,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
private fun parseLongFromIntent( private fun parseLongFromIntent(
intent: Intent, intent: Intent,
longKey: String, longKey: String,
stringKey: String stringKey: String,
): Long { ): Long {
var id = intent.getLongExtra(longKey, -1) var id = intent.getLongExtra(longKey, -1)
if (id < 0) { if (id < 0) {
@ -227,7 +205,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), OnSharedPreferenceChangeLis
try { try {
id = idString.toLong() id = idString.toLong()
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
println(e.message) logE(e)
} }
} }
} }

View file

@ -12,9 +12,8 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.Manifest
import android.Manifest.permission.BLUETOOTH_CONNECT import android.Manifest.permission.BLUETOOTH_CONNECT
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -22,16 +21,17 @@ import android.content.res.ColorStateList
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import androidx.activity.OnBackPressedCallback
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible import androidx.core.view.isVisible
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import io.github.muntashirakon.music.databinding.ActivityPermissionBinding import code.name.monkey.retromusic.databinding.ActivityPermissionBinding
import io.github.muntashirakon.music.extensions.* import code.name.monkey.retromusic.extensions.*
class PermissionActivity : AbsMusicServiceActivity() { class PermissionActivity : AbsMusicServiceActivity() {
private lateinit var binding: ActivityPermissionBinding private lateinit var binding: ActivityPermissionBinding
@ -61,10 +61,14 @@ class PermissionActivity : AbsMusicServiceActivity() {
if (VersionUtils.hasS()) { if (VersionUtils.hasS()) {
binding.bluetoothPermission.show() binding.bluetoothPermission.show()
binding.bluetoothPermission.setButtonClick { binding.bluetoothPermission.setButtonClick {
ActivityCompat.requestPermissions(this, ActivityCompat.requestPermissions(
this,
arrayOf(BLUETOOTH_CONNECT), arrayOf(BLUETOOTH_CONNECT),
PERMISSION_REQUEST) BLUETOOTH_PERMISSION_REQUEST
)
} }
} else {
binding.audioPermission.setNumber("2")
} }
binding.finish.accentBackgroundColor() binding.finish.accentBackgroundColor()
@ -79,12 +83,20 @@ class PermissionActivity : AbsMusicServiceActivity() {
finish() finish()
} }
} }
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishAffinity()
remove()
}
})
} }
private fun setupTitle() { private fun setupTitle() {
val appName = val appName =
getString(R.string.message_welcome, getString(
"<b>Metro</b>") R.string.message_welcome,
"<b>Metro</b>"
)
.parseAsHtml() .parseAsHtml()
binding.appNameText.text = appName binding.appNameText.text = appName
} }
@ -114,23 +126,19 @@ class PermissionActivity : AbsMusicServiceActivity() {
} }
private fun hasStoragePermission(): Boolean { private fun hasStoragePermission(): Boolean {
return ActivityCompat.checkSelfPermission(this, return hasPermissions()
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
} }
@RequiresApi(Build.VERSION_CODES.S) @RequiresApi(Build.VERSION_CODES.S)
private fun hasBluetoothPermission(): Boolean { private fun hasBluetoothPermission(): Boolean {
return ActivityCompat.checkSelfPermission(this, return ActivityCompat.checkSelfPermission(
BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED this,
BLUETOOTH_CONNECT
) == PackageManager.PERMISSION_GRANTED
} }
@RequiresApi(Build.VERSION_CODES.M) @RequiresApi(Build.VERSION_CODES.M)
private fun hasAudioPermission(): Boolean { private fun hasAudioPermission(): Boolean {
return Settings.System.canWrite(this) return Settings.System.canWrite(this)
} }
override fun onBackPressed() {
super.onBackPressed()
finishAffinity()
}
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Bitmap import android.graphics.Bitmap
@ -22,26 +22,28 @@ import android.os.Bundle
import android.provider.MediaStore.Images.Media import android.provider.MediaStore.Images.Media
import android.view.MenuItem import android.view.MenuItem
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.os.BundleCompat
import androidx.core.view.drawToBitmap import androidx.core.view.drawToBitmap
import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import io.github.muntashirakon.music.databinding.ActivityShareInstagramBinding import code.name.monkey.retromusic.databinding.ActivityShareInstagramBinding
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.extensions.setLightStatusBar import code.name.monkey.retromusic.extensions.setStatusBarColor
import io.github.muntashirakon.music.extensions.setStatusBarColor import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.util.Share import code.name.monkey.retromusic.util.Share
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
/** /**
* Created by hemanths on 2020-02-02. * Created by hemanths on 2020-02-02.
*/ */
class ShareInstagramStory : AbsBaseActivity() { class ShareInstagramStory : AbsThemeActivity() {
private lateinit var binding: ActivityShareInstagramBinding private lateinit var binding: ActivityShareInstagramBinding
@ -51,7 +53,7 @@ class ShareInstagramStory : AbsBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) { if (item.itemId == android.R.id.home) {
onBackPressed() onBackPressedDispatcher.onBackPressed()
return true return true
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
@ -66,16 +68,15 @@ class ShareInstagramStory : AbsBaseActivity() {
binding.toolbar.setBackgroundColor(Color.TRANSPARENT) binding.toolbar.setBackgroundColor(Color.TRANSPARENT)
setSupportActionBar(binding.toolbar) setSupportActionBar(binding.toolbar)
val song = intent.extras?.getParcelable<Song>(EXTRA_SONG) val song = intent.extras?.let { BundleCompat.getParcelable(it, EXTRA_SONG, Song::class.java) }
song?.let { songFinal -> song?.let { songFinal ->
GlideApp.with(this) Glide.with(this)
.asBitmapPalette() .asBitmapPalette()
.songCoverOptions(songFinal) .songCoverOptions(songFinal)
.load(RetroGlideExtension.getSongModel(songFinal)) .load(RetroGlideExtension.getSongModel(songFinal))
.into(object : RetroMusicColoredTarget(binding.image) { .into(object : RetroMusicColoredTarget(binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) { override fun onColorReady(colors: MediaNotificationProcessor) {
val isColorLight = ColorUtil.isColorLight(colors.backgroundColor) setColors(colors.backgroundColor)
setColors(isColorLight, colors.backgroundColor)
} }
}) })
@ -103,22 +104,7 @@ class ShareInstagramStory : AbsBaseActivity() {
ColorStateList.valueOf(accentColor()) ColorStateList.valueOf(accentColor())
} }
private fun setColors(colorLight: Boolean, color: Int) { private fun setColors(color: Int) {
setLightStatusBar(colorLight)
binding.toolbar.setTitleTextColor(
MaterialValueHelper.getPrimaryTextColor(
this@ShareInstagramStory,
colorLight
)
)
binding.toolbar.navigationIcon?.setTintList(
ColorStateList.valueOf(
MaterialValueHelper.getPrimaryTextColor(
this@ShareInstagramStory,
colorLight
)
)
)
binding.mainContent.background = binding.mainContent.background =
GradientDrawable( GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM, GradientDrawable.Orientation.TOP_BOTTOM,

View file

@ -1,12 +1,16 @@
package io.github.muntashirakon.music.activities package code.name.monkey.retromusic.activities
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import androidx.core.widget.NestedScrollView import androidx.core.widget.NestedScrollView
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
@ -14,12 +18,12 @@ import code.name.monkey.appthemehelper.util.ATHUtil.isWindowBackgroundDark
import code.name.monkey.appthemehelper.util.ColorUtil.isColorLight import code.name.monkey.appthemehelper.util.ColorUtil.isColorLight
import code.name.monkey.appthemehelper.util.ColorUtil.lightenColor import code.name.monkey.appthemehelper.util.ColorUtil.lightenColor
import code.name.monkey.appthemehelper.util.MaterialValueHelper.getPrimaryTextColor import code.name.monkey.appthemehelper.util.MaterialValueHelper.getPrimaryTextColor
import io.github.muntashirakon.music.BuildConfig import code.name.monkey.retromusic.BuildConfig
import io.github.muntashirakon.music.Constants import code.name.monkey.retromusic.Constants
import io.github.muntashirakon.music.databinding.FragmentWhatsNewBinding import code.name.monkey.retromusic.databinding.FragmentWhatsNewBinding
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.extensions.openUrl import code.name.monkey.retromusic.extensions.openUrl
import io.github.muntashirakon.music.util.PreferenceUtil.lastVersion import code.name.monkey.retromusic.util.PreferenceUtil.lastVersion
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.* import java.util.*
@ -76,6 +80,17 @@ class WhatsNewFragment : BottomSheetDialogFragment() {
) )
) )
binding.webView.loadData(changeLog, "text/html", "UTF-8") binding.webView.loadData(changeLog, "text/html", "UTF-8")
binding.webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
val url = request?.url ?: return false
//you can do checks here e.g. url.host equals to target one
startActivity(Intent(Intent.ACTION_VIEW, url))
return true
}
}
} catch (e: Throwable) { } catch (e: Throwable) {
binding.webView.loadData( binding.webView.loadData(
"<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8" "<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8"

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.base package code.name.monkey.retromusic.activities.base
import android.Manifest import android.Manifest
import android.content.Intent import android.content.Intent
@ -30,8 +30,10 @@ import android.widget.EditText
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.rootView
import code.name.monkey.retromusic.util.logD
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
abstract class AbsBaseActivity : AbsThemeActivity() { abstract class AbsBaseActivity : AbsThemeActivity() {
@ -52,7 +54,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
} }
private val snackBarContainer: View private val snackBarContainer: View
get() = window.decorView get() = rootView
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -75,7 +77,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
protected open fun onHasPermissionsChanged(hasPermissions: Boolean) { protected open fun onHasPermissionsChanged(hasPermissions: Boolean) {
// implemented by sub classes // implemented by sub classes
println(hasPermissions) logD(hasPermissions)
} }
override fun dispatchKeyEvent(event: KeyEvent): Boolean { override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@ -114,33 +116,19 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
for (grantResult in grantResults) { for (grantResult in grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) { if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale( if (ActivityCompat.shouldShowRequestPermissionRationale(
this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE this@AbsBaseActivity, Manifest.permission.READ_EXTERNAL_STORAGE,
) || ActivityCompat.shouldShowRequestPermissionRationale(
this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE,
) )
) { ) {
// User has deny from permission dialog // User has deny from permission dialog
Snackbar.make( Snackbar.make(
snackBarContainer, snackBarContainer,
permissionDeniedMessage!!, permissionDeniedMessage!!,
Snackbar.LENGTH_INDEFINITE Snackbar.LENGTH_SHORT
) )
.setAction(R.string.action_grant) { requestPermissions() } .setAction(R.string.action_grant) { requestPermissions() }
.setActionTextColor(accentColor()).show() .setActionTextColor(accentColor()).show()
} else if (ActivityCompat.shouldShowRequestPermissionRationale(
this@AbsBaseActivity, Manifest.permission.BLUETOOTH_CONNECT
)
) {
// User has deny from permission dialog
Snackbar.make(
snackBarContainer,
R.string.permission_bluetooth_denied,
Snackbar.LENGTH_INDEFINITE
)
.setAction(R.string.action_grant) {
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
PERMISSION_REQUEST)
}
.setActionTextColor(accentColor()).show()
} else { } else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page // User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make( Snackbar.make(
@ -165,11 +153,34 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
} }
hadPermissions = true hadPermissions = true
onHasPermissionsChanged(true) onHasPermissionsChanged(true)
} else if (requestCode == BLUETOOTH_PERMISSION_REQUEST) {
for (grantResult in grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this@AbsBaseActivity, Manifest.permission.BLUETOOTH_CONNECT
)
) {
// User has deny from permission dialog
Snackbar.make(
snackBarContainer,
R.string.permission_bluetooth_denied,
Snackbar.LENGTH_SHORT
)
.setAction(R.string.action_grant) {
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
BLUETOOTH_PERMISSION_REQUEST)
}
.setActionTextColor(accentColor()).show()
}
}
}
} }
} }
companion object { companion object {
const val PERMISSION_REQUEST = 100 const val PERMISSION_REQUEST = 100
const val BLUETOOTH_PERMISSION_REQUEST = 101
} }
// this lets keyboard close when clicked in background // this lets keyboard close when clicked in background

View file

@ -12,27 +12,29 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.base package code.name.monkey.retromusic.activities.base
import android.Manifest import android.Manifest
import android.content.* import android.content.*
import android.os.Bundle import android.os.Bundle
import android.os.IBinder import android.os.IBinder
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.db.toPlayCount import code.name.monkey.retromusic.db.toPlayCount
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.IMusicServiceEventListener import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import io.github.muntashirakon.music.repository.RealRepository import code.name.monkey.retromusic.repository.RealRepository
import io.github.muntashirakon.music.service.MusicService.Companion.FAVORITE_STATE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.FAVORITE_STATE_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.MEDIA_STORE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.MEDIA_STORE_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.META_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.META_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.PLAY_STATE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.PLAY_STATE_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.QUEUE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.REPEAT_MODE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.SHUFFLE_MODE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.logD
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
@ -95,8 +97,7 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
filter.addAction(MEDIA_STORE_CHANGED) filter.addAction(MEDIA_STORE_CHANGED)
filter.addAction(FAVORITE_STATE_CHANGED) filter.addAction(FAVORITE_STATE_CHANGED)
registerReceiver(musicStateReceiver, filter) ContextCompat.registerReceiver(this, musicStateReceiver, filter, ContextCompat.RECEIVER_NOT_EXPORTED)
receiverRegistered = true receiverRegistered = true
} }
@ -121,23 +122,14 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
listener.onPlayingMetaChanged() listener.onPlayingMetaChanged()
} }
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val entity = repository.songPresentInHistory(MusicPlayerRemote.currentSong)
if (entity != null) {
repository.updateHistorySong(MusicPlayerRemote.currentSong)
} else {
// Check whether pause history option is ON or OFF
if (!PreferenceUtil.pauseHistory) { if (!PreferenceUtil.pauseHistory) {
repository.addSongToHistory(MusicPlayerRemote.currentSong) repository.upsertSongInHistory(MusicPlayerRemote.currentSong)
}
}
val songs = repository.checkSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
if (songs.isNotEmpty()) {
repository.updateSongInPlayCount(songs.first().apply {
playCount += 1
})
} else {
repository.insertSongInPlayCount(MusicPlayerRemote.currentSong.toPlayCount())
} }
val song = repository.findSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
?.apply { playCount += 1 }
?: MusicPlayerRemote.currentSong.toPlayCount()
repository.upsertSongInPlayCount(song)
} }
} }
@ -185,12 +177,18 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
true true
) // just in case we need to know this at some point ) // just in case we need to know this at some point
sendBroadcast(intent) sendBroadcast(intent)
println("sendBroadcast $hasPermissions") logD("sendBroadcast $hasPermissions")
} }
override fun getPermissionsToRequest(): Array<String> { override fun getPermissionsToRequest(): Array<String> {
return mutableListOf(Manifest.permission.READ_EXTERNAL_STORAGE).apply { return mutableListOf<String>().apply {
if (!VersionUtils.hasQ()) { if (VersionUtils.hasT()) {
add(Manifest.permission.READ_MEDIA_AUDIO)
add(Manifest.permission.POST_NOTIFICATIONS)
} else {
add(Manifest.permission.READ_EXTERNAL_STORAGE)
}
if (!VersionUtils.hasR()) {
add(Manifest.permission.WRITE_EXTERNAL_STORAGE) add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
} }
}.toTypedArray() }.toTypedArray()

View file

@ -12,10 +12,12 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.base package code.name.monkey.retromusic.activities.base
import android.animation.ArgbEvaluator import android.animation.ArgbEvaluator
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.content.Intent
import android.content.SharedPreferences
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
@ -24,48 +26,74 @@ import android.view.ViewGroup
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
import android.view.animation.PathInterpolator import android.view.animation.PathInterpolator
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.activity.OnBackPressedCallback
import androidx.core.animation.doOnEnd import androidx.core.animation.doOnEnd
import androidx.core.view.* import androidx.core.view.*
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit import androidx.fragment.app.commit
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.ADAPTIVE_COLOR_APP
import io.github.muntashirakon.music.databinding.SlidingMusicPanelLayoutBinding import code.name.monkey.retromusic.ALBUM_COVER_STYLE
import io.github.muntashirakon.music.extensions.* import code.name.monkey.retromusic.ALBUM_COVER_TRANSFORM
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.CAROUSEL_EFFECT
import io.github.muntashirakon.music.fragments.NowPlayingScreen import code.name.monkey.retromusic.CIRCLE_PLAY_BUTTON
import io.github.muntashirakon.music.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.EXTRA_SONG_INFO
import io.github.muntashirakon.music.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.KEEP_SCREEN_ON
import io.github.muntashirakon.music.fragments.other.MiniPlayerFragment import code.name.monkey.retromusic.LIBRARY_CATEGORIES
import io.github.muntashirakon.music.fragments.player.adaptive.AdaptiveFragment import code.name.monkey.retromusic.NOW_PLAYING_SCREEN_ID
import io.github.muntashirakon.music.fragments.player.blur.BlurPlayerFragment import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.fragments.player.card.CardFragment import code.name.monkey.retromusic.SCREEN_ON_LYRICS
import io.github.muntashirakon.music.fragments.player.cardblur.CardBlurFragment import code.name.monkey.retromusic.SWIPE_ANYWHERE_NOW_PLAYING
import io.github.muntashirakon.music.fragments.player.circle.CirclePlayerFragment import code.name.monkey.retromusic.SWIPE_DOWN_DISMISS
import io.github.muntashirakon.music.fragments.player.classic.ClassicPlayerFragment import code.name.monkey.retromusic.TAB_TEXT_MODE
import io.github.muntashirakon.music.fragments.player.color.ColorFragment import code.name.monkey.retromusic.TOGGLE_ADD_CONTROLS
import io.github.muntashirakon.music.fragments.player.fit.FitFragment import code.name.monkey.retromusic.TOGGLE_FULL_SCREEN
import io.github.muntashirakon.music.fragments.player.flat.FlatPlayerFragment import code.name.monkey.retromusic.TOGGLE_VOLUME
import io.github.muntashirakon.music.fragments.player.full.FullPlayerFragment import code.name.monkey.retromusic.activities.PermissionActivity
import io.github.muntashirakon.music.fragments.player.gradient.GradientPlayerFragment import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
import io.github.muntashirakon.music.fragments.player.material.MaterialFragment import code.name.monkey.retromusic.extensions.*
import io.github.muntashirakon.music.fragments.player.md3.MD3PlayerFragment import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.fragments.player.normal.PlayerFragment import code.name.monkey.retromusic.fragments.NowPlayingScreen
import io.github.muntashirakon.music.fragments.player.peek.PeekPlayerFragment import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import io.github.muntashirakon.music.fragments.player.plain.PlainPlayerFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import io.github.muntashirakon.music.fragments.player.simple.SimplePlayerFragment import code.name.monkey.retromusic.fragments.other.MiniPlayerFragment
import io.github.muntashirakon.music.fragments.player.tiny.TinyPlayerFragment import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment
import io.github.muntashirakon.music.fragments.queue.PlayingQueueFragment import code.name.monkey.retromusic.fragments.player.blur.BlurPlayerFragment
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.fragments.player.card.CardFragment
import io.github.muntashirakon.music.model.CategoryInfo import code.name.monkey.retromusic.fragments.player.cardblur.CardBlurFragment
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.fragments.player.circle.CirclePlayerFragment
import io.github.muntashirakon.music.util.ViewUtil import code.name.monkey.retromusic.fragments.player.classic.ClassicPlayerFragment
import code.name.monkey.retromusic.fragments.player.color.ColorFragment
import code.name.monkey.retromusic.fragments.player.fit.FitFragment
import code.name.monkey.retromusic.fragments.player.flat.FlatPlayerFragment
import code.name.monkey.retromusic.fragments.player.full.FullPlayerFragment
import code.name.monkey.retromusic.fragments.player.gradient.GradientPlayerFragment
import code.name.monkey.retromusic.fragments.player.material.MaterialFragment
import code.name.monkey.retromusic.fragments.player.md3.MD3PlayerFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
import code.name.monkey.retromusic.fragments.player.peek.PeekPlayerFragment
import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment
import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment
import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment
import code.name.monkey.retromusic.fragments.queue.PlayingQueueFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.util.logD
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.* import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_DRAGGING
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HIDDEN
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_SETTLING
import com.google.android.material.bottomsheet.BottomSheetBehavior.from
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
SharedPreferences.OnSharedPreferenceChangeListener {
companion object { companion object {
val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName
} }
@ -74,13 +102,13 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private var windowInsets: WindowInsetsCompat? = null private var windowInsets: WindowInsetsCompat? = null
protected val libraryViewModel by viewModel<LibraryViewModel>() protected val libraryViewModel by viewModel<LibraryViewModel>()
private lateinit var bottomSheetBehavior: BottomSheetBehavior<FrameLayout> private lateinit var bottomSheetBehavior: BottomSheetBehavior<FrameLayout>
private var playerFragment: AbsPlayerFragment? = null private lateinit var playerFragment: AbsPlayerFragment
private var miniPlayerFragment: MiniPlayerFragment? = null private var miniPlayerFragment: MiniPlayerFragment? = null
private var nowPlayingScreen: NowPlayingScreen? = null private var nowPlayingScreen: NowPlayingScreen? = null
private var taskColor: Int = 0 private var taskColor: Int = 0
private var paletteColor: Int = Color.WHITE private var paletteColor: Int = Color.WHITE
private var navigationBarColor = 0 private var navigationBarColor = 0
protected abstract fun createContentView(): SlidingMusicPanelLayoutBinding
private val panelState: Int private val panelState: Int
get() = bottomSheetBehavior.state get() = bottomSheetBehavior.state
private lateinit var binding: SlidingMusicPanelLayoutBinding private lateinit var binding: SlidingMusicPanelLayoutBinding
@ -89,7 +117,18 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private var navigationBarColorAnimator: ValueAnimator? = null private var navigationBarColorAnimator: ValueAnimator? = null
private val argbEvaluator: ArgbEvaluator = ArgbEvaluator() private val argbEvaluator: ArgbEvaluator = ArgbEvaluator()
private val bottomSheetCallbackList = object : BottomSheetCallback() { private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
println("Handle back press ${bottomSheetBehavior.state}")
if (!handleBackPress()) {
remove()
onBackPressedDispatcher.onBackPressed()
}
}
}
private val bottomSheetCallbackList by lazy {
object : BottomSheetCallback() {
override fun onSlide(bottomSheet: View, slideOffset: Float) { override fun onSlide(bottomSheet: View, slideOffset: Float) {
setMiniPlayerAlphaProgress(slideOffset) setMiniPlayerAlphaProgress(slideOffset)
@ -104,6 +143,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
} }
override fun onStateChanged(bottomSheet: View, newState: Int) { override fun onStateChanged(bottomSheet: View, newState: Int) {
onBackPressedCallback.isEnabled = newState == STATE_EXPANDED
when (newState) { when (newState) {
STATE_EXPANDED -> { STATE_EXPANDED -> {
onPanelExpanded() onPanelExpanded()
@ -111,23 +151,28 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
keepScreenOn(true) keepScreenOn(true)
} }
} }
STATE_COLLAPSED -> { STATE_COLLAPSED -> {
onPanelCollapsed() onPanelCollapsed()
if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) { if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) {
keepScreenOn(false) keepScreenOn(false)
} }
} }
STATE_SETTLING, STATE_DRAGGING -> { STATE_SETTLING, STATE_DRAGGING -> {
if (fromNotification) { if (fromNotification) {
binding.bottomNavigationView.bringToFront() binding.navigationView.bringToFront()
fromNotification = false fromNotification = false
} }
} }
STATE_HIDDEN -> { STATE_HIDDEN -> {
MusicPlayerRemote.clearQueue() MusicPlayerRemote.clearQueue()
} }
else -> { else -> {
println("Do a flip") logD("Do a flip")
}
} }
} }
} }
@ -137,12 +182,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = createContentView() if (!hasPermissions()) {
startActivity(Intent(this, PermissionActivity::class.java))
finish()
}
binding = SlidingMusicPanelLayoutBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener( binding.root.setOnApplyWindowInsetsListener { _, insets ->
binding.root windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets)
) { _, insets ->
windowInsets = insets
insets insets
} }
chooseFragmentForTheme() chooseFragmentForTheme()
@ -151,21 +198,25 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
updateColor() updateColor()
if (!PreferenceUtil.materialYou) { if (!PreferenceUtil.materialYou) {
binding.slidingPanel.backgroundTintList = ColorStateList.valueOf(darkAccentColor()) binding.slidingPanel.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
bottomNavigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor()) navigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
} }
navigationBarColor = surfaceColor() navigationBarColor = surfaceColor()
onBackPressedDispatcher.addCallback(onBackPressedCallback)
} }
private fun setupBottomSheet() { private fun setupBottomSheet() {
bottomSheetBehavior = from(binding.slidingPanel) bottomSheetBehavior = from(binding.slidingPanel)
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList) bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
bottomSheetBehavior.significantVelocityThreshold = 300
setMiniPlayerAlphaProgress(0F) setMiniPlayerAlphaProgress(0F)
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) { if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) {
postRecreate() postRecreate()
} }
@ -177,10 +228,69 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList)
PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
} }
protected fun wrapSlidingMusicPanel(): SlidingMusicPanelLayoutBinding { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
return SlidingMusicPanelLayoutBinding.inflate(layoutInflater) when (key) {
SWIPE_DOWN_DISMISS -> {
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
}
TOGGLE_ADD_CONTROLS -> {
miniPlayerFragment?.setUpButtons()
}
NOW_PLAYING_SCREEN_ID -> {
chooseFragmentForTheme()
binding.slidingPanel.updateLayoutParams<ViewGroup.LayoutParams> {
height = if (nowPlayingScreen != Peek) {
ViewGroup.LayoutParams.MATCH_PARENT
} else {
ViewGroup.LayoutParams.WRAP_CONTENT
}
onServiceConnected()
}
}
ALBUM_COVER_TRANSFORM, CAROUSEL_EFFECT,
ALBUM_COVER_STYLE, TOGGLE_VOLUME, EXTRA_SONG_INFO, CIRCLE_PLAY_BUTTON,
-> {
chooseFragmentForTheme()
onServiceConnected()
}
SWIPE_ANYWHERE_NOW_PLAYING -> {
playerFragment.addSwipeDetector()
}
ADAPTIVE_COLOR_APP -> {
if (PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)) {
chooseFragmentForTheme()
onServiceConnected()
}
}
LIBRARY_CATEGORIES -> {
updateTabs()
}
TAB_TEXT_MODE -> {
navigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode
}
TOGGLE_FULL_SCREEN -> {
recreate()
}
SCREEN_ON_LYRICS -> {
keepScreenOn(bottomSheetBehavior.state == STATE_EXPANDED && PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics || PreferenceUtil.isScreenOnEnabled)
}
KEEP_SCREEN_ON -> {
maybeSetScreenOn()
}
}
} }
fun collapsePanel() { fun collapsePanel() {
@ -196,8 +306,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
val alpha = 1 - progress val alpha = 1 - progress
miniPlayerFragment?.view?.alpha = 1 - (progress / 0.2F) miniPlayerFragment?.view?.alpha = 1 - (progress / 0.2F)
miniPlayerFragment?.view?.isGone = alpha == 0f miniPlayerFragment?.view?.isGone = alpha == 0f
binding.bottomNavigationView.translationY = progress * 500 if (!isLandscape) {
binding.bottomNavigationView.alpha = alpha binding.navigationView.translationY = progress * 500
binding.navigationView.alpha = alpha
}
binding.playerFragmentContainer.alpha = (progress - 0.2F) / 0.2F binding.playerFragmentContainer.alpha = (progress - 0.2F) / 0.2F
} }
@ -224,13 +336,13 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
setLightStatusBarAuto() setLightStatusBarAuto()
setLightNavigationBarAuto() setLightNavigationBarAuto()
setTaskDescriptionColor(taskColor) setTaskDescriptionColor(taskColor)
playerFragment?.onHide() //playerFragment?.onHide()
} }
open fun onPanelExpanded() { open fun onPanelExpanded() {
setMiniPlayerAlphaProgress(1F) setMiniPlayerAlphaProgress(1F)
onPaletteColorChanged() onPaletteColorChanged()
playerFragment?.onShow() //playerFragment?.onShow()
} }
private fun setupSlidingUpPanel() { private fun setupSlidingUpPanel() {
@ -254,22 +366,16 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}) })
} }
val bottomNavigationView get() = binding.bottomNavigationView val navigationView get() = binding.navigationView
val slidingPanel get() = binding.slidingPanel val slidingPanel get() = binding.slidingPanel
val isBottomNavVisible get() = navigationView.isVisible && navigationView is BottomNavigationView
override fun onServiceConnected() { override fun onServiceConnected() {
super.onServiceConnected() super.onServiceConnected()
if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
hideBottomSheet(false) hideBottomSheet(false)
} }
})
} // don't call hideBottomSheet(true) here as it causes a bug with the SlidingUpPanelLayout
}
override fun onQueueChanged() { override fun onQueueChanged() {
super.onQueueChanged() super.onQueueChanged()
@ -280,12 +386,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
} }
} }
override fun onBackPressed() {
if (!handleBackPress()) super.onBackPressed()
}
private fun handleBackPress(): Boolean { private fun handleBackPress(): Boolean {
if (bottomSheetBehavior.peekHeight != 0 && playerFragment!!.onBackPressed()) return true
if (panelState == STATE_EXPANDED) { if (panelState == STATE_EXPANDED) {
collapsePanel() collapsePanel()
return true return true
@ -332,18 +433,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
} }
fun updateTabs() { fun updateTabs() {
binding.bottomNavigationView.menu.clear() binding.navigationView.menu.clear()
val currentTabs: List<CategoryInfo> = PreferenceUtil.libraryCategory val currentTabs: List<CategoryInfo> = PreferenceUtil.libraryCategory
for (tab in currentTabs) { for (tab in currentTabs) {
if (tab.visible) { if (tab.visible) {
val menu = tab.category val menu = tab.category
binding.bottomNavigationView.menu.add(0, menu.id, 0, menu.stringRes) binding.navigationView.menu.add(0, menu.id, 0, menu.stringRes)
.setIcon(menu.icon) .setIcon(menu.icon)
} }
} }
if (binding.bottomNavigationView.menu.size() == 1) { if (binding.navigationView.menu.size() == 1) {
isInOneTabMode = true isInOneTabMode = true
binding.bottomNavigationView.hide() binding.navigationView.isVisible = false
} else {
isInOneTabMode = false
} }
} }
@ -359,7 +462,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
animate: Boolean = false, animate: Boolean = false,
hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty(), hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty(),
) { ) {
if (!ViewCompat.isLaidOut(bottomNavigationView)) { if (!ViewCompat.isLaidOut(navigationView)) {
return return
} }
if (isInOneTabMode) { if (isInOneTabMode) {
@ -370,38 +473,38 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
) )
return return
} }
if (visible xor navigationView.isVisible) {
val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED
if (mAnimate) { if (mAnimate) {
if (visible) { if (visible) {
binding.bottomNavigationView.bringToFront() binding.navigationView.bringToFront()
binding.bottomNavigationView.show() binding.navigationView.show()
} else { } else {
binding.bottomNavigationView.hide() binding.navigationView.hide()
} }
} else { } else {
binding.bottomNavigationView.isVisible = false binding.navigationView.isVisible = visible
if (visible && bottomSheetBehavior.state != STATE_EXPANDED) { if (visible && bottomSheetBehavior.state != STATE_EXPANDED) {
binding.bottomNavigationView.bringToFront() binding.navigationView.bringToFront()
}
} }
} }
hideBottomSheet( hideBottomSheet(
hide = hideBottomSheet, hide = hideBottomSheet,
animate = animate, animate = animate,
isBottomNavVisible = visible isBottomNavVisible = visible && navigationView is BottomNavigationView
) )
} }
fun hideBottomSheet( fun hideBottomSheet(
hide: Boolean, hide: Boolean,
animate: Boolean = false, animate: Boolean = false,
isBottomNavVisible: Boolean = bottomNavigationView.isVisible, isBottomNavVisible: Boolean = navigationView.isVisible && navigationView is BottomNavigationView,
) { ) {
val heightOfBar = val heightOfBar = windowInsets.getBottomInsets() + dip(R.dimen.mini_player_height)
windowInsets.safeGetBottomInsets() +
if (MusicPlayerRemote.isCasting) dip(R.dimen.cast_mini_player_height) else dip(R.dimen.mini_player_height)
val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height) val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height)
if (hide) { if (hide) {
bottomSheetBehavior.peekHeight = -windowInsets.safeGetBottomInsets() bottomSheetBehavior.peekHeight = -windowInsets.getBottomInsets()
bottomSheetBehavior.state = STATE_COLLAPSED bottomSheetBehavior.state = STATE_COLLAPSED
libraryViewModel.setFabMargin( libraryViewModel.setFabMargin(
this, this,
@ -410,17 +513,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
} else { } else {
if (MusicPlayerRemote.playingQueue.isNotEmpty()) { if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.slidingPanel.elevation = 0F binding.slidingPanel.elevation = 0F
binding.bottomNavigationView.elevation = 5F binding.navigationView.elevation = 5F
if (isBottomNavVisible) { if (isBottomNavVisible) {
println("List") logD("List")
if (animate) { if (animate) {
bottomSheetBehavior.peekHeightAnimate(heightOfBarWithTabs) bottomSheetBehavior.peekHeightAnimate(heightOfBarWithTabs)
} else { } else {
bottomSheetBehavior.peekHeight = heightOfBarWithTabs bottomSheetBehavior.peekHeight = heightOfBarWithTabs
} }
libraryViewModel.setFabMargin(this, dip(R.dimen.mini_player_height_expanded)) libraryViewModel.setFabMargin(
this,
dip(R.dimen.bottom_nav_mini_player_height)
)
} else { } else {
println("Details") logD("Details")
if (animate) { if (animate) {
bottomSheetBehavior.peekHeightAnimate(heightOfBar).doOnEnd { bottomSheetBehavior.peekHeightAnimate(heightOfBar).doOnEnd {
binding.slidingPanel.bringToFront() binding.slidingPanel.bringToFront()
@ -443,7 +549,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private fun chooseFragmentForTheme() { private fun chooseFragmentForTheme() {
nowPlayingScreen = PreferenceUtil.nowPlayingScreen nowPlayingScreen = PreferenceUtil.nowPlayingScreen
val fragment: Fragment = when (nowPlayingScreen) { val fragment: AbsPlayerFragment = when (nowPlayingScreen) {
Blur -> BlurPlayerFragment() Blur -> BlurPlayerFragment()
Adaptive -> AdaptiveFragment() Adaptive -> AdaptiveFragment()
Normal -> PlayerFragment() Normal -> PlayerFragment()
@ -463,12 +569,12 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
Classic -> ClassicPlayerFragment() Classic -> ClassicPlayerFragment()
MD3 -> MD3PlayerFragment() MD3 -> MD3PlayerFragment()
else -> PlayerFragment() else -> PlayerFragment()
} // must implement AbsPlayerFragment } // must extend AbsPlayerFragment
supportFragmentManager.commit { supportFragmentManager.commit {
replace(R.id.playerFragmentContainer, fragment) replace(R.id.playerFragmentContainer, fragment)
} }
supportFragmentManager.executePendingTransactions() supportFragmentManager.executePendingTransactions()
playerFragment = whichFragment<AbsPlayerFragment>(R.id.playerFragmentContainer) playerFragment = whichFragment(R.id.playerFragmentContainer)
miniPlayerFragment = whichFragment<MiniPlayerFragment>(R.id.miniPlayerFragment) miniPlayerFragment = whichFragment<MiniPlayerFragment>(R.id.miniPlayerFragment)
miniPlayerFragment?.view?.setOnClickListener { expandPanel() } miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
} }

View file

@ -12,38 +12,35 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.base package code.name.monkey.retromusic.activities.base
import android.content.Context import android.content.Context
import android.content.res.Resources
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.view.KeyEvent import android.view.KeyEvent
import android.view.View import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
import androidx.core.os.ConfigurationCompat import androidx.core.os.LocaleListCompat
import code.name.monkey.appthemehelper.common.ATHToolbarActivity import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.LanguageContextWrapper import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.extensions.*
import io.github.muntashirakon.music.extensions.* import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.theme.getNightMode
import io.github.muntashirakon.music.util.theme.getNightMode import code.name.monkey.retromusic.util.theme.getThemeResValue
import io.github.muntashirakon.music.util.theme.getThemeResValue
import java.util.*
abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
updateLocale()
updateTheme() updateTheme()
hideStatusBar() hideStatusBar()
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setEdgeToEdgeOrImmersive() setEdgeToEdgeOrImmersive()
registerSystemUiVisibility() maybeSetScreenOn()
toggleScreenOn()
setLightNavigationBarAuto() setLightNavigationBarAuto()
setLightStatusBarAuto(surfaceColor()) setLightStatusBarAuto(surfaceColor())
if (VersionUtils.hasQ()) { if (VersionUtils.hasQ()) {
@ -60,8 +57,13 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
if (PreferenceUtil.isCustomFont) { if (PreferenceUtil.isCustomFont) {
setTheme(R.style.FontThemeOverlay) setTheme(R.style.FontThemeOverlay)
} }
if (PreferenceUtil.circlePlayButton) { }
setTheme(R.style.CircleFABOverlay)
private fun updateLocale() {
val localeCode = PreferenceUtil.languageCode
if (PreferenceUtil.isLocaleAutoStorageEnabled) {
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(localeCode))
PreferenceUtil.isLocaleAutoStorageEnabled = true
} }
} }
@ -76,20 +78,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
} }
} }
private fun registerSystemUiVisibility() {
val decorView = window.decorView
decorView.setOnSystemUiVisibilityChangeListener { visibility ->
if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
setImmersiveFullscreen()
}
}
}
private fun unregisterSystemUiVisibility() {
val decorView = window.decorView
decorView.setOnSystemUiVisibilityChangeListener(null)
}
override fun run() { override fun run() {
setImmersiveFullscreen() setImmersiveFullscreen()
} }
@ -101,7 +89,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
public override fun onDestroy() { public override fun onDestroy() {
super.onDestroy() super.onDestroy()
unregisterSystemUiVisibility()
exitFullscreen() exitFullscreen()
} }
@ -114,13 +101,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
} }
override fun attachBaseContext(newBase: Context?) { override fun attachBaseContext(newBase: Context?) {
val code = PreferenceUtil.languageCode super.attachBaseContext(newBase)
val locale = if (code == "auto") {
// Get the device default locale
ConfigurationCompat.getLocales(Resources.getSystem().configuration)[0]
} else {
Locale.forLanguageTag(code)
}
super.attachBaseContext(LanguageContextWrapper.wrap(newBase, locale))
} }
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.bugreport package code.name.monkey.retromusic.activities.bugreport
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
@ -23,13 +23,13 @@ import androidx.core.content.getSystemService
import androidx.core.net.toUri import androidx.core.net.toUri
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.base.AbsThemeActivity import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import io.github.muntashirakon.music.activities.bugreport.model.DeviceInfo import code.name.monkey.retromusic.activities.bugreport.model.DeviceInfo
import io.github.muntashirakon.music.databinding.ActivityBugReportBinding import code.name.monkey.retromusic.databinding.ActivityBugReportBinding
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.extensions.setTaskDescriptionColorAuto import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import io.github.muntashirakon.music.extensions.showToast import code.name.monkey.retromusic.extensions.showToast
open class BugReportActivity : AbsThemeActivity() { open class BugReportActivity : AbsThemeActivity() {
@ -64,7 +64,6 @@ open class BugReportActivity : AbsThemeActivity() {
private fun reportIssue() { private fun reportIssue() {
copyDeviceInfoToClipBoard() copyDeviceInfoToClipBoard()
val i = Intent(Intent.ACTION_VIEW) val i = Intent(Intent.ACTION_VIEW)
i.data = ISSUE_TRACKER_LINK.toUri() i.data = ISSUE_TRACKER_LINK.toUri()
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
@ -80,17 +79,11 @@ open class BugReportActivity : AbsThemeActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) { if (item.itemId == android.R.id.home) {
onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
private fun tryToFinishActivity() {
if (!isFinishing) {
finish()
}
}
companion object { companion object {
private const val ISSUE_TRACKER_LINK = private const val ISSUE_TRACKER_LINK =
"https://github.com/MuntashirAkon/Metro/issues/new" "https://github.com/MuntashirAkon/Metro/issues/new"

View file

@ -1,15 +1,15 @@
package io.github.muntashirakon.music.activities.bugreport.model package code.name.monkey.retromusic.activities.bugreport.model
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import androidx.annotation.IntRange import androidx.annotation.IntRange
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil.isAdaptiveColor import code.name.monkey.retromusic.util.PreferenceUtil.isAdaptiveColor
import io.github.muntashirakon.music.util.PreferenceUtil.languageCode import code.name.monkey.retromusic.util.PreferenceUtil.nowPlayingScreen
import io.github.muntashirakon.music.util.PreferenceUtil.nowPlayingScreen
import java.util.* import java.util.*
class DeviceInfo(context: Context) { class DeviceInfo(context: Context) {
@ -106,6 +106,6 @@ class DeviceInfo(context: Context) {
baseTheme = PreferenceUtil.baseTheme baseTheme = PreferenceUtil.baseTheme
nowPlayingTheme = context.getString(nowPlayingScreen.titleRes) nowPlayingTheme = context.getString(nowPlayingScreen.titleRes)
isAdaptive = isAdaptiveColor isAdaptive = isAdaptiveColor
selectedLang = languageCode selectedLang = AppCompatDelegate.getApplicationLocales().toLanguageTags()
} }
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.activities.saf; package code.name.monkey.retromusic.activities.saf;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@ -22,7 +22,7 @@ import androidx.annotation.Nullable;
import com.heinrichreimersoftware.materialintro.app.IntroActivity; import com.heinrichreimersoftware.materialintro.app.IntroActivity;
import com.heinrichreimersoftware.materialintro.slide.SimpleSlide; import com.heinrichreimersoftware.materialintro.slide.SimpleSlide;
import io.github.muntashirakon.music.R; import code.name.monkey.retromusic.R;
/** Created by hemanths on 2019-07-31. */ /** Created by hemanths on 2019-07-31. */
public class SAFGuideActivity extends IntroActivity { public class SAFGuideActivity extends IntroActivity {
@ -50,8 +50,8 @@ public class SAFGuideActivity extends IntroActivity {
? R.string.saf_guide_slide1_description_before_o ? R.string.saf_guide_slide1_description_before_o
: R.string.saf_guide_slide1_description) : R.string.saf_guide_slide1_description)
.image(R.drawable.saf_guide_1) .image(R.drawable.saf_guide_1)
.background(R.color.md_deep_purple_300) .background(code.name.monkey.appthemehelper.R.color.md_deep_purple_300)
.backgroundDark(R.color.md_deep_purple_400) .backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_400)
.layout(R.layout.fragment_simple_slide_large_image) .layout(R.layout.fragment_simple_slide_large_image)
.build()); .build());
addSlide( addSlide(
@ -59,8 +59,8 @@ public class SAFGuideActivity extends IntroActivity {
.title(R.string.saf_guide_slide2_title) .title(R.string.saf_guide_slide2_title)
.description(R.string.saf_guide_slide2_description) .description(R.string.saf_guide_slide2_description)
.image(R.drawable.saf_guide_2) .image(R.drawable.saf_guide_2)
.background(R.color.md_deep_purple_500) .background(code.name.monkey.appthemehelper.R.color.md_deep_purple_500)
.backgroundDark(R.color.md_deep_purple_600) .backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_600)
.layout(R.layout.fragment_simple_slide_large_image) .layout(R.layout.fragment_simple_slide_large_image)
.build()); .build());
addSlide( addSlide(
@ -68,8 +68,8 @@ public class SAFGuideActivity extends IntroActivity {
.title(R.string.saf_guide_slide3_title) .title(R.string.saf_guide_slide3_title)
.description(R.string.saf_guide_slide3_description) .description(R.string.saf_guide_slide3_description)
.image(R.drawable.saf_guide_3) .image(R.drawable.saf_guide_3)
.background(R.color.md_deep_purple_700) .background(code.name.monkey.appthemehelper.R.color.md_deep_purple_700)
.backgroundDark(R.color.md_deep_purple_800) .backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_800)
.layout(R.layout.fragment_simple_slide_large_image) .layout(R.layout.fragment_simple_slide_large_image)
.build()); .build());
} }

View file

@ -11,19 +11,19 @@
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.activities.saf package code.name.monkey.retromusic.activities.saf
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import io.github.muntashirakon.music.activities.saf.SAFGuideActivity.REQUEST_CODE_SAF_GUIDE import code.name.monkey.retromusic.activities.saf.SAFGuideActivity.REQUEST_CODE_SAF_GUIDE
import io.github.muntashirakon.music.util.SAFUtil import code.name.monkey.retromusic.util.SAFUtil
/** Created by buliasz on 2021-02-07. */ /** Created by buliasz on 2021-02-07. */
class SAFRequestActivity : Activity() { class SAFRequestActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val intent = Intent(this, SAFGuideActivity::class.java) val intent = Intent(this, code.name.monkey.retromusic.activities.saf.SAFGuideActivity::class.java)
startActivityForResult(intent, REQUEST_CODE_SAF_GUIDE) startActivityForResult(intent, REQUEST_CODE_SAF_GUIDE)
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.tageditor package code.name.monkey.retromusic.activities.tageditor
import android.app.Activity import android.app.Activity
import android.app.SearchManager import android.app.SearchManager
@ -29,25 +29,23 @@ import android.view.animation.OvershootInterpolator
import android.widget.ImageView import android.widget.ImageView
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.IntentSenderRequest import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.R.drawable import code.name.monkey.retromusic.activities.base.AbsBaseActivity
import io.github.muntashirakon.music.activities.base.AbsBaseActivity import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.activities.saf.SAFGuideActivity import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.hideSoftKeyboard
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import io.github.muntashirakon.music.extensions.hideSoftKeyboard import code.name.monkey.retromusic.model.ArtworkInfo
import io.github.muntashirakon.music.extensions.setTaskDescriptionColorAuto import code.name.monkey.retromusic.model.AudioTagInfo
import io.github.muntashirakon.music.model.ArtworkInfo import code.name.monkey.retromusic.repository.Repository
import io.github.muntashirakon.music.model.AudioTagInfo import code.name.monkey.retromusic.util.logD
import io.github.muntashirakon.music.repository.Repository import code.name.monkey.retromusic.util.logE
import io.github.muntashirakon.music.util.SAFUtil
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@ -57,7 +55,6 @@ import org.jaudiotagger.audio.AudioFileIO
import org.jaudiotagger.tag.FieldKey import org.jaudiotagger.tag.FieldKey
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.io.File import java.io.File
import java.util.*
abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() { abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
abstract val editorImage: ImageView abstract val editorImage: ImageView
@ -101,7 +98,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -110,7 +108,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TITLE) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TITLE)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -118,7 +117,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.COMPOSER) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.COMPOSER)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -127,7 +127,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -136,7 +137,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ARTIST) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ARTIST)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -145,7 +147,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -154,7 +157,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.GENRE) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.GENRE)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -163,7 +167,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.YEAR) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.YEAR)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -172,7 +177,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TRACK) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TRACK)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -181,7 +187,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.DISC_NO) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.DISC_NO)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -190,7 +197,8 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
get() { get() {
return try { return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.LYRICS) getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.LYRICS)
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
null null
} }
} }
@ -208,11 +216,17 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
) )
} }
return null return null
} catch (ignored: Exception) { } catch (e: Exception) {
logE(e)
return null return null
} }
} }
private val pickArtworkImage =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
loadImageFromFile(uri)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
_binding = bindingInflater.invoke(layoutInflater) _binding = bindingInflater.invoke(layoutInflater)
@ -223,7 +237,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
getIntentExtras() getIntentExtras()
songPaths = getSongPaths() songPaths = getSongPaths()
println(songPaths?.size) logD(songPaths?.size)
if (songPaths!!.isEmpty()) { if (songPaths!!.isEmpty()) {
finish() finish()
} }
@ -253,14 +267,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
} }
private fun startImagePicker() { private fun startImagePicker() {
val intent = Intent(Intent.ACTION_GET_CONTENT) pickArtworkImage.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
intent.type = "image/*"
startActivityForResult(
Intent.createChooser(
intent,
getString(R.string.pick_from_local_storage)
), REQUEST_CODE_SELECT_IMAGE
)
} }
protected abstract fun loadCurrentImage() protected abstract fun loadCurrentImage()
@ -276,7 +283,6 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
scaleY = 0f scaleY = 0f
isEnabled = false isEnabled = false
setOnClickListener { save() } setOnClickListener { save() }
TintHelper.setTintAuto(this, ThemeStore.accentColor(this@AbsTagEditorActivity), true)
} }
} }
@ -309,7 +315,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
android.R.id.home -> { android.R.id.home -> {
super.onBackPressed() onBackPressedDispatcher.onBackPressed()
return true return true
} }
} }
@ -334,7 +340,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
protected fun setImageBitmap(bitmap: Bitmap?, bgColor: Int) { protected fun setImageBitmap(bitmap: Bitmap?, bgColor: Int) {
if (bitmap == null) { if (bitmap == null) {
editorImage.setImageResource(drawable.default_audio_art) editorImage.setImageResource(R.drawable.default_audio_art)
} else { } else {
editorImage.setImageBitmap(bitmap) editorImage.setImageBitmap(bitmap)
} }
@ -352,7 +358,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
hideSoftKeyboard() hideSoftKeyboard()
hideFab() hideFab()
println(fieldKeyValueMap) logD(fieldKeyValueMap)
GlobalScope.launch { GlobalScope.launch {
if (VersionUtils.hasR()) { if (VersionUtils.hasR()) {
cacheFiles = TagWriter.writeTagsToFilesR( cacheFiles = TagWriter.writeTagsToFilesR(
@ -362,9 +368,12 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
artworkInfo artworkInfo
) )
) )
val pendingIntent = MediaStore.createWriteRequest(contentResolver, getSongUris())
if (cacheFiles.isNotEmpty()) {
val pendingIntent =
MediaStore.createWriteRequest(contentResolver, getSongUris())
launcher.launch(IntentSenderRequest.Builder(pendingIntent).build()) launcher.launch(IntentSenderRequest.Builder(pendingIntent).build())
}
} else { } else {
TagWriter.writeTagsToFiles( TagWriter.writeTagsToFiles(
this@AbsTagEditorActivity, AudioTagInfo( this@AbsTagEditorActivity, AudioTagInfo(
@ -402,36 +411,14 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
} }
} }
private lateinit var audioFile: AudioFile
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
super.onActivityResult(requestCode, resultCode, intent)
when (requestCode) {
REQUEST_CODE_SELECT_IMAGE -> if (resultCode == Activity.RESULT_OK) {
intent?.data?.let {
loadImageFromFile(it)
}
}
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
SAFUtil.openTreePicker(this)
}
SAFUtil.REQUEST_SAF_PICK_TREE -> {
if (resultCode == Activity.RESULT_OK) {
SAFUtil.saveTreeUri(this, intent)
writeTags(savedSongPaths)
}
}
SAFUtil.REQUEST_SAF_PICK_FILE -> {
if (resultCode == Activity.RESULT_OK) {
writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString))
}
}
}
}
private fun getAudioFile(path: String): AudioFile { private fun getAudioFile(path: String): AudioFile {
return try { return try {
AudioFileIO.read(File(path)) if (!this::audioFile.isInitialized) {
audioFile = AudioFileIO.read(File(path))
}
audioFile
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Could not read audio file $path", e) Log.e(TAG, "Could not read audio file $path", e)
AudioFile() AudioFile()

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.tageditor package code.name.monkey.retromusic.activities.tageditor
import android.app.Activity import android.app.Activity
import android.content.res.ColorStateList import android.content.res.ColorStateList
@ -28,17 +28,19 @@ import android.widget.ImageView
import android.widget.Toast import android.widget.Toast
import androidx.core.widget.doAfterTextChanged import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.ActivityAlbumTagEditorBinding import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
import io.github.muntashirakon.music.extensions.* import code.name.monkey.retromusic.extensions.*
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.model.ArtworkInfo import code.name.monkey.retromusic.model.ArtworkInfo
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.util.ImageUtil import code.name.monkey.retromusic.util.ImageUtil
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.RetroColorUtil.generatePalette import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette
import io.github.muntashirakon.music.util.RetroColorUtil.getColor import code.name.monkey.retromusic.util.RetroColorUtil.getColor
import code.name.monkey.retromusic.util.logD
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.ImageViewTarget import com.bumptech.glide.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition import com.bumptech.glide.request.transition.Transition
@ -98,7 +100,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBindin
binding.albumArtistText.setText(albumArtistName) binding.albumArtistText.setText(albumArtistName)
binding.genreTitle.setText(genreName) binding.genreTitle.setText(genreName)
binding.yearTitle.setText(songYear) binding.yearTitle.setText(songYear)
println(albumTitle + albumArtistName) logD(albumTitle + albumArtistName)
} }
override fun loadCurrentImage() { override fun loadCurrentImage() {
@ -131,7 +133,9 @@ class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBindin
} }
override fun loadImageFromFile(selectedFile: Uri?) { override fun loadImageFromFile(selectedFile: Uri?) {
GlideApp.with(this@AlbumTagEditorActivity).asBitmapPalette().load(selectedFile) Glide.with(this@AlbumTagEditorActivity)
.asBitmapPalette()
.load(selectedFile)
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) { .into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
override fun onResourceReady( override fun onResourceReady(

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.activities.tageditor package code.name.monkey.retromusic.activities.tageditor
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
@ -28,16 +28,18 @@ import android.widget.ImageView
import android.widget.Toast import android.widget.Toast
import androidx.core.widget.doAfterTextChanged import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.ActivitySongTagEditorBinding import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding
import io.github.muntashirakon.music.extensions.* import code.name.monkey.retromusic.extensions.*
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.model.ArtworkInfo import code.name.monkey.retromusic.model.ArtworkInfo
import io.github.muntashirakon.music.repository.SongRepository import code.name.monkey.retromusic.repository.SongRepository
import io.github.muntashirakon.music.util.ImageUtil import code.name.monkey.retromusic.util.ImageUtil
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.RetroColorUtil import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.logD
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.ImageViewTarget import com.bumptech.glide.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition import com.bumptech.glide.request.transition.Transition
@ -102,7 +104,7 @@ class SongTagEditorActivity : AbsTagEditorActivity<ActivitySongTagEditorBinding>
binding.discNumberText.setText(discNumber) binding.discNumberText.setText(discNumber)
binding.lyricsText.setText(lyrics) binding.lyricsText.setText(lyrics)
binding.songComposerText.setText(composer) binding.songComposerText.setText(composer)
println(songTitle + songYear) logD(songTitle + songYear)
} }
override fun loadCurrentImage() { override fun loadCurrentImage() {
@ -170,8 +172,11 @@ class SongTagEditorActivity : AbsTagEditorActivity<ActivitySongTagEditorBinding>
override fun getSongUris(): List<Uri> = listOf(MusicUtil.getSongFileUri(id)) override fun getSongUris(): List<Uri> = listOf(MusicUtil.getSongFileUri(id))
override fun loadImageFromFile(selectedFile: Uri?) { override fun loadImageFromFile(selectedFile: Uri?) {
GlideApp.with(this@SongTagEditorActivity).asBitmapPalette().load(selectedFile) Glide.with(this@SongTagEditorActivity)
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true) .asBitmapPalette()
.load(selectedFile)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) { .into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
override fun onResourceReady( override fun onResourceReady(
resource: BitmapPaletteWrapper, resource: BitmapPaletteWrapper,

View file

@ -0,0 +1,204 @@
package code.name.monkey.retromusic.activities.tageditor
import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.media.MediaScannerConnection
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener
import code.name.monkey.retromusic.model.AudioTagInfo
import code.name.monkey.retromusic.util.MusicUtil.createAlbumArtFile
import code.name.monkey.retromusic.util.MusicUtil.deleteAlbumArt
import code.name.monkey.retromusic.util.MusicUtil.insertAlbumArt
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.jaudiotagger.audio.AudioFileIO
import org.jaudiotagger.audio.exceptions.CannotReadException
import org.jaudiotagger.audio.exceptions.CannotWriteException
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException
import org.jaudiotagger.tag.FieldDataInvalidException
import org.jaudiotagger.tag.TagException
import org.jaudiotagger.tag.images.AndroidArtwork
import org.jaudiotagger.tag.images.Artwork
import java.io.File
import java.io.IOException
class TagWriter {
companion object {
suspend fun scan(context: Context, toBeScanned: List<String?>?) {
if (toBeScanned.isNullOrEmpty()) {
Log.i("scan", "scan: Empty")
context.showToast("Scan file from folder")
return
}
MediaScannerConnection.scanFile(
context,
toBeScanned.toTypedArray(),
null,
withContext(Dispatchers.Main) {
if (context is Activity) UpdateToastMediaScannerCompletionListener(
context, toBeScanned
) else null
}
)
}
suspend fun writeTagsToFiles(context: Context, info: AudioTagInfo) {
withContext(Dispatchers.IO) {
var artwork: Artwork? = null
var albumArtFile: File? = null
if (info.artworkInfo?.artwork != null) {
try {
albumArtFile = createAlbumArtFile(context).canonicalFile
info.artworkInfo.artwork.compress(
Bitmap.CompressFormat.JPEG,
100,
albumArtFile.outputStream()
)
artwork = AndroidArtwork.createArtworkFromFile(albumArtFile)
} catch (e: IOException) {
e.printStackTrace()
}
}
var wroteArtwork = false
var deletedArtwork = false
for (filePath in info.filePaths!!) {
try {
val audioFile = AudioFileIO.read(File(filePath))
val tag = audioFile.tagOrCreateAndSetDefault
if (info.fieldKeyValueMap != null) {
for ((key, value) in info.fieldKeyValueMap) {
try {
tag.setField(key, value)
} catch (e: FieldDataInvalidException) {
withContext(Dispatchers.Main) {
context.showToast(R.string.could_not_write_tags_to_file)
}
return@withContext listOf<File>()
} catch (e: Exception) {
e.printStackTrace()
}
}
}
if (info.artworkInfo != null) {
if (info.artworkInfo.artwork == null) {
tag.deleteArtworkField()
deletedArtwork = true
} else if (artwork != null) {
tag.deleteArtworkField()
tag.setField(artwork)
wroteArtwork = true
}
}
audioFile.commit()
} catch (e: CannotReadException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
} catch (e: CannotWriteException) {
e.printStackTrace()
} catch (e: TagException) {
e.printStackTrace()
} catch (e: ReadOnlyFileException) {
e.printStackTrace()
} catch (e: InvalidAudioFrameException) {
e.printStackTrace()
}
}
if (wroteArtwork) {
insertAlbumArt(context, info.artworkInfo!!.albumId, albumArtFile!!.path)
} else if (deletedArtwork) {
deleteAlbumArt(context, info.artworkInfo!!.albumId)
}
scan(context, info.filePaths)
}
}
@RequiresApi(Build.VERSION_CODES.R)
suspend fun writeTagsToFilesR(context: Context, info: AudioTagInfo): List<File> =
withContext(Dispatchers.IO) {
val cacheFiles = mutableListOf<File>()
var artwork: Artwork? = null
var albumArtFile: File? = null
if (info.artworkInfo?.artwork != null) {
try {
albumArtFile = createAlbumArtFile(context).canonicalFile
info.artworkInfo.artwork.compress(
Bitmap.CompressFormat.JPEG,
100,
albumArtFile.outputStream()
)
artwork = AndroidArtwork.createArtworkFromFile(albumArtFile)
} catch (e: IOException) {
e.printStackTrace()
}
}
var wroteArtwork = false
var deletedArtwork = false
for (filePath in info.filePaths!!) {
try {
val originFile = File(filePath)
val cacheFile = File(context.cacheDir, originFile.name)
cacheFiles.add(cacheFile)
originFile.inputStream().use { input ->
cacheFile.outputStream().use { output ->
input.copyTo(output)
}
}
val audioFile = AudioFileIO.read(cacheFile)
val tag = audioFile.tagOrCreateAndSetDefault
if (info.fieldKeyValueMap != null) {
for ((key, value) in info.fieldKeyValueMap) {
try {
tag.setField(key, value)
} catch (e: FieldDataInvalidException) {
withContext(Dispatchers.Main) {
context.showToast(R.string.could_not_write_tags_to_file)
}
return@withContext listOf<File>()
} catch (e: Exception) {
e.printStackTrace()
}
}
}
if (info.artworkInfo != null) {
if (info.artworkInfo.artwork == null) {
tag.deleteArtworkField()
deletedArtwork = true
} else if (artwork != null) {
tag.deleteArtworkField()
tag.setField(artwork)
wroteArtwork = true
}
}
audioFile.commit()
} catch (e: CannotReadException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
} catch (e: CannotWriteException) {
e.printStackTrace()
} catch (e: TagException) {
e.printStackTrace()
} catch (e: ReadOnlyFileException) {
e.printStackTrace()
} catch (e: InvalidAudioFrameException) {
e.printStackTrace()
}
}
if (wroteArtwork) {
insertAlbumArt(context, info.artworkInfo!!.albumId, albumArtFile!!.path)
} else if (deletedArtwork) {
deleteAlbumArt(context, info.artworkInfo!!.albumId)
}
cacheFiles
}
}
}

View file

@ -11,7 +11,7 @@
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.adapter package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.res.ColorStateList import android.content.res.ColorStateList
@ -22,15 +22,15 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.PreferenceDialogLibraryCategoriesListitemBinding import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategoriesListitemBinding
import io.github.muntashirakon.music.extensions.showToast import code.name.monkey.retromusic.extensions.showToast
import io.github.muntashirakon.music.model.CategoryInfo import code.name.monkey.retromusic.model.CategoryInfo
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.SwipeAndDragHelper import code.name.monkey.retromusic.util.SwipeAndDragHelper
import io.github.muntashirakon.music.util.SwipeAndDragHelper.ActionCompletionContract import code.name.monkey.retromusic.util.SwipeAndDragHelper.ActionCompletionContract
class CategoryInfoAdapter : RecyclerView.Adapter<CategoryInfoAdapter.ViewHolder>(), class CategoryInfoAdapter : RecyclerView.Adapter<code.name.monkey.retromusic.adapter.CategoryInfoAdapter.ViewHolder>(),
ActionCompletionContract { ActionCompletionContract {
var categoryInfos: MutableList<CategoryInfo> = var categoryInfos: MutableList<CategoryInfo> =
PreferenceUtil.libraryCategory.toMutableList() PreferenceUtil.libraryCategory.toMutableList()

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
@ -21,15 +21,17 @@ import android.view.ViewGroup
import android.view.ViewOutlineProvider import android.view.ViewOutlineProvider
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.ItemGenreBinding import code.name.monkey.retromusic.databinding.ItemGenreBinding
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.interfaces.IGenreClickListener import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.model.Genre import code.name.monkey.retromusic.interfaces.IGenreClickListener
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.model.Genre
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import java.util.* import java.util.*
/** /**
@ -68,10 +70,10 @@ class GenreAdapter(
private fun loadGenreImage(genre: Genre, holder: GenreAdapter.ViewHolder) { private fun loadGenreImage(genre: Genre, holder: GenreAdapter.ViewHolder) {
val genreSong = MusicUtil.songByGenre(genre.id) val genreSong = MusicUtil.songByGenre(genre.id)
GlideApp.with(activity) Glide.with(activity)
.asBitmapPalette() .asBitmapPalette()
.load(RetroGlideExtension.getSongModel(genreSong))
.songCoverOptions(genreSong) .songCoverOptions(genreSong)
.load(RetroGlideExtension.getSongModel(genreSong))
.into(object : RetroMusicColoredTarget(holder.binding.image) { .into(object : RetroMusicColoredTarget(holder.binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) { override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(holder, colors) setColors(holder, colors)

View file

@ -12,13 +12,12 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
@ -28,21 +27,21 @@ import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.github.muntashirakon.music.* import code.name.monkey.retromusic.*
import io.github.muntashirakon.music.adapter.album.AlbumAdapter import code.name.monkey.retromusic.adapter.album.AlbumAdapter
import io.github.muntashirakon.music.adapter.artist.ArtistAdapter import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
import io.github.muntashirakon.music.adapter.song.SongAdapter import code.name.monkey.retromusic.adapter.song.SongAdapter
import io.github.muntashirakon.music.fragments.home.HomeFragment import code.name.monkey.retromusic.fragments.home.HomeFragment
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import io.github.muntashirakon.music.interfaces.IArtistClickListener import code.name.monkey.retromusic.interfaces.IArtistClickListener
import io.github.muntashirakon.music.interfaces.IGenreClickListener import code.name.monkey.retromusic.model.Album
import io.github.muntashirakon.music.model.* import code.name.monkey.retromusic.model.Artist
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.model.Home
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
class HomeAdapter( class HomeAdapter(private val activity: AppCompatActivity) :
private val activity: AppCompatActivity RecyclerView.Adapter<RecyclerView.ViewHolder>(), IArtistClickListener, IAlbumClickListener {
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), IArtistClickListener, IAlbumClickListener,
IGenreClickListener {
private var list = listOf<Home>() private var list = listOf<Home>()
@ -134,6 +133,7 @@ class HomeAdapter(
notifyDataSetChanged() notifyDataSetChanged()
} }
@Suppress("UNCHECKED_CAST")
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) { private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) { fun bindView(home: Home) {
title.setText(home.titleRes) title.setText(home.titleRes)
@ -144,6 +144,7 @@ class HomeAdapter(
} }
} }
@Suppress("UNCHECKED_CAST")
private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) { private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) { fun bindView(home: Home) {
title.setText(home.titleRes) title.setText(home.titleRes)
@ -154,6 +155,7 @@ class HomeAdapter(
} }
} }
@Suppress("UNCHECKED_CAST")
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) { private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) { fun bindView(home: Home) {
title.setText(home.titleRes) title.setText(home.titleRes)
@ -161,7 +163,7 @@ class HomeAdapter(
val songAdapter = SongAdapter( val songAdapter = SongAdapter(
activity, activity,
home.arrayList as MutableList<Song>, home.arrayList as MutableList<Song>,
R.layout.item_favourite_card, null R.layout.item_favourite_card
) )
layoutManager = linearLayoutManager() layoutManager = linearLayoutManager()
adapter = songAdapter adapter = songAdapter
@ -172,15 +174,14 @@ class HomeAdapter(
open class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) { open class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView) val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView)
val title: AppCompatTextView = itemView.findViewById(R.id.title) val title: AppCompatTextView = itemView.findViewById(R.id.title)
val arrow: ImageView = itemView.findViewById(R.id.arrow)
val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area) val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area)
} }
private fun artistsAdapter(artists: List<Artist>) = private fun artistsAdapter(artists: List<Artist>) =
ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this) ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, this)
private fun albumAdapter(albums: List<Album>) = private fun albumAdapter(albums: List<Album>) =
AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this) AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, this)
private fun gridLayoutManager() = private fun gridLayoutManager() =
GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
@ -209,16 +210,4 @@ class HomeAdapter(
) )
) )
} }
override fun onClickGenre(genre: Genre, view: View) {
activity.findNavController(R.id.fragment_container).navigate(
R.id.genreDetailsFragment,
bundleOf(EXTRA_GENRE to genre),
null,
FragmentNavigatorExtras(
view to "genre"
)
)
}
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
@ -26,18 +26,21 @@ import androidx.fragment.app.FragmentActivity
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import io.github.muntashirakon.music.* import code.name.monkey.retromusic.*
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.db.PlaylistWithSongs import code.name.monkey.retromusic.db.PlaylistWithSongs
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
import io.github.muntashirakon.music.helper.menu.SongMenuHelper import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.model.Album import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.model.Artist import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import io.github.muntashirakon.music.model.Genre import code.name.monkey.retromusic.model.Album
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Artist
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import com.bumptech.glide.Glide
import java.util.* import java.util.*
class SearchAdapter( class SearchAdapter(
@ -60,27 +63,29 @@ class SearchAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return if (viewType == HEADER) ViewHolder( return when (viewType) {
HEADER -> ViewHolder(
LayoutInflater.from(activity).inflate( LayoutInflater.from(activity).inflate(
R.layout.sub_header, R.layout.sub_header,
parent, parent,
false false
), viewType ), viewType
) )
else if (viewType == ALBUM || viewType == ARTIST || viewType== ALBUM_ARTIST)
ViewHolder( ALBUM, ARTIST, ALBUM_ARTIST -> ViewHolder(
LayoutInflater.from(activity).inflate( LayoutInflater.from(activity).inflate(
R.layout.item_list_big, R.layout.item_list_big,
parent, parent,
false false
), viewType ), viewType
) )
else
ViewHolder( else -> ViewHolder(
LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false),
viewType viewType
) )
} }
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
when (getItemViewType(position)) { when (getItemViewType(position)) {
@ -89,24 +94,30 @@ class SearchAdapter(
val album = dataSet[position] as Album val album = dataSet[position] as Album
holder.title?.text = album.title holder.title?.text = album.title
holder.text?.text = album.artistName holder.text?.text = album.artistName
GlideApp.with(activity).asDrawable().albumCoverOptions(album.safeGetFirstSong()).load(RetroGlideExtension.getSongModel(album.safeGetFirstSong())) Glide.with(activity).asDrawable().albumCoverOptions(album.safeGetFirstSong())
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
.into(holder.image!!) .into(holder.image!!)
} }
ARTIST -> { ARTIST -> {
holder.imageTextContainer?.isVisible = true holder.imageTextContainer?.isVisible = true
val artist = dataSet[position] as Artist val artist = dataSet[position] as Artist
holder.title?.text = artist.name holder.title?.text = artist.name
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist) holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
GlideApp.with(activity).asDrawable().artistImageOptions(artist).load( Glide.with(activity).asDrawable().artistImageOptions(artist).load(
RetroGlideExtension.getArtistModel(artist)).into(holder.image!!) RetroGlideExtension.getArtistModel(artist)
).into(holder.image!!)
} }
SONG -> { SONG -> {
holder.imageTextContainer?.isVisible = true holder.imageTextContainer?.isVisible = true
val song = dataSet[position] as Song val song = dataSet[position] as Song
holder.title?.text = song.title holder.title?.text = song.title
holder.text?.text = song.albumName holder.text?.text = song.albumName
GlideApp.with(activity).asDrawable().songCoverOptions(song).load(RetroGlideExtension.getSongModel(song)).into(holder.image!!) Glide.with(activity).asDrawable().songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)).into(holder.image!!)
} }
GENRE -> { GENRE -> {
val genre = dataSet[position] as Genre val genre = dataSet[position] as Genre
holder.title?.text = genre.name holder.title?.text = genre.name
@ -119,19 +130,23 @@ class SearchAdapter(
) )
) )
} }
PLAYLIST -> { PLAYLIST -> {
val playlist = dataSet[position] as PlaylistWithSongs val playlist = dataSet[position] as PlaylistWithSongs
holder.title?.text = playlist.playlistEntity.playlistName holder.title?.text = playlist.playlistEntity.playlistName
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs) //holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
} }
ALBUM_ARTIST -> { ALBUM_ARTIST -> {
holder.imageTextContainer?.isVisible = true holder.imageTextContainer?.isVisible = true
val artist = dataSet[position] as Artist val artist = dataSet[position] as Artist
holder.title?.text = artist.name holder.title?.text = artist.name
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist) holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
GlideApp.with(activity).asDrawable().artistImageOptions(artist).load( Glide.with(activity).asDrawable().artistImageOptions(artist).load(
RetroGlideExtension.getArtistModel(artist)).into(holder.image!!) RetroGlideExtension.getArtistModel(artist)
).into(holder.image!!)
} }
else -> { else -> {
holder.title?.text = dataSet[position].toString() holder.title?.text = dataSet[position].toString()
holder.title?.setTextColor(ThemeStore.accentColor(activity)) holder.title?.setTextColor(ThemeStore.accentColor(activity))
@ -177,30 +192,35 @@ class SearchAdapter(
bundleOf(EXTRA_ALBUM_ID to (item as Album).id) bundleOf(EXTRA_ALBUM_ID to (item as Album).id)
) )
} }
ARTIST -> { ARTIST -> {
activity.findNavController(R.id.fragment_container).navigate( activity.findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment, R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to (item as Artist).id) bundleOf(EXTRA_ARTIST_ID to (item as Artist).id)
) )
} }
ALBUM_ARTIST -> { ALBUM_ARTIST -> {
activity.findNavController(R.id.fragment_container).navigate( activity.findNavController(R.id.fragment_container).navigate(
R.id.albumArtistDetailsFragment, R.id.albumArtistDetailsFragment,
bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name) bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name)
) )
} }
GENRE -> { GENRE -> {
activity.findNavController(R.id.fragment_container).navigate( activity.findNavController(R.id.fragment_container).navigate(
R.id.genreDetailsFragment, R.id.genreDetailsFragment,
bundleOf(EXTRA_GENRE to (item as Genre)) bundleOf(EXTRA_GENRE to (item as Genre))
) )
} }
PLAYLIST -> { PLAYLIST -> {
activity.findNavController(R.id.fragment_container).navigate( activity.findNavController(R.id.fragment_container).navigate(
R.id.playlistDetailsFragment, R.id.playlistDetailsFragment,
bundleOf(EXTRA_PLAYLIST to (item as PlaylistWithSongs)) bundleOf(EXTRA_PLAYLIST_ID to (item as PlaylistWithSongs).playlistEntity.playListId)
) )
} }
SONG -> { SONG -> {
MusicPlayerRemote.playNext(item as Song) MusicPlayerRemote.playNext(item as Song)
MusicPlayerRemote.playNextSong() MusicPlayerRemote.playNextSong()

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter package code.name.monkey.retromusic.adapter
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.view.LayoutInflater import android.view.LayoutInflater
@ -22,16 +22,14 @@ import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible import androidx.core.view.isVisible
import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ATHUtil
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.interfaces.ICallbacks
import io.github.muntashirakon.music.glide.audiocover.AudioFileCover import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.interfaces.ICabHolder import com.bumptech.glide.Glide
import io.github.muntashirakon.music.interfaces.ICallbacks
import io.github.muntashirakon.music.util.MusicUtil
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.signature.MediaStoreSignature import com.bumptech.glide.signature.MediaStoreSignature
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
@ -44,10 +42,9 @@ class SongFileAdapter(
override val activity: AppCompatActivity, override val activity: AppCompatActivity,
private var dataSet: List<File>, private var dataSet: List<File>,
private val itemLayoutRes: Int, private val itemLayoutRes: Int,
private val iCallbacks: ICallbacks?, private val iCallbacks: ICallbacks?
iCabHolder: ICabHolder?,
) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>( ) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(
activity, iCabHolder, R.menu.menu_media_selection activity, R.menu.menu_media_selection
), PopupTextProvider { ), PopupTextProvider {
init { init {
@ -97,7 +94,7 @@ class SongFileAdapter(
} }
private fun loadFileImage(file: File, holder: ViewHolder) { private fun loadFileImage(file: File, holder: ViewHolder) {
val iconColor = ATHUtil.resolveColor(activity, R.attr.colorControlNormal) val iconColor = ATHUtil.resolveColor(activity, androidx.appcompat.R.attr.colorControlNormal)
if (file.isDirectory) { if (file.isDirectory) {
holder.image?.let { holder.image?.let {
it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN) it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN)
@ -106,12 +103,12 @@ class SongFileAdapter(
holder.imageTextContainer?.setCardBackgroundColor( holder.imageTextContainer?.setCardBackgroundColor(
ATHUtil.resolveColor( ATHUtil.resolveColor(
activity, activity,
R.attr.colorSurface com.google.android.material.R.attr.colorSurface
) )
) )
} else { } else {
val error = activity.getTintedDrawable(R.drawable.ic_file_music, iconColor) val error = activity.getTintedDrawable(R.drawable.ic_audio_file, iconColor)
GlideApp.with(activity) Glide.with(activity)
.load(AudioFileCover(file.path)) .load(AudioFileCover(file.path))
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error) .error(error)
@ -147,7 +144,7 @@ class SongFileAdapter(
return MusicUtil.getSectionName(dataSet[position].name) return MusicUtil.getSectionName(dataSet[position].name)
} }
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
init { init {
if (menu != null && iCallbacks != null) { if (menu != null && iCallbacks != null) {

View file

@ -1,11 +1,11 @@
package io.github.muntashirakon.music.adapter package code.name.monkey.retromusic.adapter
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import java.io.File import java.io.File
class StorageAdapter( class StorageAdapter(

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.album package code.name.monkey.retromusic.adapter.album
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.view.LayoutInflater import android.view.LayoutInflater
@ -21,32 +21,31 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.helper.SortOrder import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.helper.SortOrder
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import io.github.muntashirakon.music.model.Album import code.name.monkey.retromusic.model.Album
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
open class AlbumAdapter( open class AlbumAdapter(
override val activity: FragmentActivity, override val activity: FragmentActivity,
var dataSet: List<Album>, var dataSet: List<Album>,
var itemLayoutRes: Int, var itemLayoutRes: Int,
iCabHolder: ICabHolder?,
val listener: IAlbumClickListener? val listener: IAlbumClickListener?
) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>( ) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>(
activity, activity,
iCabHolder,
R.menu.menu_media_selection R.menu.menu_media_selection
), PopupTextProvider { ), PopupTextProvider {
@ -113,7 +112,9 @@ open class AlbumAdapter(
return return
} }
val song = album.safeGetFirstSong() val song = album.safeGetFirstSong()
GlideApp.with(activity).asBitmapPalette().albumCoverOptions(song) Glide.with(activity)
.asBitmapPalette()
.albumCoverOptions(song)
//.checkIgnoreMediaStore() //.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.into(object : RetroMusicColoredTarget(holder.image!!) { .into(object : RetroMusicColoredTarget(holder.image!!) {
@ -163,6 +164,7 @@ open class AlbumAdapter(
when (PreferenceUtil.albumSortOrder) { when (PreferenceUtil.albumSortOrder) {
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName = SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName =
dataSet[position].title dataSet[position].title
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].albumArtist SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].albumArtist
SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString( SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(
dataSet[position].year dataSet[position].year

View file

@ -12,30 +12,33 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.album package code.name.monkey.retromusic.adapter.album
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.fragments.AlbumCoverStyle import code.name.monkey.retromusic.fragments.AlbumCoverStyle
import io.github.muntashirakon.music.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import io.github.muntashirakon.music.fragments.base.goToLyrics import code.name.monkey.retromusic.fragments.base.goToLyrics
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.misc.CustomFragmentStatePagerAdapter import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -95,7 +98,7 @@ class AlbumCoverPagerAdapter(
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
if (arguments != null) { if (arguments != null) {
song = requireArguments().getParcelable(SONG_ARG)!! song = BundleCompat.getParcelable(requireArguments(), SONG_ARG, Song::class.java)!!
} }
} }
@ -119,7 +122,7 @@ class AlbumCoverPagerAdapter(
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
MaterialAlertDialogBuilder( MaterialAlertDialogBuilder(
requireContext(), requireContext(),
R.style.ThemeOverlay_MaterialComponents_Dialog_Alert com.google.android.material.R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
).apply { ).apply {
setTitle(song.title) setTitle(song.title)
setMessage(if (data.isNullOrEmpty()) "No lyrics found" else data) setMessage(if (data.isNullOrEmpty()) "No lyrics found" else data)
@ -164,7 +167,9 @@ class AlbumCoverPagerAdapter(
} }
private fun loadAlbumCover(albumCover: ImageView) { private fun loadAlbumCover(albumCover: ImageView) {
GlideApp.with(this).asBitmapPalette().songCoverOptions(song) Glide.with(this)
.asBitmapPalette()
.songCoverOptions(song)
//.checkIgnoreMediaStore() //.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.dontAnimate() .dontAnimate()

View file

@ -12,28 +12,28 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.album package code.name.monkey.retromusic.adapter.album
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.helper.HorizontalAdapterHelper import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.interfaces.IAlbumClickListener import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import io.github.muntashirakon.music.model.Album import code.name.monkey.retromusic.model.Album
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
class HorizontalAlbumAdapter( class HorizontalAlbumAdapter(
activity: FragmentActivity, activity: FragmentActivity,
dataSet: List<Album>, dataSet: List<Album>,
ICabHolder: ICabHolder?,
albumClickListener: IAlbumClickListener albumClickListener: IAlbumClickListener
) : AlbumAdapter( ) : AlbumAdapter(
activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, ICabHolder, albumClickListener activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, albumClickListener
) { ) {
override fun createViewHolder(view: View, viewType: Int): ViewHolder { override fun createViewHolder(view: View, viewType: Int): ViewHolder {
@ -49,7 +49,9 @@ class HorizontalAlbumAdapter(
override fun loadAlbumCover(album: Album, holder: ViewHolder) { override fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) return if (holder.image == null) return
GlideApp.with(activity).asBitmapPalette().albumCoverOptions(album.safeGetFirstSong()) Glide.with(activity)
.asBitmapPalette()
.albumCoverOptions(album.safeGetFirstSong())
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong())) .load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
.into(object : RetroMusicColoredTarget(holder.image!!) { .into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) { override fun onColorReady(colors: MediaNotificationProcessor) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.artist package code.name.monkey.retromusic.adapter.artist
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.res.ColorStateList import android.content.res.ColorStateList
@ -23,34 +23,32 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.extensions.hide
import io.github.muntashirakon.music.extensions.hide import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.IAlbumArtistClickListener import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
import io.github.muntashirakon.music.interfaces.IArtistClickListener import code.name.monkey.retromusic.interfaces.IArtistClickListener
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.model.Artist
import io.github.muntashirakon.music.model.Artist import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
class ArtistAdapter( class ArtistAdapter(
override val activity: FragmentActivity, override val activity: FragmentActivity,
var dataSet: List<Artist>, var dataSet: List<Artist>,
var itemLayoutRes: Int, var itemLayoutRes: Int,
val ICabHolder: ICabHolder?,
val IArtistClickListener: IArtistClickListener, val IArtistClickListener: IArtistClickListener,
val IAlbumArtistClickListener: IAlbumArtistClickListener? = null val IAlbumArtistClickListener: IAlbumArtistClickListener? = null
) : AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist>( ) : AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist>(activity, R.menu.menu_media_selection),
activity, ICabHolder, R.menu.menu_media_selection PopupTextProvider {
), PopupTextProvider {
var albumArtistsOnly = false var albumArtistsOnly = false
@ -112,10 +110,10 @@ class ArtistAdapter(
if (holder.image == null) { if (holder.image == null) {
return return
} }
GlideApp.with(activity) Glide.with(activity)
.asBitmapPalette() .asBitmapPalette()
.load(RetroGlideExtension.getArtistModel(artist))
.artistImageOptions(artist) .artistImageOptions(artist)
.load(RetroGlideExtension.getArtistModel(artist))
.transition(RetroGlideExtension.getDefaultTransition()) .transition(RetroGlideExtension.getDefaultTransition())
.into(object : RetroMusicColoredTarget(holder.image!!) { .into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) { override fun onColorReady(colors: MediaNotificationProcessor) {
@ -159,7 +157,7 @@ class ArtistAdapter(
return MusicUtil.getSectionName(dataSet[position].name) return MusicUtil.getSectionName(dataSet[position].name)
} }
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
init { init {
menu?.isVisible = false menu?.isVisible = false

View file

@ -1,4 +1,4 @@
package io.github.muntashirakon.music.adapter.backup package code.name.monkey.retromusic.adapter.backup
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.view.LayoutInflater import android.view.LayoutInflater
@ -7,8 +7,8 @@ import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.ItemListBackupBinding import code.name.monkey.retromusic.databinding.ItemListBackupBinding
import java.io.File import java.io.File

View file

@ -0,0 +1,131 @@
package code.name.monkey.retromusic.adapter.base
import android.graphics.Color
import android.view.ActionMode
import android.view.Menu
import android.view.MenuItem
import androidx.activity.OnBackPressedCallback
import androidx.annotation.MenuRes
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.NumberRollViewBinding
import code.name.monkey.retromusic.views.NumberRollView
abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
open val activity: FragmentActivity, @MenuRes menuRes: Int,
) : RecyclerView.Adapter<V>(), ActionMode.Callback {
var actionMode: ActionMode? = null
private val checked: MutableList<I>
private var menuRes: Int
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
val inflater = mode?.menuInflater
inflater?.inflate(menuRes, menu)
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return false
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
if (item?.itemId == R.id.action_multi_select_adapter_check_all) {
checkAll()
} else {
onMultipleItemAction(item!!, ArrayList(checked))
actionMode?.finish()
clearChecked()
}
return true
}
override fun onDestroyActionMode(mode: ActionMode?) {
clearChecked()
activity.window.statusBarColor = when {
VersionUtils.hasMarshmallow() -> Color.TRANSPARENT
else -> Color.BLACK
}
actionMode = null
onBackPressedCallback.remove()
}
private fun checkAll() {
if (actionMode != null) {
checked.clear()
for (i in 0 until itemCount) {
val identifier = getIdentifier(i)
if (identifier != null) {
checked.add(identifier)
}
}
notifyDataSetChanged()
updateCab()
}
}
protected abstract fun getIdentifier(position: Int): I?
protected abstract fun getName(model: I): String?
protected fun isChecked(identifier: I): Boolean {
return checked.contains(identifier)
}
protected val isInQuickSelectMode: Boolean
get() = actionMode != null
protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List<I>)
protected fun setMultiSelectMenuRes(@MenuRes menuRes: Int) {
this.menuRes = menuRes
}
protected fun toggleChecked(position: Int): Boolean {
val identifier = getIdentifier(position) ?: return false
if (!checked.remove(identifier)) {
checked.add(identifier)
}
notifyItemChanged(position)
updateCab()
return true
}
private fun clearChecked() {
checked.clear()
notifyDataSetChanged()
}
private fun updateCab() {
if (actionMode == null) {
actionMode = activity.startActionMode(this)?.apply {
customView = NumberRollViewBinding.inflate(activity.layoutInflater).root
}
activity.onBackPressedDispatcher.addCallback(onBackPressedCallback)
}
val size = checked.size
when {
size <= 0 -> {
actionMode?.finish()
}
else -> {
actionMode?.customView?.findViewById<NumberRollView>(R.id.selection_mode_number)
?.setNumber(size, true)
}
}
}
init {
checked = ArrayList()
this.menuRes = menuRes
}
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (actionMode != null) {
actionMode?.finish()
remove()
}
}
}
}

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.adapter.base; package code.name.monkey.retromusic.adapter.base;
import android.graphics.Color; import android.graphics.Color;
import android.view.View; import android.view.View;
@ -27,7 +27,7 @@ import androidx.appcompat.widget.AppCompatImageView;
import com.google.android.material.card.MaterialCardView; import com.google.android.material.card.MaterialCardView;
import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractDraggableSwipeableItemViewHolder; import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractDraggableSwipeableItemViewHolder;
import io.github.muntashirakon.music.R; import code.name.monkey.retromusic.R;
public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHolder public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHolder
implements View.OnLongClickListener, View.OnClickListener { implements View.OnLongClickListener, View.OnClickListener {

View file

@ -12,16 +12,15 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.playlist package code.name.monkey.retromusic.adapter.playlist
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.model.Playlist
import io.github.muntashirakon.music.model.Playlist import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.MusicUtil
class LegacyPlaylistAdapter( class LegacyPlaylistAdapter(
private val activity: FragmentActivity, private val activity: FragmentActivity,
@ -36,7 +35,7 @@ class LegacyPlaylistAdapter(
notifyDataSetChanged() notifyDataSetChanged()
} }
class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView)
override fun onCreateViewHolder( override fun onCreateViewHolder(
parent: ViewGroup, parent: ViewGroup,

View file

@ -12,9 +12,10 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.playlist package code.name.monkey.retromusic.adapter.playlist
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
@ -23,34 +24,33 @@ import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.setPadding import androidx.core.view.setPadding
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R import code.name.monkey.appthemehelper.util.ATHUtil
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import code.name.monkey.appthemehelper.util.TintHelper
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.db.PlaylistEntity import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.db.PlaylistWithSongs import code.name.monkey.retromusic.db.PlaylistEntity
import io.github.muntashirakon.music.db.toSongs import code.name.monkey.retromusic.db.PlaylistWithSongs
import io.github.muntashirakon.music.extensions.dipToPix import code.name.monkey.retromusic.db.toSongs
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.extensions.dipToPix
import io.github.muntashirakon.music.glide.playlistPreview.PlaylistPreview import code.name.monkey.retromusic.glide.RetroGlideExtension.playlistOptions
import io.github.muntashirakon.music.helper.SortOrder.PlaylistSortOrder import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview
import io.github.muntashirakon.music.helper.menu.PlaylistMenuHelper import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.IPlaylistClickListener import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
class PlaylistAdapter( class PlaylistAdapter(
override val activity: FragmentActivity, override val activity: FragmentActivity,
var dataSet: List<PlaylistWithSongs>, var dataSet: List<PlaylistWithSongs>,
private var itemLayoutRes: Int, private var itemLayoutRes: Int,
ICabHolder: ICabHolder?,
private val listener: IPlaylistClickListener private val listener: IPlaylistClickListener
) : AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, PlaylistWithSongs>( ) : AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, PlaylistWithSongs>(
activity, activity,
ICabHolder,
R.menu.menu_playlists_selection R.menu.menu_playlists_selection
), PopupTextProvider { ), PopupTextProvider {
@ -72,7 +72,7 @@ class PlaylistAdapter(
return createViewHolder(view) return createViewHolder(view)
} }
fun createViewHolder(view: View): ViewHolder { private fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view) return ViewHolder(view)
} }
@ -101,16 +101,22 @@ class PlaylistAdapter(
holder.title?.text = getPlaylistTitle(playlist.playlistEntity) holder.title?.text = getPlaylistTitle(playlist.playlistEntity)
holder.text?.text = getPlaylistText(playlist) holder.text?.text = getPlaylistText(playlist)
holder.menu?.isGone = isChecked(playlist) holder.menu?.isGone = isChecked(playlist)
GlideApp.with(activity)
.load(
if (itemLayoutRes == R.layout.item_list) { if (itemLayoutRes == R.layout.item_list) {
holder.image?.setPadding(activity.dipToPix(8F).toInt()) holder.image?.setPadding(activity.dipToPix(8F).toInt())
R.drawable.ic_playlist_play holder.image?.setImageDrawable(getIconRes())
} else PlaylistPreview(playlist) } else {
) Glide.with(activity)
.load(PlaylistPreview(playlist))
.playlistOptions() .playlistOptions()
.into(holder.image!!) .into(holder.image!!)
} }
}
private fun getIconRes(): Drawable = TintHelper.createTintedDrawable(
activity,
R.drawable.ic_playlist_play,
ATHUtil.resolveColor(activity, android.R.attr.colorControlNormal)
)
override fun getItemCount(): Int { override fun getItemCount(): Int {
return dataSet.size return dataSet.size
@ -142,7 +148,7 @@ class PlaylistAdapter(
return songs return songs
} }
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
init { init {
menu?.setOnClickListener { view -> menu?.setOnClickListener { view ->
val popupMenu = PopupMenu(activity, view) val popupMenu = PopupMenu(activity, view)

View file

@ -12,24 +12,22 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.song package code.name.monkey.retromusic.adapter.song
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song
abstract class AbsOffsetSongAdapter( abstract class AbsOffsetSongAdapter(
activity: FragmentActivity, activity: FragmentActivity,
dataSet: MutableList<Song>, dataSet: MutableList<Song>,
@LayoutRes itemLayoutRes: Int, @LayoutRes itemLayoutRes: Int
ICabHolder: ICabHolder? ) : SongAdapter(activity, dataSet, itemLayoutRes) {
) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
if (viewType == OFFSET_ITEM) { if (viewType == OFFSET_ITEM) {

View file

@ -12,25 +12,21 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.song package code.name.monkey.retromusic.adapter.song
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.db.PlaylistEntity import code.name.monkey.retromusic.db.PlaylistEntity
import io.github.muntashirakon.music.db.toSongEntity import code.name.monkey.retromusic.db.toSongEntity
import io.github.muntashirakon.music.db.toSongsEntity import code.name.monkey.retromusic.db.toSongsEntity
import io.github.muntashirakon.music.dialogs.RemoveSongFromPlaylistDialog import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.extensions.accentOutlineColor import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.util.ViewUtil
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.ICabHolder
import io.github.muntashirakon.music.model.Song
import com.google.android.material.button.MaterialButton
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -38,12 +34,11 @@ import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
class OrderablePlaylistSongAdapter( class OrderablePlaylistSongAdapter(
private val playlist: PlaylistEntity, private val playlistId: Long,
activity: FragmentActivity, activity: FragmentActivity,
dataSet: MutableList<Song>, dataSet: MutableList<Song>,
itemLayoutRes: Int, itemLayoutRes: Int,
ICabHolder: ICabHolder?, ) : SongAdapter(activity, dataSet, itemLayoutRes),
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder),
DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> { DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
val libraryViewModel: LibraryViewModel by activity.viewModel() val libraryViewModel: LibraryViewModel by activity.viewModel()
@ -56,56 +51,27 @@ class OrderablePlaylistSongAdapter(
override fun getItemId(position: Int): Long { override fun getItemId(position: Int): Long {
// requires static value, it means need to keep the same value // requires static value, it means need to keep the same value
// even if the item position has been changed. // even if the item position has been changed.
return if (position != 0) { return dataSet[position].id
dataSet[position - 1].id
} else {
-1
}
} }
override fun createViewHolder(view: View): SongAdapter.ViewHolder { override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view) return ViewHolder(view)
} }
override fun getItemViewType(position: Int): Int {
return if (position == 0) OFFSET_ITEM else SONG
}
override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
if (holder.itemViewType == OFFSET_ITEM) {
val viewHolder = holder as ViewHolder
viewHolder.playAction?.let {
it.setOnClickListener {
MusicPlayerRemote.openQueue(dataSet, 0, true)
}
it.accentOutlineColor()
}
viewHolder.shuffleAction?.let {
it.setOnClickListener {
MusicPlayerRemote.openAndShuffleQueue(dataSet, true)
}
it.accentColor()
}
} else {
super.onBindViewHolder(holder, position - 1)
}
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<Song>) { override fun onMultipleItemAction(menuItem: MenuItem, selection: List<Song>) {
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.action_remove_from_playlist -> RemoveSongFromPlaylistDialog.create( R.id.action_remove_from_playlist -> RemoveSongFromPlaylistDialog.create(
selection.toSongsEntity( selection.toSongsEntity(
playlist playlistId
) )
) )
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST") .show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
else -> super.onMultipleItemAction(menuItem, selection) else -> super.onMultipleItemAction(menuItem, selection)
} }
} }
inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) { inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) {
val playAction: MaterialButton? = itemView.findViewById(R.id.playAction)
val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction)
override var songMenuRes: Int override var songMenuRes: Int
get() = R.menu.menu_item_playlist_song get() = R.menu.menu_item_playlist_song
@ -116,7 +82,7 @@ class OrderablePlaylistSongAdapter(
override fun onSongMenuItemClick(item: MenuItem): Boolean { override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_remove_from_playlist -> { R.id.action_remove_from_playlist -> {
RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlist.playListId)) RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlistId))
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST") .show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
return true return true
} }
@ -130,26 +96,22 @@ class OrderablePlaylistSongAdapter(
} }
override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean {
if (dataSet.size == 0 or 1 || isInQuickSelectMode) { if (isInQuickSelectMode) {
return false return false
} }
val dragHandle = holder.dragView ?: return false return ViewUtil.hitTest(holder.imageText!!, x, y) || ViewUtil.hitTest(
holder.dragView!!,
val handleWidth = dragHandle.width x,
val handleHeight = dragHandle.height y
val handleLeft = dragHandle.left )
val handleTop = dragHandle.top
return (x >= handleLeft && x < handleLeft + handleWidth &&
y >= handleTop && y < handleTop + handleHeight) && position != 0
} }
override fun onMoveItem(fromPosition: Int, toPosition: Int) { override fun onMoveItem(fromPosition: Int, toPosition: Int) {
dataSet.add(toPosition - 1, dataSet.removeAt(fromPosition - 1)) dataSet.add(toPosition, dataSet.removeAt(fromPosition))
} }
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange { override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange? {
return ItemDraggableRange(1, itemCount - 1) return null
} }
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean { override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {

View file

@ -12,22 +12,23 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.song package code.name.monkey.retromusic.adapter.song
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.MusicPlayerRemote.isPlaying import code.name.monkey.retromusic.helper.MusicPlayerRemote.isPlaying
import io.github.muntashirakon.music.helper.MusicPlayerRemote.playNextSong import code.name.monkey.retromusic.helper.MusicPlayerRemote.playNextSong
import io.github.muntashirakon.music.helper.MusicPlayerRemote.removeFromQueue import code.name.monkey.retromusic.helper.MusicPlayerRemote.removeFromQueue
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.ViewUtil import code.name.monkey.retromusic.util.ViewUtil
import com.bumptech.glide.Glide
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
@ -42,10 +43,9 @@ class PlayingQueueAdapter(
activity: FragmentActivity, activity: FragmentActivity,
dataSet: MutableList<Song>, dataSet: MutableList<Song>,
private var current: Int, private var current: Int,
itemLayoutRes: Int itemLayoutRes: Int,
) : SongAdapter( ) : SongAdapter(activity, dataSet, itemLayoutRes),
activity, dataSet, itemLayoutRes, null DraggableItemAdapter<PlayingQueueAdapter.ViewHolder>,
), DraggableItemAdapter<PlayingQueueAdapter.ViewHolder>,
SwipeableItemAdapter<PlayingQueueAdapter.ViewHolder>, SwipeableItemAdapter<PlayingQueueAdapter.ViewHolder>,
PopupTextProvider { PopupTextProvider {
@ -77,7 +77,7 @@ class PlayingQueueAdapter(
if (holder.image == null) { if (holder.image == null) {
return return
} }
GlideApp.with(activity) Glide.with(activity)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.songCoverOptions(song) .songCoverOptions(song)
.into(holder.image!!) .into(holder.image!!)
@ -153,6 +153,14 @@ class PlayingQueueAdapter(
dragView?.isVisible = true dragView?.isVisible = true
} }
override fun onClick(v: View?) {
if (isInQuickSelectMode) {
toggleChecked(layoutPosition)
} else {
MusicPlayerRemote.playSongAt(layoutPosition)
}
}
override fun onSongMenuItemClick(item: MenuItem): Boolean { override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_remove_from_playing_queue -> { R.id.action_remove_from_playing_queue -> {
@ -188,7 +196,7 @@ class PlayingQueueAdapter(
return if (result == SwipeableItemConstants.RESULT_CANCELED) { return if (result == SwipeableItemConstants.RESULT_CANCELED) {
SwipeResultActionDefault() SwipeResultActionDefault()
} else { } else {
SwipedResultActionRemoveItem(this, position, activity) SwipedResultActionRemoveItem(this, position)
} }
} }
@ -209,12 +217,9 @@ class PlayingQueueAdapter(
internal class SwipedResultActionRemoveItem( internal class SwipedResultActionRemoveItem(
private val adapter: PlayingQueueAdapter, private val adapter: PlayingQueueAdapter,
private val position: Int, private val position: Int,
private val activity: FragmentActivity
) : SwipeResultActionRemoveItem() { ) : SwipeResultActionRemoveItem() {
private var songToRemove: Song? = null private var songToRemove: Song? = null
private val isPlaying: Boolean = MusicPlayerRemote.isPlaying
private val songProgressMillis = 0
override fun onPerformAction() { override fun onPerformAction() {
// currentlyShownSnackbar = null // currentlyShownSnackbar = null
} }

View file

@ -12,27 +12,25 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.song package code.name.monkey.retromusic.adapter.song
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.extensions.accentColor import code.name.monkey.retromusic.extensions.accentColor
import io.github.muntashirakon.music.extensions.accentOutlineColor import code.name.monkey.retromusic.extensions.accentOutlineColor
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil
import io.github.muntashirakon.music.util.RetroUtil
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
class ShuffleButtonSongAdapter( class ShuffleButtonSongAdapter(
activity: FragmentActivity, activity: FragmentActivity,
dataSet: MutableList<Song>, dataSet: MutableList<Song>,
itemLayoutRes: Int, itemLayoutRes: Int
ICabHolder: ICabHolder? ) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes) {
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
override fun createViewHolder(view: View): SongAdapter.ViewHolder { override fun createViewHolder(view: View): SongAdapter.ViewHolder {

View file

@ -12,22 +12,19 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.song package code.name.monkey.retromusic.adapter.song
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.MusicUtil
class SimpleSongAdapter( class SimpleSongAdapter(
context: FragmentActivity, context: FragmentActivity,
songs: ArrayList<Song>, songs: ArrayList<Song>,
layoutRes: Int, layoutRes: Int
ICabHolder: ICabHolder? ) : SongAdapter(context, songs, layoutRes) {
) : SongAdapter(context, songs, layoutRes, ICabHolder) {
override fun swapDataSet(dataSet: List<Song>) { override fun swapDataSet(dataSet: List<Song>) {
this.dataSet = dataSet.toMutableList() this.dataSet = dataSet.toMutableList()

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.adapter.song package code.name.monkey.retromusic.adapter.song
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Resources import android.content.res.Resources
@ -25,24 +25,24 @@ import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.navigation.findNavController import androidx.navigation.findNavController
import io.github.muntashirakon.music.EXTRA_ALBUM_ID import code.name.monkey.retromusic.EXTRA_ALBUM_ID
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.helper.SortOrder import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.menu.SongMenuHelper import code.name.monkey.retromusic.helper.SortOrder
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import io.github.muntashirakon.music.interfaces.ICabCallback import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil
import io.github.muntashirakon.music.util.RetroUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider import me.zhanghai.android.fastscroll.PopupTextProvider
/** /**
@ -53,13 +53,11 @@ open class SongAdapter(
override val activity: FragmentActivity, override val activity: FragmentActivity,
var dataSet: MutableList<Song>, var dataSet: MutableList<Song>,
protected var itemLayoutRes: Int, protected var itemLayoutRes: Int,
ICabHolder: ICabHolder?,
showSectionName: Boolean = true showSectionName: Boolean = true
) : AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>( ) : AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>(
activity, activity,
ICabHolder,
R.menu.menu_media_selection R.menu.menu_media_selection
), ICabCallback, PopupTextProvider { ), PopupTextProvider {
private var showSectionName = true private var showSectionName = true
@ -120,7 +118,9 @@ open class SongAdapter(
if (holder.image == null) { if (holder.image == null) {
return return
} }
GlideApp.with(activity).asBitmapPalette().songCoverOptions(song) Glide.with(activity)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.into(object : RetroMusicColoredTarget(holder.image!!) { .into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) { override fun onColorReady(colors: MediaNotificationProcessor) {
@ -159,6 +159,11 @@ open class SongAdapter(
override fun getPopupText(position: Int): String { override fun getPopupText(position: Int): String {
val sectionName: String? = when (PreferenceUtil.songSortOrder) { val sectionName: String? = when (PreferenceUtil.songSortOrder) {
SortOrder.SongSortOrder.SONG_DEFAULT -> return MusicUtil.getSectionName(
dataSet[position].title,
true
)
SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title
SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName
SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName
@ -216,6 +221,7 @@ open class SongAdapter(
} }
override fun onLongClick(v: View?): Boolean { override fun onLongClick(v: View?): Boolean {
println("Long click")
return toggleChecked(layoutPosition) return toggleChecked(layoutPosition)
} }
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appshortcuts package code.name.monkey.retromusic.appshortcuts
import android.content.Context import android.content.Context
import android.graphics.drawable.Icon import android.graphics.drawable.Icon
@ -22,9 +22,9 @@ import android.util.TypedValue
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
@RequiresApi(Build.VERSION_CODES.N_MR1) @RequiresApi(Build.VERSION_CODES.N_MR1)
object AppShortcutIconGenerator { object AppShortcutIconGenerator {

View file

@ -12,26 +12,26 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appshortcuts package code.name.monkey.retromusic.appshortcuts
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import io.github.muntashirakon.music.appshortcuts.shortcuttype.LastAddedShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.ShuffleAllShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.TopTracksShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
import io.github.muntashirakon.music.extensions.extraNotNull import code.name.monkey.retromusic.extensions.extraNotNull
import io.github.muntashirakon.music.model.Playlist import code.name.monkey.retromusic.model.Playlist
import io.github.muntashirakon.music.model.smartplaylist.LastAddedPlaylist import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist
import io.github.muntashirakon.music.model.smartplaylist.ShuffleAllPlaylist import code.name.monkey.retromusic.model.smartplaylist.ShuffleAllPlaylist
import io.github.muntashirakon.music.model.smartplaylist.TopTracksPlaylist import code.name.monkey.retromusic.model.smartplaylist.TopTracksPlaylist
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_PLAY_PLAYLIST import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PLAY_PLAYLIST
import io.github.muntashirakon.music.service.MusicService.Companion.INTENT_EXTRA_PLAYLIST import code.name.monkey.retromusic.service.MusicService.Companion.INTENT_EXTRA_PLAYLIST
import io.github.muntashirakon.music.service.MusicService.Companion.INTENT_EXTRA_SHUFFLE_MODE import code.name.monkey.retromusic.service.MusicService.Companion.INTENT_EXTRA_SHUFFLE_MODE
import io.github.muntashirakon.music.service.MusicService.Companion.SHUFFLE_MODE_NONE import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_NONE
import io.github.muntashirakon.music.service.MusicService.Companion.SHUFFLE_MODE_SHUFFLE import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_SHUFFLE
class AppShortcutLauncherActivity : Activity() { class AppShortcutLauncherActivity : Activity() {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appshortcuts package code.name.monkey.retromusic.appshortcuts
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
@ -22,9 +22,9 @@ import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon import android.graphics.drawable.Icon
import android.os.Build import android.os.Build
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import io.github.muntashirakon.music.appshortcuts.shortcuttype.LastAddedShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.ShuffleAllShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.TopTracksShortcutType import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
@TargetApi(Build.VERSION_CODES.N_MR1) @TargetApi(Build.VERSION_CODES.N_MR1)
class DynamicShortcutManager(private val context: Context) { class DynamicShortcutManager(private val context: Context) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appshortcuts.shortcuttype package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
@ -20,7 +20,7 @@ import android.content.Intent
import android.content.pm.ShortcutInfo import android.content.pm.ShortcutInfo
import android.os.Build import android.os.Build
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1) @TargetApi(Build.VERSION_CODES.N_MR1)
abstract class BaseShortcutType(internal var context: Context) { abstract class BaseShortcutType(internal var context: Context) {

View file

@ -12,15 +12,15 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appshortcuts.shortcuttype package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
import android.content.pm.ShortcutInfo import android.content.pm.ShortcutInfo
import android.os.Build import android.os.Build
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.appshortcuts.AppShortcutIconGenerator import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1) @TargetApi(Build.VERSION_CODES.N_MR1)
class LastAddedShortcutType(context: Context) : BaseShortcutType(context) { class LastAddedShortcutType(context: Context) : BaseShortcutType(context) {

View file

@ -12,15 +12,15 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appshortcuts.shortcuttype package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
import android.content.pm.ShortcutInfo import android.content.pm.ShortcutInfo
import android.os.Build import android.os.Build
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.appshortcuts.AppShortcutIconGenerator import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1) @TargetApi(Build.VERSION_CODES.N_MR1)
class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) { class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) {

View file

@ -11,15 +11,15 @@
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.appshortcuts.shortcuttype package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
import android.content.pm.ShortcutInfo import android.content.pm.ShortcutInfo
import android.os.Build import android.os.Build
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.appshortcuts.AppShortcutIconGenerator import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1) @TargetApi(Build.VERSION_CODES.N_MR1)
class TopTracksShortcutType(context: Context) : BaseShortcutType(context) { class TopTracksShortcutType(context: Context) : BaseShortcutType(context) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -25,18 +25,17 @@ import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.util.PreferenceUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil
import io.github.muntashirakon.music.util.RetroUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
@ -152,7 +151,7 @@ class AppWidgetBig : BaseAppWidget() {
if (target != null) { if (target != null) {
Glide.with(service).clear(target) Glide.with(service).clear(target)
} }
target = GlideApp.with(appContext) target = Glide.with(appContext)
.asBitmap() .asBitmap()
//.checkIgnoreMediaStore() //.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -25,18 +25,19 @@ import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
@ -143,7 +144,9 @@ class AppWidgetCard : BaseAppWidget() {
if (target != null) { if (target != null) {
Glide.with(service).clear(target) Glide.with(service).clear(target)
} }
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song) target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.centerCrop() .centerCrop()
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) { .into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -24,19 +24,20 @@ import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.TOGGLE_FAVORITE import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.RetroUtil import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.CustomTarget
@ -89,7 +90,7 @@ class AppWidgetCircle : BaseAppWidget() {
).toBitmap() ).toBitmap()
) )
val isFavorite = runBlocking(Dispatchers.IO) { val isFavorite = runBlocking(Dispatchers.IO) {
return@runBlocking MusicUtil.repository.isSongFavorite(song.id) return@runBlocking MusicUtil.isFavorite(song)
} }
val favoriteRes = val favoriteRes =
if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border
@ -114,7 +115,9 @@ class AppWidgetCircle : BaseAppWidget() {
if (target != null) { if (target != null) {
Glide.with(service).clear(target) Glide.with(service).clear(target)
} }
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song) target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.apply(RequestOptions.circleCropTransform()) .apply(RequestOptions.circleCropTransform())
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) { .into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -26,18 +26,19 @@ import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
@ -119,7 +120,9 @@ class AppWidgetClassic : BaseAppWidget() {
if (target != null) { if (target != null) {
Glide.with(service).clear(target) Glide.with(service).clear(target)
} }
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song) target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
//.checkIgnoreMediaStore() //.checkIgnoreMediaStore()
.centerCrop() .centerCrop()

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -25,19 +25,20 @@ import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import io.github.muntashirakon.music.util.DensityUtil import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.DensityUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
@ -144,7 +145,9 @@ class AppWidgetMD3 : BaseAppWidget() {
if (target != null) { if (target != null) {
Glide.with(service).clear(target) Glide.with(service).clear(target)
} }
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song) target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.centerCrop() .centerCrop()
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) { .into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -25,18 +25,19 @@ import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension
import io.github.muntashirakon.music.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
@ -122,7 +123,9 @@ class AppWidgetSmall : BaseAppWidget() {
if (target != null) { if (target != null) {
Glide.with(service).clear(target) Glide.with(service).clear(target)
} }
target = GlideApp.with(service).asBitmapPalette().songCoverOptions(song) target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
//.checkIgnoreMediaStore() //.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song)) .load(RetroGlideExtension.getSongModel(song))
.centerCrop() .centerCrop()

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ComponentName import android.content.ComponentName
@ -23,15 +23,15 @@ import android.widget.RemoteViews
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.MainActivity import code.name.monkey.retromusic.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.extensions.getTintedDrawable import code.name.monkey.retromusic.extensions.getTintedDrawable
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import io.github.muntashirakon.music.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
class AppWidgetText : BaseAppWidget() { class AppWidgetText : BaseAppWidget() {
override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) { override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) {
@ -40,29 +40,29 @@ class AppWidgetText : BaseAppWidget() {
appWidgetView.setImageViewBitmap( appWidgetView.setImageViewBitmap(
R.id.button_next, R.id.button_next,
context.getTintedDrawable(R.drawable.ic_skip_next, ContextCompat.getColor( context.getTintedDrawable(R.drawable.ic_skip_next, ContextCompat.getColor(
context, R.color.md_white_1000 context, code.name.monkey.appthemehelper.R.color.md_white_1000
)).toBitmap() )).toBitmap()
) )
appWidgetView.setImageViewBitmap( appWidgetView.setImageViewBitmap(
R.id.button_prev, R.id.button_prev,
context.getTintedDrawable(R.drawable.ic_skip_previous, ContextCompat.getColor( context.getTintedDrawable(R.drawable.ic_skip_previous, ContextCompat.getColor(
context, R.color.md_white_1000 context, code.name.monkey.appthemehelper.R.color.md_white_1000
) )
).toBitmap() ).toBitmap()
) )
appWidgetView.setImageViewBitmap( appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, R.id.button_toggle_play_pause,
context.getTintedDrawable(R.drawable.ic_play_arrow_white_32dp, ContextCompat.getColor( context.getTintedDrawable(R.drawable.ic_play_arrow_white_32dp, ContextCompat.getColor(
context, R.color.md_white_1000 context, code.name.monkey.appthemehelper.R.color.md_white_1000
) )
).toBitmap() ).toBitmap()
) )
appWidgetView.setTextColor( appWidgetView.setTextColor(
R.id.title, ContextCompat.getColor(context, R.color.md_white_1000) R.id.title, ContextCompat.getColor(context, code.name.monkey.appthemehelper.R.color.md_white_1000)
) )
appWidgetView.setTextColor( appWidgetView.setTextColor(
R.id.text, ContextCompat.getColor(context, R.color.md_white_1000) R.id.text, ContextCompat.getColor(context, code.name.monkey.appthemehelper.R.color.md_white_1000)
) )
linkButtons(context, appWidgetView) linkButtons(context, appWidgetView)
@ -127,7 +127,7 @@ class AppWidgetText : BaseAppWidget() {
appWidgetView.setImageViewBitmap( appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, R.id.button_toggle_play_pause,
service.getTintedDrawable(playPauseRes, ContextCompat.getColor( service.getTintedDrawable(playPauseRes, ContextCompat.getColor(
service, R.color.md_white_1000) service, code.name.monkey.appthemehelper.R.color.md_white_1000)
).toBitmap() ).toBitmap()
) )
appWidgetView.setImageViewBitmap( appWidgetView.setImageViewBitmap(
@ -136,7 +136,7 @@ class AppWidgetText : BaseAppWidget() {
R.drawable.ic_skip_next, R.drawable.ic_skip_next,
ContextCompat.getColor( ContextCompat.getColor(
service, service,
R.color.md_white_1000 code.name.monkey.appthemehelper.R.color.md_white_1000
) )
).toBitmap() ).toBitmap()
) )
@ -145,7 +145,7 @@ class AppWidgetText : BaseAppWidget() {
service.getTintedDrawable( service.getTintedDrawable(
R.drawable.ic_skip_previous, R.drawable.ic_skip_previous,
ContextCompat.getColor( ContextCompat.getColor(
service, R.color.md_white_1000 service, code.name.monkey.appthemehelper.R.color.md_white_1000
) )
).toBitmap() ).toBitmap()
) )

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets package code.name.monkey.retromusic.appwidgets
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
@ -20,7 +20,7 @@ import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.service.MusicService
class BootReceiver : BroadcastReceiver() { class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.appwidgets.base package code.name.monkey.retromusic.appwidgets.base
import android.app.PendingIntent import android.app.PendingIntent
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
@ -26,14 +26,14 @@ import android.graphics.drawable.Drawable
import android.widget.RemoteViews import android.widget.RemoteViews
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.service.MusicService.Companion.APP_WIDGET_UPDATE import code.name.monkey.retromusic.service.MusicService.Companion.APP_WIDGET_UPDATE
import io.github.muntashirakon.music.service.MusicService.Companion.EXTRA_APP_WIDGET_NAME import code.name.monkey.retromusic.service.MusicService.Companion.EXTRA_APP_WIDGET_NAME
import io.github.muntashirakon.music.service.MusicService.Companion.FAVORITE_STATE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.FAVORITE_STATE_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.META_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.META_CHANGED
import io.github.muntashirakon.music.service.MusicService.Companion.PLAY_STATE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.PLAY_STATE_CHANGED
abstract class BaseAppWidget : AppWidgetProvider() { abstract class BaseAppWidget : AppWidgetProvider() {

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.auto; package code.name.monkey.retromusic.auto;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;

View file

@ -11,19 +11,19 @@
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
*/ */
package io.github.muntashirakon.music.auto package code.name.monkey.retromusic.auto
import android.content.Context import android.content.Context
import android.content.res.Resources import android.content.res.Resources
import android.support.v4.media.MediaBrowserCompat import android.support.v4.media.MediaBrowserCompat
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.model.CategoryInfo import code.name.monkey.retromusic.model.CategoryInfo
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.repository.* import code.name.monkey.retromusic.repository.*
import io.github.muntashirakon.music.service.MusicService import code.name.monkey.retromusic.service.MusicService
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ -31,7 +31,7 @@ import java.lang.ref.WeakReference
* Created by Beesham Sarendranauth (Beesham) * Created by Beesham Sarendranauth (Beesham)
*/ */
class AutoMusicProvider( class AutoMusicProvider(
val mContext: Context, private val mContext: Context,
private val songsRepository: SongRepository, private val songsRepository: SongRepository,
private val albumsRepository: AlbumRepository, private val albumsRepository: AlbumRepository,
private val artistsRepository: ArtistRepository, private val artistsRepository: ArtistRepository,

View file

@ -1,4 +1,4 @@
package io.github.muntashirakon.music.auto package code.name.monkey.retromusic.auto
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.* import androidx.room.*

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.room.* import androidx.room.*
@ -23,16 +23,11 @@ interface HistoryDao {
private const val HISTORY_LIMIT = 100 private const val HISTORY_LIMIT = 100
} }
@Insert(onConflict = OnConflictStrategy.REPLACE) @Upsert
suspend fun insertSongInHistory(historyEntity: HistoryEntity) suspend fun upsertSongInHistory(historyEntity: HistoryEntity)
@Query("DELETE FROM HistoryEntity WHERE id= :songId") @Query("DELETE FROM HistoryEntity WHERE id= :songId")
fun deleteSongInHistory(songId: Long) fun deleteSongInHistory(songId: Long)
@Query("SELECT * FROM HistoryEntity WHERE id = :songId LIMIT 1")
suspend fun isSongPresentInHistory(songId: Long): HistoryEntity?
@Update
suspend fun updateHistorySong(historyEntity: HistoryEntity)
@Query("SELECT * FROM HistoryEntity ORDER BY time_played DESC LIMIT $HISTORY_LIMIT") @Query("SELECT * FROM HistoryEntity ORDER BY time_played DESC LIMIT $HISTORY_LIMIT")
fun historySongs(): List<HistoryEntity> fun historySongs(): List<HistoryEntity>

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.* import androidx.room.*

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -12,30 +12,25 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.* import androidx.room.*
@Dao @Dao
interface PlayCountDao { interface PlayCountDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertSongInPlayCount(playCountEntity: PlayCountEntity)
@Update @Upsert
fun updateSongInPlayCount(playCountEntity: PlayCountEntity) fun upsertSongInPlayCount(playCountEntity: PlayCountEntity)
@Delete @Delete
fun deleteSongInPlayCount(playCountEntity: PlayCountEntity) fun deleteSongInPlayCount(playCountEntity: PlayCountEntity)
@Query("SELECT * FROM PlayCountEntity WHERE id =:songId") @Query("SELECT * FROM PlayCountEntity WHERE id =:songId LIMIT 1")
fun checkSongExistInPlayCount(songId: Long): List<PlayCountEntity> fun findSongExistInPlayCount(songId: Long): PlayCountEntity?
@Query("SELECT * FROM PlayCountEntity ORDER BY play_count DESC") @Query("SELECT * FROM PlayCountEntity ORDER BY play_count DESC")
fun playCountSongs(): List<PlayCountEntity> fun playCountSongs(): List<PlayCountEntity>
@Query("DELETE FROM SongEntity WHERE id =:songId") @Query("DELETE FROM SongEntity WHERE id =:songId")
fun deleteSong(songId: Long) fun deleteSong(songId: Long)
@Query("UPDATE PlayCountEntity SET play_count = play_count + 1 WHERE id = :id")
fun updateQuantity(id: Long)
} }

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.room.* import androidx.room.*
@ -41,6 +41,10 @@ interface PlaylistDao {
@Query("SELECT * FROM PlaylistEntity") @Query("SELECT * FROM PlaylistEntity")
suspend fun playlistsWithSongs(): List<PlaylistWithSongs> suspend fun playlistsWithSongs(): List<PlaylistWithSongs>
@Transaction
@Query("SELECT * FROM PlaylistEntity WHERE playlist_id= :playlistId")
fun getPlaylist(playlistId: Long): LiveData<PlaylistWithSongs>
@Insert(onConflict = OnConflictStrategy.REPLACE) @Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSongsToPlaylist(songEntities: List<SongEntity>) suspend fun insertSongsToPlaylist(songEntities: List<SongEntity>)
@ -59,8 +63,9 @@ interface PlaylistDao {
@Delete @Delete
suspend fun deletePlaylistSongs(songs: List<SongEntity>) suspend fun deletePlaylistSongs(songs: List<SongEntity>)
@Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId") @RewriteQueriesToDropUnusedColumns
fun favoritesSongsLiveData(playlistId: Long): LiveData<List<SongEntity>> @Query("SELECT * FROM SongEntity ,(SELECT playlist_id FROM PlaylistEntity WHERE playlist_name= :playlistName LIMIT 1) AS playlist WHERE playlist_creator_id= playlist.playlist_id")
fun favoritesSongsLiveData(playlistName: String): LiveData<List<SongEntity>>
@Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId") @Query("SELECT * FROM SongEntity WHERE playlist_creator_id= :playlistId")
fun favoritesSongs(playlistId: Long): List<SongEntity> fun favoritesSongs(playlistId: Long): List<SongEntity>

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import android.os.Parcelable import android.os.Parcelable
import androidx.room.ColumnInfo import androidx.room.ColumnInfo

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import android.os.Parcelable import android.os.Parcelable
import androidx.room.Embedded import androidx.room.Embedded

View file

@ -12,20 +12,18 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import androidx.room.Database import androidx.room.Database
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
@Database( @Database(
entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class], entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class],
version = 23, version = 24,
exportSchema = false exportSchema = false
) )
abstract class RetroDatabase : RoomDatabase() { abstract class RetroDatabase : RoomDatabase() {
abstract fun playlistDao(): PlaylistDao abstract fun playlistDao(): PlaylistDao
abstract fun blackListStore(): BlackListStoreDao
abstract fun playCountDao(): PlayCountDao abstract fun playCountDao(): PlayCountDao
abstract fun historyDao(): HistoryDao abstract fun historyDao(): HistoryDao
abstract fun lyricsDao(): LyricsDao
} }

View file

@ -0,0 +1,11 @@
package code.name.monkey.retromusic.db
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
val MIGRATION_23_24 = object : Migration(23, 24) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("DROP TABLE LyricsEntity")
database.execSQL("DROP TABLE BlackListStoreEntity")
}
}

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import android.os.Parcelable import android.os.Parcelable
import androidx.room.ColumnInfo import androidx.room.ColumnInfo

View file

@ -12,9 +12,9 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.db package code.name.monkey.retromusic.db
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
fun List<HistoryEntity>.fromHistoryToSongs(): List<Song> { fun List<HistoryEntity>.fromHistoryToSongs(): List<Song> {
return map { return map {
@ -145,3 +145,9 @@ fun List<Song>.toSongsEntity(playlistEntity: PlaylistEntity): List<SongEntity> {
it.toSongEntity(playlistEntity.playListId) it.toSongEntity(playlistEntity.playListId)
} }
} }
fun List<Song>.toSongsEntity(playlistId: Long): List<SongEntity> {
return map {
it.toSongEntity(playlistId)
}
}

View file

@ -12,25 +12,25 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_PLAYLISTS import code.name.monkey.retromusic.EXTRA_PLAYLISTS
import io.github.muntashirakon.music.EXTRA_SONG import code.name.monkey.retromusic.EXTRA_SONG
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.db.PlaylistEntity import code.name.monkey.retromusic.db.PlaylistEntity
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.extraNotNull import code.name.monkey.retromusic.extensions.extraNotNull
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.activityViewModel
class AddToPlaylistDialog : DialogFragment() { class AddToPlaylistDialog : DialogFragment() {
private val libraryViewModel by sharedViewModel<LibraryViewModel>() private val libraryViewModel by activityViewModel<LibraryViewModel>()
companion object { companion object {
fun create(playlistEntities: List<PlaylistEntity>, song: Song): AddToPlaylistDialog { fun create(playlistEntities: List<PlaylistEntity>, song: Song): AddToPlaylistDialog {

View file

@ -1,4 +1,4 @@
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.Manifest import android.Manifest
import android.app.Dialog import android.app.Dialog
@ -8,9 +8,9 @@ import android.os.Bundle
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.util.getExternalStorageDirectory import code.name.monkey.retromusic.util.getExternalStorageDirectory
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItems import com.afollestad.materialdialogs.list.listItems
import com.afollestad.materialdialogs.list.updateListItems import com.afollestad.materialdialogs.list.updateListItems

View file

@ -12,29 +12,29 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils import android.text.TextUtils
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_SONG import code.name.monkey.retromusic.EXTRA_SONG
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.DialogPlaylistBinding import code.name.monkey.retromusic.databinding.DialogPlaylistBinding
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.extra import code.name.monkey.retromusic.extensions.extra
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.model.Song
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.activityViewModel
class CreatePlaylistDialog : DialogFragment() { class CreatePlaylistDialog : DialogFragment() {
private var _binding: DialogPlaylistBinding? = null private var _binding: DialogPlaylistBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private val libraryViewModel by sharedViewModel<LibraryViewModel>() private val libraryViewModel by activityViewModel<LibraryViewModel>()
companion object { companion object {
fun create(song: Song): CreatePlaylistDialog { fun create(song: Song): CreatePlaylistDialog {

View file

@ -12,26 +12,26 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_PLAYLIST import code.name.monkey.retromusic.EXTRA_PLAYLIST
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.db.PlaylistEntity import code.name.monkey.retromusic.db.PlaylistEntity
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.extraNotNull import code.name.monkey.retromusic.extensions.extraNotNull
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.fragments.ReloadType import code.name.monkey.retromusic.fragments.ReloadType
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.activityViewModel
class DeletePlaylistDialog : DialogFragment() { class DeletePlaylistDialog : DialogFragment() {
private val libraryViewModel by sharedViewModel<LibraryViewModel>() private val libraryViewModel by activityViewModel<LibraryViewModel>()
companion object { companion object {
@ -55,10 +55,13 @@ class DeletePlaylistDialog : DialogFragment() {
//noinspection ConstantConditions //noinspection ConstantConditions
if (playlists.size > 1) { if (playlists.size > 1) {
title = R.string.delete_playlists_title title = R.string.delete_playlists_title
message = String.format(getString(R.string.delete_x_playlists), playlists.size).parseAsHtml() message =
String.format(getString(R.string.delete_x_playlists), playlists.size).parseAsHtml()
} else { } else {
title = R.string.delete_playlist_title title = R.string.delete_playlist_title
message = String.format(getString(R.string.delete_playlist_x), playlists[0].playlistName).parseAsHtml() message =
String.format(getString(R.string.delete_playlist_x), playlists[0].playlistName)
.parseAsHtml()
} }
return materialDialog(title) return materialDialog(title)

View file

@ -12,7 +12,7 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Activity import android.app.Activity
import android.app.Dialog import android.app.Dialog
@ -25,17 +25,16 @@ import androidx.core.os.bundleOf
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import io.github.muntashirakon.music.EXTRA_SONG import code.name.monkey.retromusic.EXTRA_SONG
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.activities.saf.SAFGuideActivity import code.name.monkey.retromusic.extensions.extraNotNull
import io.github.muntashirakon.music.extensions.extraNotNull import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.fragments.LibraryViewModel
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.ReloadType
import io.github.muntashirakon.music.fragments.ReloadType import code.name.monkey.retromusic.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song
import io.github.muntashirakon.music.model.Song import code.name.monkey.retromusic.util.MusicUtil
import io.github.muntashirakon.music.util.MusicUtil import code.name.monkey.retromusic.util.SAFUtil
import io.github.muntashirakon.music.util.SAFUtil
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -120,8 +119,8 @@ class DeleteSongsDialog : DialogFragment() {
deleteSongs(songs) deleteSongs(songs)
} else { } else {
startActivityForResult( startActivityForResult(
Intent(requireActivity(), SAFGuideActivity::class.java), Intent(requireActivity(), code.name.monkey.retromusic.activities.saf.SAFGuideActivity::class.java),
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE code.name.monkey.retromusic.activities.saf.SAFGuideActivity.REQUEST_CODE_SAF_GUIDE
) )
} }
} }
@ -132,7 +131,7 @@ class DeleteSongsDialog : DialogFragment() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
when (requestCode) { when (requestCode) {
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> { code.name.monkey.retromusic.activities.saf.SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
SAFUtil.openTreePicker(this) SAFUtil.openTreePicker(this)
} }
SAFUtil.REQUEST_SAF_PICK_TREE, SAFUtil.REQUEST_SAF_PICK_TREE,

View file

@ -12,19 +12,19 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.LibraryViewModel
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.activityViewModel
class ImportPlaylistDialog : DialogFragment() { class ImportPlaylistDialog : DialogFragment() {
private val libraryViewModel by sharedViewModel<LibraryViewModel>() private val libraryViewModel by activityViewModel<LibraryViewModel>()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return materialDialog(R.string.import_playlist) return materialDialog(R.string.import_playlist)

View file

@ -1,14 +1,14 @@
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.databinding.DialogPlaybackSpeedBinding import code.name.monkey.retromusic.databinding.DialogPlaybackSpeedBinding
import io.github.muntashirakon.music.extensions.accent import code.name.monkey.retromusic.extensions.accent
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import com.google.android.material.slider.Slider import com.google.android.material.slider.Slider
class PlaybackSpeedDialog : DialogFragment() { class PlaybackSpeedDialog : DialogFragment() {

View file

@ -12,24 +12,24 @@
* See the GNU General Public License for more details. * See the GNU General Public License for more details.
* *
*/ */
package io.github.muntashirakon.music.dialogs package code.name.monkey.retromusic.dialogs
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import io.github.muntashirakon.music.EXTRA_SONG import code.name.monkey.retromusic.EXTRA_SONG
import io.github.muntashirakon.music.R import code.name.monkey.retromusic.R
import io.github.muntashirakon.music.db.SongEntity import code.name.monkey.retromusic.db.SongEntity
import io.github.muntashirakon.music.extensions.colorButtons import code.name.monkey.retromusic.extensions.colorButtons
import io.github.muntashirakon.music.extensions.extraNotNull import code.name.monkey.retromusic.extensions.extraNotNull
import io.github.muntashirakon.music.extensions.materialDialog import code.name.monkey.retromusic.extensions.materialDialog
import io.github.muntashirakon.music.fragments.LibraryViewModel import code.name.monkey.retromusic.fragments.LibraryViewModel
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.activityViewModel
class RemoveSongFromPlaylistDialog : DialogFragment() { class RemoveSongFromPlaylistDialog : DialogFragment() {
private val libraryViewModel by sharedViewModel<LibraryViewModel>() private val libraryViewModel by activityViewModel<LibraryViewModel>()
companion object { companion object {
fun create(song: SongEntity): RemoveSongFromPlaylistDialog { fun create(song: SongEntity): RemoveSongFromPlaylistDialog {

Some files were not shown because too many files have changed in this diff Show more