Compare commits

..

2345 commits
v3.5.10 ... 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
Muntashir Al-Islam
2fa5407b49 Bump version to v5.8.5
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2022-05-25 17:20:58 +06:00
Muntashir Al-Islam
36ecfb678e Display song images in album/artist details page
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2022-05-25 17:14:48 +06:00
Muntashir Al-Islam
5e8dba4d90 Fix crashing while changing screen orientation
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2022-05-25 16:19:46 +06:00
Muntashir Al-Islam
12bded682c Remove Internet permission along with all Internet stuff
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2022-05-25 15:11:55 +06:00
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
Muntashir Al-Islam
b103387d73 Update changelog
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2022-05-15 17:01:13 +06:00
Muntashir Al-Islam
2f782debeb Fix about page
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
2022-05-15 16:55:04 +06:00
Muntashir Al-Islam
c1b341ad51
Merge pull request #73 from JFronny/merge-upstream
Merge upstream
2022-05-15 13:26:05 +06:00
JFronny
cde7fd6565
Fix up and repackage 2022-05-14 15:47:55 +02:00
JFronny
4df292bddf
Merge remote-tracking branch 'retro/dev' into dev
# Conflicts:
#	.github/ISSUE_TEMPLATE/bug_report.md
#	README.md
#	app/build.gradle
#	app/src/main/AndroidManifest.xml
#	app/src/main/java/code/name/monkey/retromusic/App.kt
#	app/src/main/java/code/name/monkey/retromusic/Constants.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/PlayingQueueActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt
#	app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java
#	app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt
#	app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt
#	app/src/main/java/code/name/monkey/retromusic/extensions/DrawableExtensions.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/DetailListFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java
#	app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
#	app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
#	app/src/main/java/code/name/monkey/retromusic/model/Song.kt
#	app/src/main/java/code/name/monkey/retromusic/preferences/AlbumCoverStylePreferenceDialog.kt
#	app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt
#	app/src/main/java/code/name/monkey/retromusic/preferences/NowPlayingScreenPreferenceDialog.kt
#	app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
#	app/src/main/java/code/name/monkey/retromusic/service/MusicService.java
#	app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt
#	app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java
#	app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt
#	app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt
#	app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java
#	app/src/main/res/layout-sw600dp/item_list_no_image.xml
#	app/src/main/res/layout/activity_donation.xml
#	app/src/main/res/layout/activity_pro_version.xml
#	app/src/main/res/layout/fragment_blur.xml
#	app/src/main/res/layout/fragment_classic_player.xml
#	app/src/main/res/layout/fragment_color_player.xml
#	app/src/main/res/layout/fragment_fit.xml
#	app/src/main/res/layout/fragment_flat_player.xml
#	app/src/main/res/layout/fragment_full.xml
#	app/src/main/res/layout/fragment_gradient_player.xml
#	app/src/main/res/layout/fragment_home_player.xml
#	app/src/main/res/layout/fragment_peak_player.xml
#	app/src/main/res/layout/fragment_plain_player.xml
#	app/src/main/res/layout/fragment_simple_player.xml
#	app/src/main/res/layout/fragment_tiny_player.xml
#	app/src/main/res/layout/item_storage.xml
#	app/src/main/res/layout/sliding_music_panel_layout.xml
#	app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
#	app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
#	app/src/main/res/values-fa-rIR/strings.xml
2022-05-14 14:28:31 +02:00
JFronny
7c6514d010
Repackage to prepare for merge 2022-05-14 13:27:14 +02:00
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
Daksh P. Jain
29671a374e
Merge pull request #1352 from prathameshmm02/dev
More bug fixes
2022-05-13 22:12:03 +05:30
Prathamesh More
4b51be2b0c Bump version 2022-05-13 19:17:11 +05:30
Prathamesh More
88669ceaef Fixed Playback speed and pitch not working when CrossFade is enabled 2022-05-13 19:09:48 +05:30
Prathamesh More
1cfa5aaac5 Fixed Modify System settings button not working 2022-05-13 13:10:58 +05:30
Prathamesh More
3219ba0a5d Improved MD3 now playing theme 2022-05-13 12:58:20 +05:30
Prathamesh More
c8dbb0a0fd Added Bluetooth connect permission and better UX for permissions 2022-05-13 12:57:34 +05:30
Prathamesh More
33bbc0d07e Fix Swipe To Dismiss 2022-05-13 09:59:27 +05:30
Prathamesh More
80063ea903 Resource Cleanup 2022-05-13 09:51:36 +05:30
Daksh P. Jain
b6294db8cf
Merge pull request #1350 from prathameshmm02/dev
Bug fixes
2022-05-12 15:28:35 +05:30
Prathamesh More
c3e53977f7 Merge branch 'dev' of https://github.com/RetroMusicPlayer/RetroMusicPlayer into dev 2022-05-12 11:51:43 +05:30
Prathamesh More
9db961766d Update changelog 2022-05-12 11:41:49 +05:30
Prathamesh More
0f06f42e08 Better synced lyrics color in now playing themes 2022-05-12 11:41:49 +05:30
Prathamesh More
00581082ed Added Bluetooth connect permission to communicate with paired Bluetooth devices on A12+ 2022-05-12 11:41:48 +05:30
Prathamesh More
4b08919d7d Added an option to enable/disable swipe 2022-05-12 09:50:34 +05:30
Prathamesh More
3c26c39a5a Better Cast layout 2022-05-12 00:22:27 +05:30
Prathamesh More
af63d0f28c Fix MD3 theme layout 2022-05-12 00:06:22 +05:30
Prathamesh More
5f5bddf5e9 Code Cleanup 2022-05-12 00:06:01 +05:30
Prathamesh More
8d81424365 Set queue for mediaSession so that it (mostly next song) can be read by other apps 2022-05-12 00:04:50 +05:30
Prathamesh More
fcac420ac3 Update dependencies 2022-05-12 00:01:50 +05:30
Prathamesh More
9c07ca2763 Converted hardcoded strings to string resources 2022-05-11 23:06:34 +05:30
Prathamesh More
90e113e8ab Fix Lyrics not visible in MD3 theme 2022-05-11 18:38:12 +05:30
Prathamesh More
93bb652dd6 Fix blacklist crash 2022-05-11 18:17:32 +05:30
Prathamesh More
ae6c97a498 Update Gradle plugin 2022-05-10 11:41:50 +05:30
Daksh P. Jain
7913bf4eff
Merge pull request #1344 from prathameshmm02/dev
Bump versionCode
2022-05-07 20:29:06 +05:30
Prathamesh More
b677d4fa62 Bump versionCode 2022-05-07 17:16:48 +05:30
Daksh P. Jain
7077420646
Merge pull request #1343 from prathameshmm02/dev
Added MD3 playing theme
2022-05-07 16:22:35 +05:30
Prathamesh More
7debeb13c0 Added MD3 playing theme 2022-05-07 11:47:36 +05:30
Prathamesh More
ae13590204 Change lyrics color on Color theme 2022-05-07 11:44:53 +05:30
Daksh P. Jain
cfe4556aa1
Merge pull request #1341 from DoozyDoz/feat/audio_focus_2
Feature request - Manage audio focus
2022-05-07 09:42:01 +05:30
Doozy
51f772247a
Merge branch 'RetroMusicPlayer:dev' into feat/audio_focus_2 2022-05-06 21:28:11 +03:00
Doozy
bb93b66419 Updates to strings 2022-05-06 21:16:13 +03:00
Daksh P. Jain
a30303a846
Merge pull request #1340 from prathameshmm02/dev
Release 5.8.3
2022-05-06 15:17:11 +05:30
Doozy
3ca1baf68f removed unused variable 2022-05-05 15:59:17 +03:00
Prathamesh More
0433e464d8 Revert "Added Java 8+ API desugaring, so we can use Java 8+ features on any API"
This reverts commit ab5015d4
2022-05-05 18:22:00 +05:30
Doozy
67e9707b10 [feat] - Manage audio focus 2022-05-05 15:46:44 +03:00
Doozy
f86c30c608 Update PlaybackHandler.java 2022-05-05 15:13:01 +03:00
Prathamesh More
50e8d3e2ef Fix build warnings for strings 2022-05-05 16:26:01 +05:30
Prathamesh More
8a0a8e6c10 Merge branch 'dev' of https://github.com/RetroMusicPlayer/RetroMusicPlayer into dev 2022-05-05 16:23:30 +05:30
Prathamesh More
d823c20396 Updated MDC to stable version 2022-05-05 16:22:15 +05:30
Prathamesh More
07cfd6cd6e Suppress deprecated warnings
We can't do much about these. We have to work with playlists even though they are deprecated.
2022-05-05 16:22:15 +05:30
Prathamesh More
08f4c62b4a Migrated some legacy functions to kotlin extensions 2022-05-05 16:22:15 +05:30
Prathamesh More
ee300722af Migrate to coroutines from AsyncTask for saving of custom artist images 2022-05-05 16:22:15 +05:30
Daksh P. Jain
37aa73879c
Fix #1339 2022-05-05 14:59:17 +05:30
Prathamesh More
612b492aee Merge branch 'dev' of https://github.com/RetroMusicPlayer/RetroMusicPlayer into dev 2022-05-05 00:17:43 +05:30
Prathamesh More
82d4649346 Bump version & update changelog 2022-05-05 00:04:52 +05:30
Prathamesh More
7195ab2afd Fix ChromeCast crash and bugs 2022-05-04 23:51:23 +05:30
Daksh P. Jain
a4d3ae560b Merge branch 'l10n_dev' into dev 2022-05-04 22:45:48 +05:30
Prathamesh More
a0c745641a Fix Backup & Restore not restoring user profile images 2022-05-04 17:53:54 +05:30
Daksh P. Jain
a06ff41ed8 New translations strings.xml (Chinese Traditional) 2022-05-04 16:44:05 +05:30
Daksh P. Jain
c4f01148ca New translations strings.xml (Chinese Traditional) 2022-05-04 10:42:19 +05:30
Daksh P. Jain
3f30660998 New translations strings.xml (German) 2022-05-04 04:43:04 +05:30
Daksh P. Jain
44dedaddff New translations strings.xml (Chinese Traditional) 2022-05-04 04:43:02 +05:30
Daksh P. Jain
6e9ec4210d New translations strings.xml (Chinese Traditional) 2022-05-03 22:33:32 +05:30
Prathamesh More
95e39e4f4c Better BottomNavigationView hide/unhide animation 2022-05-03 20:31:53 +05:30
Prathamesh More
e7f700ee9a Optimized imports and removed unused dependencies 2022-05-02 19:13:17 +05:30
Prathamesh More
f55c7ac21c Transparent background for WebView in Changelog 2022-05-02 18:39:25 +05:30
Prathamesh More
02f076de57 Add support for Just Black with Material You 2022-05-02 18:24:44 +05:30
Prathamesh More
aa4c20bd8c Workaround loading of light mode resources and Revert "Remove and replace light mode default song, album, artist images with dark mode ones"
This reverts commit 337d7301
2022-05-02 17:25:57 +05:30
Prathamesh More
806b3beaa7 Fix Audio Crossfade 2022-05-02 17:25:57 +05:30
Prathamesh More
608c265390 Code Cleanup 2022-05-02 17:25:57 +05:30
Daksh P. Jain
41bfffc2f4 New translations strings.xml (Chinese Traditional) 2022-04-30 09:32:35 +05:30
Daksh P. Jain
e0dbe8921f New translations strings.xml (Chinese Traditional) 2022-04-30 03:15:16 +05:30
Daksh P. Jain
bbed112443 New translations strings.xml (Chinese Traditional) 2022-04-29 21:14:47 +05:30
Prathamesh More
8b5b6d0e64 Try to suppress crashes because of startForegroundService
Sometimes, this method is called before the app is in foreground resulting in crash because of A12 foreground limitations, so we try to catch the exception
2022-04-29 17:09:03 +05:30
Prathamesh More
8cd3fcfd38 Call recreate on A12 and higher as it smoothly recreates activity anyway, instead of manually recreating the activity by saving state and starting activity with transition 2022-04-29 17:05:15 +05:30
Prathamesh More
5e1637da62 Updated dependencies 2022-04-29 16:59:51 +05:30
Prathamesh More
ce3939aeb1 Fixed Image cover Crossfade bug in blur, blur card and circle themes 2022-04-29 16:59:30 +05:30
Daksh P. Jain
9af3bb43cf New translations strings.xml (Chinese Traditional) 2022-04-29 15:13:33 +05:30
Daksh P. Jain
30fbb9f05e New translations strings.xml (Chinese Traditional) 2022-04-29 09:08:56 +05:30
Daksh P. Jain
9e34557ed8 New translations strings.xml (Chinese Traditional) 2022-04-24 23:51:59 +05:30
Daksh P. Jain
3575394ca7 New translations strings.xml (Chinese Traditional) 2022-04-24 17:47:28 +05:30
Daksh P. Jain
2699fe9f1f New translations strings.xml (Indonesian) 2022-04-22 20:03:13 +05:30
Prathamesh More
af7997321c Code Cleanup 2022-04-21 22:36:58 +05:30
Prathamesh More
e605b8c695 Converted RetroUtil to Kotlin 2022-04-21 22:35:54 +05:30
Prathamesh More
6cc1ba746a Rename .java to .kt 2022-04-21 22:35:52 +05:30
Prathamesh More
55b3ec81b6 Fixed incorrect toast after adding songs to playlist 2022-04-21 22:21:53 +05:30
Prathamesh More
b143419520 Code Cleanup 2022-04-21 19:47:24 +05:30
Prathamesh More
4b4232ce6b Using registerForActivityResult 2022-04-21 19:24:04 +05:30
Prathamesh More
5216a11170 Use MenuProvider to inflate & handle menus in fragments 2022-04-21 19:07:04 +05:30
Prathamesh More
c5a25c200c Converted WhatsNewActivity to BottomSheetDialogFragment 2022-04-21 17:07:57 +05:30
Prathamesh More
dabdcc1d31 Removed RetroBottomSheetBehavior
RetroBottomSheetBehavior was there to enable or disable dragging of bottom sheet but BottomSheetBehavior has methods to do that
2022-04-21 17:06:32 +05:30
Prathamesh More
d34fcab30c Updated targetSdk to API 32 & Updated dependencies 2022-04-21 17:03:57 +05:30
Prathamesh More
576f88ddbc Updated MDC & Kotlin 2022-04-20 19:54:28 +05:30
Prathamesh More
b9c580ca3f Using Drawable Extensions to convert drawables to bitmaps 2022-04-20 19:54:02 +05:30
Prathamesh More
c09e39b23f Converted some util, glide classes to Kotlin 2022-04-20 19:52:57 +05:30
Prathamesh More
5ee5611fbe Rename .java to .kt 2022-04-20 19:52:55 +05:30
Prathamesh More
3e1657d8eb Removed unused methods 2022-04-20 19:50:19 +05:30
Prathamesh More
a3399e7aed Removed legacy playlist methods and converted PlaylistsUtil to Kotlin 2022-04-20 19:45:03 +05:30
Prathamesh More
bb37692e46 Rename .java to .kt 2022-04-20 19:45:01 +05:30
Prathamesh More
1b91394fe9 Optimized imports 2022-04-20 18:26:52 +05:30
Daksh P. Jain
e498b5b0ec New translations strings.xml (Spanish) 2022-04-20 09:06:36 +05:30
Prathamesh More
5d038118f5 Fixed alert dialog styles 2022-04-19 19:26:16 +05:30
Prathamesh More
48c1cfb6ab Added cancel button to list dialogs 2022-04-19 19:05:50 +05:30
Prathamesh More
098f9f939d Fixing incorrect song data in notification 2022-04-19 18:29:15 +05:30
Prathamesh More
4563378505 Remove android:background from parent views of fragment 2022-04-19 18:27:56 +05:30
Prathamesh More
3105da068d Extracted deprecated methods to functions e.g. Environment.getExternalStorageDirectory() 2022-04-19 17:45:12 +05:30
Prathamesh More
aaee076718 Use ActivityCompat 2022-04-19 17:45:12 +05:30
Prathamesh More
c570be349d Replaced AsyncTasks of Folders tab with coroutines 2022-04-19 17:45:12 +05:30
Prathamesh More
0604307b88 Fixed build errors 2022-04-19 17:45:12 +05:30
Prathamesh More
9542bed54a Fixed a crash because of incorrect id 2022-04-19 17:45:12 +05:30
Daksh P. Jain
08c8228ab6 New translations strings.xml (Russian) 2022-04-18 14:49:12 +05:30
Prathamesh More
b6fee3e25d Fixed incorrect windowBackground 2022-04-17 15:14:02 +05:30
Prathamesh More
5ff4438a42 Not using static app context wherever possible 2022-04-17 15:11:43 +05:30
Prathamesh More
904dd748cb Fixed Material theme light status bar when Adaptive color is on 2022-04-16 22:26:43 +05:30
Prathamesh More
6116b4714f Fixed notification not dismissible on pre-A12 devices 2022-04-16 01:32:48 +05:30
Prathamesh More
b572fe1aee Swipe down to dismiss Mini player (Made Bottom Sheet hideable) 2022-04-16 01:32:14 +05:30
Prathamesh More
2119e0c754 Fixed a crash when opening music file from a external file manager 2022-04-15 11:21:44 +05:30
Prathamesh More
986216e6ad Fixed Circle Widget bugs 2022-04-15 11:21:43 +05:30
Prathamesh More
9a1cf7655b Fixed sharing of files from SD Card 2022-04-15 11:21:43 +05:30
Prathamesh More
60b740021a Fixed Classic notification crash 2022-04-15 11:21:43 +05:30
Prathamesh More
4a7c367ab5 Fixed Window bottom insets when Expanded header(Collapsing toolbar) is enabled 2022-04-15 11:21:43 +05:30
Prathamesh More
e0f345b616 Cleanup with Kotlin extension functions 2022-04-15 11:21:40 +05:30
Prathamesh More
fc4f0396a4 Closed some leaked closeable objects 2022-04-13 11:50:16 +05:30
Prathamesh More
ee8deedd76 Fixed incorrect app context usage 2022-04-13 11:49:20 +05:30
Prathamesh More
fc5f3adcd9 Removed unused strings 2022-04-13 00:05:07 +05:30
Prathamesh More
a4d44406d6 Converted Java View classes to Kotlin 2022-04-13 00:04:36 +05:30
Prathamesh More
ad90694879 Code Cleanup 2022-04-13 00:03:27 +05:30
Prathamesh More
818703c573 Updated dependencies 2022-04-12 23:41:59 +05:30
Prathamesh More
eb21c07f5b [Cleanup] ViewModel cleanup, fixed coroutine dispatchers for some functions 2022-04-12 19:14:48 +05:30
Daksh P. Jain
b74115fe07 New translations strings.xml (Portuguese, Brazilian) 2022-04-12 15:22:46 +05:30
Daksh P. Jain
88efba96ef New translations strings.xml (Russian) 2022-04-11 17:11:26 +05:30
Daksh P. Jain
5d3097c43f New translations strings.xml (Chinese Simplified) 2022-04-09 09:57:03 +05:30
Prathamesh More
8b100b4a17
Merge pull request #1322 from TacoTheDank/ktxExtensions
Utilize KTX extensions
2022-04-08 20:15:10 +05:30
Prathamesh More
9bd15ed5c4
Merge branch 'dev' into ktxExtensions 2022-04-08 20:02:06 +05:30
Daksh P. Jain
55a12873b8 New translations strings.xml (Kurmanji (Kurdish)) 2022-04-08 16:49:13 +05:30
Prathamesh More
68d7c6daf7
Merge pull request #1321 from TacoTheDank/cleanupCompat
Clean up redundant compat usages
2022-04-08 10:49:50 +05:30
TacoTheDank
c264c28840 Simplify some LyricUtil methods with Kotlin 2022-04-07 17:36:49 -04:00
TacoTheDank
e31898a8ec Utilize toSpannable KTX extension 2022-04-07 17:36:49 -04:00
TacoTheDank
6e7288f0b5 Utilize updateLayoutParams KTX extension 2022-04-07 17:36:49 -04:00
TacoTheDank
04afa6a271 Utilize withStyledAttributes KTX extension 2022-04-07 17:36:49 -04:00
TacoTheDank
1a71242fc6 Utilize contentValuesOf KTX extension 2022-04-07 17:36:49 -04:00
TacoTheDank
e026a748e2 Utilize fragment KTX extensions 2022-04-07 17:36:49 -04:00
TacoTheDank
549aba88df Utilize bitmap KTX extensions 2022-04-07 17:36:49 -04:00
TacoTheDank
1c85dd0e32 Utilize sharedPref edit KTX extension 2022-04-07 17:36:48 -04:00
TacoTheDank
d4ec8b917c Utilize visibility KTX extensions 2022-04-07 17:27:59 -04:00
TacoTheDank
3aa7523435 Utilize bundleOf KTX extension 2022-04-07 17:21:55 -04:00
TacoTheDank
3a84650cd1 Utilize TextWatcher KTX extensions 2022-04-07 17:20:16 -04:00
TacoTheDank
eac16c64e4 Fix bug report link 2022-04-07 17:17:49 -04:00
TacoTheDank
4b1d2401f6 Utilize TextUtils-adjacent KTX extensions 2022-04-07 17:17:11 -04:00
TacoTheDank
707bf52d16 Utilize toUri KTX extension 2022-04-07 17:11:35 -04:00
TacoTheDank
6200a7f291 Utilize parseAsHtml KTX extension 2022-04-07 16:50:43 -04:00
TacoTheDank
a3b70aa061 Clean up redundant compat usages 2022-04-07 16:49:35 -04:00
Daksh P. Jain
8dbc3510b7 New translations strings.xml (Kurmanji (Kurdish)) 2022-04-08 01:45:21 +05:30
Daksh P. Jain
4aa9d19e2e New translations strings.xml (Polish) 2022-04-08 01:45:20 +05:30
Daksh P. Jain
ab9f7a0fe3 New translations strings.xml (Dutch) 2022-04-08 01:45:19 +05:30
Daksh P. Jain
c942502d9b New translations strings.xml (Korean) 2022-04-08 01:45:18 +05:30
Daksh P. Jain
310a8a7310 New translations strings.xml (Japanese) 2022-04-08 01:45:16 +05:30
Daksh P. Jain
a603a5624a New translations strings.xml (Italian) 2022-04-08 01:45:15 +05:30
Daksh P. Jain
afd2959e9e New translations strings.xml (Hungarian) 2022-04-08 01:45:14 +05:30
Daksh P. Jain
174673d602 New translations strings.xml (Portuguese) 2022-04-08 01:45:13 +05:30
Daksh P. Jain
df723fe70e New translations strings.xml (Greek) 2022-04-08 01:45:12 +05:30
Daksh P. Jain
0d611f7e36 New translations strings.xml (Czech) 2022-04-08 01:45:10 +05:30
Daksh P. Jain
548e668cd7 New translations strings.xml (Arabic) 2022-04-08 01:45:09 +05:30
Daksh P. Jain
6b32cf6684 New translations strings.xml (Spanish) 2022-04-08 01:45:08 +05:30
Daksh P. Jain
ef3866c1ab New translations strings.xml (French) 2022-04-08 01:45:06 +05:30
Daksh P. Jain
92e97ddefe New translations strings.xml (Filipino) 2022-04-08 01:45:05 +05:30
Daksh P. Jain
73f508cf74 New translations strings.xml (Turkish) 2022-04-08 01:45:04 +05:30
Daksh P. Jain
75c426f0fd New translations strings.xml (German) 2022-04-08 01:45:03 +05:30
Daksh P. Jain
8d5f4ce999 New translations strings.xml (Romanian) 2022-04-08 01:45:02 +05:30
Daksh P. Jain
a848d0d19b New translations strings.xml (Russian) 2022-04-08 01:45:01 +05:30
Daksh P. Jain
ef38b7fc65 New translations strings.xml (Swedish) 2022-04-08 01:44:59 +05:30
Daksh P. Jain
8995260066 New translations strings.xml (Ukrainian) 2022-04-08 01:44:58 +05:30
Daksh P. Jain
1c7e1102f0 New translations strings.xml (Chinese Simplified) 2022-04-08 01:44:57 +05:30
Daksh P. Jain
5362e06394 New translations strings.xml (Chinese Traditional) 2022-04-08 01:44:56 +05:30
Daksh P. Jain
028a2dcb77 New translations strings.xml (Vietnamese) 2022-04-08 01:44:55 +05:30
Daksh P. Jain
be57a97f6c New translations strings.xml (Portuguese, Brazilian) 2022-04-08 01:44:54 +05:30
Daksh P. Jain
102acb0d13 New translations strings.xml (Indonesian) 2022-04-08 01:44:52 +05:30
Daksh P. Jain
35c6cf9a85 New translations strings.xml (Persian) 2022-04-08 01:44:51 +05:30
Daksh P. Jain
9dafbb28f6 New translations strings.xml (Tamil) 2022-04-08 01:44:50 +05:30
Daksh P. Jain
0f9fa29f78 New translations strings.xml (Thai) 2022-04-08 01:44:49 +05:30
Daksh P. Jain
21a950893e New translations strings.xml (Croatian) 2022-04-08 01:44:48 +05:30
Daksh P. Jain
7d35b54fde New translations strings.xml (Hindi) 2022-04-08 01:44:46 +05:30
Daksh P. Jain
4fa643d234 New translations strings.xml (Burmese) 2022-04-08 01:44:45 +05:30
Daksh P. Jain
e8093a6fa3 New translations strings.xml (Malayalam) 2022-04-08 01:44:44 +05:30
Daksh P. Jain
c19bad70c2 New translations strings.xml (Serbian (Cyrillic)) 2022-04-08 01:44:43 +05:30
Daksh P. Jain
1c81a9b3c0 New translations strings.xml (Spanish, Latin America) 2022-04-08 01:44:42 +05:30
Daksh P. Jain
485bac2a96 Update source file strings.xml 2022-04-08 01:44:39 +05:30
Daksh P. Jain
4d873e59f0
Merge pull request #1320 from prathameshmm02/dev
Bug fixes
2022-04-07 20:07:01 +05:30
Prathamesh More
a5346609dd Bump versionCode and update changelog 2022-04-07 19:29:05 +05:30
Daksh P. Jain
c47baa6cc4 New translations strings.xml (Filipino) 2022-04-05 18:44:08 +05:30
Daksh P. Jain
5301facaa9 New translations strings.xml (Filipino) 2022-04-05 12:35:33 +05:30
Daksh P. Jain
46bb93f361 New translations strings.xml (Filipino) 2022-04-05 00:40:37 +05:30
Daksh P. Jain
0a05b26a33 New translations strings.xml (Spanish, Latin America) 2022-04-05 00:40:35 +05:30
Prathamesh More
45a40b1faa Updated Kotlin 2022-04-04 19:43:33 +05:30
Daksh P. Jain
727b6c69a6 New translations strings.xml (Filipino) 2022-04-04 18:34:08 +05:30
Prathamesh More
882e8c15cf Added more languages to in-app language chooser 2022-04-03 18:09:57 +05:30
Prathamesh More
998655fd48 Fixed ViewPager transformers 2022-04-02 15:50:34 +05:30
Prathamesh More
a67985d040 Code Cleanup 2022-04-02 11:55:46 +05:30
Prathamesh More
7b3b52e3b0 Fixed Song duration not visible in Card & Blur card themes 2022-04-01 23:50:22 +05:30
Prathamesh More
4dc84c2564 Code Cleanup 2022-04-01 20:06:25 +05:30
Daksh P. Jain
81821020bc New translations strings.xml (Romanian) 2022-03-28 17:21:41 +05:30
Daksh P. Jain
4f97642aea New translations strings.xml (Turkish) 2022-03-27 23:55:56 +05:30
Prathamesh More
7e3b4404cf [Notification] Code Cleanup 2022-03-27 22:57:05 +05:30
Prathamesh More
ad51d09672 Use MediaButtonReceiver from androidx.media to handle headset button actions 2022-03-27 21:42:38 +05:30
Prathamesh More
b4dc50306f Exit Playlist page when playlist is deleted 2022-03-27 21:42:37 +05:30
Prathamesh More
0c4cabc755 Fixed unshuffled songs when restoring the playing queue 2022-03-27 21:42:37 +05:30
Prathamesh More
ead8520333 Fixed shuffle button not shuffling songs 2022-03-27 21:42:35 +05:30
Daksh P. Jain
8faa515ac4 New translations strings.xml (Spanish, Latin America) 2022-03-27 07:40:25 +05:30
Daksh P. Jain
b970b27d9e New translations strings.xml (Spanish, Latin America) 2022-03-27 01:32:09 +05:30
Prathamesh More
97f93e09d6 Fixed settings change not reflecting in MainActivity 2022-03-26 18:34:51 +05:30
Prathamesh More
b0b552a060 Fixed speech-to-text search 2022-03-25 22:09:03 +05:30
Prathamesh More
d3597d123d Fixed some Playing queue crashes 2022-03-25 21:43:09 +05:30
Daksh P. Jain
bc137ebb75 New translations strings.xml (Filipino) 2022-03-25 20:56:20 +05:30
Daksh P. Jain
dc41fe509b
Merge pull request #1314 from prathameshmm02/dev
UI improvements
2022-03-25 15:09:59 +05:30
Prathamesh More
88b28e4c46 Bump versionCode 2022-03-25 14:39:54 +05:30
Prathamesh More
fe1a5c8ab0 Fixed Classic Notification crash 2022-03-25 14:17:33 +05:30
Prathamesh More
802cab7818 Updated MDC 2022-03-25 14:17:33 +05:30
Prathamesh More
9b9def5a73 Fixed contents of Artist details page going behind mini player 2022-03-25 14:17:33 +05:30
Prathamesh More
37201cbf3f Updated dependencies 2022-03-25 14:17:33 +05:30
Prathamesh More
f6d640b84a Fixed crash when clicking on Playlist in the Search Tab 2022-03-24 19:23:59 +05:30
Prathamesh More
ea56e1d99a Fixed Backup list overflowing 2022-03-24 19:07:25 +05:30
Daksh P. Jain
9a2ffeded1 New translations strings.xml (Spanish, Latin America) 2022-03-22 23:42:14 +05:30
Daksh P. Jain
8c036ae06b New translations strings.xml (Spanish, Latin America) 2022-03-22 17:44:21 +05:30
Daksh P. Jain
17851f77fd New translations strings.xml (Italian) 2022-03-21 23:53:48 +05:30
Daksh P. Jain
5c68e2e420 New translations strings.xml (Spanish) 2022-03-21 23:53:42 +05:30
Daksh P. Jain
0b2fd9c59a New translations strings.xml (French) 2022-03-21 23:53:41 +05:30
Daksh P. Jain
465a7fe38d New translations strings.xml (Spanish, Latin America) 2022-03-21 23:53:38 +05:30
Daksh P. Jain
7b25eec29f New translations strings.xml (Turkish) 2022-03-21 23:53:33 +05:30
Daksh P. Jain
fa204028f4 New translations strings.xml (Persian) 2022-03-21 23:53:28 +05:30
Daksh P. Jain
94cca145e3
Merge pull request #1309 from prathameshmm02/dev
Fixed build error
2022-03-21 18:40:26 +05:30
Prathamesh More
b4435b15a7 Fixed build error 2022-03-21 18:10:44 +05:30
Daksh P. Jain
e8727af212
Delete app/src/main/res/values-es-r419 directory 2022-03-21 17:44:49 +05:30
Daksh P. Jain
b313da0563
Merge pull request #1308 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2022-03-21 17:44:26 +05:30
Daksh P. Jain
12e1ac4713 New translations strings.xml (Dutch) 2022-03-21 17:42:16 +05:30
Daksh P. Jain
214d97ac51 New translations strings.xml (Korean) 2022-03-21 17:42:15 +05:30
Daksh P. Jain
44f1122723 New translations strings.xml (Hungarian) 2022-03-21 17:42:13 +05:30
Daksh P. Jain
e4c4428291 New translations strings.xml (Greek) 2022-03-21 17:42:11 +05:30
Daksh P. Jain
ce2b2f109b New translations strings.xml (German) 2022-03-21 17:42:09 +05:30
Daksh P. Jain
d3f758e921 New translations strings.xml (Arabic) 2022-03-21 17:42:08 +05:30
Daksh P. Jain
57913f81bd New translations strings.xml (Spanish) 2022-03-21 17:42:07 +05:30
Daksh P. Jain
ae5644c725 New translations strings.xml (French) 2022-03-21 17:42:06 +05:30
Daksh P. Jain
f7384a2360 New translations strings.xml (Romanian) 2022-03-21 17:42:05 +05:30
Daksh P. Jain
0b86a61259 New translations strings.xml (Spanish, Latin America) 2022-03-21 17:42:04 +05:30
Daksh P. Jain
5addee3163 New translations strings.xml (Ukrainian) 2022-03-21 17:42:03 +05:30
Daksh P. Jain
8a61cdb158 New translations strings.xml (Czech) 2022-03-21 17:42:01 +05:30
Daksh P. Jain
121506d042 New translations strings.xml (Portuguese) 2022-03-21 17:41:58 +05:30
Daksh P. Jain
9ad3ce3a49 New translations strings.xml (Serbian (Cyrillic)) 2022-03-21 17:41:57 +05:30
Daksh P. Jain
854110a092 New translations strings.xml (Swedish) 2022-03-21 17:41:56 +05:30
Daksh P. Jain
2a25d1808c New translations strings.xml (Turkish) 2022-03-21 17:41:55 +05:30
Daksh P. Jain
6533955727 New translations strings.xml (Chinese Simplified) 2022-03-21 17:41:54 +05:30
Daksh P. Jain
ef52da9d2c New translations strings.xml (Chinese Traditional) 2022-03-21 17:41:53 +05:30
Daksh P. Jain
44d8d6f392 New translations strings.xml (Vietnamese) 2022-03-21 17:41:52 +05:30
Daksh P. Jain
1050dfaf64 New translations strings.xml (Persian) 2022-03-21 17:41:50 +05:30
Daksh P. Jain
1c8373e9ff New translations strings.xml (Thai) 2022-03-21 17:41:48 +05:30
Daksh P. Jain
b4d9a17ae4 New translations strings.xml (Croatian) 2022-03-21 17:41:47 +05:30
Daksh P. Jain
c145965d3d New translations strings.xml (Hindi) 2022-03-21 17:41:46 +05:30
Daksh P. Jain
7f1b3bda20 New translations strings.xml (Burmese) 2022-03-21 17:41:45 +05:30
Daksh P. Jain
eadd8fa5bc New translations strings.xml (Filipino) 2022-03-21 17:41:44 +05:30
Daksh P. Jain
7654abcfc8 New translations strings.xml (Russian) 2022-03-21 17:41:42 +05:30
Daksh P. Jain
f6c56e2ed9
Merge pull request #1230 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2022-03-20 18:09:52 +05:30
Daksh P. Jain
5b4f921256 Delete strings.xml 2022-03-20 18:09:29 +05:30
Daksh P. Jain
131c64de3a Merge branch 'l10n_dev' into dev 2022-03-20 18:09:14 +05:30
Daksh P. Jain
a7d4216972 New translations strings.xml (Indonesian) 2022-03-20 17:52:34 +05:30
Prathamesh More
09078e1c05
Merge pull request #1297 from 66Omar/1283-show_toast_for_existing_playlists
[1283] Show toast when adding songs to an existing playlist
2022-03-20 12:46:51 +05:30
Prathamesh More
0509686fd9 Code cleanup 2022-03-20 12:46:21 +05:30
Daksh P. Jain
aa1f5bf8f3
Merge pull request #1305 from milindgoel15/dev
fix number of methods
2022-03-20 09:42:43 +05:30
Daksh P. Jain
6b66433ac9 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-20 08:48:01 +05:30
Daksh P. Jain
077ae1d9cf New translations strings.xml (Turkish) 2022-03-20 02:49:18 +05:30
Daksh P. Jain
4a2c72e8e5 Update source file strings.xml 2022-03-20 02:49:15 +05:30
Omar
94275e3725 Code cleanup 2022-03-19 21:51:52 +02:00
Milind Goel
580d4b7642 fix 2022-03-19 22:18:57 +05:30
Milind Goel
40388e7f2f fix number of methods 2022-03-19 22:13:59 +05:30
Daksh P. Jain
4b60b54456
Merge pull request #1304 from milindgoel15/dev
fix lyrics guide
2022-03-19 22:05:33 +05:30
Milind Goel
8fd4d98662 add lyric video guide 2022-03-19 22:04:28 +05:30
Milind Goel
dc859bff32 fix lyrics guide 2022-03-19 21:58:30 +05:30
Daksh P. Jain
95bfd3e50c
Merge pull request #1303 from milindgoel15/dev
fix version mention
2022-03-19 21:51:57 +05:30
Milind Goel
70e3543704 fix version mention 2022-03-19 21:48:31 +05:30
Daksh P. Jain
b76b0e9230
Merge pull request #1302 from milindgoel15/dev
update faq
2022-03-19 21:23:43 +05:30
Milind Goel
1c73144f2b add lyrics website links 2022-03-19 20:57:27 +05:30
Daksh P. Jain
82afa1dcca New translations strings.xml (Malayalam) 2022-03-19 20:52:57 +05:30
Daksh P. Jain
d463b2f16d New translations strings.xml (Dutch) 2022-03-19 20:52:56 +05:30
Daksh P. Jain
16ad7b1fb1 New translations strings.xml (Korean) 2022-03-19 20:52:55 +05:30
Daksh P. Jain
ba34dd441d New translations strings.xml (Japanese) 2022-03-19 20:52:54 +05:30
Daksh P. Jain
f6df8d7b94 New translations strings.xml (Italian) 2022-03-19 20:52:53 +05:30
Daksh P. Jain
97b89c46be New translations strings.xml (Hungarian) 2022-03-19 20:52:52 +05:30
Daksh P. Jain
e601d13cac New translations strings.xml (Greek) 2022-03-19 20:52:51 +05:30
Milind Goel
032a916dc4 add hyphen 2022-03-19 20:52:50 +05:30
Daksh P. Jain
caf3141f7d New translations strings.xml (Polish) 2022-03-19 20:52:50 +05:30
Daksh P. Jain
55788ff391 New translations strings.xml (German) 2022-03-19 20:52:49 +05:30
Daksh P. Jain
52e78e9981 New translations strings.xml (Arabic) 2022-03-19 20:52:48 +05:30
Daksh P. Jain
c21735b213 New translations strings.xml (Spanish) 2022-03-19 20:52:47 +05:30
Daksh P. Jain
9ab2f16a22 New translations strings.xml (French) 2022-03-19 20:52:46 +05:30
Daksh P. Jain
b7fc876263 New translations strings.xml (Romanian) 2022-03-19 20:52:45 +05:30
Daksh P. Jain
baf7c5f72f New translations strings.xml (Spanish, Latin America) 2022-03-19 20:52:44 +05:30
Daksh P. Jain
a914323088 New translations strings.xml (Ukrainian) 2022-03-19 20:52:43 +05:30
Daksh P. Jain
4a75511f06 New translations strings.xml (Czech) 2022-03-19 20:52:42 +05:30
Daksh P. Jain
d949cb7948 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-19 20:52:41 +05:30
Daksh P. Jain
d4dda052c4 New translations strings.xml (Portuguese) 2022-03-19 20:52:40 +05:30
Daksh P. Jain
9230985759 New translations strings.xml (Serbian (Cyrillic)) 2022-03-19 20:52:39 +05:30
Daksh P. Jain
ad7e2a626b New translations strings.xml (Swedish) 2022-03-19 20:52:38 +05:30
Daksh P. Jain
ad2c909305 New translations strings.xml (Turkish) 2022-03-19 20:52:37 +05:30
Daksh P. Jain
4a9e505c4e New translations strings.xml (Chinese Simplified) 2022-03-19 20:52:36 +05:30
Daksh P. Jain
8178b31abf New translations strings.xml (Chinese Traditional) 2022-03-19 20:52:35 +05:30
Daksh P. Jain
8d3af64dd8 New translations strings.xml (Vietnamese) 2022-03-19 20:52:34 +05:30
Daksh P. Jain
a2d3b29986 New translations strings.xml (Portuguese, Brazilian) 2022-03-19 20:52:33 +05:30
Daksh P. Jain
01503d31cf New translations strings.xml (Persian) 2022-03-19 20:52:32 +05:30
Daksh P. Jain
cdeb790997 New translations strings.xml (Tamil) 2022-03-19 20:52:31 +05:30
Daksh P. Jain
c7ffa28d30 New translations strings.xml (Thai) 2022-03-19 20:52:30 +05:30
Daksh P. Jain
c6f24b9b46 New translations strings.xml (Croatian) 2022-03-19 20:52:29 +05:30
Daksh P. Jain
36f9c1728c New translations strings.xml (Hindi) 2022-03-19 20:52:28 +05:30
Daksh P. Jain
77daab1965 New translations strings.xml (Burmese) 2022-03-19 20:52:27 +05:30
Daksh P. Jain
4a61972cfa New translations strings.xml (Filipino) 2022-03-19 20:52:26 +05:30
Daksh P. Jain
fb24c6434a New translations strings.xml (Russian) 2022-03-19 20:52:25 +05:30
Daksh P. Jain
4efcbb1f2a New translations strings.xml (Indonesian) 2022-03-19 20:52:24 +05:30
Prathamesh More
52107a0d36
Merge pull request #1298 from Phani-22/reset_image
[1285] added button to reset image
2022-03-19 20:50:05 +05:30
Milind Goel
7643e5f5a4 fix grammer 2022-03-19 20:47:49 +05:30
Milind Goel
fdd2681c04 update faq 2022-03-19 20:38:12 +05:30
Prathamesh More
301fc0bfc8 Use MaterialDialogBuilder 2022-03-19 19:28:54 +05:30
Daksh P. Jain
cdb3fe915d New translations strings.xml (Japanese) 2022-03-19 07:42:17 +05:30
Daksh P. Jain
4e421693c6 New translations strings.xml (Polish) 2022-03-18 12:18:15 +05:30
Phani-22
647e504f3d
Merge branch 'dev' into reset_image 2022-03-18 07:51:40 +05:30
Phani
a36e6582b4 added_button_to_reset_image 2022-03-18 07:19:08 +05:30
Omar
fce3844ed5 Show toast when adding songs to an existing playlist 2022-03-17 21:15:46 +02:00
Prathamesh More
d8d1cff659
Merge pull request #1295 from taoyouh/sorting
Localized sorting
2022-03-17 22:39:33 +05:30
Prathamesh More
21a45163a7 Code Cleanup 2022-03-17 22:11:40 +05:30
Daksh P. Jain
1cb97f783b
Merge pull request #1296 from prathameshmm02/dev
Fixed Wallpaper theming #1264
2022-03-16 18:27:09 +05:30
Prathamesh More
c01cc89b0e Bump versionCode 2022-03-16 17:43:17 +05:30
Huang, Zhaoquan
41039bcdd5 Sort artist repository in a localized way 2022-03-16 13:43:54 +08:00
Huang, Zhaoquan
6b51eb84fa Sort song repository in a localized way 2022-03-16 12:21:50 +08:00
Huang, Zhaoquan
76be5a784a Sort album repository in a localized way 2022-03-16 11:52:41 +08:00
Prathamesh More
edd1903c6c Added back album name to Notification 2022-03-15 23:07:11 +05:30
Prathamesh More
371d137c51 Added padding to Accent preference 2022-03-15 22:50:15 +05:30
Prathamesh More
9d6d7de1c7 Fixed odd accent color for profile image 2022-03-15 22:42:52 +05:30
Prathamesh More
1d7203cbec Adapt Wallpaper accent for better readability 2022-03-15 22:41:32 +05:30
Prathamesh More
6a7fa40efa Added adaptive color in Material now playing theme 2022-03-15 18:34:39 +05:30
Prathamesh More
a94c5e1784 Removed checkedIcon from Search chips 2022-03-15 18:33:33 +05:30
Daksh P. Jain
a0ae384752 New translations strings.xml (Italian) 2022-03-13 20:29:55 +05:30
Daksh P. Jain
ed37f9bb59 New translations strings.xml (Chinese Simplified) 2022-03-12 22:49:28 +05:30
Daksh P. Jain
db44cf8725 New translations strings.xml (Turkish) 2022-03-12 16:49:31 +05:30
Daksh P. Jain
0eb08b21b8 New translations strings.xml (Portuguese, Brazilian) 2022-03-12 10:43:32 +05:30
Daksh P. Jain
7570745883 New translations strings.xml (Indonesian) 2022-03-12 10:43:31 +05:30
Daksh P. Jain
99fc2d65db New translations strings.xml (Kurmanji (Kurdish)) 2022-03-12 04:44:42 +05:30
Prathamesh More
eb5a773e27 Disable wallpaper accent by default 2022-03-11 17:14:35 +05:30
Daksh P. Jain
13adb90fd4 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-11 16:21:00 +05:30
Daksh P. Jain
3819cd045c Update source file strings.xml 2022-03-11 16:20:56 +05:30
Daksh P. Jain
2471a14690
Merge pull request #1291 from prathameshmm02/dev
Bump versionCode, versionName & Updated change-log
2022-03-11 16:11:48 +05:30
Prathamesh More
c4e141d3d7 Bump versionCode, versionName & Updated change-log 2022-03-11 15:38:20 +05:30
Daksh P. Jain
c14a5854c7
Merge pull request #1290 from prathameshmm02/dev
Optimized search
2022-03-11 11:01:19 +05:30
Prathamesh More
66f3670aed Optimized imports 2022-03-11 09:06:35 +05:30
Prathamesh More
a1a6e98376 Optimized search 2022-03-11 08:48:04 +05:30
Prathamesh More
8a050e114b Code Cleanup 2022-03-11 08:44:30 +05:30
Daksh P. Jain
bfeb04c497 New translations strings.xml (Malayalam) 2022-03-11 08:37:37 +05:30
Daksh P. Jain
6c4fc9515b New translations strings.xml (Dutch) 2022-03-11 08:37:36 +05:30
Daksh P. Jain
0f64e4430d New translations strings.xml (Korean) 2022-03-11 08:37:35 +05:30
Daksh P. Jain
369e4e77c9 New translations strings.xml (Japanese) 2022-03-11 08:37:33 +05:30
Daksh P. Jain
d96ef32ab8 New translations strings.xml (Italian) 2022-03-11 08:37:32 +05:30
Daksh P. Jain
fc7671e6b1 New translations strings.xml (Hungarian) 2022-03-11 08:37:31 +05:30
Daksh P. Jain
c9d2fdd7d5 New translations strings.xml (Greek) 2022-03-11 08:37:30 +05:30
Daksh P. Jain
097fa8cebd New translations strings.xml (Polish) 2022-03-11 08:37:29 +05:30
Daksh P. Jain
76e613b95b New translations strings.xml (German) 2022-03-11 08:37:28 +05:30
Daksh P. Jain
b59d8bbd4e New translations strings.xml (Arabic) 2022-03-11 08:37:27 +05:30
Daksh P. Jain
2cb50effa2 New translations strings.xml (Spanish) 2022-03-11 08:37:26 +05:30
Daksh P. Jain
ea73a342f8 New translations strings.xml (French) 2022-03-11 08:37:25 +05:30
Daksh P. Jain
9e2db2d494 New translations strings.xml (Romanian) 2022-03-11 08:37:24 +05:30
Daksh P. Jain
e5dfc12750 New translations strings.xml (Spanish, Latin America) 2022-03-11 08:37:23 +05:30
Daksh P. Jain
c6724a261f New translations strings.xml (Ukrainian) 2022-03-11 08:37:22 +05:30
Daksh P. Jain
2116e27790 New translations strings.xml (Czech) 2022-03-11 08:37:21 +05:30
Daksh P. Jain
389453c83a New translations strings.xml (Kurmanji (Kurdish)) 2022-03-11 08:37:20 +05:30
Daksh P. Jain
1d4d19dac4 New translations strings.xml (Portuguese) 2022-03-11 08:37:19 +05:30
Daksh P. Jain
6dee8648d3 New translations strings.xml (Serbian (Cyrillic)) 2022-03-11 08:37:18 +05:30
Daksh P. Jain
5efdbb4634 New translations strings.xml (Swedish) 2022-03-11 08:37:17 +05:30
Daksh P. Jain
1314c007f5 New translations strings.xml (Turkish) 2022-03-11 08:37:16 +05:30
Daksh P. Jain
2e3924b886 New translations strings.xml (Chinese Simplified) 2022-03-11 08:37:15 +05:30
Daksh P. Jain
a000bf5414 New translations strings.xml (Chinese Traditional) 2022-03-11 08:37:14 +05:30
Daksh P. Jain
0c61af46b8 New translations strings.xml (Vietnamese) 2022-03-11 08:37:13 +05:30
Daksh P. Jain
1e4c63bfcd New translations strings.xml (Portuguese, Brazilian) 2022-03-11 08:37:12 +05:30
Daksh P. Jain
9f5c665188 New translations strings.xml (Persian) 2022-03-11 08:37:11 +05:30
Daksh P. Jain
0ccca167fa New translations strings.xml (Tamil) 2022-03-11 08:37:10 +05:30
Daksh P. Jain
2d9c5bac10 New translations strings.xml (Thai) 2022-03-11 08:37:09 +05:30
Daksh P. Jain
f33f6d0193 New translations strings.xml (Croatian) 2022-03-11 08:37:08 +05:30
Daksh P. Jain
3564f406e7 New translations strings.xml (Hindi) 2022-03-11 08:37:07 +05:30
Daksh P. Jain
c485c783bd New translations strings.xml (Burmese) 2022-03-11 08:37:06 +05:30
Daksh P. Jain
e03c1e624a New translations strings.xml (Filipino) 2022-03-11 08:37:05 +05:30
Daksh P. Jain
65a66d3a9b New translations strings.xml (Russian) 2022-03-11 08:37:04 +05:30
Daksh P. Jain
dcf38e8d5e New translations strings.xml (Indonesian) 2022-03-11 08:37:03 +05:30
Prathamesh More
7f3b2b3d91
Merge pull request #1288 from logicgupta/Confirm-add-to-playlist-#1283
Confirm add to playlist #1283
2022-03-11 08:32:53 +05:30
Daksh P. Jain
fd01f19081 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-11 02:27:47 +05:30
Logic Gupta
c37fca4a5e
Merge branch 'dev' into Confirm-add-to-playlist-#1283 2022-03-10 10:02:02 -08:00
Daksh P. Jain
ddce36837d New translations strings.xml (Indonesian) 2022-03-10 20:18:52 +05:30
Daksh P. Jain
fe811f4633 New translations strings.xml (Indonesian) 2022-03-10 14:23:46 +05:30
Daksh P. Jain
bc044f4a49 New translations strings.xml (Indonesian) 2022-03-10 08:23:16 +05:30
Daksh P. Jain
7cbcf08fde New translations strings.xml (Kurmanji (Kurdish)) 2022-03-10 01:26:36 +05:30
=logicgupta59
4aed5b81fe code cleanup complete 2022-03-09 22:51:47 +05:30
=logicgupta59
16e765d150 code cleanup 2022-03-09 22:45:09 +05:30
Daksh P. Jain
89905c6043 New translations strings.xml (Italian) 2022-03-09 19:27:40 +05:30
Daksh P. Jain
6c8329a8d5 Update source file strings.xml 2022-03-09 19:27:37 +05:30
Daksh P. Jain
aadc23e297 New translations strings.xml (Malayalam) 2022-03-09 13:31:10 +05:30
Daksh P. Jain
302f4b6ca8 New translations strings.xml (Ukrainian) 2022-03-09 13:31:09 +05:30
Daksh P. Jain
4e6169d2ec New translations strings.xml (Spanish, Latin America) 2022-03-09 13:31:08 +05:30
Daksh P. Jain
de4acb2794 New translations strings.xml (Dutch) 2022-03-09 13:31:07 +05:30
Daksh P. Jain
e1b955f644 New translations strings.xml (Polish) 2022-03-09 13:31:06 +05:30
Daksh P. Jain
7f8fed741d New translations strings.xml (Kurmanji (Kurdish)) 2022-03-09 13:31:04 +05:30
Daksh P. Jain
ed99ef1e42 New translations strings.xml (Russian) 2022-03-09 13:31:03 +05:30
Daksh P. Jain
f592958aa4 New translations strings.xml (Serbian (Cyrillic)) 2022-03-09 13:31:02 +05:30
Daksh P. Jain
b892dbf013 New translations strings.xml (Swedish) 2022-03-09 13:31:01 +05:30
Daksh P. Jain
187c069a29 New translations strings.xml (Turkish) 2022-03-09 13:31:00 +05:30
Daksh P. Jain
b0364f7af7 New translations strings.xml (Chinese Simplified) 2022-03-09 13:30:58 +05:30
Daksh P. Jain
5f139828f7 New translations strings.xml (Portuguese) 2022-03-09 13:30:57 +05:30
Daksh P. Jain
72329accef New translations strings.xml (Vietnamese) 2022-03-09 13:30:56 +05:30
Daksh P. Jain
65b5f4927a New translations strings.xml (Filipino) 2022-03-09 13:30:55 +05:30
Daksh P. Jain
30b272c6d9 New translations strings.xml (Burmese) 2022-03-09 13:30:54 +05:30
Daksh P. Jain
8369d5f5ff New translations strings.xml (Chinese Traditional) 2022-03-09 13:30:53 +05:30
Daksh P. Jain
3bb64562fb New translations strings.xml (Hindi) 2022-03-09 13:30:52 +05:30
Daksh P. Jain
e4f288b1cc New translations strings.xml (Croatian) 2022-03-09 13:30:51 +05:30
Daksh P. Jain
c830387fde New translations strings.xml (Indonesian) 2022-03-09 13:30:50 +05:30
Daksh P. Jain
e1da9f44b4 New translations strings.xml (Tamil) 2022-03-09 13:30:49 +05:30
Daksh P. Jain
f3712b517c New translations strings.xml (Persian) 2022-03-09 13:30:48 +05:30
Daksh P. Jain
3d6fec5f48 New translations strings.xml (Portuguese, Brazilian) 2022-03-09 13:30:47 +05:30
Daksh P. Jain
fc56e31505 New translations strings.xml (Thai) 2022-03-09 13:30:45 +05:30
Daksh P. Jain
9246b433a7 New translations strings.xml (Korean) 2022-03-09 13:30:44 +05:30
Daksh P. Jain
f849a8bc71 New translations strings.xml (Japanese) 2022-03-09 13:30:43 +05:30
Daksh P. Jain
8abca27c60 New translations strings.xml (Italian) 2022-03-09 13:30:42 +05:30
Daksh P. Jain
35d6a48bb2 New translations strings.xml (Greek) 2022-03-09 13:30:41 +05:30
Daksh P. Jain
34e84ebbc2 New translations strings.xml (German) 2022-03-09 13:30:40 +05:30
Daksh P. Jain
ee4f3a78cd New translations strings.xml (Czech) 2022-03-09 13:30:39 +05:30
Daksh P. Jain
cc91944087 New translations strings.xml (Arabic) 2022-03-09 13:30:37 +05:30
Daksh P. Jain
6c0770c075 New translations strings.xml (Spanish) 2022-03-09 13:30:36 +05:30
Daksh P. Jain
7b4a6848db New translations strings.xml (French) 2022-03-09 13:30:35 +05:30
Daksh P. Jain
879b9659d9 New translations strings.xml (Romanian) 2022-03-09 13:30:34 +05:30
Daksh P. Jain
9063ea6748 New translations strings.xml (Hungarian) 2022-03-09 13:30:33 +05:30
Prathamesh More
b3fa6683fe
Merge pull request #1284 from 66Omar/add-disable-history-option
Added option to disable history and undo clear history
2022-03-09 13:26:34 +05:30
=logicgupta59
7f3d803ac9 done for issue #1283 2022-03-09 09:45:55 +05:30
=logicgupta59
4596e6e82c init 2022-03-09 09:44:48 +05:30
Daksh P. Jain
b77d6e9751 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-09 04:45:21 +05:30
Omar
c3bf711c7d Removed hiding history when history is disabled 2022-03-08 20:44:12 +02:00
Daksh P. Jain
71cf9d9721 New translations strings.xml (Romanian) 2022-03-08 22:46:52 +05:30
Omar
ebe90262cb Renamed keep history to pause history 2022-03-08 18:05:06 +02:00
Daksh P. Jain
19b51afce1 New translations strings.xml (Indonesian) 2022-03-07 19:04:25 +05:30
Omar
9b59c5299a Added option to disable history and undo clear history + UX improvements (History Tab) 2022-03-06 17:58:10 +02:00
Daksh P. Jain
a32c5a3feb New translations strings.xml (Italian) 2022-03-06 16:24:30 +05:30
Daksh P. Jain
bc7df1d72d New translations strings.xml (Italian) 2022-03-05 03:37:16 +05:30
Daksh P. Jain
8632219f32 Update source file strings.xml 2022-03-05 03:37:13 +05:30
Daksh P. Jain
9a35a6de62 New translations strings.xml (Malayalam) 2022-03-04 21:34:55 +05:30
Daksh P. Jain
8744b2864e New translations strings.xml (Dutch) 2022-03-04 21:34:53 +05:30
Daksh P. Jain
54fb12f1ee New translations strings.xml (Korean) 2022-03-04 21:34:52 +05:30
Daksh P. Jain
21e94457bc New translations strings.xml (Japanese) 2022-03-04 21:34:51 +05:30
Daksh P. Jain
a77fc8fce4 New translations strings.xml (Italian) 2022-03-04 21:34:50 +05:30
Daksh P. Jain
56521ed045 New translations strings.xml (Hungarian) 2022-03-04 21:34:49 +05:30
Daksh P. Jain
866a12161c New translations strings.xml (Greek) 2022-03-04 21:34:48 +05:30
Daksh P. Jain
18055f7565 New translations strings.xml (Polish) 2022-03-04 21:34:47 +05:30
Daksh P. Jain
cefc0e41f1 New translations strings.xml (German) 2022-03-04 21:34:46 +05:30
Daksh P. Jain
ebd437cebd New translations strings.xml (Arabic) 2022-03-04 21:34:45 +05:30
Daksh P. Jain
f5651357a9 New translations strings.xml (Spanish) 2022-03-04 21:34:43 +05:30
Daksh P. Jain
407b316a85 New translations strings.xml (French) 2022-03-04 21:34:42 +05:30
Daksh P. Jain
f29bbc4166 New translations strings.xml (Romanian) 2022-03-04 21:34:41 +05:30
Daksh P. Jain
8410a02aaf New translations strings.xml (Spanish, Latin America) 2022-03-04 21:34:40 +05:30
Daksh P. Jain
130fea64ff New translations strings.xml (Ukrainian) 2022-03-04 21:34:39 +05:30
Daksh P. Jain
ebd64d918c New translations strings.xml (Czech) 2022-03-04 21:34:38 +05:30
Daksh P. Jain
d37e8b92d0 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-04 21:34:36 +05:30
Daksh P. Jain
17ee8314aa New translations strings.xml (Portuguese) 2022-03-04 21:34:35 +05:30
Daksh P. Jain
14b1fd0231 New translations strings.xml (Serbian (Cyrillic)) 2022-03-04 21:34:34 +05:30
Daksh P. Jain
7ef6f37799 New translations strings.xml (Swedish) 2022-03-04 21:34:33 +05:30
Daksh P. Jain
c78cef3870 New translations strings.xml (Turkish) 2022-03-04 21:34:32 +05:30
Daksh P. Jain
122d9fae57 New translations strings.xml (Chinese Simplified) 2022-03-04 21:34:31 +05:30
Daksh P. Jain
d085c80e29 New translations strings.xml (Chinese Traditional) 2022-03-04 21:34:30 +05:30
Daksh P. Jain
69bc81f62e New translations strings.xml (Vietnamese) 2022-03-04 21:34:29 +05:30
Daksh P. Jain
67416814b0 New translations strings.xml (Portuguese, Brazilian) 2022-03-04 21:34:27 +05:30
Daksh P. Jain
4da7f6b8ba New translations strings.xml (Persian) 2022-03-04 21:34:26 +05:30
Daksh P. Jain
1ff6e06e29 New translations strings.xml (Tamil) 2022-03-04 21:34:24 +05:30
Daksh P. Jain
fac7069c40 New translations strings.xml (Thai) 2022-03-04 21:34:22 +05:30
Daksh P. Jain
f27c4b33ec New translations strings.xml (Croatian) 2022-03-04 21:34:21 +05:30
Daksh P. Jain
85734218a6 New translations strings.xml (Hindi) 2022-03-04 21:34:20 +05:30
Daksh P. Jain
6fb05aa0fd New translations strings.xml (Burmese) 2022-03-04 21:34:19 +05:30
Daksh P. Jain
8702f4e723 New translations strings.xml (Filipino) 2022-03-04 21:34:18 +05:30
Daksh P. Jain
338a41db8f New translations strings.xml (Russian) 2022-03-04 21:34:17 +05:30
Daksh P. Jain
6f40d41ce2 New translations strings.xml (Indonesian) 2022-03-04 21:34:15 +05:30
Prathamesh More
0e9392b6c5
Merge pull request #1278 from 66Omar/1216-add-option-to-clear-history
1216 add option to clear history
2022-03-04 21:32:19 +05:30
66Omar
55dd275e9d
Merge branch 'RetroMusicPlayer:dev' into 1216-add-option-to-clear-history 2022-03-04 14:16:42 +02:00
Omar
39c06ec652 Added string for 'clear history' menu item 2022-03-04 14:06:21 +02:00
Omar
ddf801f9f3 Added clear history function to repositories 2022-03-04 14:05:41 +02:00
Omar
4562afd544 Created new menu with item "Clear History" 2022-03-04 14:04:21 +02:00
Omar
71282919d3 Added clear history fun & change observableHistorySongs to MutableLiveData 2022-03-04 14:03:45 +02:00
Omar
0cdc83818a Added a query to clear song history 2022-03-04 14:01:34 +02:00
Omar
6adf09254b Added menu item to clear history (only shown on history page) 2022-03-04 14:00:26 +02:00
Daksh P. Jain
154ee42f70 New translations strings.xml (Indonesian) 2022-03-04 13:25:28 +05:30
Daksh P. Jain
81fbccf139 New translations strings.xml (Malayalam) 2022-03-04 03:28:52 +05:30
Daksh P. Jain
5a6925c8c3 New translations strings.xml (Dutch) 2022-03-04 03:28:51 +05:30
Daksh P. Jain
47114629a8 New translations strings.xml (Korean) 2022-03-04 03:28:50 +05:30
Daksh P. Jain
910e2533a5 New translations strings.xml (Japanese) 2022-03-04 03:28:49 +05:30
Daksh P. Jain
651a08c800 New translations strings.xml (Italian) 2022-03-04 03:28:48 +05:30
Daksh P. Jain
7c712e623a New translations strings.xml (Hungarian) 2022-03-04 03:28:47 +05:30
Daksh P. Jain
47c13d3607 New translations strings.xml (Greek) 2022-03-04 03:28:46 +05:30
Daksh P. Jain
4b3e1cf570 New translations strings.xml (Polish) 2022-03-04 03:28:45 +05:30
Daksh P. Jain
c6c8751091 New translations strings.xml (German) 2022-03-04 03:28:44 +05:30
Daksh P. Jain
9b56d4c6eb New translations strings.xml (Arabic) 2022-03-04 03:28:43 +05:30
Daksh P. Jain
302776aeec New translations strings.xml (Spanish) 2022-03-04 03:28:42 +05:30
Daksh P. Jain
2015d45647 New translations strings.xml (French) 2022-03-04 03:28:41 +05:30
Daksh P. Jain
56162ba648 New translations strings.xml (Romanian) 2022-03-04 03:28:40 +05:30
Daksh P. Jain
e3ac7db83b New translations strings.xml (Spanish, Latin America) 2022-03-04 03:28:38 +05:30
Daksh P. Jain
e560dcc4ac New translations strings.xml (Ukrainian) 2022-03-04 03:28:37 +05:30
Daksh P. Jain
04796d730d New translations strings.xml (Czech) 2022-03-04 03:28:36 +05:30
Daksh P. Jain
3155838245 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-04 03:28:35 +05:30
Daksh P. Jain
71e2d6abc2 New translations strings.xml (Portuguese) 2022-03-04 03:28:34 +05:30
Daksh P. Jain
c2534d660c New translations strings.xml (Serbian (Cyrillic)) 2022-03-04 03:28:33 +05:30
Daksh P. Jain
4b7e84b605 New translations strings.xml (Swedish) 2022-03-04 03:28:32 +05:30
Daksh P. Jain
e2b5c464a0 New translations strings.xml (Turkish) 2022-03-04 03:28:31 +05:30
Daksh P. Jain
f45092ddd8 New translations strings.xml (Chinese Simplified) 2022-03-04 03:28:30 +05:30
Daksh P. Jain
b28e2d9b9d New translations strings.xml (Chinese Traditional) 2022-03-04 03:28:29 +05:30
Daksh P. Jain
6afb7ca094 New translations strings.xml (Vietnamese) 2022-03-04 03:28:28 +05:30
Daksh P. Jain
6d6c41c266 New translations strings.xml (Portuguese, Brazilian) 2022-03-04 03:28:27 +05:30
Daksh P. Jain
819bda631f New translations strings.xml (Persian) 2022-03-04 03:28:26 +05:30
Daksh P. Jain
a4b9dcfef9 New translations strings.xml (Tamil) 2022-03-04 03:28:25 +05:30
Daksh P. Jain
6496bc318b New translations strings.xml (Thai) 2022-03-04 03:28:24 +05:30
Daksh P. Jain
a8dd5fa8e7 New translations strings.xml (Croatian) 2022-03-04 03:28:23 +05:30
Daksh P. Jain
3c21b09067 New translations strings.xml (Hindi) 2022-03-04 03:28:22 +05:30
Daksh P. Jain
0d85aa1896 New translations strings.xml (Burmese) 2022-03-04 03:28:21 +05:30
Daksh P. Jain
beecff5986 New translations strings.xml (Filipino) 2022-03-04 03:28:19 +05:30
Daksh P. Jain
5659f97f5c New translations strings.xml (Russian) 2022-03-04 03:28:18 +05:30
Daksh P. Jain
5cda69770e New translations strings.xml (Indonesian) 2022-03-04 03:28:17 +05:30
Daksh P. Jain
0e265e28d1 Update source file strings.xml 2022-03-04 03:28:14 +05:30
Prathamesh More
6e1f00132d
Merge pull request #1276 from AgarwalsRahul/Fix-#1273
Solved on back press issue
2022-03-03 22:12:09 +05:30
Prathamesh More
535bd8d872
Merge pull request #1275 from 66Omar/1220-add-last-modified
1220 add last modified to song (file) details
2022-03-03 22:02:56 +05:30
Daksh P. Jain
4393f61019 New translations strings.xml (Malayalam) 2022-03-03 21:25:23 +05:30
Daksh P. Jain
bb2743c176 New translations strings.xml (Spanish, Latin America) 2022-03-03 21:25:22 +05:30
Daksh P. Jain
643d6eb845 New translations strings.xml (Kurmanji (Kurdish)) 2022-03-03 21:25:21 +05:30
Daksh P. Jain
f3409802bd New translations strings.xml (Chinese Simplified) 2022-03-03 21:25:19 +05:30
Daksh P. Jain
32da563207 New translations strings.xml (Chinese Traditional) 2022-03-03 21:25:18 +05:30
Daksh P. Jain
3220ef3f24 New translations strings.xml (Vietnamese) 2022-03-03 21:25:17 +05:30
Daksh P. Jain
2d13bad190 New translations strings.xml (Portuguese, Brazilian) 2022-03-03 21:25:16 +05:30
Daksh P. Jain
28bfb08e2a New translations strings.xml (Persian) 2022-03-03 21:25:15 +05:30
Daksh P. Jain
0b9b170d84 New translations strings.xml (Indonesian) 2022-03-03 21:25:13 +05:30
Daksh P. Jain
82829ae65a New translations strings.xml (Thai) 2022-03-03 21:25:12 +05:30
Daksh P. Jain
ebd1638468 New translations strings.xml (Croatian) 2022-03-03 21:25:11 +05:30
Daksh P. Jain
3db9d66b03 New translations strings.xml (Hindi) 2022-03-03 21:25:10 +05:30
Daksh P. Jain
892adae8d9 New translations strings.xml (Filipino) 2022-03-03 21:25:09 +05:30
Daksh P. Jain
02bb5a7363 New translations strings.xml (Burmese) 2022-03-03 21:25:08 +05:30
Daksh P. Jain
3c65b5af48 New translations strings.xml (Tamil) 2022-03-03 21:25:07 +05:30
Daksh P. Jain
1c395ca4ec New translations strings.xml (Ukrainian) 2022-03-03 21:25:06 +05:30
Daksh P. Jain
48b4819a4c New translations strings.xml (Romanian) 2022-03-03 21:25:04 +05:30
Daksh P. Jain
a173140073 New translations strings.xml (French) 2022-03-03 21:25:03 +05:30
Daksh P. Jain
b188c5ff45 New translations strings.xml (Spanish) 2022-03-03 21:25:02 +05:30
Daksh P. Jain
03c89273c2 New translations strings.xml (Arabic) 2022-03-03 21:25:01 +05:30
Daksh P. Jain
97f4326b24 New translations strings.xml (Czech) 2022-03-03 21:24:59 +05:30
Daksh P. Jain
b20beb4550 New translations strings.xml (German) 2022-03-03 21:24:58 +05:30
Daksh P. Jain
008e88dc53 New translations strings.xml (Greek) 2022-03-03 21:24:57 +05:30
Daksh P. Jain
ddd75791b2 New translations strings.xml (Italian) 2022-03-03 21:24:56 +05:30
Daksh P. Jain
b62bbf69ca New translations strings.xml (Japanese) 2022-03-03 21:24:54 +05:30
Daksh P. Jain
a9f62c33f4 New translations strings.xml (Korean) 2022-03-03 21:24:53 +05:30
Daksh P. Jain
aa0ca7696f New translations strings.xml (Dutch) 2022-03-03 21:24:52 +05:30
Daksh P. Jain
d6dfb6fb52 New translations strings.xml (Polish) 2022-03-03 21:24:51 +05:30
Daksh P. Jain
6c96d524c4 New translations strings.xml (Russian) 2022-03-03 21:24:50 +05:30
Daksh P. Jain
a5a112e2ed New translations strings.xml (Serbian (Cyrillic)) 2022-03-03 21:24:49 +05:30
Daksh P. Jain
cd815163ce New translations strings.xml (Swedish) 2022-03-03 21:24:48 +05:30
Daksh P. Jain
dde805be1c New translations strings.xml (Turkish) 2022-03-03 21:24:47 +05:30
Daksh P. Jain
1282e2869a New translations strings.xml (Hungarian) 2022-03-03 21:24:46 +05:30
Daksh P. Jain
16204dd173 New translations strings.xml (Portuguese) 2022-03-03 21:24:45 +05:30
Daksh P. Jain
f6bfcd1aba Update source file strings.xml 2022-03-03 21:24:41 +05:30
AgarwalsRahul
e820aa9d02 Merge branch 'dev' of https://github.com/RetroMusicPlayer/RetroMusicPlayer into Fix-#1273 2022-03-03 19:23:35 +05:30
AgarwalsRahul
fb2904193a Solved on back pressed issue 2022-03-03 19:23:04 +05:30
Prathamesh More
a422fadc14
Merge pull request #1274 from cdhiraj40/dev
Add an option to share crash report as a file after a crash
2022-03-03 17:47:21 +05:30
Omar
893ac34362 Added functionality of showing last modification date 2022-03-03 14:13:44 +02:00
Omar
b456e71c41 Added new fun getDateModifiedString 2022-03-03 14:11:41 +02:00
Omar
ba763a1ec3 Added MaterialTextView for date modified 2022-03-03 14:10:46 +02:00
Omar
7dc7a819e4 Added Last Modified Label 2022-03-03 14:08:32 +02:00
cdhiraj40
5678140acf removed unnecessary changes 2022-03-03 15:21:17 +05:30
cdhiraj40
30b1f031ff issue#123 added an option to share crash report 2022-03-03 15:19:28 +05:30
Prathamesh More
633e5e446c
Merge pull request #1271 from AgarwalsRahul/Fix-#1270
Fix screen rotation issue in permission activity layout
2022-03-03 09:24:28 +05:30
AgarwalsRahul
5a2d43fcd7 Fix Orientation Issue 2022-03-03 09:12:01 +05:30
Daksh P. Jain
3d421e9db0 New translations strings.xml (Portuguese, Brazilian) 2022-03-03 05:45:04 +05:30
AgarwalsRahul
f15605a261 Fix screen rotation issue in permission activity layout 2022-03-02 10:41:07 +05:30
Daksh P. Jain
17237a4021
Merge pull request #1268 from prathameshmm02/dev
Fixed Sleep timer
2022-03-01 11:02:48 +05:30
Prathamesh More
d93a1f407d Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2022-02-28 18:49:59 +05:30
Prathamesh More
3aef95c9a1 Made sleep timer precise 2022-02-28 18:42:04 +05:30
Daksh P. Jain
0db988310e New translations strings.xml (Greek) 2022-02-25 03:43:00 +05:30
Daksh P. Jain
1f6c1dddc0 New translations strings.xml (Greek) 2022-02-24 21:38:28 +05:30
Prathamesh More
771897b741 Updated dependencies 2022-02-24 16:25:14 +05:30
Daksh P. Jain
90f1209294 New translations strings.xml (Greek) 2022-02-24 15:35:45 +05:30
Daksh P. Jain
b07cd8fa5a New translations strings.xml (Portuguese, Brazilian) 2022-02-23 22:57:05 +05:30
Daksh P. Jain
28fb452e35 New translations strings.xml (Portuguese, Brazilian) 2022-02-23 16:58:26 +05:30
Daksh P. Jain
8c6ef127df New translations strings.xml (Indonesian) 2022-02-22 16:06:11 +05:30
Daksh P. Jain
ca19cb196c
Merge pull request #1260 from milindgoel15/dev
make readme nicer
2022-02-22 09:58:39 +05:30
Milind Goel
1e07dae25c
Update README.md 2022-02-21 19:43:52 +05:30
Milind Goel
d8d0fd35e9 make readme nicer and update web png 2022-02-21 13:52:40 +05:30
Daksh P. Jain
0445de735e New translations strings.xml (Persian) 2022-02-21 00:20:15 +05:30
Daksh P. Jain
bd8e32b23c New translations strings.xml (Persian) 2022-02-20 17:51:51 +05:30
Daksh P. Jain
38c3313cc7 New translations strings.xml (Kurmanji (Kurdish)) 2022-02-19 14:56:14 +05:30
Prathamesh More
6c159297dc Centered CheckBox in popup menu 2022-02-19 12:19:32 +05:30
Prathamesh More
cda7af4420 Code Cleanup 2022-02-19 10:57:18 +05:30
Prathamesh More
fcdf9ad590 [Glide] Code Cleanup 2022-02-19 09:55:11 +05:30
Daksh P. Jain
e1989971b1 New translations strings.xml (Polish) 2022-02-18 21:48:48 +05:30
Daksh P. Jain
b61f623b7c New translations strings.xml (Italian) 2022-02-18 21:48:47 +05:30
Daksh P. Jain
26ff0e3e0f New translations strings.xml (Polish) 2022-02-18 15:52:43 +05:30
Daksh P. Jain
3b44dc96f3
Merge pull request #1259 from milindgoel15/dev
fix peek and improved readme
2022-02-18 12:40:53 +05:30
Milind Goel
87c08352b7 fix peek and improved readme 2022-02-18 11:58:12 +05:30
Daksh P. Jain
2f0b05473d New translations strings.xml (Polish) 2022-02-18 09:33:47 +05:30
Daksh P. Jain
8709e14b4c New translations strings.xml (Malayalam) 2022-02-18 02:32:34 +05:30
Daksh P. Jain
cc2132dd85 New translations strings.xml (Dutch) 2022-02-18 02:32:33 +05:30
Daksh P. Jain
e56d5ae59e New translations strings.xml (Korean) 2022-02-18 02:32:32 +05:30
Daksh P. Jain
af66ea1b89 New translations strings.xml (Japanese) 2022-02-18 02:32:31 +05:30
Daksh P. Jain
cdb939fa65 New translations strings.xml (Italian) 2022-02-18 02:32:30 +05:30
Daksh P. Jain
cb0707cd61 New translations strings.xml (Hungarian) 2022-02-18 02:32:29 +05:30
Daksh P. Jain
3431aaba5b New translations strings.xml (Greek) 2022-02-18 02:32:28 +05:30
Daksh P. Jain
1d7ac4464d New translations strings.xml (Polish) 2022-02-18 02:32:26 +05:30
Daksh P. Jain
732b9a9c2e New translations strings.xml (German) 2022-02-18 02:32:25 +05:30
Daksh P. Jain
858851691f New translations strings.xml (Arabic) 2022-02-18 02:32:24 +05:30
Daksh P. Jain
41852f5236 New translations strings.xml (Spanish) 2022-02-18 02:32:23 +05:30
Daksh P. Jain
82aa5fe48b New translations strings.xml (French) 2022-02-18 02:32:22 +05:30
Daksh P. Jain
ebec3cd675 New translations strings.xml (Romanian) 2022-02-18 02:32:21 +05:30
Daksh P. Jain
6915b1aa8a New translations strings.xml (Spanish, Latin America) 2022-02-18 02:32:20 +05:30
Daksh P. Jain
2a1f78447c New translations strings.xml (Ukrainian) 2022-02-18 02:32:19 +05:30
Daksh P. Jain
10d8cb84d1 New translations strings.xml (Czech) 2022-02-18 02:32:18 +05:30
Daksh P. Jain
b53ed4650d New translations strings.xml (Kurmanji (Kurdish)) 2022-02-18 02:32:16 +05:30
Daksh P. Jain
db64b468b5 New translations strings.xml (Portuguese) 2022-02-18 02:32:15 +05:30
Daksh P. Jain
966261b3d1 New translations strings.xml (Serbian (Cyrillic)) 2022-02-18 02:32:14 +05:30
Daksh P. Jain
94931e62e8 New translations strings.xml (Swedish) 2022-02-18 02:32:13 +05:30
Daksh P. Jain
22a29446f1 New translations strings.xml (Turkish) 2022-02-18 02:32:12 +05:30
Daksh P. Jain
5b4a820c15 New translations strings.xml (Chinese Simplified) 2022-02-18 02:32:11 +05:30
Daksh P. Jain
2a022ff3dc New translations strings.xml (Chinese Traditional) 2022-02-18 02:32:10 +05:30
Daksh P. Jain
d021555521 New translations strings.xml (Vietnamese) 2022-02-18 02:32:09 +05:30
Daksh P. Jain
6b625ba9b9 New translations strings.xml (Portuguese, Brazilian) 2022-02-18 02:32:08 +05:30
Daksh P. Jain
eae32b2da6 New translations strings.xml (Persian) 2022-02-18 02:32:06 +05:30
Daksh P. Jain
30011e91d2 New translations strings.xml (Tamil) 2022-02-18 02:32:04 +05:30
Daksh P. Jain
58e9a8dcbd New translations strings.xml (Thai) 2022-02-18 02:32:03 +05:30
Daksh P. Jain
7bdae2765c New translations strings.xml (Croatian) 2022-02-18 02:32:02 +05:30
Daksh P. Jain
6d246ddbed New translations strings.xml (Hindi) 2022-02-18 02:31:59 +05:30
Daksh P. Jain
909acd05fd New translations strings.xml (Burmese) 2022-02-18 02:31:58 +05:30
Daksh P. Jain
07ce717ee0 New translations strings.xml (Filipino) 2022-02-18 02:31:57 +05:30
Daksh P. Jain
071027dcd5 New translations strings.xml (Russian) 2022-02-18 02:31:56 +05:30
Daksh P. Jain
553c47e54c New translations strings.xml (Indonesian) 2022-02-18 02:31:55 +05:30
Daksh P. Jain
945cfc51e1 Update source file strings.xml 2022-02-18 02:31:52 +05:30
Daksh P. Jain
eaa036936a
Merge pull request #1257 from prathameshmm02/dev
Fixed some crashes and bugs
2022-02-17 21:50:45 +05:30
Prathamesh More
56100cab0a Fixed MainActivity restart when opening activity from notification & widget 2022-02-17 21:25:33 +05:30
Prathamesh More
367718fadd Updated changelog 2022-02-17 20:13:20 +05:30
Prathamesh More
53b4d38456
Merge branch 'RetroMusicPlayer:dev' into dev 2022-02-17 20:07:37 +05:30
Prathamesh More
e827acea83 Fixed Circle widget 2022-02-17 20:06:55 +05:30
Daksh P. Jain
71bb394cf8
Merge pull request #1256 from milindgoel15/dev
uniform stroke size and fixed outside stroke line
2022-02-17 17:28:49 +05:30
Milind Goel
62c3328296 uniform stroke size and fixed outside stroke line 2022-02-17 12:45:19 +05:30
Prathamesh More
0aa4017146 Merge branch 'dev' of https://github.com/RetroMusicPlayer/RetroMusicPlayer into dev 2022-02-16 20:57:56 +05:30
Daksh P. Jain
dd77451b52
Merge pull request #1253 from milindgoel15/dev
Monet based icon for Android 13 users
2022-02-16 20:42:09 +05:30
Prathamesh More
70e96cf808 Fixed a typo 2022-02-16 19:34:30 +05:30
Prathamesh More
63263b270b Fixed crash on song deletion 2022-02-16 00:02:41 +05:30
Prathamesh More
5731b777f0 Fixed a crash while removing songs from the queue 2022-02-15 00:44:20 +05:30
Prathamesh More
74d9d1db39 Fixed shuffle button not shuffling songs 2022-02-15 00:44:20 +05:30
Milind Goel
c9efbcc276 Monet based icon for Android 13 users 2022-02-14 19:39:11 +05:30
Prathamesh More
9f405a271e Updated changelog 2022-02-13 14:52:56 +05:30
Prathamesh More
d8898608f2 Merge branch 'dev' of https://github.com/RetroMusicPlayer/RetroMusicPlayer into dev 2022-02-13 14:33:30 +05:30
Daksh P. Jain
bfbc1eec6f
Merge pull request #1250 from milindgoel15/dev
update contributors
2022-02-12 10:19:55 +05:30
Milind Goel
c0798e3fca Update pfp and link
fix lennart's link for jio users
2022-02-11 23:09:43 +05:30
Daksh P. Jain
f840c68e02 New translations strings.xml (Kurmanji (Kurdish)) 2022-02-11 22:13:43 +05:30
Prathamesh More
425eb4807e Fixed lyrics editing crash 2022-02-10 00:45:30 +05:30
Prathamesh More
3f188d028a Code Cleanup 2022-02-10 00:20:09 +05:30
Prathamesh More
7140ef3d83 Optimized imports 2022-02-10 00:04:39 +05:30
Prathamesh More
9f5fdab3ed Fixed crash when removing song from Playing queue 2022-02-10 00:03:38 +05:30
Daksh P. Jain
0329e5076d New translations strings.xml (Spanish, Latin America) 2022-02-07 15:21:22 +05:30
Daksh P. Jain
8b9c4a9042 New translations strings.xml (Indonesian) 2022-02-07 09:21:18 +05:30
Daksh P. Jain
fd853c000b New translations strings.xml (Ukrainian) 2022-02-03 22:42:06 +05:30
Daksh P. Jain
f63c978008 New translations strings.xml (Kurmanji (Kurdish)) 2022-02-02 22:32:52 +05:30
Prathamesh More
666f52adb5
Merge pull request #1238 from antonkesy/workaround-sd-crash
Prevent app from crashing when SD-card data is not valid anymore.
2022-02-02 18:00:57 +05:30
Daksh P. Jain
0fa3e7e088 New translations strings.xml (Chinese Simplified) 2022-02-02 16:17:01 +05:30
Anton Kesy
be24fb446a
check if dataSet postition is valid
workaround for #1187

True problem is probably dataSet getting updated too early
2022-02-02 07:47:24 +01:00
Prathamesh More
597d307c66
Merge pull request #1236 from imashnake0/android-12-splashscreen
Android 12 Splashscreen API
2022-02-02 11:59:23 +05:30
Daksh P. Jain
f459f97853 New translations strings.xml (Spanish, Latin America) 2022-02-02 07:41:54 +05:30
Daksh P. Jain
862e302308 New translations strings.xml (Spanish, Latin America) 2022-02-02 01:42:44 +05:30
imashnake0
96b215784b Changed interpolator
Changed Benis' interpolator to make it stop more gradually.
2022-02-01 13:03:01 -05:00
imashnake0
31103d294e Increased wave animation duration
Increased wave animation to end it with the animation.
2022-02-01 12:59:26 -05:00
imashnake0
b51a93c359 Added animated splash screen
Added core-splashscreen dependency and implemented animated splash screen.
2022-01-31 19:26:30 -05:00
imashnake0
1a3b90f6b5 Added ic_splash_anim.xml
Added animated vector drawable for new SplashScreen API.
2022-01-31 19:24:51 -05:00
Daksh P. Jain
02ee0e8423 New translations strings.xml (Kurmanji (Kurdish)) 2022-02-01 05:49:08 +05:30
Daksh P. Jain
d78b964255 New translations strings.xml (Italian) 2022-01-31 23:32:29 +05:30
Daksh P. Jain
4164fbf148 New translations strings.xml (Spanish, Latin America) 2022-01-31 14:52:30 +05:30
Daksh P. Jain
62603eaab9 New translations strings.xml (Chinese Simplified) 2022-01-31 14:52:28 +05:30
Daksh P. Jain
207245541c New translations strings.xml (Spanish, Latin America) 2022-01-31 08:52:27 +05:30
Daksh P. Jain
18911baedd New translations strings.xml (Italian) 2022-01-31 08:52:25 +05:30
Daksh P. Jain
2048155474 New translations strings.xml (Hungarian) 2022-01-31 08:52:25 +05:30
Daksh P. Jain
94d6a6c37f New translations strings.xml (Greek) 2022-01-31 08:52:24 +05:30
Daksh P. Jain
82fb5b6876 New translations strings.xml (German) 2022-01-31 08:52:23 +05:30
Daksh P. Jain
0134d7092b New translations strings.xml (Czech) 2022-01-31 08:52:22 +05:30
Daksh P. Jain
8ae4a63600 New translations strings.xml (Arabic) 2022-01-31 08:52:21 +05:30
Daksh P. Jain
8a9f5f5535 New translations strings.xml (Japanese) 2022-01-31 08:52:19 +05:30
Daksh P. Jain
6f899d531d New translations strings.xml (Spanish) 2022-01-31 08:52:18 +05:30
Daksh P. Jain
36e1dca73e New translations strings.xml (Romanian) 2022-01-31 08:52:17 +05:30
Daksh P. Jain
09382e8d72 New translations strings.xml (Chinese Simplified) 2022-01-31 08:52:17 +05:30
Daksh P. Jain
56d35a0b28 New translations strings.xml (Portuguese, Brazilian) 2022-01-31 08:52:15 +05:30
Daksh P. Jain
46f5d8d279 New translations strings.xml (Filipino) 2022-01-31 08:52:14 +05:30
Daksh P. Jain
9d883d3853 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-31 08:52:13 +05:30
Daksh P. Jain
4cb85ef77f New translations strings.xml (Indonesian) 2022-01-31 08:52:13 +05:30
Daksh P. Jain
8992c454ea New translations strings.xml (French) 2022-01-31 08:52:12 +05:30
Daksh P. Jain
ddf3c55472 New translations strings.xml (Turkish) 2022-01-31 08:52:11 +05:30
Daksh P. Jain
b135ba315b New translations strings.xml (Korean) 2022-01-31 08:52:10 +05:30
Daksh P. Jain
9af8161a97 New translations strings.xml (Polish) 2022-01-31 08:52:09 +05:30
Daksh P. Jain
7d4fdfffc1 New translations strings.xml (Portuguese) 2022-01-31 08:52:08 +05:30
Daksh P. Jain
5469c8cd48 New translations strings.xml (Serbian (Cyrillic)) 2022-01-31 08:52:07 +05:30
Daksh P. Jain
9f6da8eaba New translations strings.xml (Swedish) 2022-01-31 08:52:06 +05:30
Daksh P. Jain
435ae832d4 New translations strings.xml (Ukrainian) 2022-01-31 08:52:05 +05:30
Daksh P. Jain
825a6bdd65 New translations strings.xml (Chinese Traditional) 2022-01-31 08:52:04 +05:30
Daksh P. Jain
4e77c938ab New translations strings.xml (Vietnamese) 2022-01-31 08:52:03 +05:30
Daksh P. Jain
13b7958f59 New translations strings.xml (Persian) 2022-01-31 08:52:01 +05:30
Daksh P. Jain
1083cf686d New translations strings.xml (Tamil) 2022-01-31 08:52:00 +05:30
Daksh P. Jain
98daa8f961 New translations strings.xml (Thai) 2022-01-31 08:51:59 +05:30
Daksh P. Jain
879e24bd82 New translations strings.xml (Croatian) 2022-01-31 08:51:58 +05:30
Daksh P. Jain
2e2f2f51f8 New translations strings.xml (Hindi) 2022-01-31 08:51:57 +05:30
Daksh P. Jain
17ab6db5bf New translations strings.xml (Burmese) 2022-01-31 08:51:56 +05:30
Daksh P. Jain
5c5cd2b3b8 New translations strings.xml (Malayalam) 2022-01-31 08:51:55 +05:30
Daksh P. Jain
9d09fc4f59 New translations strings.xml (Dutch) 2022-01-31 08:51:54 +05:30
Daksh P. Jain
8ff02d442c New translations strings.xml (Russian) 2022-01-31 08:51:53 +05:30
Daksh P. Jain
eade9c8e8e Update source file strings.xml 2022-01-31 08:51:51 +05:30
Daksh P. Jain
e7ed4ed62f
Merge pull request #1233 from prathameshmm02/dev
Bug fixes
2022-01-31 07:56:29 +05:30
Daksh P. Jain
68140a6699 New translations strings.xml (Spanish, Latin America) 2022-01-31 02:51:10 +05:30
Prathamesh More
bd4141b4b1 Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2022-01-30 23:41:21 +05:30
Prathamesh More
b2e7a4ed7e
Merge pull request #1232 from GeorgCantor/dev
Some fixes
2022-01-30 23:33:14 +05:30
Daksh P. Jain
7abe084bf3 New translations strings.xml (Spanish, Latin America) 2022-01-30 20:46:26 +05:30
GeorgCantor
06966e697c Some fixes 2022-01-30 17:05:39 +03:00
Daksh P. Jain
47ccf639b1 New translations strings.xml (Spanish, Latin America) 2022-01-30 14:51:16 +05:30
Daksh P. Jain
e63b7b54bb New translations strings.xml (Chinese Simplified) 2022-01-30 08:49:04 +05:30
Daksh P. Jain
5f1880eb60 New translations strings.xml (Indonesian) 2022-01-30 08:49:03 +05:30
Daksh P. Jain
f9be613b66 New translations strings.xml (Spanish) 2022-01-30 02:51:17 +05:30
Prathamesh More
3628d98bbe Updated change-log 2022-01-29 22:56:23 +05:30
Prathamesh More
8db4afa502 Added option to disable changing song by swiping anywhere on the now playing screen 2022-01-29 22:35:25 +05:30
Prathamesh More
7c5a97c410 Fixed Just Black theme 2022-01-29 22:04:02 +05:30
Daksh P. Jain
f35a02ae7e New translations strings.xml (Spanish) 2022-01-29 20:55:55 +05:30
Daksh P. Jain
02fcd70a79
Delete app/src/main/res/values-or-rIN directory 2022-01-29 12:31:50 +05:30
Daksh P. Jain
2ffdb7f01a
Delete app/src/main/res/values-no-rNO directory 2022-01-29 12:30:57 +05:30
Prathamesh More
75837607f4 Optimized imports 2022-01-29 01:04:53 +05:30
Prathamesh More
f6617b0844 Fixed invisible menu items/icons 2022-01-29 01:04:53 +05:30
Prathamesh More
010b771373 Fixed slow search because of Genres, and also added Playlists to Search results, Don't worry that won't slow the search. 2022-01-29 00:31:04 +05:30
Prathamesh More
5c1a88b32b Code Cleanup 2022-01-29 00:31:03 +05:30
Daksh P. Jain
ae3ea30e0e New translations strings.xml (Portuguese, Brazilian) 2022-01-28 22:33:16 +05:30
Prathamesh More
2bffff1eaa Fixed song duration not visible on Flat theme 2022-01-28 17:37:29 +05:30
Daksh P. Jain
8c9e4ce1c6 New translations strings.xml (Spanish) 2022-01-28 16:24:05 +05:30
Prathamesh More
4dc596fdf2 Fixed Playlist Details selection backgroud 2022-01-28 12:00:35 +05:30
Prathamesh More
84295eda82 Fixed Playlist save 2022-01-28 11:10:16 +05:30
Daksh P. Jain
20831f02bb
Merge pull request #1229 from prathameshmm02/dev
Android Auto and few bug fixes
2022-01-28 10:00:06 +05:30
Daksh P. Jain
979c21da24 New translations strings.xml (Italian) 2022-01-28 04:05:20 +05:30
Daksh P. Jain
d0738a9b1d New translations strings.xml (Chinese Traditional) 2022-01-27 22:10:15 +05:30
Prathamesh More
7b85fce485 Bump versionCode 2022-01-27 21:16:26 +05:30
Prathamesh More
006494bb39 Added Android Auto back to manifest 2022-01-27 21:09:24 +05:30
Prathamesh More
46ee31b723 Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2022-01-27 20:33:29 +05:30
Daksh P. Jain
c20e573349
Merge pull request #1213 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2022-01-27 19:42:21 +05:30
Prathamesh More
f45e570097 Converted MusicService to Kotlin 2022-01-27 18:45:34 +05:30
Prathamesh More
14677e31e6 Fixed wrongly formatted strings (Telugu) 2022-01-27 16:50:16 +05:30
Prathamesh More
fd7d7bf8b6 Removed a duplicate string 2022-01-27 15:39:36 +05:30
Prathamesh More
8425bec797 Merge dev into l10n_dev 2022-01-27 15:30:05 +05:30
Prathamesh More
c7d309f44a Updated AGP and dependencies 2022-01-27 13:19:39 +05:30
Daksh P. Jain
7f3044565a New translations strings.xml (Italian) 2022-01-27 03:06:15 +05:30
Daksh P. Jain
7d5fcf95ef New translations strings.xml (Spanish) 2022-01-26 21:10:55 +05:30
Daksh P. Jain
8a3d6ca5ba New translations strings.xml (Spanish) 2022-01-26 15:15:34 +05:30
Daksh P. Jain
d3937e3a7e New translations strings.xml (Indonesian) 2022-01-26 15:15:33 +05:30
Daksh P. Jain
3c11481271 New translations strings.xml (Indonesian) 2022-01-26 09:14:29 +05:30
Daksh P. Jain
649e0abd12
Merge pull request #1228 from milindgoel15/dev
update screenshots
2022-01-25 22:21:18 +05:30
Milind Goel
518f976358 update screenshots 2022-01-25 17:15:46 +05:30
Prathamesh More
051a9d8ef9 Removed redundant Song title and artist name in lyrics toolbar 2022-01-25 14:23:12 +05:30
Prathamesh More
62e016bf9b [Dialog] Consistent dialog corner radius 2022-01-25 11:13:42 +05:30
Daksh P. Jain
bd3f2bd9fc New translations strings.xml (Odia) 2022-01-24 23:17:12 +05:30
Daksh P. Jain
72dbc1b0ab New translations strings.xml (Italian) 2022-01-24 23:17:11 +05:30
Daksh P. Jain
c57596a610 New translations strings.xml (Hungarian) 2022-01-24 23:17:09 +05:30
Daksh P. Jain
5a264ba524 New translations strings.xml (Greek) 2022-01-24 23:17:08 +05:30
Daksh P. Jain
1a6fe2b711 New translations strings.xml (German) 2022-01-24 23:17:07 +05:30
Daksh P. Jain
06ea06bfa4 New translations strings.xml (Czech) 2022-01-24 23:17:06 +05:30
Daksh P. Jain
774fb4dbe1 New translations strings.xml (Arabic) 2022-01-24 23:17:04 +05:30
Daksh P. Jain
a707ace212 New translations strings.xml (Japanese) 2022-01-24 23:17:03 +05:30
Daksh P. Jain
8ceb1bfbdb New translations strings.xml (Spanish) 2022-01-24 23:17:02 +05:30
Daksh P. Jain
33134a97ef New translations strings.xml (Romanian) 2022-01-24 23:17:00 +05:30
Daksh P. Jain
6d9ee2c62f New translations strings.xml (Chinese Simplified) 2022-01-24 23:16:59 +05:30
Daksh P. Jain
1373dcaa46 New translations strings.xml (Portuguese, Brazilian) 2022-01-24 23:16:58 +05:30
Daksh P. Jain
216c5be2e3 New translations strings.xml (Filipino) 2022-01-24 23:16:57 +05:30
Daksh P. Jain
3d39fa32f0 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-24 23:16:56 +05:30
Daksh P. Jain
247e5b69c2 New translations strings.xml (Indonesian) 2022-01-24 23:16:55 +05:30
Daksh P. Jain
b94589b439 New translations strings.xml (French) 2022-01-24 23:16:53 +05:30
Daksh P. Jain
d9ba57e952 New translations strings.xml (Turkish) 2022-01-24 23:16:52 +05:30
Daksh P. Jain
70e4bd0097 New translations strings.xml (Korean) 2022-01-24 23:16:51 +05:30
Daksh P. Jain
e5995fd51f New translations strings.xml (Norwegian) 2022-01-24 23:16:50 +05:30
Daksh P. Jain
b9d288fba5 New translations strings.xml (Malayalam) 2022-01-24 23:16:49 +05:30
Daksh P. Jain
b6d9dac6be New translations strings.xml (Burmese) 2022-01-24 23:16:48 +05:30
Daksh P. Jain
6024ccc589 New translations strings.xml (Hindi) 2022-01-24 23:16:46 +05:30
Daksh P. Jain
3708aa32b1 New translations strings.xml (Croatian) 2022-01-24 23:16:45 +05:30
Daksh P. Jain
fe76a2a239 New translations strings.xml (Thai) 2022-01-24 23:16:44 +05:30
Daksh P. Jain
15752c418f New translations strings.xml (Tamil) 2022-01-24 23:16:43 +05:30
Daksh P. Jain
20f986980b New translations strings.xml (Dutch) 2022-01-24 23:16:42 +05:30
Daksh P. Jain
f511d1a271 New translations strings.xml (Persian) 2022-01-24 23:16:41 +05:30
Daksh P. Jain
5772a63366 New translations strings.xml (Chinese Traditional) 2022-01-24 23:16:40 +05:30
Daksh P. Jain
061fbbba39 New translations strings.xml (Ukrainian) 2022-01-24 23:16:39 +05:30
Daksh P. Jain
5a0c827ea2 New translations strings.xml (Swedish) 2022-01-24 23:16:38 +05:30
Daksh P. Jain
242d034acc New translations strings.xml (Serbian (Cyrillic)) 2022-01-24 23:16:37 +05:30
Daksh P. Jain
6c70004cef New translations strings.xml (Portuguese) 2022-01-24 23:16:36 +05:30
Daksh P. Jain
35c74c10c4 New translations strings.xml (Polish) 2022-01-24 23:16:35 +05:30
Daksh P. Jain
55ab256e41 New translations strings.xml (Vietnamese) 2022-01-24 23:16:34 +05:30
Daksh P. Jain
bcafcfb368 New translations strings.xml (Russian) 2022-01-24 23:16:33 +05:30
Daksh P. Jain
d24b08a5f0 Update source file strings.xml 2022-01-24 23:16:29 +05:30
Prathamesh More
b8637958ce Set exported to true for MusicService 2022-01-24 17:51:49 +05:30
Daksh P. Jain
b74b4808c6
Merge pull request #1226 from prathameshmm02/dev
New features, improvements and bug fixes
2022-01-24 17:06:52 +05:30
Prathamesh More
ad9c82990d Removed some redundant strings 2022-01-24 16:38:17 +05:30
Prathamesh More
8b9c8d7855 [Now Playing] Fixed Seekbar behaviour 2022-01-24 16:25:59 +05:30
Prathamesh More
67e5cea649 Added some new locales 2022-01-24 15:40:54 +05:30
Prathamesh More
4857fa6fc5 Fixed capitalization of strings and rearranged string entries 2022-01-24 15:40:53 +05:30
Prathamesh More
c96dad999a Fixed favorite button in Circle widget 2022-01-24 15:40:53 +05:30
Prathamesh More
2557b6950b Bump version code 2022-01-22 22:39:58 +05:30
Prathamesh More
1036b79a24 Fixed last top/recent albums/artists half visible 2022-01-22 20:35:33 +05:30
Prathamesh More
fa191b0cf4 Fixed status bar color when cab is on while switching tabs 2022-01-22 17:38:07 +05:30
Prathamesh More
1dc310d657 Fixed https://github.com/RetroMusicPlayer/RetroMusicPlayer/issues/1221 2022-01-22 10:37:34 +05:30
Daksh P. Jain
d0056ea753 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-22 05:23:30 +05:30
Daksh P. Jain
7c78007df2 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-21 23:11:10 +05:30
Prathamesh More
7226f9e76c [Now Playing] Fixed lyrics over cover 2022-01-21 21:51:15 +05:30
Prathamesh More
db97705f67 [Now Playing] Fixed lyrics and overflow icon color in Color theme 2022-01-21 18:52:44 +05:30
Prathamesh More
1c94e4d18a Fixed white navigation bar 2022-01-21 17:57:04 +05:30
Prathamesh More
5f8ba985a3 Fixed wallpaper accent not updating when wallpaper is changed 2022-01-21 15:36:13 +05:30
Daksh P. Jain
5926429fd4 New translations strings.xml (Filipino) 2022-01-21 11:14:19 +05:30
Prathamesh More
a104e42e0c Added collapsing app bar in Playing queue 2022-01-20 19:55:56 +05:30
Prathamesh More
09572b2551 Added option to use circular play button 2022-01-20 19:53:26 +05:30
Daksh P. Jain
3c5d67b9a7 New translations strings.xml (Chinese Simplified) 2022-01-20 11:36:27 +05:30
Daksh P. Jain
628349a2d4 New translations strings.xml (Filipino) 2022-01-20 11:36:26 +05:30
Daksh P. Jain
54e079a242 New translations strings.xml (Filipino) 2022-01-20 05:40:03 +05:30
Daksh P. Jain
42ae9c3853 New translations strings.xml (Portuguese, Brazilian) 2022-01-19 21:03:02 +05:30
Prathamesh More
e328ac116e Added Settings option in Folders tab 2022-01-19 18:21:25 +05:30
Prathamesh More
d1f2cac5c0 Added colored notification on A12 and fixed unreadable colors on light mode on A12 2022-01-19 16:34:05 +05:30
Prathamesh More
404bc0ff12 Fixed Color fragment crash because of wrong layout and fixed play button animation on bottom sheet expanding. 2022-01-19 15:28:27 +05:30
Prathamesh More
f56000a8be Code Cleanup with abstract variables 2022-01-19 15:06:43 +05:30
Daksh P. Jain
d427907213 New translations strings.xml (Filipino) 2022-01-19 12:31:13 +05:30
Daksh P. Jain
18d019c299 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-19 12:31:12 +05:30
Daksh P. Jain
7f035e856f New translations strings.xml (Kurmanji (Kurdish)) 2022-01-19 06:04:13 +05:30
Daksh P. Jain
3f21e7de15 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-18 23:39:42 +05:30
Prathamesh More
5fba286afb Fixed empty audio fade duration dialog 2022-01-18 22:05:48 +05:30
Prathamesh More
af4347c4ff [Lyrics] Added lyrics editing on A11+ devices 2022-01-18 21:59:12 +05:30
Daksh P. Jain
7163312ad9 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-18 17:41:48 +05:30
Daksh P. Jain
5c50e1a99e New translations strings.xml (Kurmanji (Kurdish)) 2022-01-18 11:46:27 +05:30
Prathamesh More
39a2c45081 [Theme] Cleanup 2022-01-18 09:44:28 +05:30
Daksh P. Jain
a469ca3e1a New translations strings.xml (Russian) 2022-01-18 01:17:04 +05:30
Prathamesh More
959235ad02 Fixed incorrect theme 2022-01-17 20:11:28 +05:30
Prathamesh More
c7f7f9d695 Added option to keep screen on when showing lyrics 2022-01-17 18:14:55 +05:30
Prathamesh More
b349b8c4d1 Moved Playback speed option to overflow menu 2022-01-17 17:02:59 +05:30
Prathamesh More
f719068325 Fixed empty notification when Classic Notification is on 2022-01-17 17:00:54 +05:30
Prathamesh More
93ad0d0a90 Fixed crash on API lower than 27 because of WallpaperAccentManager 2022-01-17 16:45:35 +05:30
Prathamesh More
df21419b8b Fixed widget colors 2022-01-17 16:20:37 +05:30
Prathamesh More
9d1018c03c Added ability to extract accent color from wallpaper on 8.1+ devices 2022-01-17 13:53:25 +05:30
Daksh P. Jain
448baeb129 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-17 11:10:21 +05:30
Daksh P. Jain
727150ab86 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-17 05:12:40 +05:30
Prathamesh More
09ad243a14 Fixed Edge-to-Edge 2022-01-16 18:13:31 +05:30
Prathamesh More
ea4a54d404 Code Cleanup 2022-01-16 17:57:31 +05:30
Daksh P. Jain
c9fbafda4b New translations strings.xml (Kurmanji (Kurdish)) 2022-01-16 17:42:54 +05:30
Daksh P. Jain
265384b368 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-16 11:38:07 +05:30
Daksh P. Jain
3160d31f8a New translations strings.xml (Kurmanji (Kurdish)) 2022-01-15 23:10:22 +05:30
Daksh P. Jain
41a1be03c2 New translations strings.xml (Indonesian) 2022-01-15 23:10:21 +05:30
Prathamesh More
c8ce98b1df Fixed next previous clicks causing endless forward/rewind 2022-01-15 20:36:33 +05:30
Daksh P. Jain
7ed29a9fad New translations strings.xml (Kurmanji (Kurdish)) 2022-01-15 17:13:26 +05:30
Prathamesh More
9f668e5bf8 Updated changelog 2022-01-15 15:25:25 +05:30
Prathamesh More
e778e50073 Added "Circle" widget 2022-01-15 15:11:32 +05:30
Prathamesh More
b2e1ab2128 Added Collapsing appbar to library tabs with an option to switch back to simple appbar 2022-01-15 15:07:11 +05:30
Prathamesh More
ffd251ab62 [Home] Code Cleanup 2022-01-15 11:45:36 +05:30
Prathamesh More
ff1c83c91d Added Search tab 2022-01-15 00:07:58 +05:30
Prathamesh More
f769740d17 Code Cleanup 2022-01-14 23:41:10 +05:30
Prathamesh More
061c0a8a3c Added insetter https://github.com/chrisbanes/insetter 2022-01-14 21:32:59 +05:30
Prathamesh More
3569a5c304 [Home] Hide suggestions view if there are no suggested songs. 2022-01-14 21:32:59 +05:30
Prathamesh More
36122e71e8 [Search] Add song to queue and start playing it when clicked in Search 2022-01-14 21:32:58 +05:30
Prathamesh More
337d7301e9 Remove and Replace light mode default song, album, artist images with dark mode ones 2022-01-14 14:48:03 +05:30
Daksh P. Jain
504985ad6e New translations strings.xml (Kurmanji (Kurdish)) 2022-01-14 14:15:49 +05:30
Prathamesh More
2e674d4ba2 Use DynamicColors theme instead on applying themeOverlay afterwards for Material You 2022-01-14 12:00:24 +05:30
Prathamesh More
ceb452db25 Added elevationOverlay to popup menu background to distinguish it from the app background 2022-01-14 11:30:16 +05:30
Daksh P. Jain
64bda16f8c New translations strings.xml (Kurmanji (Kurdish)) 2022-01-14 08:15:48 +05:30
Prathamesh More
0efbefb6bd [Widget] Fixed colors of MD3 widget 2022-01-13 18:21:30 +05:30
Prathamesh More
7d3e1f4e28 Code Cleanup 2022-01-13 17:45:41 +05:30
Daksh P. Jain
bf821651b3 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-13 16:32:18 +05:30
Daksh P. Jain
2c633f51ad New translations strings.xml (Kurmanji (Kurdish)) 2022-01-13 10:23:04 +05:30
Prathamesh More
5415d3869a Ignore blacklist and other things, so any song can be played when opened from File Managers, and also from Folders tab. 2022-01-12 14:05:19 +05:30
Daksh P. Jain
3a837c41a6 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-12 05:05:27 +05:30
Prathamesh More
4d9396873e Removed finishing activity on BackPressed
On Android 12, back button works just like Home button when saving activity state, so, activity isn't finished/destroyed when back button is pressed, just like home button on previous Android versions.
2022-01-12 00:23:37 +05:30
Daksh P. Jain
ffc6a51dbd New translations strings.xml (Kurmanji (Kurdish)) 2022-01-11 23:07:17 +05:30
Daksh P. Jain
4f42df9a30 New translations strings.xml (Turkish) 2022-01-11 23:07:16 +05:30
Prathamesh More
8607b0d4ee Code Cleanup 2022-01-11 22:45:56 +05:30
Daksh P. Jain
310cab4acb New translations strings.xml (Kurmanji (Kurdish)) 2022-01-11 17:07:08 +05:30
Daksh P. Jain
cf593e67a9 New translations strings.xml (Kurmanji (Kurdish)) 2022-01-11 08:11:04 +05:30
Prathamesh More
170e51a595 Fixed status bar insets when FullScreen mode is on non-notched devices 2022-01-10 20:12:33 +05:30
Prathamesh More
903fb97eef View Binding 2022-01-08 15:43:04 +05:30
Prathamesh More
5772fcd812 Added lyrics shadow for better visibility of text 2022-01-08 00:40:51 +05:30
Prathamesh More
80f3926210 Separated Suggestions from Home sections 2022-01-07 23:56:14 +05:30
Prathamesh More
75cdf4d57f Code Cleanup 2022-01-07 22:23:59 +05:30
Prathamesh More
508bfde5cb Added reset in Playback speed dialog 2022-01-07 19:59:10 +05:30
Prathamesh More
456ecebef3 Fixed Bottom Sheet 2022-01-07 10:59:14 +05:30
Prathamesh More
0dfc41c381 Fixed Artist details bottom insets 2022-01-07 00:45:46 +05:30
Prathamesh More
326c2279a0 Added selection in DetailListFragment.kt (Most Played, Last added, etc.) 2022-01-07 00:15:24 +05:30
Prathamesh More
dfa3129239 [Feature] Added option to switch to Manrope 2022-01-06 23:19:26 +05:30
Prathamesh More
83fca0a829 [Feature] Added Long Press to forward, rewind current song 2022-01-06 23:10:03 +05:30
Prathamesh More
06147dde49 Code cleanup 2022-01-06 20:39:25 +05:30
Prathamesh More
6205befb25 Fixed Buggy Navigation bar color on Just Black theme 2022-01-06 14:50:47 +05:30
Prathamesh More
5589fab2c6 Revert "Added Circular Std and a toggle to use it"
This reverts commit 02b72551
2022-01-05 20:22:54 +05:30
Prathamesh More
c974d7fefc Bump versionCode & Updated change-log 2022-01-05 16:19:26 +05:30
Prathamesh More
02b72551c9 Added Circular Std and a toggle to use it 2022-01-05 16:02:20 +05:30
Prathamesh More
fd03cb4e99 Code Cleanup 2022-01-05 16:01:44 +05:30
Prathamesh More
943de60f23 Added ability to set Playback speed and pitch 2022-01-05 14:27:05 +05:30
Hemanth S
3a6645ab35 Merge branch 'dev' of https://github.com/RetroMusicPlayer/Private into dev 2022-01-05 12:11:04 +05:30
Prathamesh More
7dd1d4d80c Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2022-01-05 11:13:28 +05:30
Prathamesh More
5a5b464057 Added grow animation to LrcView 2022-01-04 14:26:22 +05:30
Prathamesh More
956cce6989 Added option to show lyrics over Cover 2022-01-04 12:23:36 +05:30
Daksh P. Jain
a1e110fea4 New translations strings.xml (Russian) 2022-01-04 01:48:15 +05:30
Daksh P. Jain
154da940bb New translations strings.xml (French) 2022-01-04 01:48:13 +05:30
Daksh P. Jain
d708ed142c New translations strings.xml (Indonesian) 2022-01-02 13:21:29 +05:30
Daksh P. Jain
0bff07cae4 New translations strings.xml (Spanish) 2022-01-02 13:21:28 +05:30
Prathamesh More
3cd6714336 Fixed FAB going behind Mini Player 2022-01-02 13:02:46 +05:30
Prathamesh More
eb02b7eb1d Fixed crashes on pre-Marshmallow devices because of Notification 2022-01-02 11:35:57 +05:30
Prathamesh More
3f5d83b4d4 Fixed Gradient Player queue sheet 2022-01-02 10:38:53 +05:30
Daksh P. Jain
a4f99021aa New translations strings.xml (Spanish) 2022-01-02 07:17:01 +05:30
Prathamesh More
64401ec012 Fixed Gapless Playback LMAO 2022-01-01 22:20:46 +05:30
Prathamesh More
3d6bf809f8 Formatted MultiPlayer.java 2022-01-01 22:10:17 +05:30
Daksh P. Jain
cdb0daa07e
Merge pull request #1214 from prathameshmm02/dev
Updated Screenshots
2022-01-01 13:06:19 +05:30
Prathamesh More
78c765fcac Bump version code 2022-01-01 13:00:12 +05:30
Prathamesh More
ecc04a3c76 Updated Screenshots 2022-01-01 12:16:59 +05:30
Daksh P. Jain
09112f6259 New translations strings.xml (Odia) 2022-01-01 01:33:51 +05:30
Daksh P. Jain
e3b8631803 New translations strings.xml (Norwegian) 2022-01-01 01:33:51 +05:30
Daksh P. Jain
d7647e2e8d New translations strings.xml (Dutch) 2022-01-01 01:33:50 +05:30
Daksh P. Jain
ff9ac29454 New translations strings.xml (Korean) 2022-01-01 01:33:49 +05:30
Daksh P. Jain
f0196370a7 New translations strings.xml (Japanese) 2022-01-01 01:33:48 +05:30
Daksh P. Jain
de78fa9c5e New translations strings.xml (Greek) 2022-01-01 01:33:47 +05:30
Daksh P. Jain
e95d53c65e New translations strings.xml (German) 2022-01-01 01:33:46 +05:30
Daksh P. Jain
2b94031668 New translations strings.xml (Polish) 2022-01-01 01:33:45 +05:30
Daksh P. Jain
d2d586cc11 New translations strings.xml (Czech) 2022-01-01 01:33:44 +05:30
Daksh P. Jain
64f2ea416b New translations strings.xml (French) 2022-01-01 01:33:43 +05:30
Daksh P. Jain
a00081fe82 New translations strings.xml (Romanian) 2022-01-01 01:33:42 +05:30
Daksh P. Jain
2d215019fd New translations strings.xml (Filipino) 2022-01-01 01:33:40 +05:30
Daksh P. Jain
434ec08c91 New translations strings.xml (Persian) 2022-01-01 01:33:39 +05:30
Daksh P. Jain
98a0b2b04a New translations strings.xml (Italian) 2022-01-01 01:33:38 +05:30
Daksh P. Jain
5acc23cc59 New translations strings.xml (Hungarian) 2022-01-01 01:33:37 +05:30
Daksh P. Jain
aada99fcf4 New translations strings.xml (Arabic) 2022-01-01 01:33:36 +05:30
Daksh P. Jain
427a862db6 New translations strings.xml (Spanish) 2022-01-01 01:33:35 +05:30
Daksh P. Jain
bbb4feb9e4 New translations strings.xml (Portuguese) 2022-01-01 01:33:34 +05:30
Daksh P. Jain
a507dfd137 New translations strings.xml (Serbian (Cyrillic)) 2022-01-01 01:33:33 +05:30
Daksh P. Jain
0b4119f505 New translations strings.xml (Swedish) 2022-01-01 01:33:32 +05:30
Daksh P. Jain
c760ab8f22 New translations strings.xml (Turkish) 2022-01-01 01:33:31 +05:30
Daksh P. Jain
67fcd7218c New translations strings.xml (Ukrainian) 2022-01-01 01:33:30 +05:30
Daksh P. Jain
0bf8415bfe New translations strings.xml (Chinese Traditional) 2022-01-01 01:33:29 +05:30
Daksh P. Jain
0ab82c7d5f New translations strings.xml (Vietnamese) 2022-01-01 01:33:28 +05:30
Daksh P. Jain
8e6e6b9912 New translations strings.xml (Portuguese, Brazilian) 2022-01-01 01:33:27 +05:30
Daksh P. Jain
7bb48ecbcb New translations strings.xml (Indonesian) 2022-01-01 01:33:26 +05:30
Daksh P. Jain
c2a88e671e New translations strings.xml (Tamil) 2022-01-01 01:33:25 +05:30
Daksh P. Jain
c5896bab96 New translations strings.xml (Thai) 2022-01-01 01:33:24 +05:30
Daksh P. Jain
6ddbe2b983 New translations strings.xml (Croatian) 2022-01-01 01:33:23 +05:30
Daksh P. Jain
d951d64fba New translations strings.xml (Hindi) 2022-01-01 01:33:23 +05:30
Daksh P. Jain
3093724721 New translations strings.xml (Burmese) 2022-01-01 01:33:21 +05:30
Daksh P. Jain
67e4ac6d5c New translations strings.xml (Malayalam) 2022-01-01 01:33:20 +05:30
Daksh P. Jain
896ef425e5 New translations strings.xml (Russian) 2022-01-01 01:33:19 +05:30
Daksh P. Jain
d64b7d9b42 New translations strings.xml (Chinese Simplified) 2022-01-01 01:33:18 +05:30
Daksh P. Jain
f587ee53a4 Update source file strings.xml 2022-01-01 01:33:16 +05:30
Daksh P. Jain
afc309a296
Merge pull request #1211 from prathameshmm02/dev
Fixed some crashes and bugs
2021-12-31 20:24:26 +05:30
Prathamesh More
bbd7de8d90 [Now Playing: Color] Fixed wrong Lyrics icon color 2021-12-31 19:48:07 +05:30
Prathamesh More
7a2d14e061 Added Artist song sort order in Artist details fragment 2021-12-31 19:48:07 +05:30
Prathamesh More
cd933b56dc Increased size of Touch targets of Seekbars 2021-12-31 19:48:06 +05:30
Prathamesh More
cbf410f0cd [Backup & Restore] Code Cleanup 2021-12-31 19:48:06 +05:30
Prathamesh More
ab5015d4b1 Added Java 8+ API desugaring, so we can use Java 8+ features on any API 2021-12-31 19:48:06 +05:30
Prathamesh More
7db6186ff8 [Backup & Restore] Code Cleanup 2021-12-31 19:48:06 +05:30
Prathamesh More
1d77b3155a [Backup & Restore] Better Backup & Restore
Removed Playing Queue, Most Played, History, etc. from Backup. Better Backup & Restore for Playlists & Custom Artist Images.
2021-12-31 19:48:05 +05:30
Prathamesh More
076fc1d9c5 Animate visibility of LrcView and Fixed LrcView ClickListener 2021-12-31 19:47:08 +05:30
Prathamesh More
ac40c984b0 Fixed background color of Navigation Bars in GradientPlayer 2021-12-31 19:47:08 +05:30
Prathamesh More
f3c76f1002 [Backup] Tint BackupFragment buttons 2021-12-31 19:47:08 +05:30
Prathamesh More
2055795c99 ViewBinding in some Adapter classes which are using one layout 2021-12-31 19:47:08 +05:30
Prathamesh More
77e1c653be Rename .java to .kt 2021-12-31 19:47:08 +05:30
Prathamesh More
48da7dced3 [Backup] Code Cleanup 2021-12-31 19:47:08 +05:30
Prathamesh More
4af4771cfe [Playlists] Fixed playlist import 2021-12-31 19:47:08 +05:30
Prathamesh More
94925722ac [Restore] Fixed wrong file name in RestoreActivity 2021-12-31 19:47:08 +05:30
Prathamesh More
f4f4db4d47 Fixed Import Playlist crash on ColorOS devices 2021-12-31 19:47:08 +05:30
Daksh P. Jain
70474a1462
Merge pull request #1207 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-12-31 19:16:25 +05:30
Daksh P. Jain
bbb20e4b96 New translations strings.xml (Indonesian) 2021-12-30 16:38:52 +05:30
Daksh P. Jain
8445c758d6 New translations strings.xml (Indonesian) 2021-12-30 10:28:34 +05:30
Prathamesh More
5b1c7c69cd Fixed Import Playlist crash on ColorOS devices 2021-12-29 14:55:13 +05:30
Daksh P. Jain
aa31a321cf
Merge pull request #1205 from prathameshmm02/dev
Stable release
2021-12-29 12:51:17 +05:30
Prathamesh More
cdedde1893
Merge pull request #1200 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-12-29 11:01:00 +05:30
Prathamesh More
d74fe1eb7d Actually fixed incorrect Artist Images 2021-12-29 10:44:20 +05:30
Daksh P. Jain
017b14c383
Merge pull request #1204 from prathameshmm02/dev
Bug fixes
2021-12-28 16:21:43 +05:30
Prathamesh More
5d45754342 Bump versionName, versionCode & updated Change-log 2021-12-28 15:00:10 +05:30
Prathamesh More
158865a500 [Notification] Set default notification icon for failed Image loads or for Songs with no Cover 2021-12-28 14:14:07 +05:30
Prathamesh More
22451b3cf1 [Album Cover Style] Removed Material Album cover style which was almost similar to Normal Album Style and Fixed Normal Album Style 2021-12-28 14:11:58 +05:30
Prathamesh More
91baedfc70 Exit Artist & Album details if song count is 0, in case Songs may have got deleted for those Album or Artist 2021-12-28 14:06:50 +05:30
Prathamesh More
dff682c1f1 Fixed a crash when a Song is deleted in Artist Details 2021-12-28 14:06:50 +05:30
Prathamesh More
cf217b5733 Fixed Material Cab colors 2021-12-28 14:06:50 +05:30
Prathamesh More
acab873450 [Now Playing: Card] Fixed Card theme Play button shadow cutting 2021-12-28 14:06:50 +05:30
Prathamesh More
8d0b502c6d [Now Playing: Peak] Same background color for Peak Player theme as that of Mini player (Bottom Sheet) 2021-12-28 14:06:50 +05:30
Prathamesh More
0c438375f7 [Notification] Show Dismiss action only on A12 2021-12-28 14:06:50 +05:30
Prathamesh More
bcd3126885 Updated dependencies 2021-12-28 14:06:50 +05:30
Prathamesh More
c0edb8b311 [Notification] Fixed Classic Notification on A12 2021-12-28 14:06:49 +05:30
Prathamesh More
853289a81d [Now Playing: Fit] Fixed Fit theme button colors 2021-12-28 14:06:49 +05:30
Prathamesh More
27485bea2d [Lyrics] Reverted to old behaviour of lyrics
i.e. Click Album art to Show Normal lyrics and then to LyricsFragment
2021-12-28 14:06:49 +05:30
Prathamesh More
775271aed4 [Artists] Fixed incorrect Artist Images 2021-12-28 14:06:49 +05:30
Prathamesh More
89d1b7e835 [Notification] Fixed empty notification when queue is cleared 2021-12-28 14:06:49 +05:30
Prathamesh More
e5cb0dc241 Fixed Snowfall effect 2021-12-28 14:06:49 +05:30
Prathamesh More
b4529e071f Fixed Shuffle button margin 2021-12-28 14:06:49 +05:30
Prathamesh More
bc7768f5ab Centered app icon 2021-12-28 14:06:49 +05:30
Prathamesh More
be917106a6 Fixed bottom sheet peek height 2021-12-28 14:06:49 +05:30
Prathamesh More
e67c094320 Fixed bottom navigation tint 2021-12-28 14:06:49 +05:30
Daksh P. Jain
52a1bd95f2 New translations strings.xml (Italian) 2021-12-27 22:42:39 +05:30
Daksh P. Jain
d686bfea1a New translations strings.xml (Italian) 2021-12-27 16:42:52 +05:30
Daksh P. Jain
50d56183a1
Merge pull request #1202 from prathameshmm02/dev
Fixed build error & added Build status to Readme
2021-12-27 09:03:26 +05:30
Prathamesh More
1e1de7dc27 Added Build Status to README.md 2021-12-26 20:44:57 +05:30
Prathamesh More
b607aca391 Fixed Build Error 2021-12-26 20:11:18 +05:30
Daksh P. Jain
05b3943454
Update strings.xml 2021-12-26 18:45:08 +05:30
Daksh P. Jain
497d9c5117
Merge pull request #1201 from l2dy/gh-actions-1
Add GitHub Actions workflow
2021-12-26 18:10:52 +05:30
Daksh P. Jain
dbbb4089dd New translations strings.xml (Chinese Simplified) 2021-12-26 13:43:29 +05:30
Zero King
48997460c6 Add GitHub Actions workflow 2021-12-26 05:17:40 +00:00
Daksh P. Jain
6b450090bf New translations strings.xml (Chinese Simplified) 2021-12-26 07:39:05 +05:30
Hemanth S
64a7e9f0c3
Merge pull request #1184 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-12-25 06:07:49 -08:00
Daksh P. Jain
db067a2845 New translations strings.xml (Odia) 2021-12-25 00:48:03 +05:30
Daksh P. Jain
73fdbe8c1a New translations strings.xml (Norwegian) 2021-12-25 00:48:02 +05:30
Daksh P. Jain
8e8bba2346 New translations strings.xml (Dutch) 2021-12-25 00:48:01 +05:30
Daksh P. Jain
cc1fc54b49 New translations strings.xml (Korean) 2021-12-25 00:48:00 +05:30
Daksh P. Jain
fb765b54bc New translations strings.xml (Japanese) 2021-12-25 00:47:59 +05:30
Daksh P. Jain
2f4bea4506 New translations strings.xml (Greek) 2021-12-25 00:47:58 +05:30
Daksh P. Jain
89bb24f638 New translations strings.xml (German) 2021-12-25 00:47:57 +05:30
Daksh P. Jain
369391daed New translations strings.xml (Polish) 2021-12-25 00:47:56 +05:30
Daksh P. Jain
589e8810c7 New translations strings.xml (Czech) 2021-12-25 00:47:55 +05:30
Daksh P. Jain
7d2770eec3 New translations strings.xml (French) 2021-12-25 00:47:54 +05:30
Daksh P. Jain
c49a9cee0c New translations strings.xml (Romanian) 2021-12-25 00:47:53 +05:30
Daksh P. Jain
58fc29d0b7 New translations strings.xml (Filipino) 2021-12-25 00:47:52 +05:30
Daksh P. Jain
4d2823745d New translations strings.xml (Persian) 2021-12-25 00:47:51 +05:30
Daksh P. Jain
ba5e899308 New translations strings.xml (Italian) 2021-12-25 00:47:50 +05:30
Daksh P. Jain
19de816d42 New translations strings.xml (Hungarian) 2021-12-25 00:47:49 +05:30
Daksh P. Jain
a95fb601a2 New translations strings.xml (Arabic) 2021-12-25 00:47:48 +05:30
Daksh P. Jain
4b0a0a47bd New translations strings.xml (Spanish) 2021-12-25 00:47:47 +05:30
Daksh P. Jain
d56b748df3 New translations strings.xml (Portuguese) 2021-12-25 00:47:46 +05:30
Daksh P. Jain
95e3708199 New translations strings.xml (Serbian (Cyrillic)) 2021-12-25 00:47:45 +05:30
Daksh P. Jain
dc06341886 New translations strings.xml (Swedish) 2021-12-25 00:47:44 +05:30
Daksh P. Jain
8a3b1651e4 New translations strings.xml (Turkish) 2021-12-25 00:47:43 +05:30
Daksh P. Jain
191389eac5 New translations strings.xml (Ukrainian) 2021-12-25 00:47:42 +05:30
Daksh P. Jain
000bbc81e4 New translations strings.xml (Chinese Traditional) 2021-12-25 00:47:41 +05:30
Daksh P. Jain
334a5253ce New translations strings.xml (Vietnamese) 2021-12-25 00:47:40 +05:30
Daksh P. Jain
4a865eaf8b New translations strings.xml (Portuguese, Brazilian) 2021-12-25 00:47:39 +05:30
Daksh P. Jain
4b43186d0c New translations strings.xml (Indonesian) 2021-12-25 00:47:38 +05:30
Daksh P. Jain
dd4f91c6f1 New translations strings.xml (Tamil) 2021-12-25 00:47:37 +05:30
Daksh P. Jain
fb05ba30d9 New translations strings.xml (Thai) 2021-12-25 00:47:36 +05:30
Daksh P. Jain
bdfe6391d9 New translations strings.xml (Croatian) 2021-12-25 00:47:35 +05:30
Daksh P. Jain
5430d65b34 New translations strings.xml (Hindi) 2021-12-25 00:47:34 +05:30
Daksh P. Jain
0f44241410 New translations strings.xml (Burmese) 2021-12-25 00:47:33 +05:30
Daksh P. Jain
8606823b19 New translations strings.xml (Malayalam) 2021-12-25 00:47:32 +05:30
Daksh P. Jain
c8d8445ba6 New translations strings.xml (Russian) 2021-12-25 00:47:31 +05:30
Daksh P. Jain
8f7c894112 New translations strings.xml (Chinese Simplified) 2021-12-25 00:47:30 +05:30
Daksh P. Jain
b7028c42b7 Update source file strings.xml 2021-12-25 00:47:28 +05:30
Daksh P. Jain
c988f2f0fd
Merge pull request #1191 from prathameshmm02/dev
Added New features and bug fixes
2021-12-24 22:45:48 +05:30
Prathamesh More
d31ba0621d Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2021-12-24 18:35:14 +05:30
Prathamesh More
cd594967bf Updated Changelog and also show Changelog at start 2021-12-24 18:34:32 +05:30
Prathamesh More
5a310ec329 Added Snowfall effect 2021-12-24 16:47:57 +05:30
Prathamesh More
8e1dc3a600 Fixed insets of Settings screens & Folder tab 2021-12-24 16:21:31 +05:30
Prathamesh More
444677fe21 [BottomNavigation] Fixed BottomNavigation for Immersive mode 2021-12-24 15:52:55 +05:30
Prathamesh More
e72cffe6ea [Playlists] Added fastscroll in Playlists tab 2021-12-24 15:18:45 +05:30
Prathamesh More
f7620ca640 [BottomNavigation] Hide BottomNavigation when only one tab is selected in Library Categories 2021-12-23 23:48:12 +05:30
Prathamesh More
357275001e [Preferences] Removed redundant preferences 2021-12-23 23:39:11 +05:30
Prathamesh More
886ade241f [Home] Tint home playlist buttons 2021-12-23 18:25:31 +05:30
Prathamesh More
0521125bcd Code Cleanup 2021-12-23 13:51:20 +05:30
Prathamesh More
a10459c08a Fixed Search fragment keyboard visibility bug
https://github.com/RetroMusicPlayer/RetroMusicPlayer/issues/1185
2021-12-23 13:37:26 +05:30
Prathamesh More
a072e2a629 Code Cleanup 2021-12-23 12:43:30 +05:30
Prathamesh More
8b79d84614 Reverted to older method to set Light navigation bar and status bar 2021-12-23 11:13:04 +05:30
Prathamesh More
9e00965103 [Now Playing] Added simple lyrics to full album cover themes 2021-12-22 22:25:55 +05:30
Prathamesh More
1648fc6ef3 Fixed flat player toolbar colors 2021-12-22 18:07:58 +05:30
Prathamesh More
6cc3f953ce Fixed NoSuchMethodException because of Proguard removing the method, which caused errors in reading tags, audioHeader of m4a files 2021-12-22 15:22:14 +05:30
Prathamesh More
7e0dc0c309 Fixed PurchaseActivity 2021-12-22 01:05:46 +05:30
Prathamesh More
1346c49c24 Added album cover in mini player(Again) 2021-12-21 23:15:31 +05:30
Prathamesh More
9d8eb633af Added Swipe on Lyrics to change songs 2021-12-21 23:01:22 +05:30
Prathamesh More
f660c6147a [Now playing] Applied fading edges to LrcView 2021-12-21 09:42:02 +05:30
Prathamesh More
1c50903f5c Fixed Lyrics icon not updating for Full & Gradient theme 2021-12-21 01:05:43 +05:30
Prathamesh More
48950922fb Fixed Equalizer disabled in Settings 2021-12-20 23:29:54 +05:30
Prathamesh More
ff2574fffc Fixed lyrics crash 2021-12-20 22:13:45 +05:30
Prathamesh More
9fc25b71ce [Now playing] Fixed lyrics color 2021-12-20 18:08:55 +05:30
Hemanth S
80739f412a Merge branch 'dev' of https://github.com/RetroMusicPlayer/Private into dev 2021-12-20 17:14:45 +05:30
Prathamesh More
0dd5663e9e Added fade in layout animation for DetailListFragment 2021-12-20 16:42:49 +05:30
Prathamesh More
a26f08127c Fixed navigation bar color pre Oreo 2021-12-20 16:03:46 +05:30
Prathamesh More
b68947c672 Use proguard-android-optimize.txt 2021-12-20 16:03:02 +05:30
Prathamesh More
0544db1174 Disabled EditText of Restore Activity 2021-12-19 16:11:50 +05:30
Prathamesh More
5a41a07b76 Added Chooser to choose what to restore 2021-12-19 16:00:12 +05:30
Prathamesh More
2e16994276 Fixed light theme on A12 2021-12-19 14:59:16 +05:30
Prathamesh More
8cf092ab0b Fixed save button colors of Tag editor 2021-12-18 21:33:52 +05:30
Prathamesh More
d82ebd4225 Added Disc number to Song tag editor 2021-12-18 21:30:27 +05:30
Prathamesh More
1b4abccd2b Optimized imports 2021-12-18 14:51:46 +05:30
Prathamesh More
edb6574c35 Added navigation bar color to Pre Oreo devices for better navigation bar visibility 2021-12-18 14:36:18 +05:30
Prathamesh More
7b1f9cc1f3 [Glide] Fixed showing previous loaded covers for songs without covers 2021-12-18 12:28:18 +05:30
Prathamesh More
10ee02929b Cleanup 2021-12-18 11:58:25 +05:30
Prathamesh More
874e8df94c [Themes & Styles] Code cleanup 2021-12-17 14:50:50 +05:30
Daksh P. Jain
7f14f03065 New translations strings.xml (Filipino) 2021-12-16 21:40:23 +05:30
Prathamesh More
36c94a9813 [Ringtone] Fixed Ringtone crash on A11+ 2021-12-16 20:03:07 +05:30
Daksh P. Jain
05cd50fb94 New translations strings.xml (Filipino) 2021-12-16 15:38:01 +05:30
Prathamesh More
30bc178b86 Updated dependencies 2021-12-16 10:53:18 +05:30
Prathamesh More
adab132bf3 [Home] Consistent no. of lines for Home playlist buttons 2021-12-16 00:36:28 +05:30
Prathamesh More
e4a309af66 [Now Playing] Replaced old lyrics with LrcView, this replaces Album Cover with LrcView when enabled
[Now Playing] Replaced old lyrics with LrcView, this replaces Album Cover with LrcView when enabled
2021-12-16 00:10:34 +05:30
Prathamesh More
9806e2119a Updated dependencies 2021-12-15 13:37:25 +05:30
Prathamesh More
71d13ae5db [Tag Editor] Readable text color for Tag Editor save button 2021-12-15 12:06:43 +05:30
Prathamesh More
5a204b3653 [Lockscreen Controls] Fixed glitchy Lockscreen Slide 2021-12-15 12:03:01 +05:30
Prathamesh More
c919033a2c Added CrossFade effect to Blur, Blur Card & Circle player 2021-12-15 00:45:30 +05:30
Prathamesh More
4d31c4ccc3 Updated Open Source Licenses 2021-12-14 23:18:42 +05:30
Prathamesh More
268e077ab5 [Now Playing: Circle] Replaced SeekArc with Circular Seekbar
[Now Playing: Circle] Replaced SeekArc with Circular Seekbar
2021-12-14 22:50:18 +05:30
Prathamesh More
87eb3c08c3 [Now Playing: Circle] Added Circular rotating album cover to Circle theme 2021-12-14 19:34:26 +05:30
Daksh P. Jain
ffd0a992c5 New translations strings.xml (Filipino) 2021-12-14 19:02:51 +05:30
Daksh P. Jain
28c0872676
New Crowdin updates (#1181)
* New translations strings.xml (Italian)

* New translations strings.xml (Persian)

* New translations strings.xml (Persian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Filipino)

* New translations strings.xml (Filipino)

* New translations strings.xml (Filipino)

* New translations strings.xml (Filipino)

* New translations strings.xml (Filipino)
2021-12-14 13:28:48 +05:30
Prathamesh More
222e39d0ea Clearing SearchView also clears the search results 2021-12-13 17:49:31 +05:30
Prathamesh More
4211ed1a9b [Tag Editor] Added artwork chooser for Song tag editor 2021-12-13 16:06:48 +05:30
Prathamesh More
305b075365 [Tag Editor] Changed JAudioTagger to https://github.com/Kaned1as/jaudiotagger
- We should be able to read and write to opus files
- We should be able to set artwork to Flac and other files
2021-12-13 15:01:44 +05:30
Prathamesh More
aaabd8a20a Set overScrollMode to never for API lower than S 2021-12-13 12:01:26 +05:30
Prathamesh More
5e08b889c1 Fixed some crashes
- Import playlist crash
- Create new backup crash
2021-12-13 10:54:01 +05:30
Hemanth S
669c402fd6 internal release 5.4..4 2021-12-13 02:05:45 +05:30
Prathamesh More
ac902d0bf0 Fixed new playlist crash with same name 2021-12-12 23:39:07 +05:30
Prathamesh More
01be471576 Removed lyrics & lyrics icon from Peak theme 2021-12-12 22:20:26 +05:30
Prathamesh More
58feab5c23 MD3 look for Smart playlist buttons 2021-12-12 20:58:58 +05:30
Prathamesh More
5d8ad186d5 Edge-to-edge Code cleanup 2021-12-12 17:11:11 +05:30
Prathamesh More
421dc817a2 Fixed favorite toggle in DriveModeActivity 2021-12-12 17:09:05 +05:30
Prathamesh More
144fcf29bd Removed spotless 2021-12-12 16:53:58 +05:30
Prathamesh More
2975a33e95 Fixed Gradient theme queue sheet 2021-12-12 12:35:46 +05:30
Prathamesh More
e27bf9d2cb Updated dependencies and some changes to Gradle to decrease build time.
getDate used to run for every Build which resulted in different versionCode for every which is present in manifest, so heavy tasks used to run everytime so more build time. getDate is used for only release builds now.
2021-12-11 01:21:51 +05:30
Prathamesh More
2a3594a05a Restore data for any version(Google Backup & Restore) 2021-12-10 22:22:43 +05:30
Prathamesh More
0cd1b5d3bd [Notification] Made notification dismissible on API 31 and lower 2021-12-10 20:18:18 +05:30
Prathamesh More
6dc152b911 [Now Playing] Moved toolbar of Flat theme to bottom 2021-12-09 22:25:39 +05:30
Prathamesh More
4b857f6088 [Now Playing] Default Album cover theme for Now playing themes 2021-12-09 21:56:16 +05:30
Prathamesh More
766f62a1b7 [Now Playing] Fixed enterTransition for startDestination 2021-12-09 21:37:13 +05:30
Prathamesh More
dc0c4d2046 [UI] Fixed light navigation bar issues 2021-12-09 18:27:04 +05:30
Prathamesh More
558f61e905 [Settings] Fixed bottom padding issues in Setting screens on older devices
[Settings] Fixed bottom padding issues in Setting screens on older devices
2021-12-09 18:27:04 +05:30
Prathamesh More
581b2fb068 [Now Playing] Fixed Flat player crash 2021-12-09 08:06:15 +05:30
Prathamesh More
9fa90786f3 [UI] Rounded Banner image in UserInfo fragment 2021-12-09 08:02:03 +05:30
Prathamesh More
8cf36c1afa [UI] Rounded popup menus everywhere 2021-12-09 08:01:26 +05:30
Prathamesh More
5e7d69f247 [Notification] Fixed favorite not updating when song is changed 2021-12-07 23:03:57 +05:30
Prathamesh More
05246729de Fixed incorrect colors in Color Fragment for default/error/placeholder cover art and else where, where colors are extracted from image 2021-12-07 22:31:50 +05:30
Prathamesh More
6dfea43021 [Now Playing] Fixed a bug in "Plain" Now playing theme where onClick event is consumed by the views behind the bottom sheet 2021-12-07 22:08:32 +05:30
Prathamesh More
c9ac6498ae [Menu] Rounded menu popup for songs 2021-12-07 18:13:50 +05:30
Prathamesh More
a830bc73af Removed background of card in item_grid.xml 2021-12-06 18:02:23 +05:30
Prathamesh More
faf4c634be Added enter transition to Folders tab 2021-12-06 17:39:31 +05:30
Prathamesh More
c81015905e [Notification] Fixed notification not updating when Classic Notification is toggled 2021-12-06 15:50:34 +05:30
Prathamesh More
8a181607be Fixed Player not collapsing when Queue is cleared 2021-12-06 15:42:10 +05:30
Prathamesh More
2d7567584a Fixed transition for startDestination 2021-12-06 15:07:42 +05:30
Prathamesh More
b0800504e4 [Bottom Navigation] Fixed bottom navigation visible in Playing Queue 2021-12-06 14:10:05 +05:30
Prathamesh More
9af80592b3 Code Cleanup 2021-12-05 23:39:48 +05:30
Hemanth S
bebe82f9e4
Merge pull request #1175 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-12-05 10:08:09 -08:00
Daksh P. Jain
ed9d4750bf New translations strings.xml (Odia) 2021-12-05 21:16:34 +05:30
Daksh P. Jain
d0802dcc7f New translations strings.xml (Chinese Traditional) 2021-12-05 21:16:33 +05:30
Daksh P. Jain
337632f896 New translations strings.xml (Romanian) 2021-12-05 21:16:32 +05:30
Daksh P. Jain
79163ace1a New translations strings.xml (Spanish) 2021-12-05 21:16:31 +05:30
Daksh P. Jain
c37136eb4a New translations strings.xml (Arabic) 2021-12-05 21:16:30 +05:30
Daksh P. Jain
0edc5e6507 New translations strings.xml (Czech) 2021-12-05 21:16:29 +05:30
Daksh P. Jain
1b54b71e80 New translations strings.xml (German) 2021-12-05 21:16:28 +05:30
Daksh P. Jain
0e8f149651 New translations strings.xml (Greek) 2021-12-05 21:16:27 +05:30
Daksh P. Jain
a78b18df9c New translations strings.xml (Hungarian) 2021-12-05 21:16:26 +05:30
Daksh P. Jain
33fa57e7a7 New translations strings.xml (Italian) 2021-12-05 21:16:24 +05:30
Daksh P. Jain
149364395d New translations strings.xml (Japanese) 2021-12-05 21:16:23 +05:30
Daksh P. Jain
bbf8ef0ab8 New translations strings.xml (Korean) 2021-12-05 21:16:22 +05:30
Daksh P. Jain
359c0714ed New translations strings.xml (Dutch) 2021-12-05 21:16:21 +05:30
Daksh P. Jain
a51594bd41 New translations strings.xml (Norwegian) 2021-12-05 21:16:20 +05:30
Daksh P. Jain
8a7c948dd3 New translations strings.xml (Polish) 2021-12-05 21:16:19 +05:30
Daksh P. Jain
3aca794440 New translations strings.xml (Chinese Simplified) 2021-12-05 21:16:18 +05:30
Daksh P. Jain
34774178fe New translations strings.xml (Portuguese) 2021-12-05 21:16:17 +05:30
Daksh P. Jain
aca9c47d86 New translations strings.xml (Serbian (Cyrillic)) 2021-12-05 21:16:16 +05:30
Daksh P. Jain
4c89edcba1 New translations strings.xml (Swedish) 2021-12-05 21:16:15 +05:30
Daksh P. Jain
3884b128b6 New translations strings.xml (Turkish) 2021-12-05 21:16:14 +05:30
Daksh P. Jain
ab07b5b381 New translations strings.xml (Ukrainian) 2021-12-05 21:16:13 +05:30
Daksh P. Jain
ef7134e4b7 New translations strings.xml (Vietnamese) 2021-12-05 21:16:12 +05:30
Daksh P. Jain
7b9b653bd4 New translations strings.xml (Portuguese, Brazilian) 2021-12-05 21:16:12 +05:30
Daksh P. Jain
b47e8fe787 New translations strings.xml (Indonesian) 2021-12-05 21:16:11 +05:30
Daksh P. Jain
7da73a9912 New translations strings.xml (Persian) 2021-12-05 21:16:10 +05:30
Daksh P. Jain
b3d7a3cddc New translations strings.xml (Tamil) 2021-12-05 21:16:08 +05:30
Daksh P. Jain
512f9dd8a7 New translations strings.xml (Thai) 2021-12-05 21:16:07 +05:30
Daksh P. Jain
760889e49e New translations strings.xml (Croatian) 2021-12-05 21:16:06 +05:30
Daksh P. Jain
593ce8876b New translations strings.xml (Hindi) 2021-12-05 21:16:05 +05:30
Daksh P. Jain
37bd7ecbfe New translations strings.xml (Burmese) 2021-12-05 21:16:04 +05:30
Daksh P. Jain
155ab52e30 New translations strings.xml (Malayalam) 2021-12-05 21:16:03 +05:30
Daksh P. Jain
a2be514d19 New translations strings.xml (Russian) 2021-12-05 21:16:02 +05:30
Daksh P. Jain
d5ba154b6c New translations strings.xml (French) 2021-12-05 21:16:01 +05:30
Daksh P. Jain
2315d02232 Update source file strings.xml 2021-12-05 21:15:58 +05:30
Daksh P. Jain
350cba2042
Merge pull request #1178 from prathameshmm02/dev
Bug Fixes & Improvements
2021-12-05 15:11:41 +05:30
Prathamesh More
92e074d100
Merge branch 'RetroMusicPlayer:dev' into dev 2021-12-05 15:03:13 +05:30
Prathamesh More
996506c44a Updated versionCode & versionName 2021-12-05 14:56:31 +05:30
Prathamesh More
1df50491fc [Notification] Fixed and improved playing notification 2021-12-05 14:52:03 +05:30
Prathamesh More
ba9c928588 [Player] Fixed Show now playing not working 2021-12-03 19:53:43 +05:30
Prathamesh More
93277b8de7 [Settings] Code Cleanup 2021-12-03 00:03:04 +05:30
Prathamesh More
91a4282581 [BottomNavigation] Better animations for BottomNavigationView 2021-12-02 23:56:07 +05:30
Prathamesh More
e02e99ed02 [Glide] Added placeholder images for song, album & artist 2021-12-02 17:45:10 +05:30
Prathamesh More
652a79f14e [ViewModel] Fixed long loading times for most played playlist 2021-12-02 17:45:10 +05:30
Prathamesh More
a6319167c9 [Lyrics] Fixed search icon not visible in LyricsFragment 2021-12-02 14:27:13 +05:30
Prathamesh More
1f84026682 [UI] Fixed white navigation bar on Now Playing 2021-12-02 01:17:23 +05:30
Prathamesh More
e5743ee98b [Cleanup] Converted functions of super class(AbsThemeActivity) to extension functions 2021-12-02 00:37:43 +05:30
Prathamesh More
42a00dee95 [Widget] Added a new MD3 widget 2021-12-01 20:14:46 +05:30
Prathamesh More
fd639d6348 Fixed Album artist sort order in Albums tab 2021-12-01 18:05:16 +05:30
Prathamesh More
12cf446375 [UI] Fixed last playlist song hidden by mini player 2021-12-01 14:02:50 +05:30
Prathamesh More
238c54c6fb [UI] Better support for Immersive mode on notched devices 2021-12-01 13:49:52 +05:30
Prathamesh More
c6f6317839 Remove songs from Queue when deleting songs on R 2021-12-01 12:50:44 +05:30
Prathamesh More
bc93ff49b4 [UI] Changed default grid style of Artists back to circular 2021-12-01 12:44:27 +05:30
Hemanth S
74166883fc Merge branch 'dev' of https://github.com/RetroMusicPlayer/Private into dev 2021-12-01 12:14:19 +05:30
Daksh P. Jain
6924e5de01
Merge pull request #1176 from prathameshmm02/dev
Bug Fixes & Improvements
2021-12-01 11:56:31 +05:30
Prathamesh More
b6509de53c Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2021-12-01 11:26:22 +05:30
Daksh P. Jain
9573b0c8ab New translations strings.xml (Hungarian) 2021-12-01 01:40:30 +05:30
Prathamesh More
13d9b6ab71 Updated dependencies 2021-12-01 00:44:40 +05:30
Prathamesh More
77b464f1bd [UI] Harmonized colors for ColorIconsImageView.kt
Harmonized colors for Smart playlists' icon on home tab and setting categories' icon
2021-11-30 18:01:31 +05:30
Prathamesh More
dcc04c6ea4 Cleaning up moved or deleted songs from Smart playlists i.e. History, Top played 2021-11-29 19:31:41 +05:30
Prathamesh More
2dcbe0801b Using runCatching 2021-11-28 22:36:19 +05:30
Prathamesh More
d6ce7005f8 [Cleanup] Removed useless parent 2021-11-28 22:27:45 +05:30
Prathamesh More
6ae4c3cae4 [Cleanup] Code Cleanup, Removed some unused methods 2021-11-28 22:25:18 +05:30
Prathamesh More
3df5a77ee8 [UI] Using WindowInsetControllerCompat for setting Light Status bar, Light navigation bar & Immersive mode and removed deprecated code 2021-11-28 22:18:17 +05:30
Prathamesh More
1e85bcf388 [Theme] Merged styles.xml v21 with the normal configuration 2021-11-28 20:01:32 +05:30
Prathamesh More
0723c34ec4 [Backup] Added null check for Restore backup uri 2021-11-28 19:53:40 +05:30
Prathamesh More
eaa8cc3052 [UI] Removed rect_selector.xml on API 31 2021-11-28 18:50:35 +05:30
Prathamesh More
ca9c3124f1 [Playlists] Filtering Empty playlists e.g. Favorites 2021-11-28 18:48:20 +05:30
Prathamesh More
a78100c0ea Fixed ForegroundServiceStartNotAllowedException when song ended on Android 12.
This was due to Android 12's foreground service restrictions.
2021-11-28 13:37:48 +05:30
Prathamesh More
21a2014385 Updated Dependencies 2021-11-28 13:35:30 +05:30
Prathamesh More
cbc29b553c [Cleanup] Removed unused Classes 2021-11-28 12:35:07 +05:30
Prathamesh More
de14e72689 [Cleanup] Removed redundant API 21(Lollipop) or lower version checks as the minimum SDK version is 21 2021-11-28 12:31:33 +05:30
Prathamesh More
aefd52c12e [Tag Editor] Removed warnings 2021-11-28 10:46:56 +05:30
Prathamesh More
dab5ddb838 Added Custom Artist images backup 2021-11-27 20:07:22 +05:30
Prathamesh More
63bd71b7e6 [Library] Implemented Better saving of GridStyle
We used to store layout ID's of grid styles before which caused all sorts of trouble whenever an update was pushed. Layout ID's are generated at compile time according to alphabetical order ig, so if a layout is added or renamed, it will cause layout ID's to change, which resulted in either a Different layout than the one user stored, or totally random layout or a crash. So to counter this, 0-6 constant ID's are used to save Grid Styles which should result in stable updates.
2021-11-27 18:44:51 +05:30
Prathamesh More
e1364ed8a4 [Settings] Fixed transition cutting from bottom in Settings page while navigating 2021-11-27 17:20:01 +05:30
Prathamesh More
2f047e3b63 [Now Playing] Create single instance of Album, Artist & lyrics pages created from Now Playing 2021-11-27 14:09:25 +05:30
Prathamesh More
fa976b1cba [Cleanup] Fixing Warnings 2021-11-27 14:06:49 +05:30
Prathamesh More
1fdd537253 [Backup] Code Cleanup 2021-11-27 14:05:31 +05:30
Prathamesh More
d6bc78619b [Playlists] Added Grid size selection for Playlists 2021-11-27 01:29:36 +05:30
Prathamesh More
c52d02ea10 Added Version check for FLAG_IMMUTABLE 2021-11-27 00:37:16 +05:30
Prathamesh More
c45fd8d5fd [UI] Changed selection color on A12+ 2021-11-27 00:37:16 +05:30
Prathamesh More
216d25e3f0 [UI] Made Playlist Preview images rounded 2021-11-26 19:01:39 +05:30
Prathamesh More
49effb8b9e [UI] Added bottom padding to bottom navigation 2021-11-26 17:45:48 +05:30
Prathamesh More
ea750a682c Fixed Album Artist sort order 2021-11-26 17:43:12 +05:30
Prathamesh More
2dc332befd Fixed New Music Mix multiple clicks crash 2021-11-26 14:48:30 +05:30
Prathamesh More
50c04b6d97 Directly ask for permission from user to delete a file instead of showing a confirmation dialog and then asking for permission 2021-11-26 13:37:02 +05:30
Prathamesh More
4e10acf5c2 Fixed Blacklist preference "Clear All" crash 2021-11-26 10:53:08 +05:30
Daksh P. Jain
be460124ca
Merge pull request #1173 from prathameshmm02/dev
Fixed some bugs & visual inconsistencies
2021-11-25 16:52:17 +05:30
Prathamesh More
d09f4b7ef4 Fix Build Error: Escaping Apostrophe 2021-11-25 11:52:03 +05:30
Prathamesh More
57845a4249 Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev 2021-11-25 10:40:33 +05:30
Prathamesh More
d080a5e944 Updated versionCode & versionName 2021-11-25 10:39:41 +05:30
Prathamesh More
6f7e97ac09 Fixed Bottom Toolbar not clickable in now playing when Shuffle is clicked 2021-11-25 01:45:34 +05:30
Prathamesh More
976d9d53cc Code Cleanup 2021-11-24 20:58:35 +05:30
Prathamesh More
94a84b0b24 Circular fab when Material You is enabled 2021-11-24 19:53:19 +05:30
Prathamesh More
16f76bc12d Updated Kotlin & Room 2021-11-24 01:39:15 +05:30
Prathamesh More
4fbcb5d77f Added file selection from system file picker for restore 2021-11-24 00:37:16 +05:30
Prathamesh More
46417e569a
Merge pull request #1166 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-11-23 23:55:20 +05:30
Daksh P. Jain
be5e5884b4 New translations strings.xml (Hindi) 2021-11-23 23:17:56 +05:30
Prathamesh More
3c07edb5e5 Targeting Android 11, Android 12 foreground service restrictions causes multiple crashes 2021-11-23 22:22:26 +05:30
Prathamesh More
e0b3960374 Better Edge-to-edge support & fixed some visual glitches 2021-11-23 22:22:26 +05:30
Daksh P. Jain
724b333a96 New translations strings.xml (Chinese Simplified) 2021-11-23 17:12:12 +05:30
Hemanth S
a5bd0da8d9
Update README.md 2021-11-23 03:12:03 -08:00
Prathamesh More
50c7d4aeb7 Fixed Main Settings bottom insets 2021-11-23 11:31:50 +05:30
Daksh P. Jain
36c653716a
Merge pull request #1172 from prathameshmm02/dev
Updated version code and version name
2021-11-23 11:31:43 +05:30
Prathamesh More
db6e6a2533 Fixed Sleep Timer crash 2021-11-23 11:25:28 +05:30
Prathamesh More
c8afb60254 Material3 button styles to Permission activity 2021-11-23 11:22:37 +05:30
Prathamesh More
5db550ccd2 Enable Material You by default on A12 2021-11-23 11:20:07 +05:30
Prathamesh More
e187b13912 Fixed File deletion on A10 2021-11-23 11:17:26 +05:30
Prathamesh More
ad81ceb592 Updated version code and version name 2021-11-23 10:57:03 +05:30
Daksh P. Jain
7669ddc83e New translations strings.xml (Italian) 2021-11-23 00:24:30 +05:30
Daksh P. Jain
b2970a6185
Merge pull request #1169 from prathameshmm02/dev
Support for scoped storage and better compatibility with Android 12
2021-11-22 18:12:53 +05:30
Prathamesh More
574b990984 Fixed Widget and Notification crashes and added a better notification layout for Android 12 2021-11-22 17:44:07 +05:30
Prathamesh More
8e64f117f9 Fixed tag editing for Android 11+ devices 2021-11-22 17:41:41 +05:30
Prathamesh More
4eb2f68da5 Added MediaStore delete for A11 2021-11-22 17:40:27 +05:30
Prathamesh More
e9b7b5a203 Fixed Playlist save 2021-11-22 17:40:23 +05:30
Prathamesh More
9a32aa2805 Update targetSdkVersion appthemehelper 2021-11-22 17:40:14 +05:30
Hemanth S
19c1bafeb8 towards android 12 fixing 2021-11-22 17:40:10 +05:30
Daksh P. Jain
da4f9f7fb0 New translations strings.xml (Odia) 2021-11-21 23:20:42 +05:30
Daksh P. Jain
3a80195062 New translations strings.xml (Chinese Traditional) 2021-11-21 23:20:41 +05:30
Daksh P. Jain
179dd6a5ba New translations strings.xml (Romanian) 2021-11-21 23:20:40 +05:30
Daksh P. Jain
04b98d11af New translations strings.xml (Spanish) 2021-11-21 23:20:39 +05:30
Daksh P. Jain
b45f58f7b7 New translations strings.xml (Arabic) 2021-11-21 23:20:38 +05:30
Daksh P. Jain
dc4af19514 New translations strings.xml (Czech) 2021-11-21 23:20:38 +05:30
Daksh P. Jain
992d021acf New translations strings.xml (German) 2021-11-21 23:20:36 +05:30
Daksh P. Jain
914a8528d3 New translations strings.xml (Greek) 2021-11-21 23:20:35 +05:30
Daksh P. Jain
3c52dc845a New translations strings.xml (Hungarian) 2021-11-21 23:20:35 +05:30
Daksh P. Jain
10632caf4c New translations strings.xml (Italian) 2021-11-21 23:20:34 +05:30
Daksh P. Jain
602adbe619 New translations strings.xml (Japanese) 2021-11-21 23:20:33 +05:30
Daksh P. Jain
8b96a87816 New translations strings.xml (Korean) 2021-11-21 23:20:32 +05:30
Daksh P. Jain
1ecfe22178 New translations strings.xml (Dutch) 2021-11-21 23:20:31 +05:30
Daksh P. Jain
c2a12bc17d New translations strings.xml (Norwegian) 2021-11-21 23:20:30 +05:30
Daksh P. Jain
ce84a76713 New translations strings.xml (Polish) 2021-11-21 23:20:29 +05:30
Daksh P. Jain
ee9c4c1a41 New translations strings.xml (Chinese Simplified) 2021-11-21 23:20:28 +05:30
Daksh P. Jain
fdeb59e4cd New translations strings.xml (Portuguese) 2021-11-21 23:20:27 +05:30
Daksh P. Jain
11959ea69f New translations strings.xml (Serbian (Cyrillic)) 2021-11-21 23:20:26 +05:30
Daksh P. Jain
88e12e75b8 New translations strings.xml (Swedish) 2021-11-21 23:20:25 +05:30
Daksh P. Jain
3bc827144a New translations strings.xml (Turkish) 2021-11-21 23:20:24 +05:30
Daksh P. Jain
cc862eff6c New translations strings.xml (Ukrainian) 2021-11-21 23:20:23 +05:30
Daksh P. Jain
f95efa1120 New translations strings.xml (Vietnamese) 2021-11-21 23:20:22 +05:30
Daksh P. Jain
42d09f7ded New translations strings.xml (Portuguese, Brazilian) 2021-11-21 23:20:21 +05:30
Daksh P. Jain
cd5435b843 New translations strings.xml (Indonesian) 2021-11-21 23:20:20 +05:30
Daksh P. Jain
4d8198d15b New translations strings.xml (Persian) 2021-11-21 23:20:20 +05:30
Daksh P. Jain
19f9acb803 New translations strings.xml (Tamil) 2021-11-21 23:20:19 +05:30
Daksh P. Jain
1d8990b8d8 New translations strings.xml (Thai) 2021-11-21 23:20:18 +05:30
Daksh P. Jain
0cf0715274 New translations strings.xml (Croatian) 2021-11-21 23:20:17 +05:30
Daksh P. Jain
93d461dfa8 New translations strings.xml (Hindi) 2021-11-21 23:20:16 +05:30
Daksh P. Jain
4494a3d8b0 New translations strings.xml (Burmese) 2021-11-21 23:20:15 +05:30
Daksh P. Jain
ad4d9cdde0 New translations strings.xml (Malayalam) 2021-11-21 23:20:14 +05:30
Daksh P. Jain
e823dd3506 New translations strings.xml (Russian) 2021-11-21 23:20:13 +05:30
Daksh P. Jain
8cba23be21 New translations strings.xml (French) 2021-11-21 23:20:12 +05:30
Daksh P. Jain
92f16bd696 Update source file strings.xml 2021-11-21 23:20:09 +05:30
Prathamesh More
c7d158f860
Merge pull request #1168 from prathameshmm02/dev
New Update
2021-11-21 21:34:36 +05:30
Daksh P. Jain
9ca32292cc New translations strings.xml (Chinese Traditional) 2021-11-21 17:18:27 +05:30
Prathamesh More
6bff74d0f9 Removed overScrollMode="never" for A12 stretch overscroll effect 2021-11-21 16:17:46 +05:30
Prathamesh More
88ae4bcbcc Removed overScrollMode="never" for A12 stretch overscroll effect 2021-11-21 16:03:00 +05:30
Prathamesh More
6d0200f6f5 Merge branch 'dev' of https://github.com/prathameshmm02/RetroMusicPlayer into dev
 Conflicts:
	app/build.gradle
	app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
2021-11-21 15:42:22 +05:30
Daksh P. Jain
7f5c797bc7 New translations strings.xml (Chinese Traditional) 2021-11-21 11:20:27 +05:30
Prathamesh More
b0de3006a4 Fixed Color Fragment crash 2021-11-21 08:46:33 +05:30
Prathamesh More
348dc08f73 Changed backup root path to Documents 2021-11-21 08:46:17 +05:30
Prathamesh More
484d003a3b Updated Dependencies 2021-11-21 08:46:11 +05:30
Daksh P. Jain
d2cfc13e12 New translations strings.xml (French) 2021-11-19 02:40:22 +05:30
Prathamesh More
e5b04a0e7d Fixed : CollapsingToolbar not expandable when collapsed in another settings page 2021-11-18 11:57:21 +05:30
Prathamesh More
a43946210f Fixed full theme continuous crash 2021-11-17 21:31:38 +05:30
Prathamesh More
8099eb0012 Fixed back button action 2021-11-17 21:18:52 +05:30
Prathamesh More
9fa4d0bcc6 Updated dependencies 2021-11-17 18:20:32 +05:30
Prathamesh More
e405251f2c Removed resetting of queue position in PlayingQueueFragment when song is removed from queue 2021-11-15 11:30:29 +05:30
Prathamesh More
97c56f9e57 Fixed IllegalStateException when deleting multiple songs 2021-11-15 11:26:59 +05:30
Daksh P. Jain
9dc691b47d
New Crowdin updates (#1160)
* New translations strings.xml (Spanish)

* New translations strings.xml (Tamil)

* New translations strings.xml (Tamil)

* New translations strings.xml (French)

* New translations strings.xml (Chinese Simplified)
2021-11-14 13:46:24 +05:30
Prathamesh More
b2dbfd3083 Fixed toolbar popup options not visible in multi-select mode in Light mode 2021-11-13 22:06:50 +05:30
Prathamesh More
e216591419 Fixed order of songs in Playlist save 2021-11-12 21:14:18 +05:30
Prathamesh More
5d39ac18dc Fixed appBarLayout elevation of WhatsNewActivity 2021-11-12 17:10:20 +05:30
Prathamesh More
38a8c6a87a [MD3] Added more rounded-ness to all Cards, dialogs, etc. 2021-11-12 17:04:33 +05:30
Prathamesh More
3fe882c79c More rounded corners for Home banner 2021-11-12 11:07:02 +05:30
Prathamesh More
30282e79fe Added proper transitions 2021-11-11 20:59:28 +05:30
Prathamesh More
bc146d8b11 Added tint to bottomNavigationView and slidingPanel 2021-11-11 20:24:05 +05:30
Prathamesh More
9d93d700be Code cleanup 2021-11-11 20:21:57 +05:30
Prathamesh More
5ee9c04924 Fixed normal player appearing behind navbar 2021-11-10 17:33:33 +05:30
Prathamesh More
71c3128bb4 Fixed text scroll glitches in now playing 2021-11-10 12:06:54 +05:30
Prathamesh More
8ae853cd90 Removed jcenter repository completely 2021-11-08 20:57:34 +05:30
Prathamesh More
f9d5cc33cc Added AppBarLayout elevation effect to various details fragments 2021-11-08 12:16:48 +05:30
Prathamesh More
58d71cad8a Fixed DetailListFragment AppBarLayout 2021-11-08 11:44:24 +05:30
Prathamesh More
5fa3b8febc Migrated to Play billing v4 2021-11-08 11:08:52 +05:30
Prathamesh More
824e77f59b Updated Dependencies 2021-11-08 11:07:41 +05:30
Prathamesh More
e5acb1e132 Fixed edit & search lyrics buttons 2021-10-30 16:40:07 +05:30
Prathamesh More
13573882a1 Code Cleanup crossfade 2021-10-30 16:34:23 +05:30
Prathamesh More
335d9000bf Fixed incorrect theme when md3 enabled 2021-10-30 16:34:23 +05:30
Prathamesh More
fe4283e3d7 Renamed files 2021-10-28 17:27:39 +05:30
Prathamesh More
aa583614d2 Updated dependencies 2021-10-28 17:26:28 +05:30
Daksh P. Jain
74f832ad1a
New Crowdin updates (#1155)
* New translations strings.xml (Greek)

* New translations strings.xml (Greek)

* New translations strings.xml (Malayalam)

* New translations strings.xml (Turkish)

* New translations strings.xml (Turkish)

* New translations strings.xml (Turkish)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Turkish)
2021-10-27 17:34:47 +05:30
Prathamesh More
78fcd6c43b Added Backup & restore summary 2021-10-27 17:05:48 +05:30
Prathamesh More
271cff7283 Fixed artists tab lag 2021-10-27 16:52:44 +05:30
Prathamesh More
8422e5abbd Fixed folder fragment AppBarLayout 2021-10-27 10:54:19 +05:30
Prathamesh More
92635af1e0 Fixed blank player screen when clicked notification when Show Now Playing preference was true 2021-10-27 09:46:33 +05:30
Hemanth S
238987d533 Merge branch 'dev' of https://github.com/RetroMusicPlayer/Private into dev 2021-10-26 22:29:29 +05:30
Prathamesh More
cde2e0b229 Fixed Storages not loading in FoldersFragment 2021-10-26 16:28:56 +05:30
Prathamesh More
c70ceb1fbc Fixed Storages not loading in FoldersFragment 2021-10-26 11:51:00 +05:30
Prathamesh More
34c2f6e3d3 Fixed Lyrics dialog when clicked on Navigation Bar 2021-10-26 10:43:05 +05:30
Prathamesh More
2cb8ed4ade Added space below CollapsingToolbar 2021-10-26 10:16:23 +05:30
Prathamesh More
db01ce6ee8 Code Cleanup 2021-10-25 20:51:40 +05:30
Prathamesh More
aca697f6ff Fixing Bug report and change log activities 2021-10-25 20:04:36 +05:30
Prathamesh More
ef903bdf42 Re-added stuff which I removed accidentally 2021-10-25 19:23:46 +05:30
Prathamesh More
3851923a98 Fixed lyrics icon not updating 2021-10-25 18:12:41 +05:30
Prathamesh More
3bfacaea77 Fixed bottom sheet animations 2021-10-25 18:08:10 +05:30
Prathamesh More
72aedb7e77
Fixed Donate products not loading 2021-10-24 20:23:52 +05:30
Prathamesh More
db3a7d4097 Fixed crash and added more options to backup 2021-10-23 21:31:33 +05:30
Prathamesh More
75410bf77b Fixed Song title not visible due to menu icon 2021-10-23 19:37:51 +05:30
Prathamesh More
76fc04cc99 Fixed bottom insets in Gradient theme 2021-10-23 18:29:03 +05:30
Prathamesh More
ef1d24d7f9 Fixed bottom insets in Gradient theme 2021-10-23 18:15:25 +05:30
Prathamesh More
63d2ab7b6a Took care of themes in Landscape 2021-10-23 17:34:02 +05:30
Prathamesh More
efeacfa622 Fixed AppBarLayout issues 2021-10-23 17:25:48 +05:30
Prathamesh More
cb8ef7f32c Revert "Added placeholders for images"
This reverts commit a25c80a9
2021-10-23 11:08:29 +05:30
Prathamesh More
e247e56aee Fixed bottom sheet not dragging when bottom navigation was invisible 2021-10-22 21:22:57 +05:30
Prathamesh More
f3ebd34531 Fixed miniplayer cutting fragment_container content 2021-10-22 20:31:43 +05:30
Prathamesh More
94ccecc012 Fixed overlapping navbar in landscape 2021-10-22 20:23:23 +05:30
Prathamesh More
65d52776f8 Fixed navbar overlapping in settings 2021-10-22 12:14:53 +05:30
Prathamesh More
d8aaa5a21b Added MD3 accent to all preferences 2021-10-22 10:16:06 +05:30
Hemanth S
67edb9d216 Merge branch 'dev' of https://github.com/RetroMusicPlayer/Private into dev 2021-10-21 23:21:24 +05:30
Hemanth S
68787f4f08 Text and color changes 2021-10-21 23:21:19 +05:30
Prathamesh More
1c9630635c Fixed overlapping navbar with all themes 2021-10-21 21:48:17 +05:30
Prathamesh More
79238ede7a Fully transparent navbar 2021-10-21 21:27:14 +05:30
Prathamesh More
9628255b8f Made fab circle for Player themes 2021-10-21 20:14:02 +05:30
Prathamesh More
e35311ff85 Reverted to anjlab billing 2021-10-21 17:04:12 +05:30
Prathamesh More
8331b22632 Code Cleanup 2021-10-21 17:00:37 +05:30
Prathamesh More
2517220f1b Fixed shared element(image) overlapping on bottom sheet 2021-10-21 17:00:37 +05:30
Prathamesh More
734cdea427 Removed unnecessary objects from MediaEntryViewHolder 2021-10-21 17:00:36 +05:30
Prathamesh More
7b2f321693 Fixed cardview clipping in sharedElement transitions 2021-10-21 17:00:36 +05:30
Prathamesh More
2673a1f0d0 Added smooth bottom nav hide and show animation 2021-10-21 17:00:36 +05:30
Prathamesh More
9b376a2f4f Fixed invisible bottom navbar sometimes and a crash 2021-10-21 17:00:36 +05:30
Prathamesh More
c2647b9160 Fixed bottom sheet for Immersive mode 2021-10-21 17:00:36 +05:30
Prathamesh More
6a391219a8 Updated gradle and spotless plugins 2021-10-21 17:00:36 +05:30
Prathamesh More
0d970ed40e Fixed a crash on startup 2021-10-21 17:00:36 +05:30
Prathamesh More
8eb6c49303 Fixed mini player popping up in Playing queue when queue is reordered 2021-10-21 17:00:36 +05:30
Prathamesh More
520b6b74ca Code Cleanup 2021-10-21 17:00:36 +05:30
Prathamesh More
6ff3eb2e2a Fixed backups not visible 2021-10-21 17:00:36 +05:30
Prathamesh More
c5c4144973 Fixed Mini player visibility 2021-10-21 17:00:36 +05:30
Prathamesh More
7c0701efad Fixed grid size of first song set to 1 2021-10-21 17:00:35 +05:30
Prathamesh More
5005e91b1c Code Cleanup 2021-10-21 17:00:35 +05:30
Prathamesh More
f8be0502ca Fixed a typo 2021-10-21 17:00:35 +05:30
Prathamesh More
6e3c1aa742 Converted BackupActivity to fragment 2021-10-21 17:00:35 +05:30
Prathamesh More
5a73565182 Added backup & restore in settings 2021-10-21 17:00:34 +05:30
Prathamesh More
d703a05182 Added ability to restore 2021-10-21 17:00:34 +05:30
Prathamesh More
897b160834 Added ability to backup settings, databases & images 2021-10-21 17:00:34 +05:30
Prathamesh More
8ce6cf58fa Fixed Preference title tint for MD3 2021-10-21 17:00:34 +05:30
Prathamesh More
480d66cc24 Enabled MD3 on A12 by default 2021-10-21 17:00:33 +05:30
Prathamesh More
6074cdfda2 Optimized imports 2021-10-21 17:00:33 +05:30
Prathamesh More
7d49986f4b Extending AbsThemeActivity for some activities 2021-10-21 17:00:33 +05:30
Prathamesh More
5266b86c75 Updated version name and change-log 2021-10-21 17:00:33 +05:30
Prathamesh More
df5810a923 Removed some unnecessary proguard rules 2021-10-21 17:00:33 +05:30
Prathamesh More
a9fde92dd9 Removed quick actions from SongsFragment
Removing Play all & Shuffle quick actions from Songs tab as Shuffle fab is already there to complete the same task
2021-10-21 17:00:33 +05:30
Prathamesh More
ba69813ff3 Fixed Material you for all activities 2021-10-21 17:00:33 +05:30
Prathamesh More
72a11495fa Fixed UserInfoFragment.kt save fab bottom margin 2021-10-21 17:00:33 +05:30
Prathamesh More
f9188b05ca Cleaning up themes 2021-10-21 17:00:33 +05:30
Prathamesh More
4abf9645e0 Change status bar color on multi-selection 2021-10-21 17:00:33 +05:30
Prathamesh More
b2a1cb1e2e MD3 Accent color for Switch 2021-10-21 17:00:33 +05:30
Prathamesh More
531623b9b2 Decreased padding of switch preference no title 2021-10-21 17:00:32 +05:30
Prathamesh More
bc29d2ad12 Added MD3 switch 2021-10-21 17:00:32 +05:30
Prathamesh More
92b4a2fb57 Applying Dynamic colors immediately on MD3 preference changed 2021-10-21 17:00:32 +05:30
Prathamesh More
407cbb1020 Removed jcenter repository 2021-10-21 17:00:32 +05:30
Prathamesh More
9cf787bc04 Applying Dynamic colors immediately on MD3 preference changed 2021-10-21 17:00:32 +05:30
Prathamesh More
03b9e36014 Added extension functions to apply insets 2021-10-21 17:00:32 +05:30
Prathamesh More
9f5b9d32ad Classified fragment classes into suitable packages & optimized imports 2021-10-21 17:00:32 +05:30
Prathamesh More
5e16b79d23 Fixed lyrics toolbar button not working 2021-10-21 17:00:32 +05:30
Prathamesh More
61074305ec Fixed mini player becoming visible while collapsing BottomSheet 2021-10-21 17:00:32 +05:30
Prathamesh More
4d6f75031a Converted Lyrics activity to fragment 2021-10-21 17:00:32 +05:30
Prathamesh More
73f246b60e Rename .java to .kt 2021-10-21 17:00:31 +05:30
Prathamesh More
2ea878b3ac Updated dependencies 2021-10-21 17:00:31 +05:30
Prathamesh More
619f3871f2 Fixed album artist image not visible in search 2021-10-21 17:00:31 +05:30
Prathamesh More
4054d89f46 Visual changes to Search 2021-10-21 17:00:31 +05:30
Prathamesh More
fb603bc0c5 Added new theme for Material You on API 31 2021-10-21 17:00:31 +05:30
Prathamesh More
f23b102e41 Added new theme for Material You & a toggle 2021-10-21 17:00:31 +05:30
Prathamesh More
289557898e MD3 Play & Shuffle button 2021-10-21 17:00:31 +05:30
Prathamesh More
2997095bb3 Fixed a crash 2021-10-21 17:00:31 +05:30
Prathamesh More
ed2ca6c6fb Set bottom sheet to black in Just Black theme & made normal lyrics selectable 2021-10-21 17:00:30 +05:30
Prathamesh More
e7c10c8b6a Added playback resumption 2021-10-21 17:00:30 +05:30
Prathamesh More
541a6fffe5 Fixed fab bottom margin 2021-10-21 17:00:30 +05:30
Prathamesh More
a83879dffb Added playing queue fragment 2021-10-21 17:00:30 +05:30
Prathamesh More
6e081f30c0 Added Shuffle fab in songs, albums & artist tab 2021-10-21 17:00:30 +05:30
Prathamesh More
c80293f33a Added CollapsingToolbarLayout in settings 2021-10-21 17:00:30 +05:30
Prathamesh More
42b9ea4107 Fixed Material You 2021-10-21 17:00:30 +05:30
Prathamesh More
7b984108ab Fixed a preference list dialog crash 2021-10-21 17:00:30 +05:30
Prathamesh More
381e112dac Added smooth fade when theme is changed 2021-10-21 17:00:30 +05:30
Prathamesh More
6a5cc51db4 Optimized imports 2021-10-21 17:00:29 +05:30
Prathamesh More
900ea92562 Fixed Crossfade 2021-10-21 17:00:29 +05:30
Prathamesh More
7e755611b0 Fixed queue reordering 2021-10-21 17:00:29 +05:30
Prathamesh More
d82e547f6d Fixed reset button in Library categories preference 2021-10-21 17:00:28 +05:30
Prathamesh More
bd05de53d8 Changed artist and album details page a bit 2021-10-21 17:00:26 +05:30
Prathamesh More
8351c3e0fd Optimized imports 2021-10-21 17:00:20 +05:30
Prathamesh More
518485738e Migrated to mavenCentral version of some dependencies 2021-10-21 17:00:19 +05:30
Prathamesh More
1061fe8bfc Different md3 accent color for light and dark mode 2021-10-21 17:00:19 +05:30
Prathamesh More
93cc50a0c3 Added Material You accent color 2021-10-21 17:00:19 +05:30
Prathamesh More
b281b8395a Added Material You elevation color 2021-10-21 17:00:19 +05:30
Prathamesh More
6aedfbc2cb Migrated to Kotlin version of Material cab 2021-10-21 17:00:15 +05:30
Prathamesh More
4620c22479 Rename .java to .kt 2021-10-21 16:59:56 +05:30
Prathamesh More
ee7545f64e Fixed Audio Fade, Crossfade & Android Auto search 2021-10-21 16:59:55 +05:30
Prathamesh More
7f683eb0ee Fixed Settings light status bar and mini player alpha 2021-10-21 16:59:55 +05:30
Prathamesh More
e11494f443 Updated dependencies 2021-10-21 16:59:55 +05:30
Prathamesh More
5f2d3cfef7 Fixed Bottom Sheet drag glitch where Bottomnav would translate to the center of the screen 2021-10-21 16:59:54 +05:30
Prathamesh More
9f6ecc267b Rearrange xml entries for layout 2021-10-21 16:59:54 +05:30
Prathamesh More
9aa897fe7d Fixed tag-editor background 2021-10-21 16:59:54 +05:30
Prathamesh More
cccbc2804e Set light navigation bar 2021-10-21 16:59:54 +05:30
Prathamesh More
3722347305 Made Navigation Bar transparent and added some MD3 themes 2021-10-21 16:59:54 +05:30
Prathamesh More
9f17bf6378 Converted UserInfo activity to fragment 2021-10-21 16:59:54 +05:30
Prathamesh More
15a86f0f5b Made Navigation Bar transparent and added some MD3 themes 2021-10-21 16:59:53 +05:30
Prathamesh More
6cc0985ab6 Added color change animation on cab creation 2021-10-21 16:59:53 +05:30
Prathamesh More
d8c21ba7bb Removed cab updating animation 2021-10-21 16:59:53 +05:30
Prathamesh More
162e8ba2dc Removed cab updating animation 2021-10-21 16:59:53 +05:30
Prathamesh More
2c380b9844 Rename .java to .kt 2021-10-21 16:59:53 +05:30
Prathamesh More
f9c918234d Fixed inconsistent transitions 2021-10-21 16:59:53 +05:30
Prathamesh More
a25c80a9bc Added placeholders for images 2021-10-21 16:59:53 +05:30
Daksh P. Jain
9d9c93ffe6
New Crowdin updates (#1153)
* New translations strings.xml (Thai)

* New translations strings.xml (Hungarian)

* New translations strings.xml (German)

* New translations strings.xml (Hungarian)
2021-10-21 08:02:34 +05:30
Daksh P. Jain
082a1828e7 Merge branch 'l10n_dev' into dev 2021-10-18 09:01:11 +05:30
Daksh P. Jain
f4f91f812b New translations strings.xml (Thai) 2021-10-18 08:41:45 +05:30
Daksh P. Jain
1ff474bbae New translations strings.xml (Thai) 2021-10-18 08:01:05 +05:30
Teeranai.P
6b0dfd7768
Add Thai translation (#1152) 2021-10-17 21:25:30 +05:30
Daksh P. Jain
38d3901d1f New translations strings.xml (Spanish) 2021-10-16 19:21:04 +05:30
Daksh P. Jain
2c68038eec
New Crowdin updates (#1149)
* New translations strings.xml (Italian)

* New translations strings.xml (Odia)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Portuguese, Brazilian)
2021-10-16 13:06:31 +05:30
Daksh P. Jain
d97326c428
Merge pull request #1144 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-10-09 12:01:59 +05:30
Daksh P. Jain
5fa028c2ce New translations strings.xml (Odia) 2021-10-09 12:01:26 +05:30
Daksh P. Jain
b1ebda7efc New translations strings.xml (Indonesian) 2021-10-09 12:01:25 +05:30
Daksh P. Jain
943c3bf215 New translations strings.xml (Turkish) 2021-10-09 12:01:24 +05:30
Daksh P. Jain
aafab389ac New translations strings.xml (Arabic) 2021-10-09 12:01:23 +05:30
Daksh P. Jain
7765a0400a New translations strings.xml (Romanian) 2021-10-09 12:01:22 +05:30
Daksh P. Jain
59248dbbd0 New translations strings.xml (French) 2021-10-09 12:01:22 +05:30
Daksh P. Jain
eae6b3d085 New translations strings.xml (Spanish) 2021-10-09 12:01:21 +05:30
Daksh P. Jain
2f0d375b3a New translations strings.xml (Czech) 2021-10-09 12:01:20 +05:30
Daksh P. Jain
e4bc1fdfcc New translations strings.xml (German) 2021-10-09 12:01:19 +05:30
Daksh P. Jain
6bf6fe04e3 New translations strings.xml (Greek) 2021-10-09 12:01:18 +05:30
Daksh P. Jain
e5ff876ed3 New translations strings.xml (Hungarian) 2021-10-09 12:01:17 +05:30
Daksh P. Jain
0dac6913c4 New translations strings.xml (Italian) 2021-10-09 12:01:16 +05:30
Daksh P. Jain
22d216ae3e New translations strings.xml (Japanese) 2021-10-09 12:01:15 +05:30
Daksh P. Jain
776aab36c3 New translations strings.xml (Korean) 2021-10-09 12:01:14 +05:30
Daksh P. Jain
d2f826c8ae New translations strings.xml (Norwegian) 2021-10-09 12:01:13 +05:30
Daksh P. Jain
9727230087 New translations strings.xml (Dutch) 2021-10-09 12:01:12 +05:30
Daksh P. Jain
2472608407 New translations strings.xml (Polish) 2021-10-09 12:01:11 +05:30
Daksh P. Jain
1962aa3b65 New translations strings.xml (Serbian (Cyrillic)) 2021-10-09 12:01:11 +05:30
Daksh P. Jain
30ca756157 New translations strings.xml (Swedish) 2021-10-09 12:01:10 +05:30
Daksh P. Jain
a7ec1a9dbe New translations strings.xml (Ukrainian) 2021-10-09 12:01:09 +05:30
Daksh P. Jain
cf0090094e New translations strings.xml (Chinese Simplified) 2021-10-09 12:01:08 +05:30
Daksh P. Jain
3f65a5dd99 New translations strings.xml (Chinese Traditional) 2021-10-09 12:01:06 +05:30
Daksh P. Jain
c902f1ed84 New translations strings.xml (Vietnamese) 2021-10-09 12:01:05 +05:30
Daksh P. Jain
1df05d1c38 New translations strings.xml (Portuguese, Brazilian) 2021-10-09 12:01:04 +05:30
Daksh P. Jain
eac5be42f5 New translations strings.xml (Persian) 2021-10-09 12:01:03 +05:30
Daksh P. Jain
74b13715d4 New translations strings.xml (Tamil) 2021-10-09 12:01:02 +05:30
Daksh P. Jain
283964b064 New translations strings.xml (Croatian) 2021-10-09 12:01:01 +05:30
Daksh P. Jain
b0e26b7c90 New translations strings.xml (Hindi) 2021-10-09 12:01:00 +05:30
Daksh P. Jain
60b6f7dec3 New translations strings.xml (Burmese) 2021-10-09 12:00:59 +05:30
Daksh P. Jain
9ef7aae7a7 New translations strings.xml (Malayalam) 2021-10-09 12:00:58 +05:30
Daksh P. Jain
2bb7321123 New translations strings.xml (Russian) 2021-10-09 12:00:57 +05:30
Daksh P. Jain
2975c3d1c8 New translations strings.xml (Portuguese) 2021-10-09 12:00:56 +05:30
Daksh P. Jain
4dd6893fcb
Merge pull request #1148 from prathameshmm02/dev
Added new strings for Backup & Restore
2021-10-09 12:00:30 +05:30
Prathamesh More
109240437e Added new strings for Backup & Restore 2021-10-09 11:39:09 +05:30
Daksh P. Jain
f23e447077
Fix #1145 2021-10-07 08:45:17 +05:30
cdhiraj40
d5690081cc closing Keyboard when clicked in the background activity 2021-10-06 22:22:43 +05:30
Daksh P. Jain
dac2fd741c New translations strings.xml (Arabic) 2021-10-06 09:51:39 +05:30
Daksh P. Jain
ae390496ab New translations strings.xml (Turkish) 2021-10-03 07:35:21 +05:30
Daksh P. Jain
e6168008d2 New translations strings.xml (Turkish) 2021-10-03 01:34:10 +05:30
Daksh P. Jain
5659ebb3a3
Remove untranslated/outdated language strings (#1142) 2021-10-01 15:42:39 +05:30
Daksh P. Jain
eaf004254e
New Crowdin updates (#1139)
* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (French)

* New translations strings.xml (Romanian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Dutch)

* New translations strings.xml (Indonesian)
2021-10-01 14:45:05 +05:30
Daksh P. Jain
49f66205d2
New Crowdin updates (#1137)
* New translations strings.xml (French)

* New translations strings.xml (French)

* New translations strings.xml (French)

* New translations strings.xml (Korean)

* New translations strings.xml (Spanish)

* New translations strings.xml (Russian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese)
2021-09-21 11:20:34 +05:30
Bart Uliasz
b977cde1af
Fix files from SD card not being deleted (#48) 2021-09-18 15:29:42 +06:00
Prathamesh More
b78452b589
Added multi-select in playlists tab (#1132) 2021-09-12 16:07:04 +05:30
Daksh P. Jain
e1b9d518a7
New Crowdin updates (#1128)
* New translations strings.xml (Russian)

* New translations strings.xml (Spanish)

* New translations strings.xml (Polish)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Malayalam)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Persian)

* New translations strings.xml (Malayalam)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (French)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Persian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Persian)

* New translations strings.xml (French)
2021-09-11 08:17:09 +05:30
Daksh P. Jain
6e4c7552ab
Update README.md 2021-09-09 11:37:23 +05:30
Daksh P. Jain
95d978601b
Update README.md 2021-09-09 11:34:32 +05:30
Hemanth S
8604856a64
Merge pull request #1131 from prathameshmm02/dev
V5 Push
2021-09-08 11:50:04 -07:00
Prathamesh More
bce6dbfa27 V5 Push
Here's a list of changes/features: https://github.com/RetroMusicPlayer/RetroMusicPlayer/releases/tag/v5.0

Internal Changes:
1) Migrated to ViewBinding
2) Migrated to Glide V4
3) Migrated to kotlin version of Material Dialogs
2021-09-09 00:00:20 +05:30
Daksh P. Jain
fc42767031
New Crowdin updates (#1127)
* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Italian)
2021-09-06 08:47:45 +05:30
Daksh P. Jain
6ee63b58ea
New Crowdin updates (#1125)
* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)
2021-09-05 19:20:35 +05:30
Daksh P. Jain
f2c294dc4c
New Crowdin updates (#1122)
* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Estonian)

* New translations strings.xml (Swedish)

* New translations strings.xml (Turkish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Icelandic)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Persian)

* New translations strings.xml (Tamil)

* New translations strings.xml (Bengali)

* New translations strings.xml (Thai)

* New translations strings.xml (Latvian)

* New translations strings.xml (Slovak)

* New translations strings.xml (Hindi)

* New translations strings.xml (Malay)

* New translations strings.xml (Burmese)

* New translations strings.xml (Esperanto)

* New translations strings.xml (Filipino)

* New translations strings.xml (Luxembourgish)

* New translations strings.xml (Latin)

* New translations strings.xml (Flemish)

* New translations strings.xml (Kannada)

* New translations strings.xml (Nepali)

* New translations strings.xml (Hawaiian)

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

* New translations strings.xml (Russian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Italian)

* New translations strings.xml (Croatian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Polish)

* New translations strings.xml (Czech)

* New translations strings.xml (Romanian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Arabic)

* New translations strings.xml (Catalan)

* New translations strings.xml (German)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Greek)

* New translations strings.xml (Finnish)

* New translations strings.xml (Irish)

* New translations strings.xml (Gujarati)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Georgian)

* New translations strings.xml (Korean)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Punjabi)

* New translations strings.xml (Odia)

* Update source file strings.xml

* New translations strings.xml (Portuguese, Brazilian)
2021-09-05 08:51:44 +05:30
Daksh P. Jain
6c515aede6
Update strings.xml 2021-09-04 19:22:20 +05:30
Daksh P. Jain
5359c22e52
New translations strings.xml (Vietnamese) (#1120) 2021-09-04 11:53:41 +05:30
Daksh P. Jain
1e546d5f72
New Crowdin updates (#1118)
* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Italian)

* New translations strings.xml (French)

* New translations strings.xml (Italian)

* New translations strings.xml (Spanish)

* New translations strings.xml (German)

* New translations strings.xml (German)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Vietnamese)
2021-08-31 13:02:00 +05:30
Daksh P. Jain
3895c07a3c
New translations strings.xml (Russian) (#1117) 2021-08-23 18:49:38 +05:30
Daksh P. Jain
9c72d3bd43
New Crowdin updates (#1113)
* New translations strings.xml (Czech)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Thai)

* New translations strings.xml (Swedish)

* New translations strings.xml (Turkish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Icelandic)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Persian)

* New translations strings.xml (Tamil)

* New translations strings.xml (Bengali)

* New translations strings.xml (Estonian)

* New translations strings.xml (Slovak)

* New translations strings.xml (Latvian)

* New translations strings.xml (Hindi)

* New translations strings.xml (Malay)

* New translations strings.xml (Burmese)

* New translations strings.xml (Esperanto)

* New translations strings.xml (Filipino)

* New translations strings.xml (Luxembourgish)

* New translations strings.xml (Latin)

* New translations strings.xml (Flemish)

* New translations strings.xml (Kannada)

* New translations strings.xml (Nepali)

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

* New translations strings.xml (Russian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Italian)

* New translations strings.xml (Croatian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Polish)

* New translations strings.xml (Czech)

* New translations strings.xml (Romanian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Arabic)

* New translations strings.xml (Catalan)

* New translations strings.xml (German)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Greek)

* New translations strings.xml (Finnish)

* New translations strings.xml (Irish)

* New translations strings.xml (Gujarati)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Georgian)

* New translations strings.xml (Korean)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Punjabi)

* New translations strings.xml (Hawaiian)

* Update source file strings.xml

* New translations strings.xml (Italian)

* New translations strings.xml (Greek)

* New translations strings.xml (Greek)

* New translations strings.xml (Odia)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Estonian)

* New translations strings.xml (Swedish)

* New translations strings.xml (Turkish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Icelandic)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Persian)

* New translations strings.xml (Tamil)

* New translations strings.xml (Bengali)

* New translations strings.xml (Thai)

* New translations strings.xml (Latvian)

* New translations strings.xml (Slovak)

* New translations strings.xml (Hindi)

* New translations strings.xml (Malay)

* New translations strings.xml (Burmese)

* New translations strings.xml (Esperanto)

* New translations strings.xml (Filipino)

* New translations strings.xml (Luxembourgish)

* New translations strings.xml (Latin)

* New translations strings.xml (Flemish)

* New translations strings.xml (Kannada)

* New translations strings.xml (Nepali)

* New translations strings.xml (Hawaiian)

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

* New translations strings.xml (Russian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Danish)

* New translations strings.xml (Italian)

* New translations strings.xml (Croatian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Polish)

* New translations strings.xml (Czech)

* New translations strings.xml (Romanian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Arabic)

* New translations strings.xml (Catalan)

* New translations strings.xml (German)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Greek)

* New translations strings.xml (Finnish)

* New translations strings.xml (Irish)

* New translations strings.xml (Gujarati)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Georgian)

* New translations strings.xml (Korean)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Punjabi)

* New translations strings.xml (Odia)
2021-08-23 18:46:28 +05:30
Daksh P. Jain
d3d885c979
Update strings.xml 2021-08-23 18:39:57 +05:30
Prathamesh More
f26503aa3e
Merge pull request #1108 from vladrevers/dev
Added option to hide profile on home page
2021-08-21 09:26:11 +05:30
Daksh P. Jain
815e0a235e
New Crowdin updates (#1110)
* New translations strings.xml (Polish)

* New translations strings.xml (Dutch)
2021-08-18 09:11:19 +05:30
Daksh P. Jain
a41a29f44b
New Crowdin updates (#1109)
* New translations strings.xml (Italian)

* New translations strings.xml (Croatian)

* New translations strings.xml (Croatian)

* New translations strings.xml (Chinese Simplified)
2021-08-13 07:59:04 +05:30
Daksh P. Jain
7df4cd69c5
Merge pull request #1107 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-08-11 11:10:43 +05:30
Daksh P. Jain
7f0dffb242 New translations strings.xml (Dutch) 2021-08-11 11:08:22 +05:30
vladrevers
190baa6fdf Added option to hide profile on home page 2021-08-09 02:26:51 +03:00
Daksh P. Jain
204873e70b New translations strings.xml (Dutch) 2021-08-09 03:45:20 +05:30
Daksh P. Jain
b9b7a31991 New translations strings.xml (Dutch) 2021-08-08 14:13:26 +05:30
Daksh P. Jain
275caa14a5 New translations strings.xml (Dutch) 2021-08-08 08:01:43 +05:30
Daksh P. Jain
8cb5603ebf New translations strings.xml (Portuguese, Brazilian) 2021-08-07 15:48:32 +05:30
Daksh P. Jain
42feb0447a New translations strings.xml (Portuguese, Brazilian) 2021-08-07 05:15:29 +05:30
Daksh P. Jain
004a55d79b
Merge pull request #1100 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-08-04 11:43:50 +05:30
Daksh P. Jain
21fd6414bf New translations strings.xml (Georgian) 2021-08-03 16:42:28 +05:30
Daksh P. Jain
d43f94d591 New translations strings.xml (Arabic) 2021-07-31 18:42:27 +05:30
Daksh P. Jain
40e741779d New translations strings.xml (Arabic) 2021-07-31 12:37:36 +05:30
Daksh P. Jain
cb070329dc New translations strings.xml (Spanish) 2021-07-30 07:00:54 +05:30
Daksh P. Jain
9fdb637e0e New translations strings.xml (Tamil) 2021-07-30 01:03:20 +05:30
Daksh P. Jain
6a4a73dac3 New translations strings.xml (Spanish) 2021-07-30 01:03:18 +05:30
Daksh P. Jain
ec0bf9aaa3 New translations strings.xml (Spanish) 2021-07-29 19:02:11 +05:30
Daksh P. Jain
9afe4769ea
New Crowdin updates (#1098)
* New translations strings.xml (Persian)

* New translations strings.xml (Hindi)
2021-07-27 18:54:35 +05:30
Daksh P. Jain
b57109b24d
New Crowdin updates (#1096)
* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Chinese Simplified)
2021-07-26 14:05:27 +05:30
Daksh P. Jain
8be6e043ed
New translations strings.xml (Russian) (#1095) 2021-07-23 13:44:24 +05:30
Daksh P. Jain
da584aafc3
New translations strings.xml (Russian) (#1094) 2021-07-22 18:39:16 +05:30
Daksh P. Jain
32a8d762de
New translations strings.xml (Portuguese, Brazilian) (#1092) 2021-07-21 18:47:04 +05:30
Daksh P. Jain
caabf6ddcc
New Crowdin updates (#1091)
* New translations strings.xml (Arabic)

* New translations strings.xml (Arabic)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)
2021-07-20 08:22:15 +05:30
Daksh P. Jain
dad16ac551
Merge pull request #1089 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-07-19 07:59:07 +05:30
Daksh P. Jain
7e791a37fb New translations strings.xml (Chinese Simplified) 2021-07-19 01:38:00 +05:30
Daksh P. Jain
7062571d0a New translations strings.xml (Italian) 2021-07-19 01:37:59 +05:30
Daksh P. Jain
8460d3c2fb New translations strings.xml (Hungarian) 2021-07-19 01:37:58 +05:30
Daksh P. Jain
a8d87fb91e New translations strings.xml (Spanish) 2021-07-19 01:37:57 +05:30
Daksh P. Jain
0d28b2ce40
Update README.md 2021-07-18 20:06:02 +05:30
Daksh P. Jain
a97911b214
Merge pull request #1088 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-07-17 08:38:10 +05:30
Daksh P. Jain
2f4365f848 New translations strings.xml (Hindi) 2021-07-16 18:11:42 +05:30
Daksh P. Jain
85e2021b57
Merge pull request #1087 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-07-16 12:16:58 +05:30
Daksh P. Jain
76db19a13f New translations strings.xml (Hawaiian) 2021-07-16 12:05:00 +05:30
Daksh P. Jain
6c333261b3 New translations strings.xml (Slovak) 2021-07-16 12:04:58 +05:30
Daksh P. Jain
98cdb0006e New translations strings.xml (Russian) 2021-07-16 12:04:57 +05:30
Daksh P. Jain
6b4b76e9fc New translations strings.xml (Portuguese) 2021-07-16 12:04:56 +05:30
Daksh P. Jain
12e83fce75 New translations strings.xml (Polish) 2021-07-16 12:04:55 +05:30
Daksh P. Jain
969660dd45 New translations strings.xml (Punjabi) 2021-07-16 12:04:55 +05:30
Daksh P. Jain
7ec16a7051 New translations strings.xml (Norwegian) 2021-07-16 12:04:54 +05:30
Daksh P. Jain
4589045899 New translations strings.xml (Dutch) 2021-07-16 12:04:53 +05:30
Daksh P. Jain
9f5aa8bfbf New translations strings.xml (Korean) 2021-07-16 12:04:51 +05:30
Daksh P. Jain
3143ed6573 New translations strings.xml (Japanese) 2021-07-16 12:04:50 +05:30
Daksh P. Jain
e29f8aecc5 New translations strings.xml (Italian) 2021-07-16 12:04:50 +05:30
Daksh P. Jain
bfb2cdbede New translations strings.xml (Hungarian) 2021-07-16 12:04:48 +05:30
Daksh P. Jain
4908e3335b New translations strings.xml (Serbian (Cyrillic)) 2021-07-16 12:04:48 +05:30
Daksh P. Jain
a05601cffd New translations strings.xml (Hebrew) 2021-07-16 12:04:47 +05:30
Daksh P. Jain
85ea5c973c New translations strings.xml (Irish) 2021-07-16 12:04:45 +05:30
Daksh P. Jain
61913e6bf8 New translations strings.xml (Finnish) 2021-07-16 12:04:45 +05:30
Daksh P. Jain
b3ccef2284 New translations strings.xml (Greek) 2021-07-16 12:04:43 +05:30
Daksh P. Jain
8722c267e1 New translations strings.xml (German) 2021-07-16 12:04:42 +05:30
Daksh P. Jain
b952c5521b New translations strings.xml (Danish) 2021-07-16 12:04:42 +05:30
Daksh P. Jain
d88e4bda05 New translations strings.xml (Czech) 2021-07-16 12:04:41 +05:30
Daksh P. Jain
d047e897a1 New translations strings.xml (Catalan) 2021-07-16 12:04:40 +05:30
Daksh P. Jain
e969a480ba New translations strings.xml (Arabic) 2021-07-16 12:04:39 +05:30
Daksh P. Jain
0627daf8a8 New translations strings.xml (Afrikaans) 2021-07-16 12:04:38 +05:30
Daksh P. Jain
f2bd336941 New translations strings.xml (Spanish) 2021-07-16 12:04:37 +05:30
Daksh P. Jain
cb4fb30f98 New translations strings.xml (Gujarati) 2021-07-16 12:04:36 +05:30
Daksh P. Jain
fccfe51625 New translations strings.xml (French) 2021-07-16 12:04:35 +05:30
Daksh P. Jain
e87cc482a9 New translations strings.xml (Swedish) 2021-07-16 12:04:33 +05:30
Daksh P. Jain
ae363d5a09 New translations strings.xml (Ukrainian) 2021-07-16 12:04:32 +05:30
Daksh P. Jain
e10bee13ff New translations strings.xml (Nepali) 2021-07-16 12:04:31 +05:30
Daksh P. Jain
547f5ace73 New translations strings.xml (Kannada) 2021-07-16 12:04:30 +05:30
Daksh P. Jain
cda12f0e54 New translations strings.xml (Flemish) 2021-07-16 12:04:29 +05:30
Daksh P. Jain
d16a507064 New translations strings.xml (Latin) 2021-07-16 12:04:28 +05:30
Daksh P. Jain
1d4c4c070c New translations strings.xml (Luxembourgish) 2021-07-16 12:04:27 +05:30
Daksh P. Jain
7dd07f58dc New translations strings.xml (Filipino) 2021-07-16 12:04:26 +05:30
Daksh P. Jain
5209c6ddb7 New translations strings.xml (Esperanto) 2021-07-16 12:04:25 +05:30
Daksh P. Jain
7fceb85821 New translations strings.xml (Burmese) 2021-07-16 12:04:24 +05:30
Daksh P. Jain
3da7c2d5c3 New translations strings.xml (Malay) 2021-07-16 12:04:23 +05:30
Daksh P. Jain
8d0c970722 New translations strings.xml (Hindi) 2021-07-16 12:04:22 +05:30
Daksh P. Jain
2fd8beb476 New translations strings.xml (Latvian) 2021-07-16 12:04:21 +05:30
Daksh P. Jain
3efdb9f09e New translations strings.xml (Turkish) 2021-07-16 12:04:20 +05:30
Daksh P. Jain
1ec211fde3 New translations strings.xml (Estonian) 2021-07-16 12:04:19 +05:30
Daksh P. Jain
e2986a225b New translations strings.xml (Thai) 2021-07-16 12:04:18 +05:30
Daksh P. Jain
56143a4732 New translations strings.xml (Bengali) 2021-07-16 12:04:17 +05:30
Daksh P. Jain
e7142466d6 New translations strings.xml (Tamil) 2021-07-16 12:04:16 +05:30
Daksh P. Jain
2bc608048f New translations strings.xml (Persian) 2021-07-16 12:04:15 +05:30
Daksh P. Jain
1a218e4195 New translations strings.xml (Indonesian) 2021-07-16 12:04:14 +05:30
Daksh P. Jain
5468cfa1df New translations strings.xml (Portuguese, Brazilian) 2021-07-16 12:04:13 +05:30
Daksh P. Jain
a3b58d96a4 New translations strings.xml (Icelandic) 2021-07-16 12:04:12 +05:30
Daksh P. Jain
80419dafd3 New translations strings.xml (Vietnamese) 2021-07-16 12:04:11 +05:30
Daksh P. Jain
cbf9d48732 New translations strings.xml (Chinese Traditional) 2021-07-16 12:04:10 +05:30
Daksh P. Jain
88d3c5ac67 New translations strings.xml (Chinese Simplified) 2021-07-16 12:04:09 +05:30
Daksh P. Jain
cab950c771 New translations strings.xml (Croatian) 2021-07-16 12:04:08 +05:30
Daksh P. Jain
49e012cf93 New translations strings.xml (Romanian) 2021-07-16 12:04:07 +05:30
Daksh P. Jain
c87b5a736d
Update strings.xml 2021-07-16 12:03:48 +05:30
Daksh P. Jain
4509b001d8
Update strings.xml 2021-07-16 11:49:34 +05:30
Daksh P. Jain
2fe29d85d9
Merge pull request #1086 from Rossmallow/Modernize-Github-Links
Modernize repo links
2021-07-10 09:28:41 +05:30
Ross Nelson
31f365ee26 Update reference from dev branch to master branch 2021-07-09 21:35:29 -05:00
Ross Nelson
0e4585b9ea Modernize repo links 2021-07-09 20:18:35 -05:00
Daksh P. Jain
e8a107eb06
Merge pull request #1079 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-06-20 17:49:06 +05:30
Daksh P. Jain
55049bb342 New translations strings.xml (Persian) 2021-06-20 15:43:23 +05:30
Daksh P. Jain
d2298ff62c New translations strings.xml (Persian) 2021-06-20 09:38:02 +05:30
Daksh P. Jain
2c49d37b4a
Merge pull request #1078 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-06-19 11:38:58 +05:30
Daksh P. Jain
60cf3a2507 New translations strings.xml (Czech) 2021-06-19 02:11:09 +05:30
Daksh P. Jain
a2e6982f8f
Merge pull request #1077 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-06-13 10:12:46 +05:30
Daksh P. Jain
ca64a2721b New translations strings.xml (Czech) 2021-06-12 21:21:40 +05:30
Daksh P. Jain
27c83b2329
Merge pull request #1076 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-06-11 10:21:33 +05:30
Daksh P. Jain
e86df4cd8d New translations strings.xml (Burmese) 2021-06-11 10:15:26 +05:30
Daksh P. Jain
9c8efeb775 Update source file strings.xml 2021-06-11 10:11:50 +05:30
Daksh P. Jain
87e636e7a3 Update Crowdin configuration file 2021-06-11 10:11:44 +05:30
Daksh P. Jain
6b4c014716 New translations strings.xml (Burmese) 2021-06-11 10:09:17 +05:30
Daksh P. Jain
12eb9bee84 Update source file strings.xml 2021-06-11 10:09:01 +05:30
Daksh P. Jain
278da9ac1f
Update strings.xml 2021-06-11 10:08:44 +05:30
Daksh P. Jain
1a13a78372
Merge pull request #1074 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-06-10 19:49:10 +05:30
Daksh P. Jain
81e6a24628 Merge branch 'dev' into l10n_dev 2021-06-10 19:48:50 +05:30
Daksh P. Jain
0a292d3f87 New translations strings.xml (Hawaiian) 2021-06-10 19:38:03 +05:30
Daksh P. Jain
ba93841f8b New translations strings.xml (Slovak) 2021-06-10 19:38:02 +05:30
Daksh P. Jain
d0145f601e New translations strings.xml (Russian) 2021-06-10 19:38:00 +05:30
Daksh P. Jain
033ff59bb0 New translations strings.xml (Polish) 2021-06-10 19:37:58 +05:30
Daksh P. Jain
a0153b0cad New translations strings.xml (Punjabi) 2021-06-10 19:37:57 +05:30
Daksh P. Jain
0b66093c30 New translations strings.xml (Dutch) 2021-06-10 19:37:56 +05:30
Daksh P. Jain
a308279a08 New translations strings.xml (Korean) 2021-06-10 19:37:55 +05:30
Daksh P. Jain
6ead986222 New translations strings.xml (Japanese) 2021-06-10 19:37:54 +05:30
Daksh P. Jain
443ee00bf9 New translations strings.xml (Italian) 2021-06-10 19:37:53 +05:30
Daksh P. Jain
66e34252d8 New translations strings.xml (Hungarian) 2021-06-10 19:37:52 +05:30
Daksh P. Jain
12b5b6cb8a New translations strings.xml (Irish) 2021-06-10 19:37:50 +05:30
Daksh P. Jain
561369ed5c New translations strings.xml (Greek) 2021-06-10 19:37:48 +05:30
Daksh P. Jain
f6faa11c15 New translations strings.xml (Arabic) 2021-06-10 19:37:44 +05:30
Daksh P. Jain
c52783e420 New translations strings.xml (Spanish) 2021-06-10 19:37:43 +05:30
Daksh P. Jain
ebe5876844 New translations strings.xml (Gujarati) 2021-06-10 19:37:41 +05:30
Daksh P. Jain
83f336371c New translations strings.xml (French) 2021-06-10 19:37:40 +05:30
Daksh P. Jain
86cd6b9767 New translations strings.xml (Swedish) 2021-06-10 19:37:39 +05:30
Daksh P. Jain
e49d2d6726 New translations strings.xml (Ukrainian) 2021-06-10 19:37:38 +05:30
Daksh P. Jain
cd1c626d3d New translations strings.xml (Nepali) 2021-06-10 19:37:37 +05:30
Daksh P. Jain
8f712552c5 New translations strings.xml (Kannada) 2021-06-10 19:37:36 +05:30
Daksh P. Jain
1e11c27d2a New translations strings.xml (Flemish) 2021-06-10 19:37:35 +05:30
Daksh P. Jain
47c2f521de New translations strings.xml (Latin) 2021-06-10 19:37:34 +05:30
Daksh P. Jain
004f2e5d49 New translations strings.xml (Luxembourgish) 2021-06-10 19:37:33 +05:30
Daksh P. Jain
9371c1bc3b New translations strings.xml (Filipino) 2021-06-10 19:37:32 +05:30
Daksh P. Jain
bda53f2ca8 New translations strings.xml (Esperanto) 2021-06-10 19:37:31 +05:30
Daksh P. Jain
9c81d35730 New translations strings.xml (Burmese) 2021-06-10 19:37:30 +05:30
Daksh P. Jain
8414a83a12 New translations strings.xml (Malay) 2021-06-10 19:37:29 +05:30
Daksh P. Jain
2164ad71ec New translations strings.xml (Hindi) 2021-06-10 19:37:28 +05:30
Daksh P. Jain
0b55ea9f20 New translations strings.xml (Latvian) 2021-06-10 19:37:27 +05:30
Daksh P. Jain
a7bd84a8ef New translations strings.xml (Turkish) 2021-06-10 19:37:26 +05:30
Daksh P. Jain
faef7c0251 New translations strings.xml (Estonian) 2021-06-10 19:37:25 +05:30
Daksh P. Jain
a7e519a004 New translations strings.xml (Thai) 2021-06-10 19:37:24 +05:30
Daksh P. Jain
cadcb5cfc9 New translations strings.xml (Bengali) 2021-06-10 19:37:23 +05:30
Daksh P. Jain
00e550f3de New translations strings.xml (Tamil) 2021-06-10 19:37:22 +05:30
Daksh P. Jain
cb1ac61b36 New translations strings.xml (Persian) 2021-06-10 19:37:21 +05:30
Daksh P. Jain
9ec7ec4859 New translations strings.xml (Indonesian) 2021-06-10 19:37:20 +05:30
Daksh P. Jain
52a7b8dfba New translations strings.xml (Portuguese, Brazilian) 2021-06-10 19:37:19 +05:30
Daksh P. Jain
c98a6d0ddf New translations strings.xml (Icelandic) 2021-06-10 19:37:18 +05:30
Daksh P. Jain
f3bf331367 New translations strings.xml (Vietnamese) 2021-06-10 19:37:16 +05:30
Daksh P. Jain
5c0c849850 New translations strings.xml (Chinese Traditional) 2021-06-10 19:37:15 +05:30
Daksh P. Jain
4d56ae82b4 New translations strings.xml (Chinese Simplified) 2021-06-10 19:37:14 +05:30
Daksh P. Jain
27d94ac4bf New translations strings.xml (Croatian) 2021-06-10 19:37:13 +05:30
Daksh P. Jain
f9d9cc5de8 New translations strings.xml (Romanian) 2021-06-10 19:37:12 +05:30
Daksh P. Jain
2a487239f4
Update strings.xml 2021-06-10 19:36:54 +05:30
Daksh P. Jain
0b6ecb0d67 New translations strings.xml (Burmese) 2021-06-10 19:13:57 +05:30
Daksh P. Jain
a5d3e802cf
Update crowdin.yml 2021-06-10 19:07:58 +05:30
Daksh P. Jain
25ff5d9243 Update Crowdin configuration file 2021-06-10 19:02:24 +05:30
Daksh P. Jain
6ae944d768 New translations strings.xml (Burmese) 2021-06-10 18:57:57 +05:30
Daksh P. Jain
33e59dd2a5 Update Crowdin configuration file 2021-06-10 18:53:05 +05:30
Daksh P. Jain
2f74cb79a3
Delete app/src/main/res/values-my directory 2021-06-10 18:25:21 +05:30
Daksh P. Jain
123703e6e0
Update strings.xml 2021-06-10 18:25:02 +05:30
Daksh P. Jain
a48cdecde1
Merge pull request #1073 from RetroMusicPlayer/l10n_dev
New Crowdin updates
2021-06-10 18:04:42 +05:30
Daksh P. Jain
98d5afdcdb New translations strings.xml (Hindi) 2021-06-10 18:02:39 +05:30
Daksh P. Jain
378a1176fc New translations strings.xml (Hawaiian) 2021-06-10 17:53:20 +05:30
Daksh P. Jain
96e365bbda New translations strings.xml (Ukrainian) 2021-06-10 17:53:19 +05:30
Daksh P. Jain
e9465ad7a8 New translations strings.xml (Turkish) 2021-06-10 17:53:18 +05:30
Daksh P. Jain
19b8e0bc6e New translations strings.xml (Swedish) 2021-06-10 17:53:17 +05:30
Daksh P. Jain
7ecf64610f New translations strings.xml (Serbian (Cyrillic)) 2021-06-10 17:53:16 +05:30
Daksh P. Jain
9f8659746b New translations strings.xml (Russian) 2021-06-10 17:53:15 +05:30
Daksh P. Jain
43c177409e New translations strings.xml (Portuguese) 2021-06-10 17:53:14 +05:30
Daksh P. Jain
872ee75882 New translations strings.xml (Polish) 2021-06-10 17:53:13 +05:30
Daksh P. Jain
deddbd384a New translations strings.xml (Norwegian) 2021-06-10 17:53:11 +05:30
Daksh P. Jain
ddaceb14e3 New translations strings.xml (Dutch) 2021-06-10 17:53:10 +05:30
Daksh P. Jain
9fa8b25f72 New translations strings.xml (Korean) 2021-06-10 17:53:09 +05:30
Daksh P. Jain
12871d7273 New translations strings.xml (Japanese) 2021-06-10 17:53:08 +05:30
Daksh P. Jain
0ed18f879d New translations strings.xml (Chinese Simplified) 2021-06-10 17:53:07 +05:30
Daksh P. Jain
30fdada7f3 New translations strings.xml (Italian) 2021-06-10 17:53:06 +05:30
Daksh P. Jain
465d6371cf New translations strings.xml (Hebrew) 2021-06-10 17:53:05 +05:30
Daksh P. Jain
f25f109537 New translations strings.xml (Finnish) 2021-06-10 17:53:04 +05:30
Daksh P. Jain
f48527db46 New translations strings.xml (Greek) 2021-06-10 17:53:03 +05:30
Daksh P. Jain
74eb69ce57 New translations strings.xml (German) 2021-06-10 17:53:02 +05:30
Daksh P. Jain
5a29acc359 New translations strings.xml (Danish) 2021-06-10 17:53:01 +05:30
Daksh P. Jain
1b8ef26eb4 New translations strings.xml (Czech) 2021-06-10 17:53:00 +05:30
Daksh P. Jain
9a39349110 New translations strings.xml (Catalan) 2021-06-10 17:52:58 +05:30
Daksh P. Jain
7639d860e1 New translations strings.xml (Arabic) 2021-06-10 17:52:57 +05:30
Daksh P. Jain
968f97c987 New translations strings.xml (Afrikaans) 2021-06-10 17:52:56 +05:30
Daksh P. Jain
8f4e77c427 New translations strings.xml (Spanish) 2021-06-10 17:52:56 +05:30
Daksh P. Jain
1415af59c9 New translations strings.xml (Hungarian) 2021-06-10 17:52:54 +05:30
Daksh P. Jain
1d97f64661 New translations strings.xml (French) 2021-06-10 17:52:53 +05:30
Daksh P. Jain
ccc0fe30fc New translations strings.xml (Chinese Traditional) 2021-06-10 17:52:53 +05:30
Daksh P. Jain
3a637db414 New translations strings.xml (Portuguese, Brazilian) 2021-06-10 17:52:52 +05:30
Daksh P. Jain
d38e60ad8a New translations strings.xml (Nepali) 2021-06-10 17:52:51 +05:30
Daksh P. Jain
1f0d6112df New translations strings.xml (Kannada) 2021-06-10 17:52:50 +05:30
Daksh P. Jain
76b43141bd New translations strings.xml (Flemish) 2021-06-10 17:52:49 +05:30
Daksh P. Jain
372146fd11 New translations strings.xml (Latin) 2021-06-10 17:52:48 +05:30
Daksh P. Jain
c8295c7c18 New translations strings.xml (Luxembourgish) 2021-06-10 17:52:47 +05:30
Daksh P. Jain
37848cce0f New translations strings.xml (Filipino) 2021-06-10 17:52:46 +05:30
Daksh P. Jain
0a03a8116c New translations strings.xml (Esperanto) 2021-06-10 17:52:45 +05:30
Daksh P. Jain
131586ed3e New translations strings.xml (Burmese) 2021-06-10 17:52:44 +05:30
Daksh P. Jain
4867686e21 New translations strings.xml (Malay) 2021-06-10 17:52:43 +05:30
Daksh P. Jain
d7f9cc97c9 New translations strings.xml (Latvian) 2021-06-10 17:52:42 +05:30
Daksh P. Jain
329bcef903 New translations strings.xml (Estonian) 2021-06-10 17:52:41 +05:30
Daksh P. Jain
73f25dff67 New translations strings.xml (Vietnamese) 2021-06-10 17:52:40 +05:30
Daksh P. Jain
9c1f33eee7 New translations strings.xml (Croatian) 2021-06-10 17:52:39 +05:30
Daksh P. Jain
1bacb9231b New translations strings.xml (Bengali) 2021-06-10 17:52:38 +05:30
Daksh P. Jain
36521ac6a9 New translations strings.xml (Tamil) 2021-06-10 17:52:37 +05:30
Daksh P. Jain
4d23daba74 New translations strings.xml (Persian) 2021-06-10 17:52:36 +05:30
Daksh P. Jain
29c8a00e16 New translations strings.xml (Indonesian) 2021-06-10 17:52:35 +05:30
Daksh P. Jain
23538fe39a New translations strings.xml (Icelandic) 2021-06-10 17:52:34 +05:30
Daksh P. Jain
e9c5640daa New translations strings.xml (Slovak) 2021-06-10 17:52:33 +05:30
Daksh P. Jain
4029ccc5b6 New translations strings.xml (Punjabi) 2021-06-10 17:52:31 +05:30
Daksh P. Jain
3dfa0fad29 New translations strings.xml (Gujarati) 2021-06-10 17:52:31 +05:30
Daksh P. Jain
086c76734c New translations strings.xml (Irish) 2021-06-10 17:52:30 +05:30
Daksh P. Jain
1be4ba27d2 New translations strings.xml (Hindi) 2021-06-10 17:52:29 +05:30
Daksh P. Jain
8090a9ca8c New translations strings.xml (Thai) 2021-06-10 17:52:28 +05:30
Daksh P. Jain
bc593953a3 New translations strings.xml (Romanian) 2021-06-10 17:52:27 +05:30
Daksh P. Jain
4bf5a3aa5f
Update README.md 2021-06-10 17:44:25 +05:30
Daksh P. Jain
62ab41c01e Update Crowdin configuration file 2021-06-10 17:29:19 +05:30
Daksh P. Jain
394a3f4149
Merge pull request #1071 from RetroMusicPlayer/master
Update Crowdin configuration file
2021-06-10 17:07:50 +05:30
Daksh P. Jain
b4a8ed968a Update Crowdin configuration file 2021-06-10 17:07:06 +05:30
Daksh P. Jain
cda34d957f
Merge pull request #1034 from musicsd/patch-3
Update Persian translation
2021-06-10 16:59:52 +05:30
Daksh P. Jain
2b0568c6ab
Merge pull request #1039 from Daxxxis/language-pl
Update Polsih translation
2021-06-10 16:59:26 +05:30
Daksh P. Jain
62aec70bb6
Merge pull request #1044 from 9-Wongsakorn1997/thai-lanuage
Thai Translate
2021-06-10 16:59:03 +05:30
Daksh P. Jain
c52b276012
Merge pull request #1045 from gnuhead-chieb/gnuhead-chieb-patch-1
Update Japanese translation
2021-06-10 16:58:25 +05:30
Daksh P. Jain
9cb80070d9
Merge pull request #1046 from gnuhead-chieb/gnuhead-chieb-patch-2
[Political correctness]Use "Hong Kong" instead of "Hong kong China"
2021-06-10 16:57:42 +05:30
Daksh P. Jain
6fb38d5074
Merge pull request #1055 from euricosd/dev
Translated the app to European Portuguese
2021-06-10 16:57:05 +05:30
Daksh P. Jain
ed3b444044
Merge pull request #1070 from snowfluke/dev
Update Indonesian translation
2021-06-10 16:56:15 +05:30
Awal Ariansyah
6a1c2fac3d
Update Indonesian translation 2021-06-06 17:23:26 +07:00
Hemanth S
72125090d1
Update README.md 2021-05-23 06:43:32 -07:00
Hemanth S
1dcc9db438
Merge pull request #1066 from h4h13/Daksh777-patch-3
Update README.md
2021-03-25 11:36:18 +05:30
Daksh P. Jain
b7efd92203
Update README.md 2021-03-25 10:47:45 +05:30
Eurico Serradas Duarte
35795d3135 Translated the app to European Portuguese
The strings file was previously just a copy of the english version.
It is similar to the Brazillian Portuguese version, but with some differences.
2021-02-16 22:24:26 +00:00
gnuhead-chieb
f05f71a831
Update arrays.xml 2021-02-08 13:24:20 +00:00
gnuhead-chieb
12d4a74427
Update arrays.xml 2021-01-25 15:01:31 +00:00
gnuhead-chieb
fead7fc479
Update strings.xml 2021-01-25 14:50:20 +00:00
Wongsakorn1997
df6867f6c3
Add files via upload
update
2021-01-24 12:02:14 +07:00
Wongsakorn1997
d38f1bb771
Thai lanuage add 2021-01-23 20:17:59 +07:00
Muntashir Al-Islam
ac0ad8ec64 Update room, remove AppRater once again 2021-01-04 16:52:54 +06:00
Muntashir Al-Islam
c8ca135454 Merge branch 'dev' of github.com:MuntashirAkon/RetroMusicPlayer into dev 2021-01-04 16:51:29 +06:00
Muntashir Al-Islam
86f2f788e9 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev
 Conflicts:
	app/build.gradle
	app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java
	app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/CoroutineViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/full/FullPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt
	app/src/main/res/layout/item_grid_circle.xml
	app/src/main/res/layout/item_list_quick_actions.xml
	appthemehelper/build.gradle
2021-01-04 16:51:16 +06:00
musicsd
3385b96615
Update Persian translation 2020-12-27 19:30:08 +00:00
Daxxxis
4d26c414a5 Update Polsih translation 2020-12-27 15:12:15 +01:00
musicsd
9a6aa2f1fe
Update Persian translation 2020-12-27 11:44:22 +00:00
musicsd
562e04f27c
Update Persian translation (#43) 2020-12-22 18:41:23 +06:00
musicsd
aeba93dea8
Update Persian translation 2020-12-21 11:06:06 +00:00
Hemanth S
1b08b775ac code clean 2020-12-05 19:02:49 +05:30
Hemanth S
6845f75ea0 code clean 2020-12-05 11:33:31 +05:30
Hemanth S
c5a4b4b4c6 Update FullPlaybackControlsFragment.kt 2020-12-05 11:10:43 +05:30
Hemanth S
cc855d22fc code clean 2020-12-05 11:10:35 +05:30
Hemanth S
03df684c7e Revert "Merge pull request #1018 from SimonMTaye/dev"
This reverts commit 5dd7ec15e8, reversing
changes made to 66618824e2.
2020-12-05 03:10:23 +05:30
Hemanth S
5dd7ec15e8
Merge pull request #1018 from SimonMTaye/dev
Fixed search bug
2020-12-05 02:51:17 +05:30
Hemanth S
66618824e2 updated code 2020-12-04 23:41:49 +05:30
Hemanth S
85d8d5cba9 Fixing animations 2020-12-04 18:17:14 +05:30
Hemanth S
b944ef5de6 Fixing animations 2020-12-04 02:27:44 +05:30
Hemanth S
0679774d41 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-12-03 20:31:30 +05:30
Hemanth S
9fce62b9c5 Fix animations 2020-12-03 20:31:27 +05:30
Hemanth S
7ac1e1370f
Merge pull request #947 from h4h13/Daksh777-patch-2
Update bug_report.md
2020-11-28 14:41:01 +05:30
Hemanth S
47743cc464
Merge pull request #963 from h4h13/Daksh777-patch-1
Update strings.xml
2020-11-28 14:40:46 +05:30
Hemanth S
afae2bcb41
Merge branch 'dev' into Daksh777-patch-1 2020-11-28 14:40:40 +05:30
Hemanth S
a9c6dbe391
Merge pull request #1003 from ThuHtooSan/translation-update
Added Burmese translation
2020-11-28 14:40:04 +05:30
Hemanth S
54dc315845 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-11-28 14:33:57 +05:30
Hemanth S
bfe03a2b06 Adding shuffle button 2020-11-28 14:33:54 +05:30
Hemanth S
a0a9bb8631
Merge pull request #918 from TeGaX/TeGaX-ru-fix-patch
Deleted a second action_album_artists_only string
2020-11-28 14:32:23 +05:30
Hemanth S
e2b4ffab30
Merge branch 'dev' into TeGaX-ru-fix-patch 2020-11-28 14:31:55 +05:30
SirPotato10000
21904e2a26 Fixed search bug
Old search code in GenreRepository.kt was very slow on large libraries.
Used selection parameters for contentResolver.query instead of fetching all genres and filtering afterwards.
Changed code in SearchRepository.kt to call new function.
2020-11-24 20:47:49 +03:00
Hemanth S
bf2f4ac757 Add play all and shuffle all buttons for lists 2020-11-16 23:07:16 +05:30
Hemanth S
c059176982
Merge pull request #1009 from h4h13/Daksh-translations
Fix an error in Russian translation
2020-11-13 20:52:24 +05:30
Daksh P. Jain
d47091e765
Merge pull request #1014 from zhombie/symbol_issue
Fixed compilation issue: Problem with missed > symbol in el-rGR/strings.xml
2020-11-12 09:07:00 +05:30
rsaliyevzhomart
15ede0b71c Fixed compilation issue: Problem with missed > symbol in el-rGR/strings.xml 2020-11-12 00:47:12 +05:00
Muntashir Al-Islam
b49a8eb7e0 Apply fixes after a merge 2020-11-07 08:04:59 +06:00
Muntashir Al-Islam
2dea5c31ca Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev
 Conflicts:
	app/src/main/java/io/github/muntashirakon/music/Constants.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/GenreAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/HomeAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/SearchAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/LibraryViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsRecyclerViewFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/home/HomeFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/IGenreClickListener.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/IHomeClickListener.kt
	app/src/main/java/io/github/muntashirakon/music/preferences/AlbumCoverStylePreferenceDialog.kt
	app/src/main/java/io/github/muntashirakon/music/preferences/NowPlayingScreenPreferenceDialog.kt
	app/src/main/java/io/github/muntashirakon/music/service/notification/PlayingNotificationImpl.kt
	app/src/main/java/io/github/muntashirakon/music/util/MusicUtil.kt
	app/src/main/java/io/github/muntashirakon/music/util/PreferenceUtil.kt
	app/src/main/res/layout/activity_donation.xml
	app/src/main/res/layout/activity_pro_version.xml
	app/src/main/res/layout/card_other.xml
	app/src/main/res/layout/fragment_settings.xml
	app/src/main/res/layout/fragment_synced.xml
	app/src/main/res/layout/image.xml
	app/src/main/res/transition/change_bounds.xml
	appthemehelper/src/main/res/layout/ate_preference_custom.xml
2020-11-07 07:34:17 +06:00
Daksh P. Jain
27b9ccc81e
Fix an error in Russian translation 2020-11-05 12:51:53 +05:30
ThuHtooSan
7bc48ea6e8 added Burmese translation in strings.xml 2020-10-30 23:12:47 +06:30
Hemanth S
22369667a9 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-10-28 01:37:06 +05:30
Hemanth S
de5e9444b7 Fix classic theme time frame issue #992 2020-10-28 01:37:02 +05:30
Daksh P. Jain
8b84a27721
Merge pull request #994 from Aeris1One/patch-1
Bad French translation
2020-10-25 15:01:45 +05:30
Aeris One
725e1d11e3
Bad translation #2 2020-10-24 20:34:49 +02:00
Aeris One
c084e44681
Bad translation 2020-10-24 20:30:37 +02:00
Muntashir Al-Islam
8c221b908e Update icon on F-Droid
Closes #25
2020-10-24 19:00:43 +06:00
Muntashir Al-Islam
c5fabd625e Reduce font size to display better 2020-10-24 19:00:12 +06:00
Muntashir Al-Islam
978fcea9d0 Display song artist for albums and artists 2020-10-24 18:59:53 +06:00
Daksh P. Jain
efc4930bc8
Merge pull request #990 from giwrgosmant/patch-1
Update strings.xml
2020-10-24 17:43:18 +05:30
giwrgosmant
be8ca61c3c
Update strings.xml
Traslation in Greek. Updates & Fixes.
2020-10-22 19:59:58 +03:00
Proprietary Chrome-chan
018acb456f
Update README (#22)
- Change Differences section
- Add Table of contents
- Properly format
- Add download links
2020-10-19 22:10:50 +06:00
Hemanth S
9b677573a3 Update PreferenceUtil.kt 2020-10-18 02:20:40 +05:30
Hemanth S
24159557df
Merge pull request #975 from rocketeer231/patch-8
Updated translation with sorting changes
2020-10-18 02:03:24 +05:30
Hemanth S
3fc86582f3 Add menu for songs when grid size is more than 2 #940 2020-10-18 01:49:47 +05:30
Hemanth S
349d4ad534 Fix not showing song image on search 2020-10-18 01:32:58 +05:30
Hemanth S
f9206dcfdb Ringtone permission dialog showing #937
Fix crashing on album edit or artist edit  and
2020-10-18 01:30:00 +05:30
Hemanth S
2f4632fd67 Fix free label showing when Pro is enable #934 2020-10-17 18:00:11 +05:30
Hemanth S
a39a9bd592 Fix padding for list #933 2020-10-17 17:45:52 +05:30
Igor
282613c88c
Updated translation with sorting changes 2020-10-17 14:13:31 +03:00
Hemanth S
02ff1b92cb Fix not updating artist cover when selecting #926 2020-10-17 15:07:44 +05:30
Hemanth S
85bd49f391 Fix toggle notification favourite icon #954 2020-10-17 14:47:57 +05:30
Hemanth S
1a5d74d9cf Sort XML 2020-10-17 14:28:07 +05:30
Hemanth S
4cfa8cc561 Fix text over lapping #967 2020-10-17 14:24:01 +05:30
Hemanth S
2d9d12f0bf Fix keyboard not showing when search fragment shows #955 2020-10-17 13:53:03 +05:30
Hemanth S
f3affb76d7 Revert "Fix now showing search #955"
This reverts commit 3e63d3a6b7.
2020-10-17 13:50:28 +05:30
Hemanth S
3e63d3a6b7 Fix now showing search #955 2020-10-17 13:49:44 +05:30
Hemanth S
da9f005f9e Removed res 2020-10-17 13:45:45 +05:30
Hemanth S
c8a5089fd0 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-10-17 13:35:29 +05:30
Hemanth S
0fe0c2728f Removed unesscery ids, res, etc 2020-10-17 13:28:13 +05:30
Muntashir Al-Islam
2059a55281 Replace Retro Music with Metro 2020-10-16 02:30:32 +06:00
Muntashir Al-Islam
e5a27ca7f1 Prepare for 4.0.010 2020-10-16 02:14:54 +06:00
Muntashir Al-Islam
3265af2086 Fix package names after a merge 2020-10-16 00:14:02 +06:00
Muntashir Al-Islam
3c0fc790d1 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev
 Conflicts:
	README.md
	app/build.gradle
	app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
	app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt
	app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenPlayerControlsFragment.kt
	app/src/main/java/code/name/monkey/retromusic/interfaces/CabHolder.kt
	app/src/main/java/code/name/monkey/retromusic/interfaces/MainActivityFragmentCallbacks.kt
	app/src/main/java/code/name/monkey/retromusic/interfaces/MusicServiceEventListener.kt
	app/src/main/java/code/name/monkey/retromusic/interfaces/PaletteColorHolder.kt
	app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt
	app/src/main/java/io/github/muntashirakon/music/App.kt
	app/src/main/java/io/github/muntashirakon/music/Constants.kt
	app/src/main/java/io/github/muntashirakon/music/HomeSection.kt
	app/src/main/java/io/github/muntashirakon/music/MainModule.kt
	app/src/main/java/io/github/muntashirakon/music/activities/DriveModeActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/LicenseActivity.java
	app/src/main/java/io/github/muntashirakon/music/activities/LockScreenActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/LyricsActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/PermissionActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/PlayingQueueActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/SettingsActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/ShareInstagramStory.kt
	app/src/main/java/io/github/muntashirakon/music/activities/UserInfoActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/WhatsNewActivity.java
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsBaseActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsMusicServiceActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsThemeActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/bugreport/BugReportActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/bugreport/model/DeviceInfo.java
	app/src/main/java/io/github/muntashirakon/music/activities/bugreport/model/Report.java
	app/src/main/java/io/github/muntashirakon/music/activities/saf/SAFGuideActivity.java
	app/src/main/java/io/github/muntashirakon/music/activities/tageditor/AbsTagEditorActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/tageditor/AlbumTagEditorActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/tageditor/SongTagEditorActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/tageditor/WriteTagsAsyncTask.java
	app/src/main/java/io/github/muntashirakon/music/adapter/CategoryInfoAdapter.java
	app/src/main/java/io/github/muntashirakon/music/adapter/ContributorAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/GenreAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/HomeAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/SearchAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/SongFileAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/TranslatorsAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/album/AlbumCoverPagerAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/album/HorizontalAlbumAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/artist/ArtistAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/base/AbsMultiSelectAdapter.java
	app/src/main/java/io/github/muntashirakon/music/adapter/base/MediaEntryViewHolder.java
	app/src/main/java/io/github/muntashirakon/music/adapter/playlist/LegacyPlaylistAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/playlist/PlaylistAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/AbsOffsetSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/OrderablePlaylistSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/PlayingQueueAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/PlaylistSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/ShuffleButtonSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/SimpleSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/SongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/AppShortcutIconGenerator.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/AppShortcutLauncherActivity.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/DynamicShortcutManager.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/shortcuttype/BaseShortcutType.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/shortcuttype/LastAddedShortcutType.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt
	app/src/main/java/io/github/muntashirakon/music/appshortcuts/shortcuttype/TopTracksShortcutType.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/AppWidgetBig.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/AppWidgetCard.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/AppWidgetClassic.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/AppWidgetSmall.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/AppWidgetText.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/BootReceiver.kt
	app/src/main/java/io/github/muntashirakon/music/appwidgets/base/BaseAppWidget.kt
	app/src/main/java/io/github/muntashirakon/music/db/BlackListStoreDao.kt
	app/src/main/java/io/github/muntashirakon/music/db/BlackListStoreEntity.kt
	app/src/main/java/io/github/muntashirakon/music/db/HistoryDao.kt
	app/src/main/java/io/github/muntashirakon/music/db/HistoryEntity.kt
	app/src/main/java/io/github/muntashirakon/music/db/LyricsDao.kt
	app/src/main/java/io/github/muntashirakon/music/db/LyricsEntity.kt
	app/src/main/java/io/github/muntashirakon/music/db/PlayCountDao.kt
	app/src/main/java/io/github/muntashirakon/music/db/PlayCountEntity.kt
	app/src/main/java/io/github/muntashirakon/music/db/PlaylistDao.kt
	app/src/main/java/io/github/muntashirakon/music/db/PlaylistEntity.kt
	app/src/main/java/io/github/muntashirakon/music/db/PlaylistWithSongs.kt
	app/src/main/java/io/github/muntashirakon/music/db/RetroDatabase.kt
	app/src/main/java/io/github/muntashirakon/music/db/SongEntity.kt
	app/src/main/java/io/github/muntashirakon/music/db/SongExtension.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/AddToPlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/BlacklistFolderChooserDialog.java
	app/src/main/java/io/github/muntashirakon/music/dialogs/CreatePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/DeletePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/ImportPlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/LyricsDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/RemoveSongFromPlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/RenamePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/SavePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/SleepTimerDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/SongDetailDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/SongShareDialog.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/ActivityEx.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/ColorExt.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/CursorExtensions.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/DialogExtension.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/DimenExtension.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/DrawableExt.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/FragmentExt.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/NavigationExtensions.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/PaletteEX.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/Preference.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/ViewExtensions.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/AlbumCoverStyle.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/CoroutineViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/LibraryViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/MiniPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/NowPlayingScreen.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/VolumeFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/about/AboutFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsMainActivityFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsMusicServiceFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsPlayerControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsRecyclerViewFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/folder/FoldersFragment.java
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenreDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/home/HomeFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/library/LibraryFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/NowPlayingPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/PlayerAlbumCoverFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/adaptive/AdaptiveFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/blur/BlurPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/blur/BlurPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/card/CardFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/card/CardPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/cardblur/CardBlurFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/circle/CirclePlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/classic/ClassicPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/color/ColorFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/color/ColorPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/fit/FitFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/fit/FitPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/flat/FlatPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/flat/FlatPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/full/FullPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/full/FullPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/gradient/GradientPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/home/HomePlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/lockscreen/LockScreenControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/lockscreen/LockScreenPlayerControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/material/MaterialControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/material/MaterialFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/normal/PlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/normal/PlayerPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/peak/PeakPlayerControlFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/peak/PeakPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/plain/PlainPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/plain/PlainPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/simple/SimplePlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/simple/SimplePlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/tiny/TinyPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/tiny/TinyPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/search/SearchViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/AbsSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/AudioSettings.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/ImageSettingFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/MainSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/NotificationSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/NowPlayingSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/OtherSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/PersonalizeSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/ThemeSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/glide/AlbumGlideRequest.java
	app/src/main/java/io/github/muntashirakon/music/glide/ArtistGlideRequest.java
	app/src/main/java/io/github/muntashirakon/music/glide/BlurTransformation.kt
	app/src/main/java/io/github/muntashirakon/music/glide/ProfileBannerGlideRequest.java
	app/src/main/java/io/github/muntashirakon/music/glide/RetroMusicColoredTarget.kt
	app/src/main/java/io/github/muntashirakon/music/glide/RetroMusicGlideModule.kt
	app/src/main/java/io/github/muntashirakon/music/glide/SingleColorTarget.kt
	app/src/main/java/io/github/muntashirakon/music/glide/SongGlideRequest.java
	app/src/main/java/io/github/muntashirakon/music/glide/UserProfileGlideRequest.java
	app/src/main/java/io/github/muntashirakon/music/glide/artistimage/ArtistImageLoader.kt
	app/src/main/java/io/github/muntashirakon/music/glide/palette/BitmapPaletteTranscoder.java
	app/src/main/java/io/github/muntashirakon/music/helper/HorizontalAdapterHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/MusicPlayerRemote.kt
	app/src/main/java/io/github/muntashirakon/music/helper/MusicProgressViewUpdateHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/PlayPauseButtonOnClickHandler.kt
	app/src/main/java/io/github/muntashirakon/music/helper/SearchQueryHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/ShuffleHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/StopWatch.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/GenreMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/PlaylistMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/SongMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/SongsMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/CabHolder.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/Callbacks.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/ICabHolder.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/IMainActivityFragmentCallbacks.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/IMusicServiceEventListener.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/IPaletteColorHolder.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/MainActivityFragmentCallbacks.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/MusicServiceEventListener.kt
	app/src/main/java/io/github/muntashirakon/music/interfaces/PaletteColorHolder.kt
	app/src/main/java/io/github/muntashirakon/music/lyrics/LrcView.java
	app/src/main/java/io/github/muntashirakon/music/model/Artist.kt
	app/src/main/java/io/github/muntashirakon/music/model/lyrics/Lyrics.java
	app/src/main/java/io/github/muntashirakon/music/providers/BlacklistStore.java
	app/src/main/java/io/github/muntashirakon/music/providers/MusicPlaybackQueueStore.java
	app/src/main/java/io/github/muntashirakon/music/repository/GenreRepository.kt
	app/src/main/java/io/github/muntashirakon/music/repository/PlaylistSongsLoader.kt
	app/src/main/java/io/github/muntashirakon/music/repository/Repository.kt
	app/src/main/java/io/github/muntashirakon/music/repository/RoomRepository.kt
	app/src/main/java/io/github/muntashirakon/music/repository/SongRepository.kt
	app/src/main/java/io/github/muntashirakon/music/service/MultiPlayer.java
	app/src/main/java/io/github/muntashirakon/music/service/MusicService.java
	app/src/main/java/io/github/muntashirakon/music/service/PlaybackHandler.java
	app/src/main/java/io/github/muntashirakon/music/util/FileUtil.java
	app/src/main/java/io/github/muntashirakon/music/util/NavigationUtil.java
	app/src/main/java/io/github/muntashirakon/music/util/PlaylistsUtil.java
	app/src/main/java/io/github/muntashirakon/music/util/PreferenceUtil.kt
	app/src/main/java/io/github/muntashirakon/music/util/RetroUtil.java
	app/src/main/java/io/github/muntashirakon/music/util/SAFUtil.java
	app/src/main/java/io/github/muntashirakon/music/util/color/MediaNotificationProcessor.java
	app/src/main/java/io/github/muntashirakon/music/util/color/NotificationColorUtil.java
	app/src/main/java/io/github/muntashirakon/music/views/BaselineGridTextView.java
	app/src/main/java/io/github/muntashirakon/music/views/BreadCrumbLayout.java
	app/src/main/java/io/github/muntashirakon/music/views/CircularImageView.java
	app/src/main/java/io/github/muntashirakon/music/views/ContributorsView.java
	app/src/main/java/io/github/muntashirakon/music/views/NetworkImageView.java
	app/src/main/java/io/github/muntashirakon/music/views/SeekArc.java
	app/src/main/res/layout-land/fragment_home.xml
	app/src/main/res/layout-xlarge-land/fragment_blur.xml
	app/src/main/res/layout/activity_lock_screen.xml
	app/src/main/res/layout/activity_user_info.xml
	app/src/main/res/layout/fragment_banner_home.xml
	app/src/main/res/layout/fragment_classic_player.xml
	app/src/main/res/layout/fragment_folder.xml
	app/src/main/res/layout/fragment_home.xml
	app/src/main/res/layout/item_image.xml
	app/src/main/res/layout/sliding_music_panel_layout.xml
	app/src/main/res/navigation/now_playing.xml
2020-10-15 19:16:23 +06:00
Daksh P. Jain
4b57e72dba
Update strings.xml 2020-10-15 10:48:40 +05:30
Daksh P. Jain
5ee33123db
Update strings.xml 2020-10-15 10:46:03 +05:30
Daksh P. Jain
928f2e4686
Merge pull request #952 from Lambada10/dev
Update Polish translation
2020-10-14 08:03:53 +05:30
Lambada10
ceffbd976f Delete placeholder strings 2020-10-13 20:29:18 +02:00
Lambada10
58decfb0b5 Update Polish translation v3 2020-10-13 20:28:22 +02:00
Daksh P. Jain
a2fef04697
Merge pull request #925 from rocketeer231/patch-6
Updated permission string fixes
2020-10-13 20:13:35 +05:30
Daksh P. Jain
f2b47c5c70
Update bug_report.md 2020-10-13 20:12:30 +05:30
Igor
525e94c011
Updated permission string fixes
Updated permission string fixes and some other fixes
2020-10-13 11:45:05 +03:00
Lambada10
962afbfc0a Update Polish translation v2 2020-10-12 20:27:08 +02:00
Lambada10
729334d43d Update Polish translation v1 2020-10-12 19:51:36 +02:00
Hemanth S
4fdb336444 Artist album changes to card 2020-10-12 22:58:39 +05:30
Hemanth S
52dc1d9f22 Fix scaning and updateing error 2020-10-12 22:52:53 +05:30
Hemanth S
9dc2da66e1 Fix app shortcuts click crash 2020-10-12 20:25:31 +05:30
TeGaX_Dakkar
85436029ff
Deleted a second action_album_artists_only string 2020-10-12 18:58:11 +07:00
Hemanth S
0ce71b19a8 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-10-12 13:27:14 +05:30
Hemanth S
3e258714bb Fix color not showing in Gradient 2020-10-12 13:27:11 +05:30
Hemanth S
ff457cfe3f
Merge pull request #915 from rocketeer231/patch-4
Added permission strings
2020-10-12 13:26:50 +05:30
Igor
59df82b8bd
Added permission strings 2020-10-12 10:54:41 +03:00
Hemanth S
cef955abe6 Bump up the version 2020-10-12 13:11:29 +05:30
Hemanth S
1a4905cd76 Added permission strings 2020-10-12 13:08:17 +05:30
Hemanth S
e86266e12a Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-10-12 01:57:47 +05:30
Hemanth S
fa819284d0 Added label for Settings 2020-10-12 01:56:14 +05:30
Hemanth S
cf9ab9674a
Merge pull request #913 from rocketeer231/patch-3
Updated
2020-10-12 01:31:19 +05:30
Hemanth S
acd55f249a Code refactor 2020-10-12 01:30:36 +05:30
Igor
ef50e3186a
Updated
Need to be checked.
2020-10-11 22:35:37 +03:00
Hemanth S
b2a5f5a2d1 Update item_queue.xml 2020-10-11 23:54:34 +05:30
Hemanth S
4a9a4d68a6 Update item_queue.xml 2020-10-11 23:43:35 +05:30
Hemanth S
677cbbb712 Update AbsSlidingMusicPanelActivity.kt 2020-10-11 23:07:15 +05:30
Hemanth S
535b54ce31 Update AbsSlidingMusicPanelActivity.kt 2020-10-11 22:52:34 +05:30
Hemanth S
87be373a03 Bump the version to v4
To make it 4th anniversary
2020-10-11 22:50:56 +05:30
Hemanth S
247189f769
Merge pull request #912 from h4h13/main
Main
2020-10-11 22:48:47 +05:30
Hemanth S
b7a117c90d
Merge branch 'dev' into main 2020-10-11 22:48:41 +05:30
Hemanth S
a0f4394099 Added new icon
Fix bottom tabs showing rotating, coming notification or widgets
2020-10-11 22:45:27 +05:30
Daksh P. Jain
2432080d3c
Update contributors.json 2020-10-11 10:15:15 +05:30
Hemanth S
fdcf7271a6 Bump up the build 2020-10-09 23:37:08 +05:30
Hemanth S
912960fc31
Merge pull request #2 from h4h13/new-style
Added image to queue
2020-10-09 23:33:16 +05:30
Hemanth S
04ed7434d2 Added image to queue 2020-10-09 23:32:52 +05:30
Hemanth S
24244e17e0 Merge branch 'main' of https://github.com/h4h13/RetroMusicPro into main 2020-10-09 23:14:07 +05:30
Hemanth S
33f4f31066 Updated
Playlist refresh
Bottom navigation shows when coming from notification
Removed animation for lyrics page
Added playlist reorder
Added refresh for album & artist details when update
Fix when scan to update library
Added sort for playlist
Fix album art not showing in lockscreen
2020-10-09 23:14:02 +05:30
Daksh P. Jain
4d21bff69d
Merge pull request #1 from h4h13/Daksh777-patch-1
Update strings.xml
2020-10-09 13:47:20 +05:30
Daksh P. Jain
2e9cc963f9
Update strings.xml 2020-10-09 13:46:14 +05:30
Daksh P. Jain
420a7bcac6
Merge pull request #862 from d-l-n/patch-1
Update strings.xml
2020-10-09 13:38:50 +05:30
Daksh P. Jain
116249c38f
Update strings.xml 2020-10-09 13:36:49 +05:30
dylan
a4bc5f6ca7
Update strings.xml
Fixed conflicts with https://github.com/h4h13/RetroMusicPlayer/compare/Daksh777-patch-1
2020-10-09 02:31:53 -03:00
Daksh P. Jain
96cd8de896
Update app/src/main/res/values-es-rES/strings.xml
Co-authored-by: Anyelo Almánzar Mercedes <22483347+anyeloamt@users.noreply.github.com>
2020-10-09 09:34:55 +05:30
Hemanth S
e5f6e83dd4 Fix playlist reload 2020-10-09 01:14:10 +05:30
Hemanth S
54f95dbd92 Add XML rules 2020-10-06 14:37:45 +05:30
Hemanth S
4b767bca54 Updated Spotless 2020-10-06 14:36:16 +05:30
Hemanth S
defcd86152 Add Spotless 2020-10-06 14:16:04 +05:30
Hemanth S
2af13a4e6c Artist fallback
Fallback to fetch Album cover for missing artists
2020-10-06 09:40:16 +05:30
Hemanth S
ccf123a481
Merge pull request #890 from tnyeanderson/fixartistart
Fix Artist Images
2020-10-06 09:32:41 +05:30
Hemanth S
6fd3f36e31 Modified User details 2020-10-04 19:01:40 +05:30
Hemanth S
e2d4ef11bd Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-10-04 14:43:44 +05:30
Hemanth S
f02888113e Code fixes 2020-10-04 14:43:42 +05:30
Hemanth S
d6e945542e
Merge pull request #907 from h4h13/Daksh777-patch-1
Update README.md
2020-10-04 14:43:14 +05:30
Daksh P. Jain
1631449c13
Update README.md 2020-10-03 19:26:21 +05:30
Daksh P. Jain
fc1de88cde
Update README.md 2020-10-03 17:49:21 +05:30
Hemanth S
c23c56649e Code refactor, fix animations on Album and Artist details 2020-10-03 00:40:26 +05:30
Hemanth S
31a0ddd731 Fix small text in Add to playlist dialog 2020-10-02 23:45:33 +05:30
Hemanth S
3af3a89ba5 Code refactor 2020-10-02 23:35:09 +05:30
Hemanth S
546d974084 Fix classic theme 2020-10-02 18:26:17 +05:30
Hemanth S
f56b158e78 Fixed showing app rate 2020-10-02 18:18:57 +05:30
Hemanth S
fdfedf274f Added some animations
Renamed some interface classes
2020-09-28 00:29:09 +05:30
Muntashir Al-Islam
3ce85797ea Remove Google Play API, again (#1) 2020-09-27 14:19:19 +06:00
Hemanth S
b78cbb60b4 Update SearchAdapter.kt 2020-09-27 03:03:56 +05:30
Hemanth S
209e3d58eb Updated
Item list to support big screen
Fix search for playlist
Fix playlist crash
2020-09-27 02:09:07 +05:30
Muntashir Al-Islam
cabc7a89f8 Prepare for v3.5.11 2020-09-26 14:30:34 +06:00
Muntashir Al-Islam
233adb833b Replace Retro Music with Metro in the library title 2020-09-26 13:51:29 +06:00
Muntashir Al-Islam
d851f2d048 Remove AppRater 2020-09-26 12:19:21 +06:00
Hemanth S
f2e290d274 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-09-25 23:09:03 +05:30
Hemanth S
608330f0da I belived fixed android Navigation 2020-09-25 23:08:59 +05:30
Hemanth S
46c65a7ebc Details removed extra space 2020-09-25 03:11:34 +05:30
Hemanth S
a8933cf079 Update build.gradle 2020-09-25 02:47:51 +05:30
Hemanth S
76389c45f9 Dynamic navigation 2020-09-25 02:33:56 +05:30
Hemanth S
a4bbc9ce5a Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-09-25 01:51:37 +05:30
Hemanth S
9850341d4c Updating
Constants names
Proper namings
Bottom tabs slide animation
Added home album list style change
2020-09-25 01:51:32 +05:30
Hemanth S
f94316b8b8 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-09-24 20:51:49 +05:30
Hemanth S
697da8a8f4 Update build.gradle 2020-09-24 20:51:46 +05:30
Hemanth S
b9c12e20dd Fix issues
Lockscreen controls and screen wakes when locked
Removed animaked `peakheight` for Bottomsheet
Added padding for details items to show last item
Fix suggestion text for less than 26 API
2020-09-24 20:51:08 +05:30
Hemanth S
0e8010ad78 Fix issues 2020-09-24 17:39:05 +05:30
Hemanth S
870cf4ce2e alpha release 2020-09-24 16:30:54 +05:30
Hemanth S
46dc5eb58e Fix crashing on About on release build 2020-09-24 16:23:23 +05:30
Hemanth S
40da78af8b Update Code
rolled back to old Icon
Updated pro gaurd rules
2020-09-24 04:19:05 +05:30
Hemanth S
caefbbbbad Fixed peak theme 2020-09-24 02:40:16 +05:30
Hemanth S
3f368e186b Updated code
Added Fragment options
Renamed Interfaces
Rolled back to previous implementaion for Now playing to handle backpress
2020-09-24 02:25:12 +05:30
Muntashir Al-Islam
1a453f5e49
Swap Metro and Retro 2020-09-22 23:46:29 +06:00
No Name Pro
830dd045c1
Add a table with differences between Metro and Retro (#14)
Replaced the differences list with a table for better overview.
2020-09-22 23:45:07 +06:00
No Name Pro
9051e3782a
Issue template agreement (#15)
* Update Issue Template (Feature) for no duplicates 

User is required to agree, that the issue is not already in retro issue list
2020-09-22 23:36:17 +06:00
Muntashir Al-Islam
2d0419d48c Apply package name changes after merge 2020-09-22 15:37:45 +06:00
Hemanth S
7c0b3ee82c Update ViewExtensions.kt 2020-09-22 15:00:00 +05:30
Hemanth S
c495c66a38 Added animation collapse when navigating to details 2020-09-22 13:50:43 +05:30
Hemanth S
e9c1559c57
Merge pull request #900 from h4h13/state
State
2020-09-22 12:44:54 +05:30
Hemanth S
03c0b2f68b
Merge branch 'dev' into state 2020-09-22 12:44:47 +05:30
Hemanth S
22a40a90b3
Merge pull request #889 from tnyeanderson/dev
Option to show album artists on the artists page
2020-09-22 12:41:44 +05:30
Muntashir Al-Islam
6df00b3e3a Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev
 Conflicts:
	README.md
	app/build.gradle
	app/release/output-metadata.json
	app/src/main/java/code/name/monkey/retromusic/Result.kt
	app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
	app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt
	app/src/main/java/code/name/monkey/retromusic/deezer/DeezerApiService.kt
	app/src/main/java/code/name/monkey/retromusic/deezer/DeezerResponse.kt
	app/src/main/java/io/github/muntashirakon/music/MainModule.kt
	app/src/main/java/io/github/muntashirakon/music/Result.kt
	app/src/main/java/io/github/muntashirakon/music/activities/MainActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsMusicServiceActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/base/AbsSlidingMusicPanelActivity.kt
	app/src/main/java/io/github/muntashirakon/music/activities/tageditor/AlbumTagEditorActivity.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/album/HorizontalAlbumAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/playlist/PlaylistAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/OrderablePlaylistSongAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/adapter/song/PlayingQueueAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/deezer/DeezerApiService.kt
	app/src/main/java/io/github/muntashirakon/music/deezer/DeezerResponse.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/AddToPlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/CreatePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/DeletePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsAsyncTask.java
	app/src/main/java/io/github/muntashirakon/music/dialogs/DeleteSongsDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/RemoveFromPlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/RenamePlaylistDialog.kt
	app/src/main/java/io/github/muntashirakon/music/dialogs/RetroSingleCheckedListAdapter.kt
	app/src/main/java/io/github/muntashirakon/music/extensions/ActivityEx.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/DetailListFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/LibraryViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/MiniPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/albums/AlbumsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/artists/ArtistsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/base/AbsPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/genres/GenresFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/home/HomeFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/library/LibraryFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/classic/ClassicPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/fit/FitPlaybackControlsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/player/gradient/GradientPlayerFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistDetailsViewModel.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/playlists/PlaylistsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/queue/PlayingQueueFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/MainSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/settings/OtherSettingsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/fragments/songs/SongsFragment.kt
	app/src/main/java/io/github/muntashirakon/music/glide/artistimage/ArtistImageLoader.kt
	app/src/main/java/io/github/muntashirakon/music/helper/M3UWriter.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/GenreMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/PlaylistMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/SongMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/helper/menu/SongsMenuHelper.kt
	app/src/main/java/io/github/muntashirakon/music/model/CategoryInfo.java
	app/src/main/java/io/github/muntashirakon/music/model/DeezerResponse.kt
	app/src/main/java/io/github/muntashirakon/music/model/Home.kt
	app/src/main/java/io/github/muntashirakon/music/model/PlaylistSong.java
	app/src/main/java/io/github/muntashirakon/music/network/DeezerService.kt
	app/src/main/java/io/github/muntashirakon/music/network/Result.kt
	app/src/main/java/io/github/muntashirakon/music/network/RetrofitClient.kt
	app/src/main/java/io/github/muntashirakon/music/repository/GenreRepository.kt
	app/src/main/java/io/github/muntashirakon/music/repository/PlaylistRepository.kt
	app/src/main/java/io/github/muntashirakon/music/repository/PlaylistSongsLoader.kt
	app/src/main/java/io/github/muntashirakon/music/repository/Repository.kt
	app/src/main/java/io/github/muntashirakon/music/repository/SongRepository.kt
	app/src/main/java/io/github/muntashirakon/music/service/MusicService.java
	app/src/main/java/io/github/muntashirakon/music/util/AppRater.kt
	app/src/main/java/io/github/muntashirakon/music/util/MusicUtil.kt
	app/src/main/java/io/github/muntashirakon/music/util/PlaylistsUtil.java
	app/src/main/res/font/pacifico.xml
	app/src/main/res/layout/fragment_gradient_player.xml
	app/src/main/res/layout/fragment_library.xml
	app/src/main/res/layout/fragment_main.xml
	app/src/main/res/layout/fragment_main_settings.xml
	app/src/main/res/navigation/library_graph.xml
	app/src/main/res/navigation/main_graph.xml
2020-09-22 11:14:00 +06:00
Hemanth S
022bf3624c Merge branch 'dev' of https://github.com/tnyeanderson/RetroMusicPlayer into pr/889 2020-09-21 16:19:50 +05:30
Hemanth S
40ceb57c45 Update AlbumDetailsFragment.kt 2020-09-21 16:17:08 +05:30
Hemanth S
4493273c69 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into state 2020-09-21 16:16:18 +05:30
thomas
5d1a75bc13 Fixing bug when preference is not set 2020-09-21 00:39:26 -04:00
thomas
991c4ee36e Got code cleanup happy... all fixed 2020-09-21 00:31:53 -04:00
thomas
6747af076f Various artists is working 2020-09-21 00:24:01 -04:00
thomas
2ed5e236da Fix incorrect loading from #895 2020-09-20 17:23:32 -04:00
thomas
76e55ba079 Minimum working prototype 2020-09-19 20:35:19 -04:00
Hemanth S
c3ddb066b7 Code refactor 2020-09-19 02:05:58 +05:30
Hemanth S
3fd8481522 Update GradientPlayerFragment.kt 2020-09-18 19:33:55 +05:30
Hemanth S
67b59f7c00 Adding animation 2020-09-18 18:26:41 +05:30
Hemanth S
765172d69f Code refactor 2020-09-18 16:31:55 +05:30
Hemanth S
9dac81ca6f
Merge pull request #895 from ologe/fix/ids
Images not loading - migrated ids from `int` to `long`
2020-09-18 15:26:42 +05:30
Eugeniu Olog
9e46d74507 - migrated ids from int to long
- some cleaning
2020-09-17 23:25:41 +02:00
Hemanth S
03723b62eb Now playing state management 2020-09-17 23:26:59 +05:30
Hemanth S
90bca59192
Merge pull request #891 from h4h13/Daksh777-patch-1
Update contributors.json
2020-09-15 23:52:04 +05:30
Hemanth S
a4b1b0a085 Code refactor 2020-09-15 23:45:35 +05:30
Daksh P. Jain
915ee780d4
Update contributors.json 2020-09-14 12:46:25 +05:30
thomas
24f91a48db Removed unnecessary imports 2020-09-14 02:07:11 -04:00
thomas
1982ccd710 Album art fallback working 2020-09-14 01:13:15 -04:00
thomas
bbd1853e78 Minimum working prototype 2020-09-13 21:42:12 -04:00
Hemanth S
0069253043
Merge pull request #886 from h4h13/room-playlist
Added Permission Screen
2020-09-13 01:10:24 +05:30
Hemanth S
10f56e9e6d Added Permission Screen 2020-09-13 01:09:46 +05:30
Hemanth S
fbbc1a1ef9
Merge pull request #883 from h4h13/room-playlist
Room playlist
2020-09-12 12:27:37 +05:30
Hemanth S
cc494edbbf Fix songs not loading from SD card 2020-09-12 12:23:23 +05:30
Hemanth S
0ef83c7136 Code refactor 2020-09-11 00:52:10 +05:30
Hemanth S
5ebeb9c587 Code refactor 2020-09-09 18:07:25 +05:30
Hemanth S
6d0898a49a Code refactor 2020-09-07 15:01:27 +05:30
Hemanth S
416ee91c39 Merge branch 'room-playlist' of https://github.com/h4h13/RetroMusicPlayer into room-playlist 2020-09-07 13:34:54 +05:30
Hemanth S
8cebb0c603 Code refactor 2020-09-07 13:34:51 +05:30
Hemanth S
26edcdf4da WIP Lyrics 2020-09-06 23:26:39 +05:30
Hemanth S
8eb7859f30 Code refactor 2020-09-06 16:33:24 +05:30
Hemanth S
332c2dc69b Code refactor 2020-09-06 16:17:06 +05:30
Hemanth S
5211890607 Fix Album & Artist crash when no network 2020-09-06 12:48:47 +05:30
Hemanth S
e8549513bd Hot fix 2020-09-06 04:00:50 +05:30
Hemanth S
47d533f9ed Update ImportPlaylistFragment.kt 2020-09-06 01:44:04 +05:30
Hemanth S
45b93ed3aa ⬇️ Import legacy playlists 2020-09-06 01:43:45 +05:30
Hemanth S
51d2c17ad7 Create playlist added to menu 2020-09-06 00:41:48 +05:30
Hemanth S
6e8ff6ab71 Add save playlist 💾 2020-09-06 00:21:44 +05:30
Hemanth S
41e8aa8a03 🗑Deleted unwanted files 2020-09-05 23:54:05 +05:30
Hemanth S
25fbbce11e Don't update Material lib to alpha02 🙆🏻 2020-09-05 23:46:44 +05:30
Hemanth S
45f5c18725 Merge branch 'room-playlist' of https://github.com/h4h13/RetroMusicPlayer into room-playlist 2020-09-05 21:25:00 +05:30
Hemanth S
cf3db7a76b Code refactor 2020-09-05 21:24:16 +05:30
Hemanth S
f7d14e13c7 Code refactor 2020-09-05 21:22:10 +05:30
Hemanth S
c050ce3fbd Merge branch 'room-playlist' of https://github.com/h4h13/RetroMusicPlayer into room-playlist 2020-09-05 19:33:16 +05:30
Hemanth S
061b9c90ab Code refactor 2020-09-05 19:33:12 +05:30
Hemanth S
54b037c0c1 Merge branch 'room-playlist' of https://github.com/h4h13/RetroMusicPlayer into room-playlist 2020-09-02 20:55:03 +05:30
Hemanth S
9da8cb99ce Code refactor 2020-09-02 20:50:38 +05:30
Hemanth S
ffa0749849 Added List sort, grid size, layout changes 2020-08-31 18:42:03 +05:30
Hemanth S
6f07548023 Merge branch 'room-playlist' of https://github.com/h4h13/RetroMusicPlayer into room-playlist 2020-08-31 18:04:18 +05:30
Hemanth S
6881e9a4c1 Code refactor 2020-08-31 18:00:07 +05:30
Hemanth S
34b5d01e8d Remove MainActivityFragmentCallbacks 2020-08-30 22:23:09 +05:30
Hemanth S
2854b33d56 Refactor code
Moving business logic from UI to ViewModel class
2020-08-30 00:23:15 +05:30
Hemanth S
c379342f6a Update SongExtension.kt 2020-08-24 22:00:53 +05:30
Hemanth S
3265580275 Merge branch 'room-playlist' of https://github.com/h4h13/RetroMusicPlayer into room-playlist 2020-08-24 22:00:49 +05:30
Hemanth S
bbfec6f489 old Changes 2020-08-24 21:57:08 +05:30
Hemanth S
cee4565c34 Code refactor 2020-08-23 13:31:42 +05:30
Hemanth S
543893adba Code refactor 🧑‍💻 2020-08-21 23:31:52 +05:30
Hemanth S
2817dc1db5 Code refactor 🧑‍💻 2020-08-21 22:37:10 +05:30
Hemanth S
859d10d907 🔨 Fix smart playlists 2020-08-21 20:29:14 +05:30
Hemanth S
2769db3f17 ️Favorite playlist added 2020-08-21 20:17:25 +05:30
Hemanth S
b22b3a627f History playlist add 2020-08-21 19:49:15 +05:30
Hemanth S
f013cf296d Code refactor 2020-08-21 18:35:01 +05:30
Hemanth S
b54c561070 Code refactor 2020-08-21 17:42:40 +05:30
Hemanth S
a7e55cc5bf 🙆🏻Ohh god removed AsyncTask finally 2020-08-21 17:15:38 +05:30
Hemanth S
069d45e8df 🙆🏻Ohh got AsyncTask removed finally
And Favorite playlist added yay
2020-08-21 17:13:51 +05:30
Hemanth S
d5d77afaaf Code refactor 2020-08-21 16:12:21 +05:30
Hemanth S
3489e3ba28 Update AddToRetroPlaylist.kt 2020-08-21 10:47:20 +05:30
Hemanth S
c81d0c17fb Code refactor 2020-08-21 10:31:53 +05:30
Hemanth S
1941086b4a Added debug font 2020-08-21 09:53:01 +05:30
Hemanth S
f3988ae1d1 Playlist Add, Delete, Add Songs 2020-08-21 01:32:40 +05:30
Hemanth S
6aa9b08ff2 Code refactor 2020-08-20 15:36:59 +05:30
Hemanth S
bcb8f1b42b Updated SongEntity to Song 2020-08-20 15:31:22 +05:30
Hemanth S
a93dcb0285 Changes Playlist to PlaylistEntity 2020-08-20 15:22:38 +05:30
Hemanth S
b5e07a31d8 Add Room for playlist
Added DAO Queries and Able insert songs to playlist
2020-08-20 12:19:08 +05:30
Hemanth S
6ace96708b Add Room database for custom playlist
Here we go again!

Doing custom playlist db
2020-08-20 00:13:06 +05:30
Hemanth S
662a5eea35 Update build.gradle 2020-08-19 19:30:45 +05:30
Muntashir Al-Islam
3c3cbf08a9 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-08-19 13:40:58 +06:00
dylan
51b0bafb80
Update strings.xml
updated some translations. also i suggest to change the "blacklist" strings/references for a more inclusive name like denylist or blocklist as even Linux did.
2020-08-16 17:32:35 -03:00
Hemanth S
c6c89e9b9e Dialog content has changed follow font 2020-08-14 14:04:03 +05:30
Hemanth S
038e872e7a Update RealRepository.kt 2020-08-13 23:43:32 +05:30
Hemanth S
1c08487939 Fix crash while rotating device 2020-08-13 23:18:49 +05:30
Hemanth S
e159b1a32a 🙆🏻 Woof that's done it Playlist
Code refactor to Kotlin
2020-08-13 22:38:37 +05:30
Hemanth S
ff20b3a052 Fix bottom navigation hiding 2020-08-13 18:06:24 +05:30
Hemanth S
3a68c7de12 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-08-13 13:54:46 +05:30
Hemanth S
23f4fee872 Android Navigation code refactor 2020-08-13 13:54:36 +05:30
Hemanth S
54173a395a
Merge pull request #856 from h4h13/milindgoel15-patch-1
Update faq link
2020-08-13 11:47:42 +05:30
Hemanth S
2fbac50837
Merge pull request #857 from h4h13/Daksh777-patch-2
Update bug report template to include FAQ link
2020-08-13 11:47:29 +05:30
Hemanth S
9552e617b5 code refactor 2020-08-12 03:50:22 +05:30
Hemanth S
ec47bc3d2e Add detail navigation 2020-08-12 03:01:09 +05:30
Hemanth S
4a87a900be Code refactor
Towards single activity
*Removed SearchActvitiy
2020-08-12 00:28:14 +05:30
Hemanth S
e7691aa856 Merge branch 'dev' of https://github.com/h4h13/RetroMusicPlayer into dev 2020-08-11 23:59:50 +05:30
Hemanth S
3ebf777d7b Working towards single activity design 2020-08-11 23:59:44 +05:30
Daksh P. Jain
2184013191 Update bug report template to include FAQ link 2020-08-11 20:19:13 +05:30
Milind Goel
45972f33cb
Update faq link 2020-08-11 19:51:49 +05:30
Daksh P. Jain
e887b42ef5 Update bug report template to include crash logs 2020-08-10 17:05:07 +05:30
Hemanth S
31534769a8
Merge pull request #849 from Daksh777/dev
Update README.md
2020-08-10 15:21:02 +05:30
Daksh P. Jain
55205bbd74
Update CONTRIBUTING.md 2020-08-10 12:33:27 +05:30
Daksh P. Jain
9655d58432
Update README.md 2020-08-10 11:41:12 +05:30
Daksh P. Jain
31c0d8bc98
Create CONTRIBUTING.md 2020-08-10 11:27:08 +05:30
Daksh P. Jain
8d5d7054c6
Create CODE_OF_CONDUCT.md 2020-08-10 11:25:04 +05:30
Hemanth S
14fdfbd884
Merge pull request #847 from milindgoel15/patch-2
Update lyric guide to be more simple and straight
2020-08-10 11:13:52 +05:30
Daksh P. Jain
213f106cac Update issue templates 2020-08-10 11:12:23 +05:30
Daksh P. Jain
287638af90 Update issue templates 2020-08-10 11:10:16 +05:30
Milind Goel
051ca50929
Update lyric guide to be more simple and straight 2020-08-02 20:58:04 +05:30
1359 changed files with 67234 additions and 87850 deletions

4
.gitattributes vendored Normal file
View file

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

51
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,51 @@
---
name: Bug report
about: Create a report to help us improve. Please write in English only.
title: ''
labels: bug
assignees: ''
---
<!--
Don't report bugs that are already in the issue list of Retro Music: https://github.com/h4h13/RetroMusicPlayer/issues
[ ] Yes
-->
**Have you read the [FAQ](https://github.com/RetroMusicPlayer/RetroMusicPlayer/blob/master/FAQ.md)?**
[Yes/No]
**Has the bug already been reported? Please search in GitHub issue tab before creating an issue.**
[Yes/No]
**Describe the bug**
A clear and concise description of what the bug is.
**How To Reproduce**
Steps to reproduce the behavior:
1.
2.
3.
4.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Crash log**
If the app is crashing, add a crash log
<details>
<summary>Click to view logs</summary>
PASTE YOUR LOGS HERE.
</details>
**Device info:**
- Device: [e.g. OnePlus 7]
- Android version: [e.g. Android 9]
- App version [e.g. 3.5.300_0517]
**Additional context**
Add any other context about the problem here.

View file

@ -0,0 +1,26 @@
---
name: Feature request
about: Suggest an idea for this project. Please write in English only.
title: ''
labels: enhancement
assignees: ''
---
<!--
Don't report bugs that are already in the issue list of Retro Music: https://github.com/h4h13/RetroMusicPlayer/issues
[ ] Yes
-->
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

34
.github/workflows/android.yml vendored Normal file
View file

@ -0,0 +1,34 @@
name: Android CI
on:
push:
branches: [ dev ]
pull_request:
branches: [ dev ]
jobs:
check:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- uses: gradle/wrapper-validation-action@v1
- uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: 17
- uses: gradle/gradle-build-action@v2
- name: Lint Android
run: ./gradlew lint
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
- uses: gradle/gradle-build-action@v2
- name: Build
run: ./gradlew app:assemble

6
.gitignore vendored
View file

@ -38,8 +38,4 @@ obj/
captures
app/normal/release/
/models/
app/font/
app/src/debug/
/app/nofont/
/crowdin.properties
/app/release/

35
CONTRIBUTING.md Normal file
View file

@ -0,0 +1,35 @@
# Contributing
## Using the issue tracker
The [issue tracker](https://github.com/RetroMusicPlayer/RetroMusicPlayer/issues) is the preferred channel for bug reports, feature requests and submitting pull requests, but please follow these rules:
* Please **do not** derail or troll issues. Keep the discussion on topic and respect the opinions of others.
* Please **do not** post comments consisting solely of "+1" or "👍". Use [GitHub's "reactions" feature](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) instead.
* Please **do not** write [enhancement]/[bug]/[feature request] or similar stuff in the title of issues, as there are labels for that purpose that will be added by devs or collaborators.
## Bug reports
A bug is a _demonstrable problem_. Good bug reports are extremely helpful, so thanks!
Guidelines for bug reports:
* Use the GitHub issue search, check if the issue has already been reported both in the open issues and in the closed ones, if there are some missing details, add them in issue comments, without creating a new one
* Check if the issue has been fixed — try to reproduce it using the latest available build
* Isolate the problem — ideally create a reproducible scenario and a live example
* Do not report multiple bugs in a single ticket, otherwise it will be confusing.
A good bug report shouldn't leave others needing to chase you up for more information. Please try to be as detailed as possible in your report.
## Feature requests
Feature requests are welcome, please make sure to be as detailed as possible and use screenshots, videos, GIFs, to demonstrate it better, if possible.
## Pull requests
**Please ask first** before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that developers might not want to merge into the project. To avoid that, you can join the official [Telegram group](https://t.me/retromusicapp) or open an issue.
## License
By contributing your code, you agree to license your contribution under the [GNU General Public License](https://github.com/RetroMusicPlayer/RetroMusicPlayer/blob/master/LICENSE.md).
Please note we have a code of conduct, please follow it in all your interactions with the project.

195
FAQ.md
View file

@ -1,152 +1,157 @@
#### Q: How do I get the beta version of Retro Music?
## **Q: How do I get the beta version of Retro Music?**
You can opt-in for the beta build by clicking on this link: https://play.google.com/apps/testing/code.name.monkey.retromusic
___
#### Q: How to restore my purchases?
Make sure to switch and use account in the Play Store app through which you purchased before installing Retro music. The account used to install the app is also used to purchase/restore the pro license.
## **Q: How to restore my purchases?**
Make sure to switch and use your account in the Play Store app through which you purchased before installing Retro Music. The Google account used to install the app is also used to purchase/restore the pro license.
If you already installed, remove all other accounts except the one with which you purchased premium. Then restore the purchase.
If you've already installed the app, remove all other accounts except the one from which you purchased premium, and then restore the purchase.
___
#### Q: How do I use offline synced lyrics?
There are two methods for how to get offline synced lyrics.
## Q: **How do I use offline synced lyrics?**
There are three methods for adding offline synced lyrics in Retro Music.
#### Method 1:-
##### STEP 1:
Find the time stamped lyrics for your songs which don't have lyrics already. A time stamped lyrics looks like this, "[00:04:02] Some lyrics text" for example.
##### STEP 2:
Copy these time stamped lyrics.
##### STEP 3:
### ***Method 1:-***
#### STEP 1:
Find the time-stamped lyrics for your songs that don't have lyrics already. A time-stamped lyric looks like this, "[00:04:02] Some lyrics text" for example.
#### STEP 2:
Copy these time-stamped lyrics.
#### STEP 3:
Open retro music and head to the song synced lyrics editor.
##### STEP 4:
#### STEP 4:
Paste the lyrics there normally and exit the editor
##### STEP 5:
Open lyrics and you should see your time stamped lyrics there.
#### STEP 5:
Open lyrics and you should see your time-stamped lyrics there.
#### Method 2:-
##### STEP 1:
Find the ".lrc" files for your songs which doesn't have lyrics already.
##### STEP 2:
A ".lrc" is like a text file which contains the time stamped lyrics for example, "[00:04:02] Some lyrics text"
##### STEP 3:
### ***Method 2:-***
#### STEP 1:
Download the time-stamped lyrics for your songs that don't have lyrics already. You can find ".lrc" files for popular songs at either of the websites given below. A time-stamped lyric looks like this, "[00:04:02] Some lyrics text" for example.
#### STEP 2:
A ".lrc" is like a text file that contains the time-stamped lyrics for example, "[00:04:02] Some lyrics text". Save your time-stamped lyrics are ".lrc" file.
#### STEP 3:
Now you have to rename the file you created in this way: <song_name> - <artist_name>.lrc or for better matching copy the <song_name> and the <artist_name> from the tag editor and then rename the file.
##### STEP 4:
You have to copy or move this file into a location on the SD Card: whatever_sdcard/RetroMusic/lyrics/ and paste it there.
Finally you will be able to see the lyrics working.
> If you want to skip to particular time stamp, simply scroll to the time stamp from where you want to start from and a 'Play' icon will appear left to the particular stamp. Tap on play button to play from there.
### STEP 4:
Now paste the LRC files to the following path: /sdcard/Retromusic/lyrics/
Here sdcard is your internal storage.
### ***Method 3:- (Requires third-party app)***
#### STEP 1:
Download automatag or autotagger from Play Store.
#### STEP 2:
Find the time-stamped lyrics for your songs that don't have lyrics already. You can find ".lrc" files for popular songs at either of the websites given below. A time-stamped lyric looks like this, "[00:04:02] Some lyrics text" for example.
#### STEP 3:
Find your song to edit and paste the synced lyrics.
> These apps add those synced lyrics in the music file itself instead of creating a ".lrc file for it."
#### Q: Why isn't the artist's image downloading?
Last.fm has disabled the download of artist's images for the time being, whether functionality for this will be restored in future is uncertain. So we have moved to deezer API for artist images which have very less artists in their database and you might not able to see covers on every artist profiles.
**Lyrics Website Links:**
- https://www.lyricsify.com/
- https://www.syair.info
**Some Important Notes:**
- If you want to skip to a particular timestamp, simply scroll to the time stamp from where you want to start and a 'Play' icon will appear left to the particular stamp. Tap on the play button to play from there.
- When you save lyrics by pasting lyrics in lyrics editor, close the lyrics and open again for lyrics to show.
- For those who are having difficulty in making the synced lyrics work, we have a short tutorial video on it. Hope this helps you. {[Link in the note or here](https://youtu.be/1oIOTGWhNMY)}
#### Q: How do I change the theme?
___
## **Q: How do I change the theme?**
Settings -> Look and feel -> Select your theme.
___
## **Q: Equalizer is very laggy and unstable or I am getting a "No equalizer found" error. Why?**
- The Retro music in-built equalizer was removed updates ago so the only equalizer you will have by your OEM or Android native equalizer which isn't made by us and have no control over them. So you can report those issues to your OEM so that they can provide a fix in the next updates.
#### Q: Equailizer is very laggy and unstable or I am getting "No equalizer found" error. why?
The Retro music in-built equalizer was removed updates ago so the only equalizer you will have by your OEM or android which aren't made by us and have no control over them. So you can report those issues to your OEM so that they can provide a fix in next updates.
- If you are seeing "No Equalizer Found" in your device, this means your device doesn't have a stock equalizer "MusicFx" Equalizer. You can try using this one. It's made by AEX ROM developers.
If you are seeing "No Equalizer Found" in your device, this means your device doesn't have stock equalizer MusicFx Equalizer. You can try using this one. Its made by AEX ROM developers.
https://drive.google.com/file/d/1_1bpsn6roeEyElGKikbU39lVKUH8O3xp/view?**usp=drivesdk
https://drive.google.com/file/d/1_1bpsn6roeEyElGKikbU39lVKUH8O3xp/view?usp=drivesdk
___
#### Q: Why aren't last added songs showing?
## **Q: Why aren't last added songs showing?**
Settings -> Other -> Last added playlist interval -> Select an option from the list.
___
#### Q: How do I enable fullscreen lockscreen controls?
## **Q: How do I enable fullscreen lock screen controls?**
Settings -> Personalize -> Fullscreen controls -> Enable (this will only be visible when songs are playing from Retro Music).
___
#### Q: Why are gallery or random pictures showing up as album art?
## **Q: Why are my gallery or random pictures showing up as album art?**
Settings -> Images -> Ignore media store covers -> Enable
___
#### Q: Which file types are supported?
## **Q: Which file types are supported?**
Retro Music uses the native media player that comes with your Android phone, so as long as a file type is supported by your phone, it's supported by Retro Music.
___
#### Q: Why is my device slowing down when I'm using the app?
## **Q: Why is my device slowing down when I'm using the app?**
Retro Music is image intensive, it keeps images in the cache for quick loading.
___
#### Q: The title "Retro Music" is showing on the top of the app, how can i fix this?
## **Q: The title "Retro Music" is showing on the top of the app, how can I fix this?**
Clear the app's cache and data.
___
## **Q: My app is crashing, how do I fix this?** (Sorry, settings have changed internally)
Please try to clear the data of the app. If it doesn't work, reinstalling fresh from the play store should help.
___
#### Q: My app is crashing, how do i fix this? (Sorry, settings have changed internally)
Please try clear data of the app. If it doesn't work, reinstalling fresh from play store should help.
#### Q: Why has all the text gone white/dissapeared?
## **Q: Why has all the text gone white/disappeared?**
Change the theme to Black or Dark and change it back to what you had before.
___
## **Q: Why some of my songs are not showing in my library?**
- Try checking up if those songs are not less than 30 seconds, if so head to settings -> other -> filter song duration. Put this to zero and see the songs that should start appearing in the library.
#### Q: Why some of my songs are not showing in my library?
Try checking up if those songs are not less than 30 seconds, if so head to settings -> other -> filter song duration. Put this to zero and see the songs should start appearimg in the library.
- If this doesn't work out for you, re-scanning the media folder should help and subsequently rebooting the device to refresh the media store.
If this doesn't work out for you, re-scanning the media folder should help and subsquently rebooting the device to refresh media store.
- At last, resort, If nothing worked and your audio files are stored in SD card. Try moving them to internal memory then back to SD card.
At last resort, If nothing worked and your audio files are stored in SD card. Try moving them to internal memory then back to SD card.
___
## **Q: Why does my library shows song files twice or no song at all?**
If you are seeing duplication of songs in the library or no songs at all, then it's because of the Media Store issue which got affected by some other app.
#### Q: Why some of my songs are not showing in my library?
1. Try checking up if those songs are not less than 30 seconds, if so head to settings -> other -> filter song duration. Put this to zero and see the songs should start appearimg in the library.
***To fix this:***
1. Head to your device settings
2. If this doesn't work out for you, re-scanning the media folder should help and subsquently rebooting the device to refresh media store.
1. Open up "Apps & notifications" (This name depends from ROM to ROM)
3. At last resort, If nothing worked and your audio files are stored in SD card. Try moving them to internal memory then back to SD card.
1. Find the 'Media storage' app and clear storage (both data and cache) of it.
1. Then open the Retro Music app and manually scan your music from your storage.
#### Q: Why my playlist/playlist songs keep disappearing?
Playlist/Playlist songs disappearing is based on android media store system. Save those playlist as file(Tap on three dot menu next to available playlist and save as file) and it should get fixed.
1. Reboot the device to refresh the media store (Not sure if this is necessary)
**NOTE:** Don't panic when you will open Retro Music and see "Zero" songs there in the library. It's because you cleared Media Store which is responsible for recognising files on your device.
___
#### Q: Why does my library shows song files twice or no song at all?
If you are seeing duplication of songs in the library or no songs at all, then it's because of Media Store issue which got affected by some other app.
## **Q: I can't find the folder menu anymore after the latest update?**
Head to settings -> personalise. And select folders from "library categories". If there is no option of folders, tap on reset and select folders.
___
To fix this:
## **Q: After updating the app to the latest version, the font got removed. Why?**
- Retro Music's font has now been replaced with system font, which means the default font your system uses will be used by Retro Music too. It fixes all font-related issues you used to face/are facing in the app.
• Head to your device settings
- With the recent Retro Music v5 release, we have a built-in optional font "Manrope font" which you can toggle from Settings > Look & Feel > Toggle "Use manrope font".
• Open up "Apps & notifications" (This name depends from ROM to ROM)
- If you think the font looks ugly, then you just need to change the default font from your Android settings (or use any Magisk module). If you can't, there's nothing we can do about it.
___
• Find 'Media storage' app and clear storage (both data and cache) of it.
## **Q: How to export playlist?**
- ***From Retro Music:***
• Then open Retro Music app and manually scan your music from your storage.
Head to the playlists tab > tap on the three-dot menu on the playlist you want to export > save as a file.
• Reboot the device to refresh media store (Not sure if this is necessary)
- ***From Other Music Players:***
NOTE: Don't panic when you will open Retro Music and see "Zero" songs there in the library. It's because you cleared Media Store which is responsible for recognising files on your device.
In your built-in music player, there should be an option to save that playlist as a file. Save them and import them from the file manager by opening it into retro music.
> Note that such playlist must be of your offline music only since retro music is an offline music player, not an online music player. So if your playlist is of online music, it can't be opened on other offline players nor can be exported
___
#### Q: I can't find folder menu anymore after latest update?
Head to settings -> personalise. And select folders from "library categories". If there is option of folders, tap on reset and select folders.
## **Q: How to restore/import playlist?**
Retro Music will automatically detect any playlist file when that playlist file is stored in internal storage/Playlist. However, if it doesn't, just open any "File manager" and open that playlist file with Retro Music.
#### Q: After updating the app to latest version, font got removed. Why?
Retro Music's font have now been replaced with system font now, which means the default font your system uses will be used by Retro too. It fixes all font related issues you used to face/are facing in the app.
If you think the font looks ugly, then you just need to change the default font from your Android settings (or use any Magisk module). If you can't, there's nothing we can do about it.
#### Q: How to export playlist:
In your built-in music player, there should be an option to save those playlist as file. Save them and import from file manager by opening it into retro music.
Note that those playlist must be of your offline music only since retro music is offline music player not an online music player. So if your playlist are of online music, it can't be opened on other offline players nor can be exported
#### Q: How to restore/import playlist:
Retro Music will automatically detect any playlist file when that playlist file is stored in InternalStorage/Playlist. However, if it doesn't, just open "file manager" and open that playlist file with Retro Music.
For restoring playlists, the location of songs must be same in both Playlist file and in your storage. For example, your music is in "Internalstorage/Music" and playlist file has songs location "Internalstorage/Songs". Then it will not going to work since both these location are different.
#### Q: Adding songs to playlist or marking them as favourite are making app crash. Why?
It's a known issue with only android 10 with its media store API when songs are in SD card due to introduction of Scoped Storage by Google. The issue have been created on Google Issue Tracker by many users. Many other players which doesn't have this issue are using a custom database for storing playlist. We will soon be implementing a custom database for playlist to fix this issue!
Workaround: You can move all songs to internal storage to fix the issue.
ISSUE link: https://issuetracker.google.com/issues/147619577
For restoring playlists successfully, the location of songs must be the same in both the "Playlist" file and in your storage. For example, If your music is in "Internal storage/Music" and the playlist file has songs location "Internal storage/Songs". Then it will not be going to work since both these locations are different.

113
README.md
View file

@ -2,77 +2,96 @@
Material Design music player for Android music lovers
## Differences between RetroMusicPlayer and Metro
- Google Play libraries removed (in favor for F-Droid)
- Pro features for free
- Bug fixes
## Downloads
## Screenshots
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/en/packages/io.github.muntashirakon.Music/)
## Differences between Metro and [RetroMusicPlayer](https://github.com/h4h13/RetroMusicPlayer)
- Google Play libraries removed (fully libre)
- Pro features available for free
- Fully offline (INTERNET permission removed)
- Bug fixes
- Minor differences in UI
## 📱 Screenshots
### App Themes
| <img src="screenshots/home.jpeg" width="200"/> | <img src="screenshots/home_dark.jpeg" width="200"/> | <img src="screenshots/home_black.jpeg" 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|
### Player screen
| <img src="screenshots/home.jpeg" width="200"/>| <img src="screenshots/list.jpeg" width="200"/>| <img src="screenshots/albums.jpeg" width="200"/>| <img src="screenshots/settings.jpeg" width="200"/>|
|:---:|:---:|:---:|:---:|
| Home | Songs | Albums | Settings |
| <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 |
### 9+ Now playing themes
| <img src="screenshots/np_normal.jpeg" width="200"/> |<img src="screenshots/np_fit.jpeg" width="200"/>| <img src="screenshots/np_flat.jpeg" width="200"/> | <img src="screenshots/np_color.jpeg" width="200"/> | <img src="screenshots/np_material.jpeg" width="200"/> |
### Synced lyrics screen (Over Cover)
| <img src="screenshots/synced_over_light.jpg" width="200"/>| <img src="screenshots/synced_over_dark.jpg" width="200"/>| <img src="screenshots/synced_over_black.jpg" width="200"/>|
|:---:|:---:|:---:|
| Synced Over Cover light | Synced Over Cover dark | Synced Over Cover black |
### Synced lyrics screen (Replace Cover)
| <img src="screenshots/synced_replace_light.jpg" width="200"/>| <img src="screenshots/synced_replace_dark.jpg" width="200"/>| <img src="screenshots/synced_replace_black.jpg" width="200"/>|
|:---:|:---:|:---:|
| Synced Replace Cover light | Synced Replace Cover dark | Synced Replace Cover black |
### 10+ Now playing themes
| <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 |
| <img src="screenshots/no_classic.jpeg" width="200"/> |<img src="screenshots/np_adaptive.jpeg" width="200"/>| <img src="screenshots/np_blur.jpeg" width="200"/> | <img src="screenshots/np_tiny.jpeg" width="200"/> | <img src="screenshots/np_peak.jpeg" width="200"/> |
| <img src="screenshots/classic.jpg" width="200"/> |<img src="screenshots/adaptive.jpg" width="200"/>| <img src="screenshots/blur.jpg" width="200"/> | <img src="screenshots/tiny.jpg" width="200"/> | <img src="screenshots/peek.jpg" width="200"/> |
|:-----: |:-----: |:-----: |:-----: |:-----: |
| Classic | Adaptive | Blur | Tiny | Peak |
| Classic | Adaptive | Blur | Tiny | Peek |
### 🧭 Navigation never made easier
Self-explanatory interface without overloaded menus
## 🧭 Navigation never made easier
Self-explanatory interface without overloaded menus.
### 🎨 Colorful
You can choose between three different main themes: Clearly white, Kind
dark and Just black for AMOLED displays. Select your favorite accent
## 🎨 Colorful
You can choose between three different main themes: Clearly White, Kinda
Dark and Just Black for AMOLED displays. Select your favorite accent
color from a color palette.
### 🏠 Home
Where you can have your recently/ top played Artists, Albums and
Favorite Songs. No other music player has this feature
## 🏠 Home
Where you can view your recently/top played artists, albums and
favorite songs. No other music player has this feature.
### 📦 Included Features
- Base 3 themes (Clearly white, Kinda dark and Just Black)
## 📦 Included Features
- Base 3 themes (Clearly White, Kinda Dark and Just Black)
- Choose from 10+ now playing themes
- Drive Mode
- Driving Mode
- Headset/Bluetooth support
- Music Duration Filter
- Folder support - Play song by folder
- Music duration filter
- Android auto support
- Wallpaper accent picker on Android 8.1+
- Material You support on Android 12+
- Monet themed icon support on Android 13+
- Folder support - Play songs by folder
- Gapless playback
- Volume controls
- More than 10 Now playing themes
- Carousel effect for an album cover
- Home screen Widgets
- Lock Screen Playback Controls
- Lyrics Screen(download and sync with music)
- Sleep Timer
- Home screen Widgets
- Easy Drag to Sort Playlist & Play Queue
- Carousel effect for album covers
- Home screen widgets
- Lock screen playback controls
- Lyrics screen (download and sync with music)
- Sleep timer
- Easy drag to sort playlist & play queue
- Tag editor
- Create, Edit, Import playlists
- Create, edit and import playlists
- Playing queue with reorder
- User profile
- 30 Languages support
- Browse and play your music by Songs, Albums, Artists, Playlists,
Genre
- Smart Auto Playlists - Recently played/Top Played/History Fully
playlist support & Build your own playlist on the go
- 30+ languages support
- Browse and play your music by songs, albums, artists, playlists and
genre
- Smart Auto Playlists - Recently played, most played and history
- Build your playlist on the go
We are trying our best to bring you the best user experience. The app is regularly being updated for bug fixes and new features.
We are trying our best to bring you the best user experience. Until now
it is a beta version - bug fixes (if any) and more features are on the
way. for FAQ's https://goo.gl/DR2mE2
### 🗂️ License
## 🗂️ License
Metro is released under the GNU General Public License v3.0
(GPLv3), which can be found here: [License](LICENSE.md)
(GPLv3), which can be found [here](LICENSE.md)
> Please note: Metro is an offline music player app. It doesn't support music downloading or online music streaming.

View file

@ -1,40 +1,30 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: "ru.cleverpumpkin.proguard-dictionaries-generator"
apply plugin: "androidx.navigation.safeargs.kotlin"
proguardDictionaries {
dictionaryNames = [
"build/class-dictionary",
"build/package-dictionary",
"build/obfuscation-dictionary"
]
}
apply plugin: 'kotlin-parcelize'
apply plugin: 'com.google.devtools.ksp'
android {
compileSdkVersion 29
buildToolsVersion = '30.0.0'
compileSdk 33
namespace "code.name.monkey.retromusic"
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
minSdk 21
targetSdk 33
renderscriptTargetApi 29 //must match target sdk and build tools
vectorDrawables.useSupportLibrary = true
applicationId 'io.github.muntashirakon.Music'
versionCode 10443
versionName '3.5.10'
versionCode 10603
versionName '6.1.0'
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix '.debug'
@ -42,15 +32,17 @@ android {
}
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/java.properties'
buildFeatures {
viewBinding true
}
lintOptions {
disable 'MissingTranslation'
disable 'InvalidPackage'
abortOnError false
packagingOptions {
resources {
excludes += ['META-INF/LICENSE', 'META-INF/NOTICE', 'META-INF/java.properties']
}
}
lint {
abortOnError true
warning 'ImpliedQuantity', 'Instantiatable', 'MissingQuantity', 'MissingTranslation'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@ -59,90 +51,82 @@ android {
kotlinOptions {
jvmTarget = "1.8"
}
configurations.all {
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
configurations.configureEach {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}
androidExtensions {
experimental = true
}
kapt {
generateStubs = true
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':appthemehelper')
implementation 'androidx.multidex:multidex:2.0.1'
implementation "androidx.gridlayout:gridlayout:1.0.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.viewpager2:viewpager2:1.1.0-alpha01"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.fragment:fragment-ktx:1.2.5'
implementation "androidx.appcompat:appcompat:$appcompat_version"
implementation 'androidx.annotation:annotation:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.recyclerview:recyclerview:1.3.0'
implementation "androidx.preference:preference-ktx:$preference_version"
implementation "androidx.core:core-ktx:$core_version"
implementation 'androidx.palette:palette-ktx:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta8'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.mediarouter:mediarouter:1.3.1'
implementation 'com.google.android.material:material:1.3.0-alpha01'
implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
def room_version = '2.5.1'
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
ksp "androidx.room:room-compiler:$room_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.core:core-splashscreen:1.0.0"
implementation "com.google.android.material:material:$mdc_version"
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 = "0.9.6.0"
def material_dialog_version = "3.3.0"
implementation "com.afollestad.material-dialogs:core:$material_dialog_version"
implementation "com.afollestad.material-dialogs:commons:$material_dialog_version"
implementation 'com.afollestad:material-cab:0.1.12'
implementation "com.afollestad.material-dialogs:input:$material_dialog_version"
implementation "com.afollestad.material-dialogs:color:$material_dialog_version"
implementation 'com.github.bumptech.glide:glide:3.8.0'
implementation 'com.github.bumptech.glide:okhttp3-integration:1.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
implementation 'com.afollestad:material-cab:2.0.1'
implementation('com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.11.0@aar') {
transitive = true
}
def kotlin_coroutines_version = "1.3.8"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:3.4.0.201406110918-r'
def koin_version = '3.4.0'
implementation "io.insert-koin:koin-core:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version"
implementation 'com.github.ksoichiro:android-observablescrollview:1.6.0'
implementation 'com.github.kabouzeid:recyclerview-fastscroll:1.9-kmod'
def glide_version = '4.15.1'
implementation "com.github.bumptech.glide:glide:$glide_version"
ksp "com.github.bumptech.glide:ksp:$glide_version"
implementation 'com.github.AdrienPoupa:jaudiotagger:2.2.3'
implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0'
implementation 'com.github.bosphere.android-fadingedgelayout:fadingedgelayout:1.0.0'
implementation 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:3.0.0-RC3'
implementation 'com.github.jetradarmobile:android-snowfall:1.2.1'
implementation "dev.chrisbanes.insetter:insetter:0.6.1"
implementation 'com.github.Adonai:jaudiotagger:2.3.15'
implementation 'com.r0adkll:slidableactivity:2.1.0'
implementation 'com.heinrichreimersoftware:material-intro:1.6'
implementation 'me.zhanghai.android.fastscroll:library:1.1.0'
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation 'me.jorgecastillo:androidcolorx:0.2.0'
debugImplementation 'com.amitshekhar.android:debug-db:1.0.4'
implementation 'com.github.dhaval2404:imagepicker:1.7.1'
def koin_version = "2.1.5"
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-core-ext:$koin_version"
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-fragment:$koin_version"
implementation "org.koin:koin-androidx-ext:$koin_version"
def nav_version = "2.3.0"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
implementation 'com.heinrichreimersoftware:material-intro:2.0.0'
implementation 'com.github.dhaval2404:imagepicker:2.1'
implementation 'me.zhanghai.android.fastscroll:library:1.2.0'
implementation 'cat.ereza:customactivityoncrash:2.4.0'
implementation 'me.tankery.lib:circularSeekBar:1.4.2'
}

View file

@ -16,9 +16,9 @@
# public *;
#}
# Uncomment this to preserve the line number information for
# Preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
@ -26,40 +26,46 @@
-dontwarn java.lang.invoke.*
-dontwarn **$$Lambda$*
-dontwarn javax.annotation.**
# RetroFit
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-dontwarn javax.annotation.**
# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
-keep class * extends com.bumptech.glide.module.AppGlideModule {
<init>(...);
}
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {
*** rewind();
}
-keep class !android.support.v7.internal.view.menu.**,** {*;}
# OkHttp
-keepattributes Signature
-keepattributes *Annotation*
-keep interface com.squareup.okhttp3.** { *; }
-dontwarn com.squareup.okhttp3.**
-dontwarn
-ignorewarnings
#-dontwarn
#-ignorewarnings
-keep public class android.support.design.widget.BottomNavigationView { *; }
-keep public class android.support.design.internal.BottomNavigationMenuView { *; }
-keep public class android.support.design.internal.BottomNavigationPresenter { *; }
-keep public class android.support.design.internal.BottomNavigationItemView { *; }
#Jaudiotagger
-dontwarn org.jaudiotagger.**
-dontwarn org.jcodec.**
-keep class org.jaudiotagger.** { *; }
-keep class org.jcodec.** { *; }
#-dontwarn android.support.v8.renderscript.*
#-keepclassmembers class android.support.v8.renderscript.RenderScript {
# native *** rsn*(...);
# native *** n*(...);
#}
#-keep class org.jaudiotagger.** { *; }
-obfuscationdictionary build/obfuscation-dictionary.txt
-classobfuscationdictionary build/class-dictionary.txt
-packageobfuscationdictionary build/package-dictionary.txt
-keepclassmembers enum * { *; }
-keepattributes *Annotation*, Signature, Exception
-keepnames class androidx.navigation.fragment.NavHostFragment
-keep class * extends androidx.fragment.app.Fragment{}
-keepnames class * extends android.os.Parcelable
-keepnames class * extends java.io.Serializable
-keep class code.name.monkey.retromusic.network.model.** { *; }
-keep class code.name.monkey.retromusic.model.** { *; }
-keep class com.google.android.material.bottomsheet.** { *; }

View file

@ -1,20 +0,0 @@
{
"version": 1,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "io.github.muntashirakon.Music",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"properties": [],
"versionCode": 10443,
"versionName": "3.5.10",
"enabled": true,
"outputFile": "app-release.apk"
}
]
}

View file

@ -1,20 +0,0 @@
{
"version": 1,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "code.name.monkey.retromusic",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"properties": [],
"versionCode": 10438,
"versionName": "10438",
"enabled": true,
"outputFile": "app-release.apk"
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:font="@font/google_sans_regular"
android:fontWeight="400" />
<font
android:font="@font/google_sans_medium"
android:fontWeight="600" />
<font
android:font="@font/google_sans_bold"
android:fontWeight="700" />
</font-family>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="md3_available">true</bool>
<bool name="allowBackup">false</bool>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Metro Debug</string>
</resources>

View file

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextViewNormal" parent="">
<item name="android:textSize">14sp</item>
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewNormalCompress" parent="TextAppearance.MaterialComponents.Caption">
<item name="android:textSize">14sp</item>
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewHeadline4" parent="TextAppearance.MaterialComponents.Headline4">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewHeadline4.Compress" parent="TextAppearance.MaterialComponents.Headline4">
<item name="fontFamily">@font/sans</item>
<item name="android:textSize">32sp</item>
</style>
<style name="TextViewHeadline5" parent="TextAppearance.MaterialComponents.Headline5">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewCaption" parent="TextAppearance.MaterialComponents.Caption">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewHeadline6" parent="TextAppearance.MaterialComponents.Headline6">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewHeadline3" parent="TextAppearance.MaterialComponents.Headline3">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewHeadline2" parent="TextAppearance.MaterialComponents.Headline2">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewSubtitle1" parent="TextAppearance.MaterialComponents.Subtitle1">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewSubtitle2" parent="TextAppearance.MaterialComponents.Subtitle2">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewBody1" parent="TextAppearance.MaterialComponents.Body1">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewButton" parent="TextAppearance.MaterialComponents.Button">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewBody2" parent="TextAppearance.MaterialComponents.Body2">
<item name="fontFamily">@font/sans</item>
</style>
<style name="TextViewOverline" parent="TextAppearance.MaterialComponents.Overline">
<item name="fontFamily">@font/sans</item>
</style>
<style name="AppTextAppearance.MaterialAlertDialog.Button" parent="Widget.MaterialComponents.Button.TextButton">
<item name="android:textAppearance">@style/TextViewButton</item>
<item name="fontFamily">@font/sans</item>
<item name="android:textStyle">bold</item>
<item name="android:padding">0dp</item>
</style>
<style name="AppTextAppearance.MaterialAlertDialog.Body" parent="MaterialAlertDialog.MaterialComponents.Body.Text">
<item name="android:textAppearance">@style/TextViewBody1</item>
<item name="fontFamily">@font/sans</item>
<item name="android:paddingTop">16dp</item>
</style>
<style name="AppTextAppearance.MaterialAlertDialog.Title" parent="MaterialAlertDialog.MaterialComponents.Title.Text">
<item name="android:textAppearance">@style/TextViewHeadline6</item>
<item name="android:textStyle">bold</item>
<item name="fontFamily">@font/sans</item>
<item name="android:padding">16dp</item>
</style>
<style name="ToolbarTextAppearanceNormal">
<item name="android:textStyle">bold</item>
<item name="android:textAllCaps">false</item>
<item name="android:textAppearance">@style/TextViewHeadline6</item>
<item name="fontFamily">@font/sans</item>
<item name="android:textSize">20sp</item>
<item name="android:letterSpacing">0.0125</item>
<item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="circleImageView" parent="ShapeAppearance.MaterialComponents">
<item name="cornerSize">40dp</item>
</style>
<style name="BottomSheetItemTextAppearance" parent="Widget.MaterialComponents.BottomNavigationView.Colored">
<item name="android:textSize">13sp</item>
<item name="fontFamily">@font/sans</item>
</style>
</resources>

View file

@ -1,39 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="io.github.muntashirakon.music"
package="code.name.monkey.retromusic"
android:installLocation="auto">
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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
android:name=".App"
android:allowBackup="true"
android:allowBackup="@bool/allowBackup"
android:appCategory="audio"
android:configChanges="locale|layoutDirection"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:localeConfig="@xml/locales_config"
android:requestLegacyExternalStorage="true"
android:restoreAnyVersion="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:configChanges="locale|layoutDirection"
android:theme="@style/Theme.RetroMusic.FollowSystem"
android:usesCleartextTraffic="false"
tools:ignore="AllowBackup,GoogleAppIndexingWarning"
tools:targetApi="m">
android:usesCleartextTraffic="true"
tools:ignore="UnusedAttribute">
<activity
android:name=".activities.MainActivity"
android:label="@string/app_name"
android:theme="@style/SplashTheme">
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/Theme.RetroMusic.SplashScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MUSIC_PLAYER" />
@ -44,7 +62,6 @@
</intent-filter>
<intent-filter>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
@ -104,30 +121,54 @@
<data android:mimeType="vnd.android.cursor.dir/audio" />
</intent-filter>
</activity>
<activity android:name=".activities.albums.AlbumDetailsActivity" />
<activity android:name=".activities.artists.ArtistDetailActivity" />
<activity android:name=".activities.playlist.PlaylistDetailActivity" />
<activity android:name=".activities.PlayingQueueActivity" />
<activity android:name=".activities.AboutActivity" />
<activity android:name=".activities.tageditor.AlbumTagEditorActivity" />
<activity android:name=".activities.tageditor.SongTagEditorActivity" />
<activity android:name=".activities.SettingsActivity" />
<activity android:name=".activities.LyricsActivity" />
<activity android:name=".activities.UserInfoActivity" />
<activity android:name=".activities.GenreDetailsActivity" />
<activity android:name=".activities.LicenseActivity" />
<activity android:name=".activities.WhatsNewActivity" />
<activity android:name=".activities.bugreport.BugReportActivity" />
<activity android:name=".activities.ShareInstagramStory" />
<activity android:name=".activities.DriveModeActivity" />
<activity
android:name=".activities.search.SearchActivity"
android:windowSoftInputMode="stateVisible" />
<activity android:name=".activities.PermissionActivity" />
<activity
android:name=".activities.LockScreenActivity"
android:noHistory="true"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:showOnLockScreen="true" />
<activity
android:name=".fragments.backup.RestoreActivity"
android:excludeFromRecents="false"
android:exported="true"
android:label="@string/restore"
android:theme="@style/Theme.RetroMusic.Dialog">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/octet-stream" />
<data android:mimeType="application/x-zip-compressed" />
<data android:mimeType="application/zip" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:mimeType="*/*" />
<!--
Work around Android's ugly primitive PatternMatcher
implementation that can't cope with finding a . early in
the path unless it's explicitly matched.
-->
<data android:host="*" />
<data android:pathPattern=".*\\.rmbak" />
<data android:pathPattern=".*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.rmbak" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.rmbak" />
</intent-filter>
</activity>
<activity
android:name=".appshortcuts.AppShortcutLauncherActivity"
@ -138,16 +179,13 @@
android:name=".activities.saf.SAFGuideActivity"
android:theme="@style/Theme.Intro" />
<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>
<activity
android:name=".activities.ErrorActivity"
android:exported="true">
<intent-filter>
<action android:name="cat.ereza.customactivityoncrash.RESTART" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
@ -159,13 +197,17 @@
android:resource="@xml/provider_paths" />
</provider>
<receiver android:name=".service.MediaButtonIntentReceiver">
<receiver
android:name=".service.MediaButtonIntentReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<receiver android:name=".appwidgets.BootReceiver">
<receiver
android:name=".appwidgets.BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
@ -174,7 +216,7 @@
<receiver
android:name=".appwidgets.AppWidgetBig"
android:exported="false"
android:exported="true"
android:label="@string/app_widget_big_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@ -187,7 +229,7 @@
<receiver
android:name=".appwidgets.AppWidgetClassic"
android:exported="false"
android:exported="true"
android:label="@string/app_widget_classic_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@ -199,7 +241,7 @@
</receiver>
<receiver
android:name=".appwidgets.AppWidgetSmall"
android:exported="false"
android:exported="true"
android:label="@string/app_widget_small_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@ -211,7 +253,7 @@
</receiver>
<receiver
android:name=".appwidgets.AppWidgetText"
android:exported="false"
android:exported="true"
android:label="@string/app_widget_text_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@ -223,7 +265,7 @@
</receiver>
<receiver
android:name=".appwidgets.AppWidgetCard"
android:exported="false"
android:exported="true"
android:label="@string/app_widget_card_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@ -233,13 +275,36 @@
android:name="android.appwidget.provider"
android:resource="@xml/app_widget_card_info" />
</receiver>
<receiver
android:name=".appwidgets.AppWidgetMD3"
android:exported="true"
android:label="@string/app_widget_md3_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/app_widget_md3_info" />
</receiver>
<receiver
android:name=".appwidgets.AppWidgetCircle"
android:exported="true"
android:label="@string/app_widget_circle_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/app_widget_circle_info" />
</receiver>
<service
android:name=".service.MusicService"
android:enabled="true"
android:exported="true"
android:label="@string/app_name"
tools:ignore="ExportedService">
android:foregroundServiceType="mediaPlayback"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
@ -253,15 +318,33 @@
android:name="com.lge.support.SPLIT_WINDOW"
android:value="true" />
<!-- Android Auto -->
<meta-data
android:name="io.github.muntashirakon.music.glide.RetroMusicGlideModule"
android:value="GlideModule" />
android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc" />
<meta-data
android:name="com.google.android.gms.car.application.theme"
android:resource="@style/CarTheme" />
<meta-data
android:name="com.google.android.gms.car.notification.SmallIcon"
android:resource="@drawable/ic_notification" />
<meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
android:value="GlideModule" />
<meta-data
android:name="com.android.vending.splits.required"
android:value="true" />
<!-- 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>
<!--
This is not that important, it's just here so that we can query equalizer package
and check if it's present on A11+ because of Package visibility restrictions.
-->
<queries>
<package android:name="com.android.musicfx" />
</queries>
</manifest>

View file

@ -1,26 +0,0 @@
[
{
"name": "Hemanth Savarala",
"summary": "Lead Developer & Designer",
"link": "https://github.com/h4h13",
"profile_image": "https://i.imgur.com/AoVs9oj.jpg"
},
{
"name": "Lennart Glamann",
"summary": "Play Store banner and Images",
"link": "https://t.me/FlixbusLennart",
"profile_image": "https://i.imgur.com/Q5Nsx1R.jpg"
},
{
"name": "Daksh P. Jain",
"summary": "Telegram group maintainer",
"link": "https://dakshpjain.eu.org",
"profile_image": "https://i.imgur.com/fnYpg65.jpg"
},
{
"name": "Milind Goel",
"summary": "Github & Telegram maintainer",
"link": "https://t.me/MilindGoel15",
"profile_image": "https://i.imgur.com/Bz4De21_d.jpg"
}
]

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

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<style media="screen" type="text/css">
* {
word-wrap: break-word;
}
{style-placeholder}
a {
color: {link-color};
}
a:active {
color: {link-color-active};
}
ol {
list-style-position: inside;
padding-left: 0;
padding-right: 0;
}
li {
padding-top: 8px;
}
</style>
</head>
<body>
<p><b><a href="https://github.com/kabouzeid/Phonograph" title="Phonograph"> Phonograph</a></b> by
Karim Abou Zeid</p>
<p><b><a href="http://developer.android.com/tools/support-library/index.html"
title="AOSP Support Libraries">AOSP Support Libraries</a></b> by AOSP contributors</p>
<p><b><a href="https://github.com/bumptech/glide" title="Glide"> Glide</a></b> by Sam Judd</p>
<p><b><a href="https://github.com/square/retrofit" title="Retrofit"> Retrofit</a></b> by Square team
</p>
<p><b><a href="http://square.github.io/okhttp/" title="OkHttp"> OkHttp</a></b> by Square team</p>
<p><b><a href="https://github.com/InsertKoinIO/koin"
title="Koin">Koin</a></b> by Arnaud Giuliani</p>
<p><b><a href="https://github.com/afollestad" title="Material Dialogs"> Material Dialogs and Cab</a></b>
by Aidan Michael Follestad</p>
<p><b><a href="https://github.com/afollestad/material-cab" title="Material Contextual Action Bar">
Material Contextual Action Bar</a></b> by Aidan Michael Follestad</p>
<p><b><a href="https://github.com/h6ah4i/android-advancedrecyclerview"
title="Advanced RecyclerView"> Advanced RecyclerView</a></b> by Haruki Hasegawa</p>
<p><b><a href="https://github.com/Ereza/CustomActivityOnCrash"
title="Custom Activity on Crash">Custom Activity on Crash</a></b> by Eduard Ereza Martínez
</p>
<p><b><a href="https://github.com/NanoHttpd/nanohttpd"
title="NanoHttpd">NanoHttpd</a></b> by NanoHttpd Team</p>
<p><b><a href="https://github.com/tankery/CircularSeekBar"
title="Circular Seekbar">Circular Seekbar</a></b> by Tankery</p>
<p><b><a href="https://github.com/Kaned1as/jaudiotagger"
title="jAudioTagger">jAudioTagger</a></b> by Kanedias</p>
<p><b><a href="https://github.com/zhanghai/AndroidFastScroll"
title="Android Fast Scroll">Android Fast Scroll</a></b> by Zhang Hai</p>
<p><b><a href="https://github.com/Dhaval2404/ImagePicker"
title="Image Picker">Image Picker</a></b> by Dhaval Patel</p>
<p><b><a href="https://github.com/heinrichreimer/material-intro"
title="Material Intro">Material Intro</a></b> by Jan Heinrich Reimer</p>
<p><b><a href="https://github.com/r0adkll/Slidr"
title="Slidr">Slidr</a></b> by Drew Heavner</p>
<p><b><a href="https://github.com/bosphere/Android-FadingEdgeLayout"
title="FadingEdgeLayout">FadingEdgeLayout</a></b> by bosphere</p>
<p><b><a href="https://github.com/yshrsmz/KeyboardVisibilityEvent"
title="KeyboardVisibilityEvent">KeyboardVisibilityEvent</a></b> by Yasuhiro SHIMIZU</p>
<p><b><a href="https://github.com/JetradarMobile/android-snowfall"
title="android-snowfall">android-snowfall</a></b> by Jetradar Mobile</p>
<p><b><a href="https://github.com/chrisbanes/insetter"
title="Insetter">Insetter</a></b> by Chris Banes</p>
<p><b><a href="https://materialdesignicons.com" title="Icons"> Icons</a></b> by Austin Andrews</p>
<p><b><a href="https://www.techjuice.pk" title="City wallpaper"> Material Design City Wallpaper</a></b>
</p>
</body>
</html>

View file

@ -1,63 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<style media="screen" type="text/css">
* {
word-wrap: break-word;
}
{style-placeholder}
a {
color: {link-color};
}
a:active {
color: {link-color-active};
}
ol {
list-style-position: inside;
padding-left: 0;
padding-right: 0;
}
li {
padding-top: 8px;
}
</style>
</head>
<body>
<p><b><a href="https://github.com/kabouzeid/Phonograph" title="Phonograph"> Phonograph</a></b> by
Karim Abou Zeid</p>
<p><b><a href="https://github.com/afollestad" title="Material Dialogs"> Material Dialogs and Cab</a></b>
by Aidan Michael Follestad</p>
<p><b><a href="http://developer.android.com/tools/support-library/index.html"
title="AOSP Support Libraries"> AOSP Support Libraries</a></b>by AOSP contributors</p>
<p><b><a href="https://github.com/bumptech/glide" title="Glide"> Glide</a></b> by Sam Judd</p>
<p><b><a href="https://github.com/square/retrofit" title="Retrofit"> Retrofit</a></b> by Square team
</p>
<p><b><a href="https://github.com/afollestad/material-cab" title="Material Contextual Action Bar">
Material Contextual Action Bar</a></b> by Aidan Michael Follestad</p>
<p><b><a href="http://square.github.io/okhttp/" title="OkHttp"> OkHttp</a></b> by Square team</p>
<p><b><a href="https://github.com/hdodenhof/CircleImageView" title="CircleImageView">
CircleImageView</a></b> by Henning Dodenhof</p>
<p><b><a href="https://github.com/DreaminginCodeZH/MaterialProgressBar" title="MaterialProgressBar">
MaterialProgressBar</a></b> by Zhang Hai</p>
<p><b><a href="https://github.com/anjlab/android-inapp-billing-v3"
title="Android In-App Billing v3 Library"> Android In-App Billing v3 Library</a></b> by
Henning Dodenhof</p>
<p><b><a href="https://github.com/h6ah4i/android-advancedrecyclerview"
title="Advanced RecyclerView"> Advanced RecyclerView</a></b> by Haruki Hasegawa</p>
<p><b><a href="https://github.com/ksoichiro/Android-ObservableScrollView"
title="Android-ObservableScrollView"> Android-ObservableScrollView</a></b> by Soichiro
Kashima</p>
<p><b><a href="https://materialdesignicons.com" title="Icons"> Icons</a></b> by Austin Andrews</p>
<p><b><a href="https://www.techjuice.pk" title="City wallpaper"> Material Design City Wallpaper</a></b>
</p>
</body>
</html>

View file

@ -6,22 +6,23 @@
word-wrap: break-word;
}
body {
padding-left: 1rem;
padding-right: 1rem;
div {
margin: 20px 10px;
padding: 10px;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
}
h2 {
margin-block-end: 0rem;
margin-block-start: 0rem;
display: inline-block;
vertical-align: center;
}
li {
font-size: 0.85rem;
padding-top: 0.5rem;
padding-left: 0;
padding-right: 0;
color: rgba(0, 0, 0, 0.8);
padding: 0.5rem 0;
}
ul {
@ -36,7 +37,6 @@
span {
font-size: 0.7rem;
line-height: 0.7rem;
}
h5 {
@ -44,39 +44,423 @@
margin-block-end: 0.5rem;
}
h3 span {
border-radius: 0.2rem;
padding-left: 0.5rem;
padding-right: 0.5rem;
padding-top: 0.3rem;
padding-bottom: 0.3rem;
h3 {
margin: 10px 0px;
font-size: 1rem;
}
.tag {
border-radius: 5px;
margin-left: 10px;
padding: 5px;
display: inline-block;
vertical-align: top;
}
{style-placeholder}
</style>
</head>
<body>
<h5>April 30, 2020</h5>
<h2>v3.5.110</h2>
<span class="tag"><i>Beta version</i></span>
<h3><span class="colorHeader">What's New</span></h3>
<ul>
<li>Changed profile form image to icon</li>
<li>New what's new screen</li>
<li>Added In-App language changer, where you can select language</li>
</ul>
<h3><span class="colorHeader">Improved</span></h3>
<ul>
<li>Improved loading of Songs, Albums, Artists, Genres, Playlists</li>
</ul>
<!--<h3><span class="colorHeader">Bug fixes</span></h3>
<ul>
<li></li>
</ul>-->
<p>*If you face any UI related issues you clear app data and cache, if itsnot working try to
uninstall and install
again. </p>
<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>
<h5>May 25, 2022</h5>
<h2>v5.8.5</h2>
<h3>What's New</h3>
<ul>
<li>Display song images along in the artist and album details pages</li>
<li>Removed the Internet permissions and all the associated features</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed crashing occurs during changing screen orientation</li>
</ul>
</div>
<div>
<h5>May 13, 2022</h5>
<h2>v5.8.4</h2>
<h3>What's New</h3>
<ul>
<li>Added a toggle to enable/disable swipe down to dismiss mini player</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Playback speed and pitch not working when CrossFade is enabled</li>
<li>Fixed crash when adding folders to blacklist</li>
<li>Fix bugs in MD3 theme</li>
</ul>
</div>
<div>
<h5>May 07, 2022</h5>
<h2>v5.8.3</h2>
<h3>What's New</h3>
<ul>
<li>Added a new MD3 now playing theme</li>
<li>Swipe down to dismiss Mini player</li>
<li>Add support for Just Black with Material You</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed sharing of files from SD Card</li>
<li>Fix ChromeCast crash and bugs</li>
<li>Fix Audio Crossfade</li>
<li>Tried to fix incorrect song data in notification</li>
</ul>
</div>
<div>
<h5>April 8, 2022</h5>
<h2>v5.8.0</h2>
<h3>What's New</h3>
<ul>
<li>Updated translations</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Classic Notification crash</li>
<li>Fixed crash when clicking on Playlist in the Search Tab</li>
<li>Fixed settings change not reflecting immediately</li>
<li>Fixed shuffle</li>
<li>Fixed Song duration not visible in Card & Blur card themes</li>
<li>Fixed some Album skip styles</li>
<li>Minor bug fixes & UI improvements</li>
</ul>
</div>
<div>
<h5>March 13, 2022</h5>
<h2>v5.7.3</h2>
<h3>What's New</h3>
<ul>
<li>Added adaptive color in Material now playing theme</li>
<li>Added an option to share crash report</li>
<li>Added options to clear, pause history</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Adapt Wallpaper accent for better readability</li>
<li>Optimized search</li>
<li>Made sleep timer precise</li>
</ul>
</div>
<div>
<h5>February 13, 2022</h5>
<h2>v5.7.2<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Animated splash screen on Android 12 devices</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed crash when removing song from Playing queue</li>
<li>Fixed lyrics editing crash</li>
<li>Fixed shuffle button not working</li>
<li>Fixed crash on song deletion</li>
</ul>
</div>
<div>
<h5>February 1, 2022</h5>
<h2>v5.7.1<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Added option to disable changing song by swiping anywhere on the now playing screen</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Playlist save on A11+</li>
<li>Fixed Just Black theme</li>
<li>Fixed some UI issues</li>
</ul>
<h3>Improved</h3>
<ul>
<li>Improvements to search</li>
</ul>
</div>
<div>
<h5>January 25, 2022</h5>
<h2>v5.7.0<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Added Android Auto</li>
<li>Added accent color extraction on Android 8.1+ devices</li>
<li>Added new Circle widget</li>
<li>Added Collapsing appbar to library tabs with an option to switch back to simple appbar
</li>
<li>Added Search tab</li>
<li>Added option to use circular play button</li>
<li>Added lyrics editing on A11+ devices again</li>
<li>Added Long Press to forward, rewind current song</li>
<li>Added ability to set Playback speed and pitch</li>
<li>Added option to show lyrics over Cover</li>
<li>Added option to keep screen on when showing lyrics</li>
<li>Added option to switch to Manrope font</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Gapless Playback</li>
<li>Fixed Shuffle FAB going behind Mini Player</li>
<li>Fixed crashes on Pre-marshmallow devices</li>
<li>Blacklisted songs can't be played after opening from outside the app</li>
<li>Fixed various small bugs and some minor improvements</li>
</ul>
</div>
<div>
<h5>January 1, 2021</h5>
<h2>v5.6.1</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed artist covers not updating and showing album cover images.</li>
<li>Fixed FAB's not visible (Shuffle, Save, etc.)</li>
<li>Fixed a crash when a Song is deleted in Artist Details</li>
<li>Fixed Snowfall effect</li>
<li>Fixed empty notification when queue is cleared</li>
</ul>
</div>
<div>
<h5>December 25, 2021</h5>
<h2>v5.6.0<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Added Artwork editing for songs</li>
<li>Circle theme has album art now</li>
<li>Upgraded tag editor library, we should support reading tags of more formats now e.g.
opus.
</li>
<li>Added Snowfall effect</li>
<li>Crossfade effect for background when Song is changed for Blur, Blur card themes</li>
<li>Album art is hidden when Show lyrics is enabled</li>
<li>Added fastscroll in Playlists tab</li>
<li>Added Chooser to choose what to restore</li>
<li>Hide BottomNavigation when only one tab is selected in Library Categories(This was
already there but when changing screens it was getting visible)
</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Ringtone crash</li>
<li>Fixed blank album cover bug</li>
<li>Fixed bottom navigation visible in Playing Queue</li>
<li>Fixed lockscreen dragging glitch</li>
<li>Fixed incorrect colors when no cover art is available</li>
<li>Fixed favorite not updating when song is changed</li>
<li>Fixed playlist not getting created & playlist creation crash with same name</li>
<li>Fixed a bug in "Plain" Now playing theme where onClick event is consumed by the views
behind the bottom sheet
</li>
</ul>
</div>
<div>
<h5>December 6, 2021</h5>
<h2>v5.4.2<span class="tag"><i>Beta</i></span></h2>
<h3>Fixed</h3>
<ul>
<li>Bug Fixes</li>
</ul>
</div>
<div>
<h5>December 1, 2021</h5>
<h2>v5.4.1<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Added file selection from system file picker for restore</li>
<li>Added Grid size selection for Playlists</li>
</ul>
<h3>Improved</h3>
<ul>
<li>Enable Material You by default on Android 12</li>
<li>Reworked Grid Style saving</li>
<li>Improved Playlist preview images</li>
<li>UI improvements</li>
</ul>
<h3>Improved</h3>
<ul>
<li>Fixed File deletion on Android 10</li>
<li>Fixed Sleep Timer crash</li>
<li>Fixed Bottom Toolbar not clickable in now playing when Shuffle is clicked</li>
<li>Fixed Album Artist sort order</li>
<li>Fixed a crash when clicking the "Clear All" button in the Blacklist folder selection
</li>
<li>Fixed Continuous crashes on A12 when the song ends</li>
<li>Fixed New Music Mix multiple clicks crash</li>
</ul>
</div>
<div>
<h5>November 22, 2021</h5>
<h2>v5.4.0<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li><b>Material You</b></li>
<li>Going Edge-to-Edge</li>
<li>Added Backup & restore</li>
</ul>
<h3>Improved</h3>
<ul>
<li>Improved Animations</li>
<li>Improved Crossfade</li>
</ul>
</div>
<div>
<h5>September 06, 2021</h5>
<h2>v5.0.0</h2>
<h3>What's New</h3>
<ul>
<li>Added ability to Remember last tab</li>
<li>Added Whitelisting songs</li>
<li>You can now browse SDCard from Folders Tab</li>
</ul>
</div>
<div>
<h5>August 22, 2021</h5>
<h2>v4.4.0<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Added Crossfade</li>
<li>Multi-select in Album and Artist Details</li>
<li>Albums now show Album Artists instead of artist of first song</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Playlist Preview Images</li>
</ul>
</div>
<div>
<h5>August 11, 2021</h5>
<h2>v4.2.30<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Revamped Playlist Tab</li>
<li>Revamped Genres Tab</li>
<li>Added support for embedded Synced Lyrics</li>
<li>Added animated icons</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Language Switching</li>
<li>Fixed some reported bugs</li>
</ul>
</div>
<div>
<h5>July 18, 2021</h5>
<h2>v4.2.020<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Added ChromeCast Support</li>
<li>Added Lyrics Editor for Normal and Synced Lyrics</li>
<li>Added Ripple Animation for Color Theme</li>
<li>Added Drag to seek in Tiny Theme</li>
<li>Added Playlist Order</li>
<li>Added Search Filters</li>
<li>Added Audio Fade</li>
<li>Synced Lyrics in all Themes</li>
<li>Swipe anywhere to change song</li>
</ul>
<h3>Improved</h3>
<ul>
<li>Fixed Navigate by Album Artist</li>
<li>Changed New Music Mix Actions</li>
<li>Improved Animations</li>
<li>And some minor bug fixes and improvements</li>
</ul>
</div>
<div>
<h5>October 12, 2020</h5>
<h2>v4.0.10</h2>
<h3>What's New</h3>
<ul>
<li>Re-built from scratch using MVVM Architecture and JetPack Components</li>
<li>New Material Design icon</li>
<li>Implemented a custom database for playlists</li>
<li>Added new Material Design motions</li>
<li>Bug fixes & performance improvements</li>
<li>Revamped Home tab UI</li>
<li>Android 11 support</li>
<li>And more!</li>
</ul>
</div>
<div>
<h5>April 30, 2020</h5>
<h2>v3.5.110<span class="tag"><i>Beta</i></span></h2>
<h3>What's New</h3>
<ul>
<li>Changed profile form image to icon</li>
<li>New what's new screen</li>
<li>Added In-App language changer, where you can select language</li>
</ul>
<h3>Improved</h3>
<ul>
<li>Improved loading of Songs, Albums, Artists, Genres, Playlists</li>
</ul>
</div>
</body>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Before After
Before After

View file

@ -0,0 +1,74 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic
import android.app.Application
import androidx.preference.PreferenceManager
import cat.ereza.customactivityoncrash.config.CaocConfig
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.activities.ErrorActivity
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
import code.name.monkey.retromusic.helper.WallpaperAccentManager
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
class App : Application() {
private val wallpaperAccentManager = WallpaperAccentManager(this)
override fun onCreate() {
super.onCreate()
instance = this
startKoin {
androidContext(this@App)
modules(appModules)
}
// default theme
if (!ThemeStore.isConfigured(this, 3)) {
ThemeStore.editTheme(this)
.accentColorRes(code.name.monkey.appthemehelper.R.color.md_deep_purple_A200)
.coloredNavigationBar(true)
.commit()
}
wallpaperAccentManager.init()
if (VersionUtils.hasNougatMR())
DynamicShortcutManager(this).initDynamicShortcuts()
// setting Error activity
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() {
super.onTerminate()
wallpaperAccentManager.release()
}
companion object {
private var instance: App? = null
fun getContext(): App {
return instance!!
}
}
}

View file

@ -1,59 +1,62 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music
package code.name.monkey.retromusic
import android.provider.BaseColumns
import android.provider.MediaStore
object Constants {
const val RATE_ON_GOOGLE_PLAY =
"https://play.google.com/store/apps/details?id=code.name.monkey.retromusic"
const val TRANSLATE = "https://github.com/h4h13/RetroMusicPlayer"
const val TRANSLATE = "https://crowdin.com/project/retromusicplayer"
const val GITHUB_PROJECT = "https://github.com/MuntashirAkon/Metro"
const val TELEGRAM_CHANGE_LOG = "https://t.me/retromusiclog"
const val TELEGRAM_CHANGE_LOG = "https://t.me/AppManagerChannel"
const val USER_PROFILE = "profile.jpg"
const val USER_BANNER = "banner.jpg"
const val APP_INSTAGRAM_LINK = "https://www.instagram.com/retromusicapp/"
const val APP_TELEGRAM_LINK = "https://t.me/retromusicapp/"
const val APP_TWITTER_LINK = "https://twitter.com/retromusicapp"
const val FAQ_LINK = "https://github.com/h4h13/RetroMusicPlayer/blob/master/FAQ.md"
const val PINTEREST = "https://in.pinterest.com/retromusicapp/"
const val BASE_URL = "https://ws.audioscrobbler.com/2.0/"
const val FAQ_LINK = "https://github.com/MuntashirAkon/Metro/blob/master/FAQ.md"
const val IS_MUSIC =
MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''"
const val DATA = "_data"
@Suppress("Deprecation")
val baseProjection = arrayOf(
BaseColumns._ID, // 0
MediaStore.Audio.AudioColumns.TITLE, // 1
MediaStore.Audio.AudioColumns.TRACK, // 2
MediaStore.Audio.AudioColumns.YEAR, // 3
MediaStore.Audio.AudioColumns.DURATION, // 4
MediaStore.Audio.AudioColumns.DATA, // 5
DATA, // 5
MediaStore.Audio.AudioColumns.DATE_MODIFIED, // 6
MediaStore.Audio.AudioColumns.ALBUM_ID, // 7
MediaStore.Audio.AudioColumns.ALBUM, // 8
MediaStore.Audio.AudioColumns.ARTIST_ID, // 9
MediaStore.Audio.AudioColumns.ARTIST,// 10
MediaStore.Audio.AudioColumns.COMPOSER// 11
MediaStore.Audio.AudioColumns.ARTIST, // 10
MediaStore.Audio.AudioColumns.COMPOSER, // 11
ALBUM_ARTIST // 12
)
const val NUMBER_OF_TOP_TRACKS = 99
}
const val EXTRA_PLAYLIST_TYPE = "type"
const val EXTRA_GENRE = "extra_genre"
const val EXTRA_PLAYLIST = "extra_playlist"
const val EXTRA_PLAYLIST_ID = "extra_playlist_id"
const val EXTRA_ALBUM_ID = "extra_album_id"
const val EXTRA_ARTIST_ID = "extra_artist_id"
const val EXTRA_SONG = "extra_songs"
const val EXTRA_PLAYLIST = "extra_list"
const val EXTRA_PLAYLISTS = "extra_playlists"
const val LIBRARY_CATEGORIES = "library_categories"
const val EXTRA_SONG_INFO = "extra_song_info"
const val DESATURATED_COLOR = "desaturated_color"
@ -64,29 +67,27 @@ const val NOW_PLAYING_SCREEN_ID = "now_playing_screen_id"
const val CAROUSEL_EFFECT = "carousel_effect"
const val COLORED_NOTIFICATION = "colored_notification"
const val CLASSIC_NOTIFICATION = "classic_notification"
const val GAPLESS_PLAYBACK = "gapless_playback"
const val ALBUM_ART_ON_LOCKSCREEN = "album_art_on_lockscreen"
const val GAP_LESS_PLAYBACK = "gapless_playback"
const val ALBUM_ART_ON_LOCK_SCREEN = "album_art_on_lock_screen"
const val BLURRED_ALBUM_ART = "blurred_album_art"
const val NEW_BLUR_AMOUNT = "new_blur_amount"
const val TOGGLE_HEADSET = "toggle_headset"
const val GENERAL_THEME = "general_theme"
const val ACCENT_COLOR = "accent_color"
const val SHOULD_COLOR_APP_SHORTCUTS = "should_color_app_shortcuts"
const val CIRCULAR_ALBUM_ART = "circular_album_art"
const val USER_NAME = "user_name"
const val TOGGLE_FULL_SCREEN = "toggle_full_screen"
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 TOGGLE_SEPARATE_LINE = "toggle_separate_line"
const val HOME_ARTIST_GRID_STYLE = "home_artist_grid_style"
const val HOME_ALBUM_GRID_STYLE = "home_album_grid_style"
const val TOGGLE_ADD_CONTROLS = "toggle_add_controls"
const val ALBUM_COVER_STYLE = "album_cover_style_id"
const val ALBUM_COVER_TRANSFORM = "album_cover_transform"
const val TAB_TEXT_MODE = "tab_text_mode"
const val LANGUAGE_NAME = "language_name"
const val DIALOG_CORNER = "dialog_corner"
const val LOCALE_AUTO_STORE_ENABLED = "locale_auto_store_enabled"
const val SLEEP_TIMER_FINISH_SONG = "sleep_timer_finish_song"
const val ALBUM_GRID_STYLE = "album_grid_style_home"
const val ARTIST_GRID_STYLE = "artist_grid_style_home"
@ -94,12 +95,12 @@ const val SAF_SDCARD_URI = "saf_sdcard_uri"
const val SONG_SORT_ORDER = "song_sort_order"
const val SONG_GRID_SIZE = "song_grid_size"
const val GENRE_SORT_ORDER = "genre_sort_order"
const val LAST_PAGE = "last_start_page"
const val BLUETOOTH_PLAYBACK = "bluetooth_playback"
const val INITIALIZED_BLACKLIST = "initialized_blacklist"
const val ARTIST_SORT_ORDER = "artist_sort_order"
const val ARTIST_ALBUM_SORT_ORDER = "artist_album_sort_order"
const val ALBUM_SORT_ORDER = "album_sort_order"
const val PLAYLIST_SORT_ORDER = "playlist_sort_order"
const val ALBUM_SONG_SORT_ORDER = "album_song_sort_order"
const val ARTIST_SONG_SORT_ORDER = "artist_song_sort_order"
const val ALBUM_GRID_SIZE = "album_grid_size"
@ -107,22 +108,47 @@ const val ALBUM_GRID_SIZE_LAND = "album_grid_size_land"
const val SONG_GRID_SIZE_LAND = "song_grid_size_land"
const val ARTIST_GRID_SIZE = "artist_grid_size"
const val ARTIST_GRID_SIZE_LAND = "artist_grid_size_land"
const val PLAYLIST_GRID_SIZE = "playlist_grid_size"
const val PLAYLIST_GRID_SIZE_LAND = "playlist_grid_size_land"
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_SLEEP_TIMER_VALUE = "last_sleep_timer_value"
const val NEXT_SLEEP_TIMER_ELAPSED_REALTIME = "next_sleep_timer_elapsed_real_time"
const val IGNORE_MEDIA_STORE_ARTWORK = "ignore_media_store_artwork"
const val LAST_CHANGELOG_VERSION = "last_changelog_version"
const val AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy"
const val START_DIRECTORY = "start_directory"
const val RECENTLY_PLAYED_CUTOFF = "recently_played_interval"
const val LOCK_SCREEN = "lock_screen"
const val ALBUM_ARTISTS_ONLY = "album_artists_only"
const val ALBUM_ARTIST = "album_artist"
const val ALBUM_DETAIL_SONG_SORT_ORDER = "album_detail_song_sort_order"
const val ARTIST_DETAIL_SONG_SORT_ORDER = "artist_detail_song_sort_order"
const val LYRICS_OPTIONS = "lyrics_tab_position"
const val CHOOSE_EQUALIZER = "choose_equalizer"
const val TOGGLE_SHUFFLE = "toggle_shuffle"
const val EQUALIZER = "equalizer"
const val SONG_GRID_STYLE = "song_grid_style"
const val PAUSE_ON_ZERO_VOLUME = "pause_on_zero_volume"
const val FILTER_SONG = "filter_song"
const val EXPAND_NOW_PLAYING_PANEL = "expand_now_playing_panel"
const val EXTRA_ARTIST_NAME = "extra_artist_name"
const val TOGGLE_SUGGESTIONS = "toggle_suggestions"
const val AUDIO_FADE_DURATION = "audio_fade_duration"
const val CROSS_FADE_DURATION = "cross_fade_duration"
const val SHOW_LYRICS = "show_lyrics"
const val REMEMBER_LAST_TAB = "remember_last_tab"
const val LAST_USED_TAB = "last_used_tab"
const val WHITELIST_MUSIC = "whitelist_music"
const val MATERIAL_YOU = "material_you"
const val SNOWFALL = "snowfall"
const val LYRICS_TYPE = "lyrics_type"
const val PLAYBACK_SPEED = "playback_speed"
const val PLAYBACK_PITCH = "playback_pitch"
const val CUSTOM_FONT = "custom_font"
const val APPBAR_MODE = "appbar_mode"
const val WALLPAPER_ACCENT = "wallpaper_accent"
const val SCREEN_ON_LYRICS = "screen_on_lyrics"
const val CIRCLE_PLAY_BUTTON = "circle_play_button"
const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
const val PAUSE_HISTORY = "pause_history"
const val MANAGE_AUDIO_FOCUS = "manage_audio_focus"
const val SWIPE_DOWN_DISMISS = "swipe_to_dismiss"

View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic
import androidx.annotation.IntDef
@IntDef(
RECENT_ALBUMS,
TOP_ALBUMS,
RECENT_ARTISTS,
TOP_ARTISTS,
SUGGESTIONS,
FAVOURITES,
GENRES,
PLAYLISTS
)
@Retention(AnnotationRetention.SOURCE)
annotation class HomeSection
const val RECENT_ALBUMS = 3
const val TOP_ALBUMS = 1
const val RECENT_ARTISTS = 2
const val TOP_ARTISTS = 0
const val SUGGESTIONS = 5
const val FAVOURITES = 4
const val GENRES = 6
const val PLAYLISTS = 7
const val HISTORY_PLAYLIST = 8
const val LAST_ADDED_PLAYLIST = 9
const val TOP_PLAYED_PLAYLIST = 10

View file

@ -0,0 +1,156 @@
package code.name.monkey.retromusic
import androidx.room.Room
import code.name.monkey.retromusic.auto.AutoMusicProvider
import code.name.monkey.retromusic.db.MIGRATION_23_24
import code.name.monkey.retromusic.db.RetroDatabase
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.albums.AlbumDetailsViewModel
import code.name.monkey.retromusic.fragments.artists.ArtistDetailsViewModel
import code.name.monkey.retromusic.fragments.genres.GenreDetailsViewModel
import code.name.monkey.retromusic.fragments.playlists.PlaylistDetailsViewModel
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.repository.*
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.bind
import org.koin.dsl.module
private val roomModule = module {
single {
Room.databaseBuilder(androidContext(), RetroDatabase::class.java, "playlist.db")
.addMigrations(MIGRATION_23_24)
.build()
}
factory {
get<RetroDatabase>().playlistDao()
}
factory {
get<RetroDatabase>().playCountDao()
}
factory {
get<RetroDatabase>().historyDao()
}
single {
RealRoomRepository(get(), get(), get())
} bind RoomRepository::class
}
private val autoModule = module {
single {
AutoMusicProvider(
androidContext(),
get(),
get(),
get(),
get(),
get(),
get()
)
}
}
private val mainModule = module {
single {
androidContext().contentResolver
}
}
private val dataModule = module {
single {
RealRepository(
get(),
get(),
get(),
get(),
get(),
get(),
get(),
get(),
get(),
get(),
)
} bind Repository::class
single {
RealSongRepository(get())
} bind SongRepository::class
single {
RealGenreRepository(get(), get())
} bind GenreRepository::class
single {
RealAlbumRepository(get())
} bind AlbumRepository::class
single {
RealArtistRepository(get(), get())
} bind ArtistRepository::class
single {
RealPlaylistRepository(get())
} bind PlaylistRepository::class
single {
RealTopPlayedRepository(get(), get(), get(), get())
} bind TopPlayedRepository::class
single {
RealLastAddedRepository(
get(),
get(),
get()
)
} bind LastAddedRepository::class
single {
RealSearchRepository(
get(),
get(),
get(),
get(),
get()
)
}
}
private val viewModules = module {
viewModel {
LibraryViewModel(get())
}
viewModel { (albumId: Long) ->
AlbumDetailsViewModel(
get(),
albumId
)
}
viewModel { (artistId: Long?, artistName: String?) ->
ArtistDetailsViewModel(
get(),
artistId,
artistName
)
}
viewModel { (playlistId: Long) ->
PlaylistDetailsViewModel(
get(),
playlistId
)
}
viewModel { (genre: Genre) ->
GenreDetailsViewModel(
get(),
genre
)
}
}
val appModules = listOf(mainModule, dataModule, autoModule, viewModules, roomModule)

View file

@ -0,0 +1,258 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities
import android.content.Intent
import android.graphics.Color
import android.graphics.PorterDuff
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import code.name.monkey.retromusic.databinding.ActivityDriveModeBinding
import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
import code.name.monkey.retromusic.glide.BlurTransformation
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import com.bumptech.glide.Glide
import com.google.android.material.slider.Slider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.ext.android.inject
/**
* Created by hemanths on 2020-02-02.
*/
class DriveModeActivity : AbsMusicServiceActivity(), Callback {
private lateinit var binding: ActivityDriveModeBinding
private var lastPlaybackControlsColor: Int = Color.GRAY
private var lastDisabledPlaybackControlsColor: Int = Color.GRAY
private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper
private val repository: RealRepository by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDriveModeBinding.inflate(layoutInflater)
setContentView(binding.root)
setUpMusicControllers()
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
lastPlaybackControlsColor = accentColor()
binding.close.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.repeatButton.drawAboveSystemBars()
}
private fun setUpMusicControllers() {
setUpPlayPauseFab()
setUpPrevNext()
setUpRepeatButton()
setUpShuffleButton()
setUpProgressSlider()
setupFavouriteToggle()
}
private fun setupFavouriteToggle() {
binding.songFavourite.setOnClickListener {
toggleFavorite(MusicPlayerRemote.currentSong)
}
}
private fun toggleFavorite(song: Song) {
lifecycleScope.launch(Dispatchers.IO) {
val playlist = repository.favoritePlaylist()
val songEntity = song.toSongEntity(playlist.playListId)
val isFavorite = repository.isSongFavorite(song.id)
if (isFavorite) {
repository.removeSongFromPlaylist(songEntity)
} else {
repository.insertSongs(listOf(song.toSongEntity(playlist.playListId)))
}
sendBroadcast(Intent(MusicService.FAVORITE_STATE_CHANGED))
}
}
private fun updateFavorite() {
lifecycleScope.launch(Dispatchers.IO) {
val isFavorite: Boolean =
repository.isSongFavorite(MusicPlayerRemote.currentSong.id)
withContext(Dispatchers.Main) {
binding.songFavourite.setImageResource(if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border)
}
}
}
private fun setUpProgressSlider() {
binding.progressSlider.addOnChangeListener { _: Slider, progress: Float, fromUser: Boolean ->
if (fromUser) {
MusicPlayerRemote.seekTo(progress.toInt())
onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis
)
}
}
}
override fun onPause() {
super.onPause()
progressViewUpdateHelper.stop()
}
override fun onResume() {
super.onResume()
progressViewUpdateHelper.start()
}
private fun setUpPrevNext() {
binding.nextButton.setOnClickListener { MusicPlayerRemote.playNextSong() }
binding.previousButton.setOnClickListener { MusicPlayerRemote.back() }
}
private fun setUpShuffleButton() {
binding.shuffleButton.setOnClickListener { MusicPlayerRemote.toggleShuffleMode() }
}
private fun setUpRepeatButton() {
binding.repeatButton.setOnClickListener { MusicPlayerRemote.cycleRepeatMode() }
}
private fun setUpPlayPauseFab() {
binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler())
}
override fun onRepeatModeChanged() {
super.onRepeatModeChanged()
updateRepeatState()
}
override fun onShuffleModeChanged() {
super.onShuffleModeChanged()
updateShuffleState()
}
override fun onPlayStateChanged() {
super.onPlayStateChanged()
updatePlayPauseDrawableState()
}
override fun onServiceConnected() {
super.onServiceConnected()
updatePlayPauseDrawableState()
updateSong()
updateRepeatState()
updateShuffleState()
updateFavorite()
}
private fun updatePlayPauseDrawableState() {
if (MusicPlayerRemote.isPlaying) {
binding.playPauseButton.setImageResource(R.drawable.ic_pause)
} else {
binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow)
}
}
fun updateShuffleState() {
when (MusicPlayerRemote.shuffleMode) {
MusicService.SHUFFLE_MODE_SHUFFLE -> binding.shuffleButton.setColorFilter(
lastPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
)
else -> binding.shuffleButton.setColorFilter(
lastDisabledPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
)
}
}
private fun updateRepeatState() {
when (MusicPlayerRemote.repeatMode) {
MusicService.REPEAT_MODE_NONE -> {
binding.repeatButton.setImageResource(R.drawable.ic_repeat)
binding.repeatButton.setColorFilter(
lastDisabledPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
)
}
MusicService.REPEAT_MODE_ALL -> {
binding.repeatButton.setImageResource(R.drawable.ic_repeat)
binding.repeatButton.setColorFilter(
lastPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
)
}
MusicService.REPEAT_MODE_THIS -> {
binding.repeatButton.setImageResource(R.drawable.ic_repeat_one)
binding.repeatButton.setColorFilter(
lastPlaybackControlsColor,
PorterDuff.Mode.SRC_IN
)
}
}
}
override fun onPlayingMetaChanged() {
super.onPlayingMetaChanged()
updateSong()
updateFavorite()
}
override fun onFavoriteStateChanged() {
super.onFavoriteStateChanged()
updateFavorite()
}
private fun updateSong() {
val song = MusicPlayerRemote.currentSong
binding.songTitle.text = song.title
binding.songText.text = song.artistName
Glide.with(this)
.load(RetroGlideExtension.getSongModel(song))
.songCoverOptions(song)
.transform(BlurTransformation.Builder(this).build())
.into(binding.image)
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.progressSlider.run {
valueTo = total.toFloat()
value = progress.toFloat().coerceIn(valueFrom, valueTo)
}
binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong())
binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong())
}
}

View file

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

View file

@ -0,0 +1,94 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.activities
import android.graphics.Color
import android.os.Bundle
import android.view.MenuItem
import code.name.monkey.appthemehelper.util.ATHUtil.isWindowBackgroundDark
import code.name.monkey.appthemehelper.util.ColorUtil.lightenColor
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import code.name.monkey.retromusic.databinding.ActivityLicenseBinding
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
import code.name.monkey.retromusic.extensions.surfaceColor
import java.io.BufferedReader
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
/** Created by hemanths on 2019-09-27. */
class LicenseActivity : AbsThemeActivity() {
private lateinit var binding: ActivityLicenseBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLicenseBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
ToolbarContentTintHelper.colorBackButton(binding.toolbar)
try {
val buf = StringBuilder()
val json = assets.open("license.html")
BufferedReader(InputStreamReader(json, StandardCharsets.UTF_8)).use { br ->
var str: String?
while (br.readLine().also { str = it } != null) {
buf.append(str)
}
}
// Inject color values for WebView body background and links
val isDark = isWindowBackgroundDark(this)
val backgroundColor = colorToCSS(
surfaceColor(Color.parseColor(if (isDark) "#424242" else "#ffffff"))
)
val contentColor = colorToCSS(Color.parseColor(if (isDark) "#ffffff" else "#000000"))
val changeLog = buf.toString()
.replace(
"{style-placeholder}", String.format(
"body { background-color: %s; color: %s; }", backgroundColor, contentColor
)
)
.replace("{link-color}", colorToCSS(accentColor()))
.replace(
"{link-color-active}",
colorToCSS(
lightenColor(accentColor())
)
)
binding.license.loadData(changeLog, "text/html", "UTF-8")
} catch (e: Throwable) {
binding.license.loadData(
"<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8"
)
}
binding.license.drawAboveSystemBars()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressedDispatcher.onBackPressed()
return true
}
return super.onOptionsItemSelected(item)
}
private fun colorToCSS(color: Int): String {
return String.format(
"rgb(%d, %d, %d)",
Color.red(color),
Color.green(color),
Color.blue(color)
) // on API 29, WebView doesn't load with hex colors
}
}

View file

@ -0,0 +1,121 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities
import android.app.KeyguardManager
import android.os.Bundle
import android.view.WindowManager
import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import code.name.monkey.retromusic.databinding.ActivityLockScreenBinding
import code.name.monkey.retromusic.extensions.hideStatusBar
import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.player.lockscreen.LockScreenControlsFragment
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
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.model.SlidrConfig
import com.r0adkll.slidr.model.SlidrListener
import com.r0adkll.slidr.model.SlidrPosition
class LockScreenActivity : AbsMusicServiceActivity() {
private lateinit var binding: ActivityLockScreenBinding
private var fragment: LockScreenControlsFragment? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lockScreenInit()
binding = ActivityLockScreenBinding.inflate(layoutInflater)
setContentView(binding.root)
hideStatusBar()
setTaskDescriptionColorAuto()
val config = SlidrConfig.Builder().listener(object : SlidrListener {
override fun onSlideStateChanged(state: Int) {
}
override fun onSlideChange(percent: Float) {
}
override fun onSlideOpened() {
}
override fun onSlideClosed(): Boolean {
if (VersionUtils.hasOreo()) {
val keyguardManager =
getSystemService<KeyguardManager>()
keyguardManager?.requestDismissKeyguard(this@LockScreenActivity, null)
}
finish()
return true
}
}).position(SlidrPosition.BOTTOM).build()
Slidr.attach(this, config)
fragment = whichFragment<LockScreenControlsFragment>(R.id.playback_controls_fragment)
binding.slide.apply {
translationY = 100f
alpha = 0f
animate().translationY(0f).alpha(1f).setDuration(1500).start()
}
}
@Suppress("Deprecation")
private fun lockScreenInit() {
if (VersionUtils.hasOreoMR1()) {
setShowWhenLocked(true)
//setTurnScreenOn(true)
} else {
window.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
// or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
}
}
override fun onPlayingMetaChanged() {
super.onPlayingMetaChanged()
updateSongs()
}
override fun onServiceConnected() {
super.onServiceConnected()
updateSongs()
}
private fun updateSongs() {
val song = MusicPlayerRemote.currentSong
Glide.with(this)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.dontAnimate()
.into(object : RetroMusicColoredTarget(binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) {
fragment?.setColor(colors)
}
})
}
}

View file

@ -0,0 +1,214 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import androidx.lifecycle.lifecycleScope
import androidx.navigation.contains
import androidx.navigation.ui.setupWithNavController
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SearchQueryHelper.getSongs
import code.name.monkey.retromusic.interfaces.IScrollHelper
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.PlaylistSongsLoader
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.logE
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import org.koin.android.ext.android.get
class MainActivity : AbsSlidingMusicPanelActivity() {
companion object {
const val TAG = "MainActivity"
const val EXPAND_PANEL = "expand_panel"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setTaskDescriptionColorAuto()
hideStatusBar()
updateTabs()
setupNavigationController()
WhatsNewFragment.showChangeLog(this)
}
private fun setupNavigationController() {
val navController = findNavController(R.id.fragment_container)
val navInflater = navController.navInflater
val navGraph = navInflater.inflate(R.navigation.main_graph)
val categoryInfo: CategoryInfo = PreferenceUtil.libraryCategory.first { it.visible }
if (categoryInfo.visible) {
if (!navGraph.contains(PreferenceUtil.lastTab)) PreferenceUtil.lastTab =
categoryInfo.category.id
navGraph.setStartDestination(
if (PreferenceUtil.rememberLastTab) {
PreferenceUtil.lastTab.let {
if (it == 0) {
categoryInfo.category.id
} else {
it
}
}
} else categoryInfo.category.id
)
}
navController.graph = navGraph
navigationView.setupWithNavController(navController)
// Scroll Fragment to top
navigationView.setOnItemReselectedListener {
currentFragment(R.id.fragment_container).apply {
if (this is IScrollHelper) {
scrollToTop()
}
}
}
navController.addOnDestinationChangedListener { _, destination, _ ->
if (destination.id == navGraph.startDestinationId) {
currentFragment(R.id.fragment_container)?.enterTransition = null
}
when (destination.id) {
R.id.action_home, R.id.action_song, R.id.action_album, R.id.action_artist, R.id.action_folder, R.id.action_playlist, R.id.action_genre, R.id.action_search -> {
// Save the last tab
if (PreferenceUtil.rememberLastTab) {
saveTab(destination.id)
}
// Show Bottom Navigation Bar
setBottomNavVisibility(visible = true, animate = true)
}
R.id.playing_queue_fragment -> {
setBottomNavVisibility(visible = false, hideBottomSheet = true)
}
else -> setBottomNavVisibility(
visible = false,
animate = true
) // Hide Bottom Navigation Bar
}
}
}
private fun saveTab(id: Int) {
if (PreferenceUtil.libraryCategory.firstOrNull { it.category.id == id }?.visible == true) {
PreferenceUtil.lastTab = id
}
}
override fun onSupportNavigateUp(): Boolean =
findNavController(R.id.fragment_container).navigateUp()
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
val expand = intent?.extra<Boolean>(EXPAND_PANEL)?.value ?: false
if (expand && PreferenceUtil.isExpandPanel) {
fromNotification = true
slidingPanel.bringToFront()
expandPanel()
intent?.removeExtra(EXPAND_PANEL)
}
}
override fun onServiceConnected() {
super.onServiceConnected()
intent ?: return
handlePlaybackIntent(intent)
}
private fun handlePlaybackIntent(intent: Intent) {
lifecycleScope.launch(IO) {
val uri: Uri? = intent.data
val mimeType: String? = intent.type
var handled = false
if (intent.action != null &&
intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
) {
val songs: List<Song> = getSongs(intent.extras!!)
if (MusicPlayerRemote.shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) {
MusicPlayerRemote.openAndShuffleQueue(songs, true)
} else {
MusicPlayerRemote.openQueue(songs, 0, true)
}
handled = true
}
if (uri != null && uri.toString().isNotEmpty()) {
MusicPlayerRemote.playFromUri(this@MainActivity, uri)
handled = true
} else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) {
val id = parseLongFromIntent(intent, "playlistId", "playlist")
if (id >= 0L) {
val position: Int = intent.getIntExtra("position", 0)
val songs: List<Song> = PlaylistSongsLoader.getPlaylistSongList(get(), id)
MusicPlayerRemote.openQueue(songs, position, true)
handled = true
}
} else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) {
val id = parseLongFromIntent(intent, "albumId", "album")
if (id >= 0L) {
val position: Int = intent.getIntExtra("position", 0)
val songs = libraryViewModel.albumById(id).songs
MusicPlayerRemote.openQueue(
songs,
position,
true
)
handled = true
}
} else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) {
val id = parseLongFromIntent(intent, "artistId", "artist")
if (id >= 0L) {
val position: Int = intent.getIntExtra("position", 0)
val songs: List<Song> = libraryViewModel.artistById(id).songs
MusicPlayerRemote.openQueue(
songs,
position,
true
)
handled = true
}
}
if (handled) {
setIntent(Intent())
}
}
}
private fun parseLongFromIntent(
intent: Intent,
longKey: String,
stringKey: String,
): Long {
var id = intent.getLongExtra(longKey, -1)
if (id < 0) {
val idString = intent.getStringExtra(stringKey)
if (idString != null) {
try {
id = idString.toLong()
} catch (e: NumberFormatException) {
logE(e)
}
}
}
return id
}
}

View file

@ -0,0 +1,144 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities
import android.Manifest.permission.BLUETOOTH_CONNECT
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.ColorStateList
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import androidx.activity.OnBackPressedCallback
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.net.toUri
import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import code.name.monkey.retromusic.databinding.ActivityPermissionBinding
import code.name.monkey.retromusic.extensions.*
class PermissionActivity : AbsMusicServiceActivity() {
private lateinit var binding: ActivityPermissionBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityPermissionBinding.inflate(layoutInflater)
setContentView(binding.root)
setStatusBarColorAuto()
setTaskDescriptionColorAuto()
setupTitle()
binding.storagePermission.setButtonClick {
requestPermissions()
}
if (VersionUtils.hasMarshmallow()) {
binding.audioPermission.show()
binding.audioPermission.setButtonClick {
if (!hasAudioPermission()) {
val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
intent.data = ("package:" + applicationContext.packageName).toUri()
startActivity(intent)
}
}
}
if (VersionUtils.hasS()) {
binding.bluetoothPermission.show()
binding.bluetoothPermission.setButtonClick {
ActivityCompat.requestPermissions(
this,
arrayOf(BLUETOOTH_CONNECT),
BLUETOOTH_PERMISSION_REQUEST
)
}
} else {
binding.audioPermission.setNumber("2")
}
binding.finish.accentBackgroundColor()
binding.finish.setOnClickListener {
if (hasPermissions()) {
startActivity(
Intent(this, MainActivity::class.java).addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK
)
)
finish()
}
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishAffinity()
remove()
}
})
}
private fun setupTitle() {
val appName =
getString(
R.string.message_welcome,
"<b>Metro</b>"
)
.parseAsHtml()
binding.appNameText.text = appName
}
override fun onResume() {
super.onResume()
binding.finish.isEnabled = hasStoragePermission()
if (hasStoragePermission()) {
binding.storagePermission.checkImage.isVisible = true
binding.storagePermission.checkImage.imageTintList =
ColorStateList.valueOf(accentColor())
}
if (VersionUtils.hasMarshmallow()) {
if (hasAudioPermission()) {
binding.audioPermission.checkImage.isVisible = true
binding.audioPermission.checkImage.imageTintList =
ColorStateList.valueOf(accentColor())
}
}
if (VersionUtils.hasS()) {
if (hasBluetoothPermission()) {
binding.bluetoothPermission.checkImage.isVisible = true
binding.bluetoothPermission.checkImage.imageTintList =
ColorStateList.valueOf(accentColor())
}
}
}
private fun hasStoragePermission(): Boolean {
return hasPermissions()
}
@RequiresApi(Build.VERSION_CODES.S)
private fun hasBluetoothPermission(): Boolean {
return ActivityCompat.checkSelfPermission(
this,
BLUETOOTH_CONNECT
) == PackageManager.PERMISSION_GRANTED
}
@RequiresApi(Build.VERSION_CODES.M)
private fun hasAudioPermission(): Boolean {
return Settings.System.canWrite(this)
}
}

View file

@ -0,0 +1,114 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.provider.MediaStore.Images.Media
import android.view.MenuItem
import androidx.core.net.toUri
import androidx.core.os.BundleCompat
import androidx.core.view.drawToBitmap
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import code.name.monkey.retromusic.databinding.ActivityShareInstagramBinding
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.setStatusBarColor
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.Share
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
/**
* Created by hemanths on 2020-02-02.
*/
class ShareInstagramStory : AbsThemeActivity() {
private lateinit var binding: ActivityShareInstagramBinding
companion object {
const val EXTRA_SONG = "extra_song"
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressedDispatcher.onBackPressed()
return true
}
return super.onOptionsItemSelected(item)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityShareInstagramBinding.inflate(layoutInflater)
setContentView(binding.root)
setStatusBarColor(Color.TRANSPARENT)
binding.toolbar.setBackgroundColor(Color.TRANSPARENT)
setSupportActionBar(binding.toolbar)
val song = intent.extras?.let { BundleCompat.getParcelable(it, EXTRA_SONG, Song::class.java) }
song?.let { songFinal ->
Glide.with(this)
.asBitmapPalette()
.songCoverOptions(songFinal)
.load(RetroGlideExtension.getSongModel(songFinal))
.into(object : RetroMusicColoredTarget(binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(colors.backgroundColor)
}
})
binding.shareTitle.text = songFinal.title
binding.shareText.text = songFinal.artistName
binding.shareButton.setOnClickListener {
val path: String = Media.insertImage(
contentResolver,
binding.mainContent.drawToBitmap(Bitmap.Config.ARGB_8888),
"Design", null
)
Share.shareStoryToSocial(
this@ShareInstagramStory,
path.toUri()
)
}
}
binding.shareButton.setTextColor(
MaterialValueHelper.getPrimaryTextColor(
this,
ColorUtil.isColorLight(accentColor())
)
)
binding.shareButton.backgroundTintList =
ColorStateList.valueOf(accentColor())
}
private fun setColors(color: Int) {
binding.mainContent.background =
GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
intArrayOf(color, Color.BLACK)
)
}
}

View file

@ -0,0 +1,153 @@
package code.name.monkey.retromusic.activities
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
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.widget.NestedScrollView
import androidx.fragment.app.FragmentActivity
import code.name.monkey.appthemehelper.util.ATHUtil.isWindowBackgroundDark
import code.name.monkey.appthemehelper.util.ColorUtil.isColorLight
import code.name.monkey.appthemehelper.util.ColorUtil.lightenColor
import code.name.monkey.appthemehelper.util.MaterialValueHelper.getPrimaryTextColor
import code.name.monkey.retromusic.BuildConfig
import code.name.monkey.retromusic.Constants
import code.name.monkey.retromusic.databinding.FragmentWhatsNewBinding
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.openUrl
import code.name.monkey.retromusic.util.PreferenceUtil.lastVersion
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import java.nio.charset.StandardCharsets
import java.util.*
class WhatsNewFragment : BottomSheetDialogFragment() {
private var _binding: FragmentWhatsNewBinding? = null
val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentWhatsNewBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
try {
val buf = StringBuilder()
val stream = requireContext().assets.open("retro-changelog.html")
stream.reader(StandardCharsets.UTF_8).buffered().use { br ->
var str: String?
while (br.readLine().also { str = it } != null) {
buf.append(str)
}
}
// Inject color values for WebView body background and links
val isDark = isWindowBackgroundDark(requireContext())
val accentColor = accentColor()
binding.webView.setBackgroundColor(0)
val contentColor = colorToCSS(Color.parseColor(if (isDark) "#ffffff" else "#000000"))
val textColor = colorToCSS(Color.parseColor(if (isDark) "#60FFFFFF" else "#80000000"))
val accentColorString = colorToCSS(accentColor())
val cardBackgroundColor =
colorToCSS(Color.parseColor(if (isDark) "#353535" else "#ffffff"))
val accentTextColor = colorToCSS(
getPrimaryTextColor(
requireContext(), isColorLight(accentColor)
)
)
val changeLog = buf.toString()
.replace(
"{style-placeholder}",
"body { color: $contentColor; } li {color: $textColor;} h3 {color: $accentColorString;} .tag {background-color: $accentColorString; color: $accentTextColor; } div{background-color: $cardBackgroundColor;}"
)
.replace("{link-color}", colorToCSS(accentColor()))
.replace(
"{link-color-active}",
colorToCSS(
lightenColor(accentColor())
)
)
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) {
binding.webView.loadData(
"<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8"
)
}
setChangelogRead(requireContext())
binding.tgFab.setOnClickListener {
openUrl(Constants.TELEGRAM_CHANGE_LOG)
}
binding.tgFab.accentColor()
binding.tgFab.shrink()
binding.container.setOnScrollChangeListener { _: NestedScrollView?, _: Int, scrollY: Int, _: Int, oldScrollY: Int ->
val dy = scrollY - oldScrollY
if (dy > 0) {
binding.tgFab.shrink()
} else if (dy < 0) {
binding.tgFab.extend()
}
}
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
companion object {
const val TAG = "WhatsNewFragment"
private fun colorToCSS(color: Int): String {
return String.format(
Locale.getDefault(),
"rgba(%d, %d, %d, %d)",
Color.red(color),
Color.green(color),
Color.blue(color),
Color.alpha(color)
) // on API 29, WebView doesn't load with hex colors
}
private fun setChangelogRead(context: Context) {
try {
val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
val currentVersion = PackageInfoCompat.getLongVersionCode(pInfo)
lastVersion = currentVersion
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
}
fun showChangeLog(activity: FragmentActivity) {
val pInfo = activity.packageManager.getPackageInfo(activity.packageName, 0)
val currentVersion = PackageInfoCompat.getLongVersionCode(pInfo)
if (currentVersion > lastVersion && !BuildConfig.DEBUG) {
val changelogBottomSheet = WhatsNewFragment()
changelogBottomSheet.show(activity.supportFragmentManager, TAG)
}
}
}
}

View file

@ -0,0 +1,204 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.base
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Rect
import android.media.AudioManager
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.core.app.ActivityCompat
import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
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
abstract class AbsBaseActivity : AbsThemeActivity() {
private var hadPermissions: Boolean = false
private lateinit var permissions: Array<String>
private var permissionDeniedMessage: String? = null
open fun getPermissionsToRequest(): Array<String> {
return arrayOf()
}
protected fun setPermissionDeniedMessage(message: String) {
permissionDeniedMessage = message
}
fun getPermissionDeniedMessage(): String {
return if (permissionDeniedMessage == null) getString(R.string.permissions_denied) else permissionDeniedMessage!!
}
private val snackBarContainer: View
get() = rootView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
volumeControlStream = AudioManager.STREAM_MUSIC
permissions = getPermissionsToRequest()
hadPermissions = hasPermissions()
permissionDeniedMessage = null
}
override fun onResume() {
super.onResume()
val hasPermissions = hasPermissions()
if (hasPermissions != hadPermissions) {
hadPermissions = hasPermissions
if (VersionUtils.hasMarshmallow()) {
onHasPermissionsChanged(hasPermissions)
}
}
}
protected open fun onHasPermissionsChanged(hasPermissions: Boolean) {
// implemented by sub classes
logD(hasPermissions)
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if (event.keyCode == KeyEvent.KEYCODE_MENU && event.action == KeyEvent.ACTION_UP) {
showOverflowMenu()
return true
}
return super.dispatchKeyEvent(event)
}
private fun showOverflowMenu() {
}
protected open fun requestPermissions() {
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST)
}
protected fun hasPermissions(): Boolean {
for (permission in permissions) {
if (ActivityCompat.checkSelfPermission(this,
permission) != PackageManager.PERMISSION_GRANTED
) {
return false
}
}
return true
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray,
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST) {
for (grantResult in grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this@AbsBaseActivity, Manifest.permission.READ_EXTERNAL_STORAGE,
) || ActivityCompat.shouldShowRequestPermissionRationale(
this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE,
)
) {
// User has deny from permission dialog
Snackbar.make(
snackBarContainer,
permissionDeniedMessage!!,
Snackbar.LENGTH_SHORT
)
.setAction(R.string.action_grant) { requestPermissions() }
.setActionTextColor(accentColor()).show()
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(
snackBarContainer,
permissionDeniedMessage!!,
Snackbar.LENGTH_INDEFINITE
)
.setAction(R.string.action_settings) {
val intent = Intent()
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
val uri = Uri.fromParts(
"package",
this@AbsBaseActivity.packageName,
null
)
intent.data = uri
startActivity(intent)
}.setActionTextColor(accentColor()).show()
}
return
}
}
hadPermissions = 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 {
const val PERMISSION_REQUEST = 100
const val BLUETOOTH_PERMISSION_REQUEST = 101
}
// this lets keyboard close when clicked in background
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is EditText) {
val outRect = Rect()
v.getGlobalVisibleRect(outRect)
if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
v.clearFocus()
getSystemService<InputMethodManager>()?.hideSoftInputFromWindow(
v.windowToken,
0
)
}
}
}
return super.dispatchTouchEvent(event)
}
}

View file

@ -1,20 +1,49 @@
package io.github.muntashirakon.music.activities.base
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.base
import android.Manifest
import android.content.*
import android.os.Bundle
import android.os.IBinder
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.MusicServiceEventListener
import io.github.muntashirakon.music.service.MusicService.*
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.db.toPlayCount
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.service.MusicService.Companion.FAVORITE_STATE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.MEDIA_STORE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.META_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.PLAY_STATE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.logD
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import java.lang.ref.WeakReference
import java.util.*
abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventListener {
private val mMusicServiceEventListeners = ArrayList<MusicServiceEventListener>()
abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventListener {
private val mMusicServiceEventListeners = ArrayList<IMusicServiceEventListener>()
private val repository: RealRepository by inject()
private var serviceToken: MusicPlayerRemote.ServiceToken? = null
private var musicStateReceiver: MusicStateReceiver? = null
private var receiverRegistered: Boolean = false
@ -43,15 +72,15 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
}
}
fun addMusicServiceEventListener(listener: MusicServiceEventListener?) {
if (listener != null) {
mMusicServiceEventListeners.add(listener)
fun addMusicServiceEventListener(listenerI: IMusicServiceEventListener?) {
if (listenerI != null) {
mMusicServiceEventListeners.add(listenerI)
}
}
fun removeMusicServiceEventListener(listener: MusicServiceEventListener?) {
if (listener != null) {
mMusicServiceEventListeners.remove(listener)
fun removeMusicServiceEventListener(listenerI: IMusicServiceEventListener?) {
if (listenerI != null) {
mMusicServiceEventListeners.remove(listenerI)
}
}
@ -68,8 +97,7 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
filter.addAction(MEDIA_STORE_CHANGED)
filter.addAction(FAVORITE_STATE_CHANGED)
registerReceiver(musicStateReceiver, filter)
ContextCompat.registerReceiver(this, musicStateReceiver, filter, ContextCompat.RECEIVER_NOT_EXPORTED)
receiverRegistered = true
}
@ -93,6 +121,16 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
for (listener in mMusicServiceEventListeners) {
listener.onPlayingMetaChanged()
}
lifecycleScope.launch(Dispatchers.IO) {
if (!PreferenceUtil.pauseHistory) {
repository.upsertSongInHistory(MusicPlayerRemote.currentSong)
}
val song = repository.findSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
?.apply { playCount += 1 }
?: MusicPlayerRemote.currentSong.toPlayCount()
repository.upsertSongInPlayCount(song)
}
}
override fun onQueueChanged() {
@ -125,6 +163,12 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
}
}
override fun onFavoriteStateChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onFavoriteStateChanged()
}
}
override fun onHasPermissionsChanged(hasPermissions: Boolean) {
super.onHasPermissionsChanged(hasPermissions)
val intent = Intent(MEDIA_STORE_CHANGED)
@ -133,15 +177,21 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
true
) // just in case we need to know this at some point
sendBroadcast(intent)
println("sendBroadcast $hasPermissions")
logD("sendBroadcast $hasPermissions")
}
override fun getPermissionsToRequest(): Array<String> {
return arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.BLUETOOTH
)
return mutableListOf<String>().apply {
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)
}
}.toTypedArray()
}
private class MusicStateReceiver(activity: AbsMusicServiceActivity) : BroadcastReceiver() {
@ -153,7 +203,8 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
val activity = reference.get()
if (activity != null && action != null) {
when (action) {
FAVORITE_STATE_CHANGED, META_CHANGED -> activity.onPlayingMetaChanged()
FAVORITE_STATE_CHANGED -> activity.onFavoriteStateChanged()
META_CHANGED -> activity.onPlayingMetaChanged()
QUEUE_CHANGED -> activity.onQueueChanged()
PLAY_STATE_CHANGED -> activity.onPlayStateChanged()
REPEAT_MODE_CHANGED -> activity.onRepeatModeChanged()

View file

@ -0,0 +1,581 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.base
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.content.Intent
import android.content.SharedPreferences
import android.content.res.ColorStateList
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.view.animation.PathInterpolator
import android.widget.FrameLayout
import androidx.activity.OnBackPressedCallback
import androidx.core.animation.doOnEnd
import androidx.core.view.*
import androidx.fragment.app.commit
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.ADAPTIVE_COLOR_APP
import code.name.monkey.retromusic.ALBUM_COVER_STYLE
import code.name.monkey.retromusic.ALBUM_COVER_TRANSFORM
import code.name.monkey.retromusic.CAROUSEL_EFFECT
import code.name.monkey.retromusic.CIRCLE_PLAY_BUTTON
import code.name.monkey.retromusic.EXTRA_SONG_INFO
import code.name.monkey.retromusic.KEEP_SCREEN_ON
import code.name.monkey.retromusic.LIBRARY_CATEGORIES
import code.name.monkey.retromusic.NOW_PLAYING_SCREEN_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.SCREEN_ON_LYRICS
import code.name.monkey.retromusic.SWIPE_ANYWHERE_NOW_PLAYING
import code.name.monkey.retromusic.SWIPE_DOWN_DISMISS
import code.name.monkey.retromusic.TAB_TEXT_MODE
import code.name.monkey.retromusic.TOGGLE_ADD_CONTROLS
import code.name.monkey.retromusic.TOGGLE_FULL_SCREEN
import code.name.monkey.retromusic.TOGGLE_VOLUME
import code.name.monkey.retromusic.activities.PermissionActivity
import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.other.MiniPlayerFragment
import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment
import code.name.monkey.retromusic.fragments.player.blur.BlurPlayerFragment
import code.name.monkey.retromusic.fragments.player.card.CardFragment
import code.name.monkey.retromusic.fragments.player.cardblur.CardBlurFragment
import code.name.monkey.retromusic.fragments.player.circle.CirclePlayerFragment
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.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
abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
SharedPreferences.OnSharedPreferenceChangeListener {
companion object {
val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName
}
var fromNotification = false
private var windowInsets: WindowInsetsCompat? = null
protected val libraryViewModel by viewModel<LibraryViewModel>()
private lateinit var bottomSheetBehavior: BottomSheetBehavior<FrameLayout>
private lateinit var playerFragment: AbsPlayerFragment
private var miniPlayerFragment: MiniPlayerFragment? = null
private var nowPlayingScreen: NowPlayingScreen? = null
private var taskColor: Int = 0
private var paletteColor: Int = Color.WHITE
private var navigationBarColor = 0
private val panelState: Int
get() = bottomSheetBehavior.state
private lateinit var binding: SlidingMusicPanelLayoutBinding
private var isInOneTabMode = false
private var navigationBarColorAnimator: ValueAnimator? = null
private val argbEvaluator: ArgbEvaluator = ArgbEvaluator()
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) {
setMiniPlayerAlphaProgress(slideOffset)
navigationBarColorAnimator?.cancel()
setNavigationBarColorPreOreo(
argbEvaluator.evaluate(
slideOffset,
surfaceColor(),
navigationBarColor
) as Int
)
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
onBackPressedCallback.isEnabled = newState == STATE_EXPANDED
when (newState) {
STATE_EXPANDED -> {
onPanelExpanded()
if (PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) {
keepScreenOn(true)
}
}
STATE_COLLAPSED -> {
onPanelCollapsed()
if ((PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics) || !PreferenceUtil.isScreenOnEnabled) {
keepScreenOn(false)
}
}
STATE_SETTLING, STATE_DRAGGING -> {
if (fromNotification) {
binding.navigationView.bringToFront()
fromNotification = false
}
}
STATE_HIDDEN -> {
MusicPlayerRemote.clearQueue()
}
else -> {
logD("Do a flip")
}
}
}
}
}
fun getBottomSheetBehavior() = bottomSheetBehavior
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!hasPermissions()) {
startActivity(Intent(this, PermissionActivity::class.java))
finish()
}
binding = SlidingMusicPanelLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.root.setOnApplyWindowInsetsListener { _, insets ->
windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets)
insets
}
chooseFragmentForTheme()
setupSlidingUpPanel()
setupBottomSheet()
updateColor()
if (!PreferenceUtil.materialYou) {
binding.slidingPanel.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
navigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor())
}
navigationBarColor = surfaceColor()
onBackPressedDispatcher.addCallback(onBackPressedCallback)
}
private fun setupBottomSheet() {
bottomSheetBehavior = from(binding.slidingPanel)
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
bottomSheetBehavior.significantVelocityThreshold = 300
setMiniPlayerAlphaProgress(0F)
}
override fun onResume() {
super.onResume()
PreferenceUtil.registerOnSharedPreferenceChangedListener(this)
if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) {
postRecreate()
}
if (bottomSheetBehavior.state == STATE_EXPANDED) {
setMiniPlayerAlphaProgress(1f)
}
}
override fun onDestroy() {
super.onDestroy()
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList)
PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
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() {
bottomSheetBehavior.state = STATE_COLLAPSED
}
fun expandPanel() {
bottomSheetBehavior.state = STATE_EXPANDED
}
private fun setMiniPlayerAlphaProgress(progress: Float) {
if (progress < 0) return
val alpha = 1 - progress
miniPlayerFragment?.view?.alpha = 1 - (progress / 0.2F)
miniPlayerFragment?.view?.isGone = alpha == 0f
if (!isLandscape) {
binding.navigationView.translationY = progress * 500
binding.navigationView.alpha = alpha
}
binding.playerFragmentContainer.alpha = (progress - 0.2F) / 0.2F
}
private fun animateNavigationBarColor(color: Int) {
if (VersionUtils.hasOreo()) return
navigationBarColorAnimator?.cancel()
navigationBarColorAnimator = ValueAnimator
.ofArgb(window.navigationBarColor, color).apply {
duration = ViewUtil.RETRO_MUSIC_ANIM_TIME.toLong()
interpolator = PathInterpolator(0.4f, 0f, 1f, 1f)
addUpdateListener { animation: ValueAnimator ->
setNavigationBarColorPreOreo(
animation.animatedValue as Int
)
}
start()
}
}
open fun onPanelCollapsed() {
setMiniPlayerAlphaProgress(0F)
// restore values
animateNavigationBarColor(surfaceColor())
setLightStatusBarAuto()
setLightNavigationBarAuto()
setTaskDescriptionColor(taskColor)
//playerFragment?.onHide()
}
open fun onPanelExpanded() {
setMiniPlayerAlphaProgress(1F)
onPaletteColorChanged()
//playerFragment?.onShow()
}
private fun setupSlidingUpPanel() {
binding.slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
if (nowPlayingScreen != Peek) {
binding.slidingPanel.updateLayoutParams<ViewGroup.LayoutParams> {
height = ViewGroup.LayoutParams.MATCH_PARENT
}
}
when (panelState) {
STATE_EXPANDED -> onPanelExpanded()
STATE_COLLAPSED -> onPanelCollapsed()
else -> {
// playerFragment!!.onHide()
}
}
}
})
}
val navigationView get() = binding.navigationView
val slidingPanel get() = binding.slidingPanel
val isBottomNavVisible get() = navigationView.isVisible && navigationView is BottomNavigationView
override fun onServiceConnected() {
super.onServiceConnected()
hideBottomSheet(false)
}
override fun onQueueChanged() {
super.onQueueChanged()
// Mini player should be hidden in Playing Queue
// it may pop up if hideBottomSheet is called
if (currentFragment(R.id.fragment_container) !is PlayingQueueFragment) {
hideBottomSheet(MusicPlayerRemote.playingQueue.isEmpty())
}
}
private fun handleBackPress(): Boolean {
if (panelState == STATE_EXPANDED) {
collapsePanel()
return true
}
return false
}
private fun onPaletteColorChanged() {
if (panelState == STATE_EXPANDED) {
navigationBarColor = surfaceColor()
setTaskDescColor(paletteColor)
val isColorLight = paletteColor.isColorLight
if (PreferenceUtil.isAdaptiveColor && (nowPlayingScreen == Normal || nowPlayingScreen == Flat || nowPlayingScreen == Material)) {
setLightNavigationBar(true)
setLightStatusBar(isColorLight)
} else if (nowPlayingScreen == Card || nowPlayingScreen == Blur || nowPlayingScreen == BlurCard) {
animateNavigationBarColor(Color.BLACK)
navigationBarColor = Color.BLACK
setLightStatusBar(false)
setLightNavigationBar(true)
} else if (nowPlayingScreen == Color || nowPlayingScreen == Tiny || nowPlayingScreen == Gradient) {
animateNavigationBarColor(paletteColor)
navigationBarColor = paletteColor
setLightNavigationBar(isColorLight)
setLightStatusBar(isColorLight)
} else if (nowPlayingScreen == Full) {
animateNavigationBarColor(paletteColor)
navigationBarColor = paletteColor
setLightNavigationBar(isColorLight)
setLightStatusBar(false)
} else if (nowPlayingScreen == Classic) {
setLightStatusBar(false)
} else if (nowPlayingScreen == Fit) {
setLightStatusBar(false)
}
}
}
private fun setTaskDescColor(color: Int) {
taskColor = color
if (panelState == STATE_COLLAPSED) {
setTaskDescriptionColor(color)
}
}
fun updateTabs() {
binding.navigationView.menu.clear()
val currentTabs: List<CategoryInfo> = PreferenceUtil.libraryCategory
for (tab in currentTabs) {
if (tab.visible) {
val menu = tab.category
binding.navigationView.menu.add(0, menu.id, 0, menu.stringRes)
.setIcon(menu.icon)
}
}
if (binding.navigationView.menu.size() == 1) {
isInOneTabMode = true
binding.navigationView.isVisible = false
} else {
isInOneTabMode = false
}
}
private fun updateColor() {
libraryViewModel.paletteColor.observe(this) { color ->
this.paletteColor = color
onPaletteColorChanged()
}
}
fun setBottomNavVisibility(
visible: Boolean,
animate: Boolean = false,
hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty(),
) {
if (!ViewCompat.isLaidOut(navigationView)) {
return
}
if (isInOneTabMode) {
hideBottomSheet(
hide = hideBottomSheet,
animate = animate,
isBottomNavVisible = false
)
return
}
if (visible xor navigationView.isVisible) {
val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED
if (mAnimate) {
if (visible) {
binding.navigationView.bringToFront()
binding.navigationView.show()
} else {
binding.navigationView.hide()
}
} else {
binding.navigationView.isVisible = visible
if (visible && bottomSheetBehavior.state != STATE_EXPANDED) {
binding.navigationView.bringToFront()
}
}
}
hideBottomSheet(
hide = hideBottomSheet,
animate = animate,
isBottomNavVisible = visible && navigationView is BottomNavigationView
)
}
fun hideBottomSheet(
hide: Boolean,
animate: Boolean = false,
isBottomNavVisible: Boolean = navigationView.isVisible && navigationView is BottomNavigationView,
) {
val heightOfBar = windowInsets.getBottomInsets() + dip(R.dimen.mini_player_height)
val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height)
if (hide) {
bottomSheetBehavior.peekHeight = -windowInsets.getBottomInsets()
bottomSheetBehavior.state = STATE_COLLAPSED
libraryViewModel.setFabMargin(
this,
if (isBottomNavVisible) dip(R.dimen.bottom_nav_height) else 0
)
} else {
if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.slidingPanel.elevation = 0F
binding.navigationView.elevation = 5F
if (isBottomNavVisible) {
logD("List")
if (animate) {
bottomSheetBehavior.peekHeightAnimate(heightOfBarWithTabs)
} else {
bottomSheetBehavior.peekHeight = heightOfBarWithTabs
}
libraryViewModel.setFabMargin(
this,
dip(R.dimen.bottom_nav_mini_player_height)
)
} else {
logD("Details")
if (animate) {
bottomSheetBehavior.peekHeightAnimate(heightOfBar).doOnEnd {
binding.slidingPanel.bringToFront()
}
} else {
bottomSheetBehavior.peekHeight = heightOfBar
binding.slidingPanel.bringToFront()
}
libraryViewModel.setFabMargin(this, dip(R.dimen.mini_player_height))
}
}
}
}
fun setAllowDragging(allowDragging: Boolean) {
bottomSheetBehavior.isDraggable = allowDragging
hideBottomSheet(false)
}
private fun chooseFragmentForTheme() {
nowPlayingScreen = PreferenceUtil.nowPlayingScreen
val fragment: AbsPlayerFragment = when (nowPlayingScreen) {
Blur -> BlurPlayerFragment()
Adaptive -> AdaptiveFragment()
Normal -> PlayerFragment()
Card -> CardFragment()
BlurCard -> CardBlurFragment()
Fit -> FitFragment()
Flat -> FlatPlayerFragment()
Full -> FullPlayerFragment()
Plain -> PlainPlayerFragment()
Simple -> SimplePlayerFragment()
Material -> MaterialFragment()
Color -> ColorFragment()
Gradient -> GradientPlayerFragment()
Tiny -> TinyPlayerFragment()
Peek -> PeekPlayerFragment()
Circle -> CirclePlayerFragment()
Classic -> ClassicPlayerFragment()
MD3 -> MD3PlayerFragment()
else -> PlayerFragment()
} // must extend AbsPlayerFragment
supportFragmentManager.commit {
replace(R.id.playerFragmentContainer, fragment)
}
supportFragmentManager.executePendingTransactions()
playerFragment = whichFragment(R.id.playerFragmentContainer)
miniPlayerFragment = whichFragment<MiniPlayerFragment>(R.id.miniPlayerFragment)
miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
}
}

View file

@ -0,0 +1,106 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.base
import android.content.Context
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.KeyEvent
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
import androidx.core.os.LocaleListCompat
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.theme.getNightMode
import code.name.monkey.retromusic.util.theme.getThemeResValue
abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
private val handler = Handler(Looper.getMainLooper())
override fun onCreate(savedInstanceState: Bundle?) {
updateLocale()
updateTheme()
hideStatusBar()
super.onCreate(savedInstanceState)
setEdgeToEdgeOrImmersive()
maybeSetScreenOn()
setLightNavigationBarAuto()
setLightStatusBarAuto(surfaceColor())
if (VersionUtils.hasQ()) {
window.decorView.isForceDarkAllowed = false
}
}
private fun updateTheme() {
setTheme(getThemeResValue())
if (PreferenceUtil.materialYou) {
setDefaultNightMode(getNightMode())
}
if (PreferenceUtil.isCustomFont) {
setTheme(R.style.FontThemeOverlay)
}
}
private fun updateLocale() {
val localeCode = PreferenceUtil.languageCode
if (PreferenceUtil.isLocaleAutoStorageEnabled) {
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(localeCode))
PreferenceUtil.isLocaleAutoStorageEnabled = true
}
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) {
hideStatusBar()
handler.removeCallbacks(this)
handler.postDelayed(this, 300)
} else {
handler.removeCallbacks(this)
}
}
override fun run() {
setImmersiveFullscreen()
}
override fun onStop() {
handler.removeCallbacks(this)
super.onStop()
}
public override fun onDestroy() {
super.onDestroy()
exitFullscreen()
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
handler.removeCallbacks(this)
handler.postDelayed(this, 500)
}
return super.onKeyDown(keyCode, event)
}
override fun attachBaseContext(newBase: Context?) {
super.attachBaseContext(newBase)
}
}

View file

@ -0,0 +1,91 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.bugreport
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import code.name.monkey.retromusic.activities.bugreport.model.DeviceInfo
import code.name.monkey.retromusic.databinding.ActivityBugReportBinding
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import code.name.monkey.retromusic.extensions.showToast
open class BugReportActivity : AbsThemeActivity() {
private lateinit var binding: ActivityBugReportBinding
private var deviceInfo: DeviceInfo? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityBugReportBinding.inflate(layoutInflater)
setContentView(binding.root)
setTaskDescriptionColorAuto()
initViews()
if (title.isNullOrEmpty()) setTitle(R.string.report_an_issue)
deviceInfo = DeviceInfo(this)
binding.cardDeviceInfo.airTextDeviceInfo.text = deviceInfo.toString()
}
private fun initViews() {
val accentColor = accentColor()
setSupportActionBar(binding.toolbar)
ToolbarContentTintHelper.colorBackButton(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding.cardDeviceInfo.airTextDeviceInfo.setOnClickListener { copyDeviceInfoToClipBoard() }
TintHelper.setTintAuto(binding.sendFab, accentColor, true)
binding.sendFab.setOnClickListener { reportIssue() }
}
private fun reportIssue() {
copyDeviceInfoToClipBoard()
val i = Intent(Intent.ACTION_VIEW)
i.data = ISSUE_TRACKER_LINK.toUri()
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(i)
}
private fun copyDeviceInfoToClipBoard() {
val clipboard = getSystemService<ClipboardManager>()
val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown())
clipboard?.setPrimaryClip(clip)
showToast(R.string.copied_device_info_to_clipboard)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressedDispatcher.onBackPressed()
}
return super.onOptionsItemSelected(item)
}
companion object {
private const val ISSUE_TRACKER_LINK =
"https://github.com/MuntashirAkon/Metro/issues/new"
}
}

View file

@ -0,0 +1,111 @@
package code.name.monkey.retromusic.activities.bugreport.model
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.annotation.IntRange
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.pm.PackageInfoCompat
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtil.isAdaptiveColor
import code.name.monkey.retromusic.util.PreferenceUtil.nowPlayingScreen
import java.util.*
class DeviceInfo(context: Context) {
@SuppressLint("NewApi")
private val abis = Build.SUPPORTED_ABIS
@SuppressLint("NewApi")
private val abis32Bits = Build.SUPPORTED_32_BIT_ABIS
@SuppressLint("NewApi")
private val abis64Bits = Build.SUPPORTED_64_BIT_ABIS
private val baseTheme: String
private val brand = Build.BRAND
private val buildID = Build.DISPLAY
private val buildVersion = Build.VERSION.INCREMENTAL
private val device = Build.DEVICE
private val hardware = Build.HARDWARE
private val isAdaptive: Boolean
private val manufacturer = Build.MANUFACTURER
private val model = Build.MODEL
private val nowPlayingTheme: String
private val product = Build.PRODUCT
private val releaseVersion = Build.VERSION.RELEASE
@IntRange(from = 0)
private val sdkVersion = Build.VERSION.SDK_INT
private var versionCode = 0L
private var versionName: String? = null
private val selectedLang: String
fun toMarkdown(): String {
return """
Device info:
---
<table>
<tr><td><b>App version</b></td><td>$versionName</td></tr>
<tr><td>App version code</td><td>$versionCode</td></tr>
<tr><td>Android build version</td><td>$buildVersion</td></tr>
<tr><td>Android release version</td><td>$releaseVersion</td></tr>
<tr><td>Android SDK version</td><td>$sdkVersion</td></tr>
<tr><td>Android build ID</td><td>$buildID</td></tr>
<tr><td>Device brand</td><td>$brand</td></tr>
<tr><td>Device manufacturer</td><td>$manufacturer</td></tr>
<tr><td>Device name</td><td>$device</td></tr>
<tr><td>Device model</td><td>$model</td></tr>
<tr><td>Device product name</td><td>$product</td></tr>
<tr><td>Device hardware name</td><td>$hardware</td></tr>
<tr><td>ABIs</td><td>${Arrays.toString(abis)}</td></tr>
<tr><td>ABIs (32bit)</td><td>${Arrays.toString(abis32Bits)}</td></tr>
<tr><td>ABIs (64bit)</td><td>${Arrays.toString(abis64Bits)}</td></tr>
<tr><td>Language</td><td>$selectedLang</td></tr>
</table>
""".trimIndent()
}
override fun toString(): String {
return """
App version: $versionName
App version code: $versionCode
Android build version: $buildVersion
Android release version: $releaseVersion
Android SDK version: $sdkVersion
Android build ID: $buildID
Device brand: $brand
Device manufacturer: $manufacturer
Device name: $device
Device model: $model
Device product name: $product
Device hardware name: $hardware
ABIs: ${Arrays.toString(abis)}
ABIs (32bit): ${Arrays.toString(abis32Bits)}
ABIs (64bit): ${Arrays.toString(abis64Bits)}
Base theme: $baseTheme
Now playing theme: $nowPlayingTheme
Adaptive: $isAdaptive
System language: ${Locale.getDefault().toLanguageTag()}
In-App Language: $selectedLang
""".trimIndent()
}
init {
val packageInfo = try {
context.packageManager.getPackageInfo(context.packageName, 0)
} catch (e: PackageManager.NameNotFoundException) {
null
}
if (packageInfo != null) {
versionCode = PackageInfoCompat.getLongVersionCode(packageInfo)
versionName = packageInfo.versionName
} else {
versionCode = -1
versionName = null
}
baseTheme = PreferenceUtil.baseTheme
nowPlayingTheme = context.getString(nowPlayingScreen.titleRes)
isAdaptive = isAdaptiveColor
selectedLang = AppCompatDelegate.getApplicationLocales().toLanguageTags()
}
}

View file

@ -0,0 +1,76 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.activities.saf;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.heinrichreimersoftware.materialintro.app.IntroActivity;
import com.heinrichreimersoftware.materialintro.slide.SimpleSlide;
import code.name.monkey.retromusic.R;
/** Created by hemanths on 2019-07-31. */
public class SAFGuideActivity extends IntroActivity {
public static final int REQUEST_CODE_SAF_GUIDE = 98;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setButtonCtaVisible(false);
setButtonNextVisible(false);
setButtonBackVisible(false);
setButtonCtaTintMode(BUTTON_CTA_TINT_MODE_TEXT);
String title =
String.format(getString(R.string.saf_guide_slide1_title), getString(R.string.app_name));
addSlide(
new SimpleSlide.Builder()
.title(title)
.description(
Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1
? R.string.saf_guide_slide1_description_before_o
: R.string.saf_guide_slide1_description)
.image(R.drawable.saf_guide_1)
.background(code.name.monkey.appthemehelper.R.color.md_deep_purple_300)
.backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_400)
.layout(R.layout.fragment_simple_slide_large_image)
.build());
addSlide(
new SimpleSlide.Builder()
.title(R.string.saf_guide_slide2_title)
.description(R.string.saf_guide_slide2_description)
.image(R.drawable.saf_guide_2)
.background(code.name.monkey.appthemehelper.R.color.md_deep_purple_500)
.backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_600)
.layout(R.layout.fragment_simple_slide_large_image)
.build());
addSlide(
new SimpleSlide.Builder()
.title(R.string.saf_guide_slide3_title)
.description(R.string.saf_guide_slide3_description)
.image(R.drawable.saf_guide_3)
.background(code.name.monkey.appthemehelper.R.color.md_deep_purple_700)
.backgroundDark(code.name.monkey.appthemehelper.R.color.md_deep_purple_800)
.layout(R.layout.fragment_simple_slide_large_image)
.build());
}
}

View file

@ -0,0 +1,44 @@
/*
* Copyright (c) 2021 Bartlomiej Uliasz.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.activities.saf
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import code.name.monkey.retromusic.activities.saf.SAFGuideActivity.REQUEST_CODE_SAF_GUIDE
import code.name.monkey.retromusic.util.SAFUtil
/** Created by buliasz on 2021-02-07. */
class SAFRequestActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intent = Intent(this, code.name.monkey.retromusic.activities.saf.SAFGuideActivity::class.java)
startActivityForResult(intent, REQUEST_CODE_SAF_GUIDE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
super.onActivityResult(requestCode, resultCode, intent)
when (requestCode) {
REQUEST_CODE_SAF_GUIDE -> {
SAFUtil.openTreePicker(this)
}
SAFUtil.REQUEST_SAF_PICK_TREE -> {
if (resultCode == RESULT_OK) {
SAFUtil.saveTreeUri(this, intent)
}
finish()
}
}
}
}

View file

@ -1,52 +1,83 @@
package io.github.muntashirakon.music.activities.tageditor
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.tageditor
import android.app.Activity
import android.app.SearchManager
import android.content.Intent
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.animation.OvershootInterpolator
import android.widget.ImageView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.R.drawable
import io.github.muntashirakon.music.activities.base.AbsBaseActivity
import io.github.muntashirakon.music.activities.saf.SAFGuideActivity
import io.github.muntashirakon.music.util.RetroUtil
import io.github.muntashirakon.music.util.SAFUtil
import androidx.lifecycle.lifecycleScope
import androidx.viewbinding.ViewBinding
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsBaseActivity
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.colorButtons
import code.name.monkey.retromusic.extensions.hideSoftKeyboard
import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.model.AudioTagInfo
import code.name.monkey.retromusic.repository.Repository
import code.name.monkey.retromusic.util.logD
import code.name.monkey.retromusic.util.logE
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.android.synthetic.main.activity_album_tag_editor.*
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.jaudiotagger.audio.AudioFile
import org.jaudiotagger.audio.AudioFileIO
import org.jaudiotagger.tag.FieldKey
import org.koin.android.ext.android.inject
import java.io.File
import java.util.*
abstract class AbsTagEditorActivity : AbsBaseActivity() {
abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
abstract val editorImage: ImageView
val repository by inject<Repository>()
protected var id: Int = 0
lateinit var saveFab: MaterialButton
protected var id: Long = 0
private set
private var paletteColorPrimary: Int = 0
private var isInNoImageMode: Boolean = false
private var songPaths: List<String>? = null
lateinit var saveFab: MaterialButton
private var savedSongPaths: List<String>? = null
private val currentSongPath: String? = null
private var savedTags: Map<FieldKey, String>? = null
private var savedArtworkInfo: ArtworkInfo? = null
private var _binding: VB? = null
protected val binding: VB get() = _binding!!
private var cacheFiles = listOf<File>()
abstract val bindingInflater: (LayoutInflater) -> VB
private lateinit var launcher: ActivityResultLauncher<IntentSenderRequest>
protected abstract fun loadImageFromFile(selectedFile: Uri?)
protected val show: AlertDialog
get() =
@ -59,14 +90,16 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
2 -> deleteImage()
}
}
.setNegativeButton(R.string.action_cancel, null)
.show()
protected abstract val contentViewLayout: Int
.colorButtons()
internal val albumArtist: String?
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -75,7 +108,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TITLE)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -83,7 +117,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.COMPOSER)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -92,7 +127,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -101,7 +137,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ARTIST)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -110,7 +147,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -119,7 +157,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.GENRE)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -128,7 +167,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.YEAR)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -137,7 +177,18 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TRACK)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
protected val discNumber: String?
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.DISC_NO)
} catch (e: Exception) {
logE(e)
null
}
}
@ -146,7 +197,8 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
get() {
return try {
getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.LYRICS)
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
null
}
}
@ -164,41 +216,44 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
)
}
return null
} catch (ignored: Exception) {
} catch (e: Exception) {
logE(e)
return null
}
}
private val pickArtworkImage =
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
loadImageFromFile(uri)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(contentViewLayout)
_binding = bindingInflater.invoke(layoutInflater)
setContentView(binding.root)
setTaskDescriptionColorAuto()
saveFab = findViewById(R.id.saveTags)
getIntentExtras()
songPaths = getSongPaths()
logD(songPaths?.size)
if (songPaths!!.isEmpty()) {
finish()
return
}
setUpViews()
setStatusbarColorAuto()
setNavigationbarColorAuto()
setTaskDescriptionColorAuto()
launcher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
writeToFiles(getSongUris(), cacheFiles)
}
}
}
private fun setUpViews() {
setUpScrollView()
setUpFab()
setUpImageView()
}
private fun setUpScrollView() {
//observableScrollView.setScrollViewCallbacks(observableScrollViewCallbacks);
}
private lateinit var items: List<String>
private fun setUpImageView() {
@ -208,18 +263,11 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
getString(R.string.web_search),
getString(R.string.remove_cover)
)
editorImage?.setOnClickListener { show }
editorImage.setOnClickListener { show }
}
private fun startImagePicker() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "image/*"
startActivityForResult(
Intent.createChooser(
intent,
getString(R.string.pick_from_local_storage)
), REQUEST_CODE_SELECT_IMAGE
)
pickArtworkImage.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
protected abstract fun loadCurrentImage()
@ -229,26 +277,12 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
protected abstract fun deleteImage()
private fun setUpFab() {
saveFab.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this))
ColorStateList.valueOf(
MaterialValueHelper.getPrimaryTextColor(
this,
ColorUtil.isColorLight(
ThemeStore.accentColor(
this
)
)
)
).apply {
saveFab.setTextColor(this)
saveFab.iconTint = this
}
saveFab.accentColor()
saveFab.apply {
scaleX = 0f
scaleY = 0f
isEnabled = false
setOnClickListener { save() }
TintHelper.setTintAuto(this, ThemeStore.accentColor(this@AbsTagEditorActivity), true)
}
}
@ -257,12 +291,14 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
private fun getIntentExtras() {
val intentExtras = intent.extras
if (intentExtras != null) {
id = intentExtras.getInt(EXTRA_ID)
id = intentExtras.getLong(EXTRA_ID)
}
}
protected abstract fun getSongPaths(): List<String>
protected abstract fun getSongUris(): List<Uri>
protected fun searchWebFor(vararg keys: String) {
val stringBuilder = StringBuilder()
for (key in keys) {
@ -279,27 +315,13 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
super.onBackPressed()
onBackPressedDispatcher.onBackPressed()
return true
}
}
return super.onOptionsItemSelected(item)
}
protected fun setNoImageMode() {
isInNoImageMode = true
imageContainer?.visibility = View.GONE
editorImage?.visibility = View.GONE
editorImage?.isEnabled = false
setColors(
intent.getIntExtra(
EXTRA_PALETTE,
ATHUtil.resolveColor(this, R.attr.colorPrimary)
)
)
}
protected fun dataChanged() {
showFab()
}
@ -318,7 +340,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
protected fun setImageBitmap(bitmap: Bitmap?, bgColor: Int) {
if (bitmap == null) {
editorImage.setImageResource(drawable.default_audio_art)
editorImage.setImageResource(R.drawable.default_audio_art)
} else {
editorImage.setImageBitmap(bitmap)
}
@ -330,86 +352,106 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() {
}
protected fun writeValuesToFiles(
fieldKeyValueMap: Map<FieldKey, String>, artworkInfo: ArtworkInfo?
fieldKeyValueMap: Map<FieldKey, String>,
artworkInfo: ArtworkInfo?
) {
RetroUtil.hideSoftKeyboard(this)
hideSoftKeyboard()
hideFab()
savedSongPaths = getSongPaths()
savedTags = fieldKeyValueMap
savedArtworkInfo = artworkInfo
if (!SAFUtil.isSAFRequired(savedSongPaths)) {
writeTags(savedSongPaths)
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (SAFUtil.isSDCardAccessGranted(this)) {
writeTags(savedSongPaths)
} else {
startActivityForResult(
Intent(this, SAFGuideActivity::class.java),
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE
logD(fieldKeyValueMap)
GlobalScope.launch {
if (VersionUtils.hasR()) {
cacheFiles = TagWriter.writeTagsToFilesR(
this@AbsTagEditorActivity, AudioTagInfo(
songPaths,
fieldKeyValueMap,
artworkInfo
)
)
if (cacheFiles.isNotEmpty()) {
val pendingIntent =
MediaStore.createWriteRequest(contentResolver, getSongUris())
launcher.launch(IntentSenderRequest.Builder(pendingIntent).build())
}
} else {
TagWriter.writeTagsToFiles(
this@AbsTagEditorActivity, AudioTagInfo(
songPaths,
fieldKeyValueMap,
artworkInfo
)
)
}
}
}
private fun writeTags(paths: List<String>?) {
WriteTagsAsyncTask(this).execute(
WriteTagsAsyncTask.LoadingInfo(
paths,
savedTags,
savedArtworkInfo
)
)
}
GlobalScope.launch {
if (VersionUtils.hasR()) {
cacheFiles = TagWriter.writeTagsToFilesR(
this@AbsTagEditorActivity, AudioTagInfo(
paths,
savedTags,
savedArtworkInfo
)
)
val pendingIntent = MediaStore.createWriteRequest(contentResolver, getSongUris())
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))
}
launcher.launch(IntentSenderRequest.Builder(pendingIntent).build())
} else {
TagWriter.writeTagsToFiles(
this@AbsTagEditorActivity, AudioTagInfo(
paths,
savedTags,
savedArtworkInfo
)
)
}
}
}
protected abstract fun loadImageFromFile(selectedFile: Uri?)
private lateinit var audioFile: AudioFile
private fun getAudioFile(path: String): AudioFile {
return try {
AudioFileIO.read(File(path))
if (!this::audioFile.isInitialized) {
audioFile = AudioFileIO.read(File(path))
}
audioFile
} catch (e: Exception) {
Log.e(TAG, "Could not read audio file $path", e)
AudioFile()
}
}
class ArtworkInfo constructor(val albumId: Int, val artwork: Bitmap?)
private fun writeToFiles(songUris: List<Uri>, cacheFiles: List<File>) {
if (cacheFiles.size == songUris.size) {
for (i in cacheFiles.indices) {
contentResolver.openOutputStream(songUris[i])?.use { output ->
cacheFiles[i].inputStream().use { input ->
input.copyTo(output)
}
}
}
}
lifecycleScope.launch {
TagWriter.scan(this@AbsTagEditorActivity, getSongPaths())
}
}
override fun onDestroy() {
super.onDestroy()
// Delete Cache Files
cacheFiles.forEach { file ->
file.delete()
}
}
companion object {
const val EXTRA_ID = "extra_id"
const val EXTRA_PALETTE = "extra_palette"
private val TAG = AbsTagEditorActivity::class.java.simpleName
private const val REQUEST_CODE_SELECT_IMAGE = 1000
}
}

View file

@ -0,0 +1,219 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.tageditor
import android.app.Activity
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Bundle
import android.transition.Slide
import android.view.LayoutInflater
import android.widget.ImageView
import android.widget.Toast
import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.ImageUtil
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette
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.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.shape.MaterialShapeDrawable
import org.jaudiotagger.tag.FieldKey
import java.util.*
class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBinding>() {
override val bindingInflater: (LayoutInflater) -> ActivityAlbumTagEditorBinding =
ActivityAlbumTagEditorBinding::inflate
private fun windowEnterTransition() {
val slide = Slide()
slide.excludeTarget(R.id.appBarLayout, true)
slide.excludeTarget(R.id.status_bar, true)
slide.excludeTarget(android.R.id.statusBarBackground, true)
slide.excludeTarget(android.R.id.navigationBarBackground, true)
window.enterTransition = slide
}
private var albumArtBitmap: Bitmap? = null
private var deleteAlbumArt: Boolean = false
private fun setupToolbar() {
setSupportActionBar(binding.toolbar)
binding.appBarLayout?.statusBarForeground =
MaterialShapeDrawable.createWithElevationOverlay(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.sharedElementsUseOverlay = true
binding.imageContainer.transitionName = getString(R.string.transition_album_art)
windowEnterTransition()
setUpViews()
setupToolbar()
}
private fun setUpViews() {
fillViewsWithFileTags()
binding.yearContainer.setTint(false)
binding.genreContainer.setTint(false)
binding.albumTitleContainer.setTint(false)
binding.albumArtistContainer.setTint(false)
binding.albumText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.albumArtistText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.genreTitle.appHandleColor().doAfterTextChanged { dataChanged() }
binding.yearTitle.appHandleColor().doAfterTextChanged { dataChanged() }
}
private fun fillViewsWithFileTags() {
binding.albumText.setText(albumTitle)
binding.albumArtistText.setText(albumArtistName)
binding.genreTitle.setText(genreName)
binding.yearTitle.setText(songYear)
logD(albumTitle + albumArtistName)
}
override fun loadCurrentImage() {
val bitmap = albumArt
setImageBitmap(
bitmap,
getColor(
generatePalette(bitmap),
defaultFooterColor()
)
)
deleteAlbumArt = false
}
private fun toastLoadingFailed() {
showToast(R.string.could_not_download_album_cover)
}
override fun searchImageOnWeb() {
searchWebFor(binding.albumText.text.toString(), binding.albumArtistText.text.toString())
}
override fun deleteImage() {
setImageBitmap(
BitmapFactory.decodeResource(resources, R.drawable.default_audio_art),
defaultFooterColor()
)
deleteAlbumArt = true
dataChanged()
}
override fun loadImageFromFile(selectedFile: Uri?) {
Glide.with(this@AlbumTagEditorActivity)
.asBitmapPalette()
.load(selectedFile)
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
transition: Transition<in BitmapPaletteWrapper>?
) {
getColor(resource.palette, Color.TRANSPARENT)
albumArtBitmap = resource.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) }
setImageBitmap(
albumArtBitmap,
getColor(
resource.palette,
defaultFooterColor()
)
)
deleteAlbumArt = false
dataChanged()
setResult(Activity.RESULT_OK)
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
showToast(R.string.error_load_failed, Toast.LENGTH_LONG)
}
override fun setResource(resource: BitmapPaletteWrapper?) {}
})
}
override fun save() {
val fieldKeyValueMap = EnumMap<FieldKey, String>(FieldKey::class.java)
fieldKeyValueMap[FieldKey.ALBUM] = binding.albumText.text.toString()
// android seems not to recognize album_artist field so we additionally write the normal artist field
fieldKeyValueMap[FieldKey.ARTIST] = binding.albumArtistText.text.toString()
fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = binding.albumArtistText.text.toString()
fieldKeyValueMap[FieldKey.GENRE] = binding.genreTitle.text.toString()
fieldKeyValueMap[FieldKey.YEAR] = binding.yearTitle.text.toString()
writeValuesToFiles(
fieldKeyValueMap,
when {
deleteAlbumArt -> ArtworkInfo(id, null)
albumArtBitmap == null -> null
else -> ArtworkInfo(id, albumArtBitmap!!)
}
)
}
override fun getSongPaths(): List<String> {
return repository.albumById(id).songs
.map(Song::data)
}
override fun getSongUris(): List<Uri> = repository.albumById(id).songs.map {
MusicUtil.getSongFileUri(it.id)
}
override fun setColors(color: Int) {
super.setColors(color)
saveFab.backgroundTintList = ColorStateList.valueOf(color)
saveFab.backgroundTintList = ColorStateList.valueOf(color)
ColorStateList.valueOf(
MaterialValueHelper.getPrimaryTextColor(
this,
color.isColorLight
)
).also {
saveFab.iconTint = it
saveFab.setTextColor(it)
}
}
override val editorImage: ImageView
get() = binding.editorImage
companion object {
val TAG: String = AlbumTagEditorActivity::class.java.simpleName
}
}

View file

@ -0,0 +1,214 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.activities.tageditor
import android.annotation.SuppressLint
import android.app.Activity
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.ImageView
import android.widget.Toast
import androidx.core.widget.doAfterTextChanged
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.repository.SongRepository
import code.name.monkey.retromusic.util.ImageUtil
import code.name.monkey.retromusic.util.MusicUtil
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.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.shape.MaterialShapeDrawable
import org.jaudiotagger.tag.FieldKey
import org.koin.android.ext.android.inject
import java.util.*
class SongTagEditorActivity : AbsTagEditorActivity<ActivitySongTagEditorBinding>() {
override val bindingInflater: (LayoutInflater) -> ActivitySongTagEditorBinding =
ActivitySongTagEditorBinding::inflate
private val songRepository by inject<SongRepository>()
private var albumArtBitmap: Bitmap? = null
private var deleteAlbumArt: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setUpViews()
setSupportActionBar(binding.toolbar)
binding.appBarLayout?.statusBarForeground =
MaterialShapeDrawable.createWithElevationOverlay(this)
}
@SuppressLint("ClickableViewAccessibility")
private fun setUpViews() {
fillViewsWithFileTags()
binding.songTextContainer.setTint(false)
binding.composerContainer.setTint(false)
binding.albumTextContainer.setTint(false)
binding.artistContainer.setTint(false)
binding.albumArtistContainer.setTint(false)
binding.yearContainer.setTint(false)
binding.genreContainer.setTint(false)
binding.trackNumberContainer.setTint(false)
binding.discNumberContainer.setTint(false)
binding.lyricsContainer.setTint(false)
binding.songText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.albumText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.albumArtistText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.artistText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.genreText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.yearText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.trackNumberText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.discNumberText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.lyricsText.appHandleColor().doAfterTextChanged { dataChanged() }
binding.songComposerText.appHandleColor().doAfterTextChanged { dataChanged() }
}
private fun fillViewsWithFileTags() {
binding.songText.setText(songTitle)
binding.albumArtistText.setText(albumArtist)
binding.albumText.setText(albumTitle)
binding.artistText.setText(artistName)
binding.genreText.setText(genreName)
binding.yearText.setText(songYear)
binding.trackNumberText.setText(trackNumber)
binding.discNumberText.setText(discNumber)
binding.lyricsText.setText(lyrics)
binding.songComposerText.setText(composer)
logD(songTitle + songYear)
}
override fun loadCurrentImage() {
val bitmap = albumArt
setImageBitmap(
bitmap,
RetroColorUtil.getColor(
RetroColorUtil.generatePalette(bitmap),
defaultFooterColor()
)
)
deleteAlbumArt = false
}
override fun searchImageOnWeb() {
searchWebFor(binding.songText.text.toString(), binding.artistText.text.toString())
}
override fun deleteImage() {
setImageBitmap(
BitmapFactory.decodeResource(resources, R.drawable.default_audio_art),
defaultFooterColor()
)
deleteAlbumArt = true
dataChanged()
}
override fun setColors(color: Int) {
super.setColors(color)
saveFab.backgroundTintList = ColorStateList.valueOf(color)
ColorStateList.valueOf(
MaterialValueHelper.getPrimaryTextColor(
this,
color.isColorLight
)
).also {
saveFab.iconTint = it
saveFab.setTextColor(it)
}
}
override fun save() {
val fieldKeyValueMap = EnumMap<FieldKey, String>(FieldKey::class.java)
fieldKeyValueMap[FieldKey.TITLE] = binding.songText.text.toString()
fieldKeyValueMap[FieldKey.ALBUM] = binding.albumText.text.toString()
fieldKeyValueMap[FieldKey.ARTIST] = binding.artistText.text.toString()
fieldKeyValueMap[FieldKey.GENRE] = binding.genreText.text.toString()
fieldKeyValueMap[FieldKey.YEAR] = binding.yearText.text.toString()
fieldKeyValueMap[FieldKey.TRACK] = binding.trackNumberText.text.toString()
fieldKeyValueMap[FieldKey.DISC_NO] = binding.discNumberText.text.toString()
fieldKeyValueMap[FieldKey.LYRICS] = binding.lyricsText.text.toString()
fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = binding.albumArtistText.text.toString()
fieldKeyValueMap[FieldKey.COMPOSER] = binding.songComposerText.text.toString()
writeValuesToFiles(
fieldKeyValueMap, when {
deleteAlbumArt -> ArtworkInfo(id, null)
albumArtBitmap == null -> null
else -> ArtworkInfo(id, albumArtBitmap!!)
}
)
}
override fun getSongPaths(): List<String> = listOf(songRepository.song(id).data)
override fun getSongUris(): List<Uri> = listOf(MusicUtil.getSongFileUri(id))
override fun loadImageFromFile(selectedFile: Uri?) {
Glide.with(this@SongTagEditorActivity)
.asBitmapPalette()
.load(selectedFile)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
transition: Transition<in BitmapPaletteWrapper>?
) {
RetroColorUtil.getColor(resource.palette, Color.TRANSPARENT)
albumArtBitmap = resource.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) }
setImageBitmap(
albumArtBitmap,
RetroColorUtil.getColor(
resource.palette,
defaultFooterColor()
)
)
deleteAlbumArt = false
dataChanged()
setResult(Activity.RESULT_OK)
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
showToast(R.string.error_load_failed, Toast.LENGTH_LONG)
}
override fun setResource(resource: BitmapPaletteWrapper?) {}
})
}
companion object {
val TAG: String = SongTagEditorActivity::class.java.simpleName
}
override val editorImage: ImageView
get() = binding.editorImage
}

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

@ -0,0 +1,116 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.PreferenceDialogLibraryCategoriesListitemBinding
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.SwipeAndDragHelper
import code.name.monkey.retromusic.util.SwipeAndDragHelper.ActionCompletionContract
class CategoryInfoAdapter : RecyclerView.Adapter<code.name.monkey.retromusic.adapter.CategoryInfoAdapter.ViewHolder>(),
ActionCompletionContract {
var categoryInfos: MutableList<CategoryInfo> =
PreferenceUtil.libraryCategory.toMutableList()
@SuppressLint("NotifyDataSetChanged")
set(value) {
field = value
notifyDataSetChanged()
}
private val touchHelper: ItemTouchHelper
fun attachToRecyclerView(recyclerView: RecyclerView?) {
touchHelper.attachToRecyclerView(recyclerView)
}
override fun getItemCount(): Int {
return categoryInfos.size
}
@SuppressLint("ClickableViewAccessibility")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val categoryInfo = categoryInfos[position]
holder.binding.checkbox.isChecked = categoryInfo.visible
holder.binding.title.text =
holder.binding.title.resources.getString(categoryInfo.category.stringRes)
holder.itemView.setOnClickListener {
if (!(categoryInfo.visible && isLastCheckedCategory(categoryInfo))) {
categoryInfo.visible = !categoryInfo.visible
holder.binding.checkbox.isChecked = categoryInfo.visible
} else {
holder.itemView.context.showToast(R.string.you_have_to_select_at_least_one_category)
}
}
holder.binding.dragView.setOnTouchListener { _: View?, event: MotionEvent ->
if (event.actionMasked == MotionEvent.ACTION_DOWN) {
touchHelper.startDrag(holder)
}
false
}
}
override fun onCreateViewHolder(
parent: ViewGroup, viewType: Int
): ViewHolder {
return ViewHolder(
PreferenceDialogLibraryCategoriesListitemBinding.inflate(
LayoutInflater.from(
parent.context
), parent, false
)
)
}
override fun onViewMoved(oldPosition: Int, newPosition: Int) {
val categoryInfo = categoryInfos[oldPosition]
categoryInfos.removeAt(oldPosition)
categoryInfos.add(newPosition, categoryInfo)
notifyItemMoved(oldPosition, newPosition)
}
private fun isLastCheckedCategory(categoryInfo: CategoryInfo): Boolean {
if (categoryInfo.visible) {
for (c in categoryInfos) {
if (c !== categoryInfo && c.visible) {
return false
}
}
}
return true
}
class ViewHolder(val binding: PreferenceDialogLibraryCategoriesListitemBinding) :
RecyclerView.ViewHolder(binding.root) {
init {
binding.checkbox.buttonTintList =
ColorStateList.valueOf(accentColor(binding.checkbox.context))
}
}
init {
val swipeAndDragHelper = SwipeAndDragHelper(this)
touchHelper = ItemTouchHelper(swipeAndDragHelper)
}
}

View file

@ -0,0 +1,112 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewOutlineProvider
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ItemGenreBinding
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.interfaces.IGenreClickListener
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import java.util.*
/**
* @author Hemanth S (h4h13).
*/
class GenreAdapter(
private val activity: FragmentActivity,
var dataSet: List<Genre>,
private val listener: IGenreClickListener
) : RecyclerView.Adapter<GenreAdapter.ViewHolder>() {
init {
this.setHasStableIds(true)
}
override fun getItemId(position: Int): Long {
return dataSet[position].id
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(ItemGenreBinding.inflate(LayoutInflater.from(activity), parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val genre = dataSet[position]
holder.binding.title.text = genre.name
holder.binding.text.text = String.format(
Locale.getDefault(),
"%d %s",
genre.songCount,
if (genre.songCount > 1) activity.getString(R.string.songs) else activity.getString(R.string.song)
)
loadGenreImage(genre, holder)
}
private fun loadGenreImage(genre: Genre, holder: GenreAdapter.ViewHolder) {
val genreSong = MusicUtil.songByGenre(genre.id)
Glide.with(activity)
.asBitmapPalette()
.songCoverOptions(genreSong)
.load(RetroGlideExtension.getSongModel(genreSong))
.into(object : RetroMusicColoredTarget(holder.binding.image) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(holder, colors)
}
})
// Just for a bit of shadow around image
holder.binding.image.outlineProvider = ViewOutlineProvider.BOUNDS
}
private fun setColors(holder: ViewHolder, color: MediaNotificationProcessor) {
holder.binding.imageContainerCard.setCardBackgroundColor(color.backgroundColor)
holder.binding.title.setTextColor(color.primaryTextColor)
holder.binding.text.setTextColor(color.secondaryTextColor)
}
override fun getItemCount(): Int {
return dataSet.size
}
@SuppressLint("NotifyDataSetChanged")
fun swapDataSet(list: List<Genre>) {
dataSet = list
notifyDataSetChanged()
}
inner class ViewHolder(val binding: ItemGenreBinding) : RecyclerView.ViewHolder(binding.root),
View.OnClickListener {
override fun onClick(v: View?) {
listener.onClickGenre(dataSet[layoutPosition], itemView)
}
init {
itemView.setOnClickListener(this)
}
}
}

View file

@ -0,0 +1,213 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.os.bundleOf
import androidx.fragment.app.findFragment
import androidx.navigation.findNavController
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter
import code.name.monkey.retromusic.fragments.home.HomeFragment
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Home
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
class HomeAdapter(private val activity: AppCompatActivity) :
RecyclerView.Adapter<RecyclerView.ViewHolder>(), IArtistClickListener, IAlbumClickListener {
private var list = listOf<Home>()
override fun getItemViewType(position: Int): Int {
return list[position].homeSection
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layout =
LayoutInflater.from(activity).inflate(R.layout.section_recycler_view, parent, false)
return when (viewType) {
RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout)
FAVOURITES -> PlaylistViewHolder(layout)
TOP_ALBUMS, RECENT_ALBUMS -> AlbumViewHolder(layout)
else -> {
ArtistViewHolder(layout)
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val home = list[position]
when (getItemViewType(position)) {
RECENT_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
viewHolder.bindView(home)
viewHolder.clickableArea.setOnClickListener {
it.findFragment<HomeFragment>().setSharedAxisXTransitions()
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to RECENT_ALBUMS)
)
}
}
TOP_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
viewHolder.bindView(home)
viewHolder.clickableArea.setOnClickListener {
it.findFragment<HomeFragment>().setSharedAxisXTransitions()
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to TOP_ALBUMS)
)
}
}
RECENT_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
viewHolder.bindView(home)
viewHolder.clickableArea.setOnClickListener {
it.findFragment<HomeFragment>().setSharedAxisXTransitions()
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to RECENT_ARTISTS)
)
}
}
TOP_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
viewHolder.bindView(home)
viewHolder.clickableArea.setOnClickListener {
it.findFragment<HomeFragment>().setSharedAxisXTransitions()
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to TOP_ARTISTS)
)
}
}
FAVOURITES -> {
val viewHolder = holder as PlaylistViewHolder
viewHolder.bindView(home)
viewHolder.clickableArea.setOnClickListener {
it.findFragment<HomeFragment>().setSharedAxisXTransitions()
activity.findNavController(R.id.fragment_container).navigate(
R.id.detailListFragment,
bundleOf("type" to FAVOURITES)
)
}
}
}
}
override fun getItemCount(): Int {
return list.size
}
@SuppressLint("NotifyDataSetChanged")
fun swapData(sections: List<Home>) {
list = sections
notifyDataSetChanged()
}
@Suppress("UNCHECKED_CAST")
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) {
title.setText(home.titleRes)
recyclerView.apply {
adapter = albumAdapter(home.arrayList as List<Album>)
layoutManager = gridLayoutManager()
}
}
}
@Suppress("UNCHECKED_CAST")
private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) {
title.setText(home.titleRes)
recyclerView.apply {
layoutManager = linearLayoutManager()
adapter = artistsAdapter(home.arrayList as List<Artist>)
}
}
}
@Suppress("UNCHECKED_CAST")
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(home: Home) {
title.setText(home.titleRes)
recyclerView.apply {
val songAdapter = SongAdapter(
activity,
home.arrayList as MutableList<Song>,
R.layout.item_favourite_card
)
layoutManager = linearLayoutManager()
adapter = songAdapter
}
}
}
open class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView)
val title: AppCompatTextView = itemView.findViewById(R.id.title)
val clickableArea: ViewGroup = itemView.findViewById(R.id.clickable_area)
}
private fun artistsAdapter(artists: List<Artist>) =
ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, this)
private fun albumAdapter(albums: List<Album>) =
AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, this)
private fun gridLayoutManager() =
GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
private fun linearLayoutManager() =
LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
override fun onArtist(artistId: Long, view: View) {
activity.findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to artistId),
null,
FragmentNavigatorExtras(
view to artistId.toString()
)
)
}
override fun onAlbumClick(albumId: Long, view: View) {
activity.findNavController(R.id.fragment_container).navigate(
R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to albumId),
null,
FragmentNavigatorExtras(
view to albumId.toString()
)
)
}
}

View file

@ -0,0 +1,241 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
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.*
class SearchAdapter(
private val activity: FragmentActivity,
private var dataSet: List<Any>
) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {
@SuppressLint("NotifyDataSetChanged")
fun swapDataSet(dataSet: List<Any>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
override fun getItemViewType(position: Int): Int {
if (dataSet[position] is Album) return ALBUM
if (dataSet[position] is Artist) return if ((dataSet[position] as Artist).isAlbumArtist) ALBUM_ARTIST else ARTIST
if (dataSet[position] is Genre) return GENRE
if (dataSet[position] is PlaylistWithSongs) return PLAYLIST
return if (dataSet[position] is Song) SONG else HEADER
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return when (viewType) {
HEADER -> ViewHolder(
LayoutInflater.from(activity).inflate(
R.layout.sub_header,
parent,
false
), viewType
)
ALBUM, ARTIST, ALBUM_ARTIST -> ViewHolder(
LayoutInflater.from(activity).inflate(
R.layout.item_list_big,
parent,
false
), viewType
)
else -> ViewHolder(
LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false),
viewType
)
}
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
when (getItemViewType(position)) {
ALBUM -> {
holder.imageTextContainer?.isVisible = true
val album = dataSet[position] as Album
holder.title?.text = album.title
holder.text?.text = album.artistName
Glide.with(activity).asDrawable().albumCoverOptions(album.safeGetFirstSong())
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
.into(holder.image!!)
}
ARTIST -> {
holder.imageTextContainer?.isVisible = true
val artist = dataSet[position] as Artist
holder.title?.text = artist.name
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
Glide.with(activity).asDrawable().artistImageOptions(artist).load(
RetroGlideExtension.getArtistModel(artist)
).into(holder.image!!)
}
SONG -> {
holder.imageTextContainer?.isVisible = true
val song = dataSet[position] as Song
holder.title?.text = song.title
holder.text?.text = song.albumName
Glide.with(activity).asDrawable().songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song)).into(holder.image!!)
}
GENRE -> {
val genre = dataSet[position] as Genre
holder.title?.text = genre.name
holder.text?.text = String.format(
Locale.getDefault(),
"%d %s",
genre.songCount,
if (genre.songCount > 1) activity.getString(R.string.songs) else activity.getString(
R.string.song
)
)
}
PLAYLIST -> {
val playlist = dataSet[position] as PlaylistWithSongs
holder.title?.text = playlist.playlistEntity.playlistName
//holder.text?.text = MusicUtil.playlistInfoString(activity, playlist.songs)
}
ALBUM_ARTIST -> {
holder.imageTextContainer?.isVisible = true
val artist = dataSet[position] as Artist
holder.title?.text = artist.name
holder.text?.text = MusicUtil.getArtistInfoString(activity, artist)
Glide.with(activity).asDrawable().artistImageOptions(artist).load(
RetroGlideExtension.getArtistModel(artist)
).into(holder.image!!)
}
else -> {
holder.title?.text = dataSet[position].toString()
holder.title?.setTextColor(ThemeStore.accentColor(activity))
}
}
}
override fun getItemCount(): Int {
return dataSet.size
}
inner class ViewHolder(itemView: View, itemViewType: Int) : MediaEntryViewHolder(itemView) {
init {
itemView.setOnLongClickListener(null)
imageTextContainer?.isInvisible = true
if (itemViewType == SONG) {
imageTextContainer?.isGone = true
menu?.isVisible = true
menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) {
override val song: Song
get() = dataSet[layoutPosition] as Song
})
} else {
menu?.isVisible = false
}
when (itemViewType) {
ALBUM -> setImageTransitionName(activity.getString(R.string.transition_album_art))
ARTIST -> setImageTransitionName(activity.getString(R.string.transition_artist_image))
else -> {
val container = itemView.findViewById<View>(R.id.imageContainer)
container?.isVisible = false
}
}
}
override fun onClick(v: View?) {
val item = dataSet[layoutPosition]
when (itemViewType) {
ALBUM -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to (item as Album).id)
)
}
ARTIST -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to (item as Artist).id)
)
}
ALBUM_ARTIST -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.albumArtistDetailsFragment,
bundleOf(EXTRA_ARTIST_NAME to (item as Artist).name)
)
}
GENRE -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.genreDetailsFragment,
bundleOf(EXTRA_GENRE to (item as Genre))
)
}
PLAYLIST -> {
activity.findNavController(R.id.fragment_container).navigate(
R.id.playlistDetailsFragment,
bundleOf(EXTRA_PLAYLIST_ID to (item as PlaylistWithSongs).playlistEntity.playListId)
)
}
SONG -> {
MusicPlayerRemote.playNext(item as Song)
MusicPlayerRemote.playNextSong()
}
}
}
}
companion object {
private const val HEADER = 0
private const val ALBUM = 1
private const val ARTIST = 2
private const val SONG = 3
private const val GENRE = 4
private const val PLAYLIST = 5
private const val ALBUM_ARTIST = 6
}
}

View file

@ -1,19 +1,18 @@
/*
* Copyright 2019 Google LLC
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Licensed under the GNU General Public License v3
*
* https://www.apache.org/licenses/LICENSE-2.0
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.github.muntashirakon.music.adapter
package code.name.monkey.retromusic.adapter
import android.graphics.PorterDuff
import android.view.LayoutInflater
@ -21,32 +20,31 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import code.name.monkey.appthemehelper.util.ATHUtil
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.glide.audiocover.AudioFileCover
import io.github.muntashirakon.music.interfaces.CabHolder
import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.RetroUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
import code.name.monkey.retromusic.interfaces.ICallbacks
import code.name.monkey.retromusic.util.MusicUtil
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.signature.MediaStoreSignature
import me.zhanghai.android.fastscroll.PopupTextProvider
import java.io.File
import java.text.DecimalFormat
import java.util.*
import kotlin.math.log10
import kotlin.math.pow
class SongFileAdapter(
private val activity: AppCompatActivity,
override val activity: AppCompatActivity,
private var dataSet: List<File>,
private val itemLayoutRes: Int,
private val callbacks: Callbacks?,
cabHolder: CabHolder?
private val iCallbacks: ICallbacks?
) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(
activity, cabHolder, R.menu.menu_media_selection
activity, R.menu.menu_media_selection
), PopupTextProvider {
init {
@ -78,7 +76,7 @@ class SongFileAdapter(
if (holder.itemViewType == FILE) {
holder.text?.text = getFileText(file)
} else {
holder.text?.visibility = View.GONE
holder.text?.isVisible = false
}
}
@ -96,7 +94,7 @@ class SongFileAdapter(
}
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) {
holder.image?.let {
it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN)
@ -105,21 +103,19 @@ class SongFileAdapter(
holder.imageTextContainer?.setCardBackgroundColor(
ATHUtil.resolveColor(
activity,
R.attr.colorSurface
com.google.android.material.R.attr.colorSurface
)
)
} else {
val error = RetroUtil.getTintedVectorDrawable(
activity, R.drawable.ic_file_music, iconColor
)
val error = activity.getTintedDrawable(R.drawable.ic_audio_file, iconColor)
Glide.with(activity)
.load(AudioFileCover(file.path))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error)
.placeholder(error)
.animate(android.R.anim.fade_in)
.transition(RetroGlideExtension.getDefaultTransition())
.signature(MediaStoreSignature("", file.lastModified(), 0))
.into(holder.image)
.into(holder.image!!)
}
}
@ -127,43 +123,35 @@ class SongFileAdapter(
return dataSet.size
}
override fun getIdentifier(position: Int): File? {
override fun getIdentifier(position: Int): File {
return dataSet[position]
}
override fun getName(`object`: File): String {
return getFileTitle(`object`)
override fun getName(model: File): String {
return getFileTitle(model)
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<File>) {
if (callbacks == null) return
callbacks.onMultipleItemAction(menuItem, selection)
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<File>) {
if (iCallbacks == null) return
iCallbacks.onMultipleItemAction(menuItem, selection as ArrayList<File>)
}
override fun getPopupText(position: Int): String {
return getSectionName(position)
return if (position >= dataSet.lastIndex) "" else getSectionName(position)
}
private fun getSectionName(position: Int): String {
return MusicUtil.getSectionName(dataSet[position].name)
}
interface Callbacks {
fun onFileSelected(file: File)
fun onFileMenuClicked(file: File, view: View)
fun onMultipleItemAction(item: MenuItem, files: ArrayList<File>)
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
init {
if (menu != null && callbacks != null) {
if (menu != null && iCallbacks != null) {
menu?.setOnClickListener { v ->
val position = layoutPosition
if (isPositionInRange(position)) {
callbacks.onFileMenuClicked(dataSet[position], v)
iCallbacks.onFileMenuClicked(dataSet[position], v)
}
}
}
@ -178,7 +166,7 @@ class SongFileAdapter(
if (isInQuickSelectMode) {
toggleChecked(position)
} else {
callbacks?.onFileSelected(dataSet[position])
iCallbacks?.onFileSelected(dataSet[position])
}
}
}
@ -205,4 +193,4 @@ class SongFileAdapter(
return DecimalFormat("#,##0.##").format(size / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups]
}
}
}
}

View file

@ -0,0 +1,55 @@
package code.name.monkey.retromusic.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import java.io.File
class StorageAdapter(
val storageList: List<Storage>,
val storageClickListener: StorageClickListener
) :
RecyclerView.Adapter<StorageAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_storage,
parent,
false
)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bindData(storageList[position])
}
override fun getItemCount(): Int {
return storageList.size
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val title: TextView = itemView.findViewById(R.id.title)
fun bindData(storage: Storage) {
title.text = storage.title
}
init {
itemView.setOnClickListener { storageClickListener.onStorageClicked(storageList[bindingAdapterPosition]) }
}
}
}
interface StorageClickListener {
fun onStorageClicked(storage: Storage)
}
class Storage {
lateinit var title: String
lateinit var file: File
}

View file

@ -1,39 +1,51 @@
package io.github.muntashirakon.music.adapter.album
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.album
import android.app.ActivityOptions
import android.content.res.ColorStateList
import android.content.res.Resources
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.glide.AlbumGlideRequest
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.SortOrder
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.CabHolder
import io.github.muntashirakon.music.model.Album
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.NavigationUtil
import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
open class AlbumAdapter(
protected val activity: AppCompatActivity,
override val activity: FragmentActivity,
var dataSet: List<Album>,
protected var itemLayoutRes: Int,
cabHolder: CabHolder?
var itemLayoutRes: Int,
val listener: IAlbumClickListener?
) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>(
activity,
cabHolder,
R.menu.menu_media_selection
), PopupTextProvider {
@ -47,12 +59,7 @@ open class AlbumAdapter(
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view =
try {
LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
} catch (e: Resources.NotFoundException) {
LayoutInflater.from(activity).inflate(R.layout.item_grid, parent, false)
}
val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
return createViewHolder(view, viewType)
}
@ -60,12 +67,18 @@ open class AlbumAdapter(
return ViewHolder(view)
}
private fun getAlbumTitle(album: Album): String? {
private fun getAlbumTitle(album: Album): String {
return album.title
}
protected open fun getAlbumText(album: Album): String? {
return album.artistName
return album.albumArtist.let {
if (it.isNullOrEmpty()) {
album.artistName
} else {
it
}
}
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@ -74,14 +87,12 @@ open class AlbumAdapter(
holder.itemView.isActivated = isChecked
holder.title?.text = getAlbumTitle(album)
holder.text?.text = getAlbumText(album)
holder.playSongs?.setOnClickListener {
album.songs?.let { songs ->
MusicPlayerRemote.openQueue(
songs,
0,
true
)
}
// Check if imageContainer exists so we can have a smooth transition without
// CardView clipping, if it doesn't exist in current layout set transition name to image instead.
if (holder.imageContainer != null) {
holder.imageContainer?.transitionName = album.id.toString()
} else {
holder.image?.transitionName = album.id.toString()
}
loadAlbumCover(album, holder)
}
@ -93,19 +104,20 @@ open class AlbumAdapter(
holder.paletteColorContainer?.setBackgroundColor(color.backgroundColor)
}
holder.mask?.backgroundTintList = ColorStateList.valueOf(color.primaryTextColor)
holder.imageContainerCard?.setCardBackgroundColor(color.backgroundColor)
}
protected open fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) {
return
}
AlbumGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity)
.build()
val song = album.safeGetFirstSong()
Glide.with(activity)
.asBitmapPalette()
.albumCoverOptions(song)
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(colors, holder)
}
@ -117,27 +129,28 @@ open class AlbumAdapter(
}
override fun getItemId(position: Int): Long {
return dataSet[position].id.toLong()
return dataSet[position].id
}
override fun getIdentifier(position: Int): Album? {
return dataSet[position]
}
override fun getName(album: Album): String {
return album.title!!
override fun getName(model: Album): String {
return model.title
}
override fun onMultipleItemAction(
menuItem: MenuItem, selection: ArrayList<Album>
menuItem: MenuItem,
selection: List<Album>
) {
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId)
}
private fun getSongList(albums: List<Album>): ArrayList<Song> {
private fun getSongList(albums: List<Album>): List<Song> {
val songs = ArrayList<Song>()
for (album in albums) {
songs.addAll(album.songs!!)
songs.addAll(album.songs)
}
return songs
}
@ -151,20 +164,19 @@ open class AlbumAdapter(
when (PreferenceUtil.albumSortOrder) {
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName =
dataSet[position].title
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].albumArtist
SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(
dataSet[position].year
)
}
return MusicUtil.getSectionName(sectionName)
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
setImageTransitionName(activity.getString(R.string.transition_album_art))
menu?.visibility = View.GONE
menu?.isVisible = false
}
override fun onClick(v: View?) {
@ -172,22 +184,14 @@ open class AlbumAdapter(
if (isInQuickSelectMode) {
toggleChecked(layoutPosition)
} else {
val activityOptions = ActivityOptions.makeSceneTransitionAnimation(
activity,
imageContainerCard ?: image,
activity.getString(R.string.transition_album_art)
)
NavigationUtil.goToAlbumOptions(
activity,
dataSet[layoutPosition].id,
activityOptions
)
image?.let {
listener?.onAlbumClick(dataSet[layoutPosition].id, imageContainer ?: it)
}
}
}
override fun onLongClick(v: View?): Boolean {
toggleChecked(layoutPosition)
return super.onLongClick(v)
return toggleChecked(layoutPosition)
}
}

View file

@ -1,25 +1,45 @@
package io.github.muntashirakon.music.adapter.album
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.album
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.fragments.AlbumCoverStyle
import io.github.muntashirakon.music.fragments.NowPlayingScreen.*
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.glide.SongGlideRequest
import io.github.muntashirakon.music.misc.CustomFragmentStatePagerAdapter
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.NavigationUtil
import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.fragments.AlbumCoverStyle
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import code.name.monkey.retromusic.fragments.base.goToLyrics
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
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.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -68,17 +88,17 @@ class AlbumCoverPagerAdapter(
class AlbumCoverFragment : Fragment() {
private lateinit var albumCover: ImageView
private var isColorReady: Boolean = false
private lateinit var color: MediaNotificationProcessor
private lateinit var song: Song
private var colorReceiver: ColorReceiver? = null
private var request: Int = 0
private val mainActivity get() = activity as MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
song = requireArguments().getParcelable(SONG_ARG)!!
song = BundleCompat.getParcelable(requireArguments(), SONG_ARG, Song::class.java)!!
}
}
@ -88,25 +108,26 @@ class AlbumCoverPagerAdapter(
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(getLayoutWithPlayerTheme(), container, false)
albumCover = view.findViewById(R.id.player_image)
albumCover.setOnClickListener {
showLyricsDialog()
view.setOnClickListener {
if (mainActivity.getBottomSheetBehavior().state == STATE_EXPANDED) {
showLyricsDialog()
}
}
return view
}
private fun showLyricsDialog() {
lifecycleScope.launch(Dispatchers.IO) {
val data = MusicUtil.getLyrics(song)
val data: String? = MusicUtil.getLyrics(song)
withContext(Dispatchers.Main) {
MaterialAlertDialogBuilder(
requireContext(),
R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
com.google.android.material.R.style.ThemeOverlay_MaterialComponents_Dialog_Alert
).apply {
setTitle(song.title)
setMessage(data)
setMessage(if (data.isNullOrEmpty()) "No lyrics found" else data)
setNegativeButton(R.string.synced_lyrics) { _, _ ->
NavigationUtil.goToLyrics(requireActivity())
goToLyrics(requireActivity())
}
show()
}
@ -117,6 +138,7 @@ class AlbumCoverPagerAdapter(
private fun getLayoutWithPlayerTheme(): Int {
return when (PreferenceUtil.nowPlayingScreen) {
Card, Fit, Tiny, Classic, Gradient, Full -> R.layout.fragment_album_full_cover
Peek -> R.layout.fragment_peek_album_cover
else -> {
if (PreferenceUtil.isCarouselEffect) {
R.layout.fragment_album_carousel_cover
@ -126,7 +148,6 @@ class AlbumCoverPagerAdapter(
AlbumCoverStyle.Flat -> R.layout.fragment_album_flat_cover
AlbumCoverStyle.Circle -> R.layout.fragment_album_circle_cover
AlbumCoverStyle.Card -> R.layout.fragment_album_card_cover
AlbumCoverStyle.Material -> R.layout.fragment_album_material_cover
AlbumCoverStyle.Full -> R.layout.fragment_album_full_cover
AlbumCoverStyle.FullCard -> R.layout.fragment_album_full_card_cover
}
@ -137,7 +158,7 @@ class AlbumCoverPagerAdapter(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
loadAlbumCover()
loadAlbumCover(albumCover = view.findViewById(R.id.player_image))
}
override fun onDestroyView() {
@ -145,10 +166,13 @@ class AlbumCoverPagerAdapter(
colorReceiver = null
}
private fun loadAlbumCover() {
SongGlideRequest.Builder.from(Glide.with(requireContext()), song)
.checkIgnoreMediaStore(requireContext())
.generatePalette(requireContext()).build()
private fun loadAlbumCover(albumCover: ImageView) {
Glide.with(this)
.asBitmapPalette()
.songCoverOptions(song)
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.dontAnimate()
.into(object : RetroMusicColoredTarget(albumCover) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColor(colors)
@ -184,9 +208,7 @@ class AlbumCoverPagerAdapter(
fun newInstance(song: Song): AlbumCoverFragment {
val frag = AlbumCoverFragment()
val args = Bundle()
args.putParcelable(SONG_ARG, song)
frag.arguments = args
frag.arguments = bundleOf(SONG_ARG to song)
return frag
}
}
@ -196,4 +218,3 @@ class AlbumCoverPagerAdapter(
val TAG: String = AlbumCoverPagerAdapter::class.java.simpleName
}
}

View file

@ -0,0 +1,78 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.album
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.albumCoverOptions
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
class HorizontalAlbumAdapter(
activity: FragmentActivity,
dataSet: List<Album>,
albumClickListener: IAlbumClickListener
) : AlbumAdapter(
activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, albumClickListener
) {
override fun createViewHolder(view: View, viewType: Int): ViewHolder {
val params = view.layoutParams as ViewGroup.MarginLayoutParams
HorizontalAdapterHelper.applyMarginToLayoutParams(activity, params, viewType)
return ViewHolder(view)
}
override fun setColors(color: MediaNotificationProcessor, holder: ViewHolder) {
// holder.title?.setTextColor(ATHUtil.resolveColor(activity, android.R.attr.textColorPrimary))
// holder.text?.setTextColor(ATHUtil.resolveColor(activity, android.R.attr.textColorSecondary))
}
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) return
Glide.with(activity)
.asBitmapPalette()
.albumCoverOptions(album.safeGetFirstSong())
.load(RetroGlideExtension.getSongModel(album.safeGetFirstSong()))
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(colors, holder)
}
})
}
override fun getAlbumText(album: Album): String {
return MusicUtil.getYearString(album.year)
}
override fun getItemViewType(position: Int): Int {
return HorizontalAdapterHelper.getItemViewType(position, itemCount)
}
override fun getItemCount(): Int {
return dataSet.size
}
companion object {
val TAG: String = AlbumAdapter::class.java.simpleName
}
}

View file

@ -0,0 +1,186 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.artist
import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.content.res.Resources
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.extensions.hide
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.artistImageOptions
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
import code.name.monkey.retromusic.interfaces.IArtistClickListener
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
class ArtistAdapter(
override val activity: FragmentActivity,
var dataSet: List<Artist>,
var itemLayoutRes: Int,
val IArtistClickListener: IArtistClickListener,
val IAlbumArtistClickListener: IAlbumArtistClickListener? = null
) : AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist>(activity, R.menu.menu_media_selection),
PopupTextProvider {
var albumArtistsOnly = false
init {
this.setHasStableIds(true)
}
@SuppressLint("NotifyDataSetChanged")
fun swapDataSet(dataSet: List<Artist>) {
this.dataSet = dataSet
notifyDataSetChanged()
albumArtistsOnly = PreferenceUtil.albumArtistsOnly
}
override fun getItemId(position: Int): Long {
return dataSet[position].id
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view =
try {
LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
} catch (e: Resources.NotFoundException) {
LayoutInflater.from(activity).inflate(R.layout.item_grid_circle, parent, false)
}
return createViewHolder(view)
}
private fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val artist = dataSet[position]
val isChecked = isChecked(artist)
holder.itemView.isActivated = isChecked
holder.title?.text = artist.name
holder.text?.hide()
val transitionName =
if (albumArtistsOnly) artist.name else artist.id.toString()
if (holder.imageContainer != null) {
holder.imageContainer?.transitionName = transitionName
} else {
holder.image?.transitionName = transitionName
}
loadArtistImage(artist, holder)
}
private fun setColors(processor: MediaNotificationProcessor, holder: ViewHolder) {
holder.mask?.backgroundTintList = ColorStateList.valueOf(processor.primaryTextColor)
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer?.setBackgroundColor(processor.backgroundColor)
holder.title?.setTextColor(processor.primaryTextColor)
}
holder.imageContainerCard?.setCardBackgroundColor(processor.backgroundColor)
}
private fun loadArtistImage(artist: Artist, holder: ViewHolder) {
if (holder.image == null) {
return
}
Glide.with(activity)
.asBitmapPalette()
.artistImageOptions(artist)
.load(RetroGlideExtension.getArtistModel(artist))
.transition(RetroGlideExtension.getDefaultTransition())
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(colors, holder)
}
})
}
override fun getItemCount(): Int {
return dataSet.size
}
override fun getIdentifier(position: Int): Artist {
return dataSet[position]
}
override fun getName(model: Artist): String {
return model.name
}
override fun onMultipleItemAction(
menuItem: MenuItem,
selection: List<Artist>
) {
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId)
}
private fun getSongList(artists: List<Artist>): List<Song> {
val songs = ArrayList<Song>()
for (artist in artists) {
songs.addAll(artist.songs) // maybe async in future?
}
return songs
}
override fun getPopupText(position: Int): String {
return getSectionName(position)
}
private fun getSectionName(position: Int): String {
return MusicUtil.getSectionName(dataSet[position].name)
}
inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
init {
menu?.isVisible = false
}
override fun onClick(v: View?) {
super.onClick(v)
if (isInQuickSelectMode) {
toggleChecked(layoutPosition)
} else {
val artist = dataSet[layoutPosition]
image?.let {
if (albumArtistsOnly && IAlbumArtistClickListener != null) {
IAlbumArtistClickListener.onAlbumArtist(artist.name, imageContainer ?: it)
} else {
IArtistClickListener.onArtist(artist.id, imageContainer ?: it)
}
}
}
}
override fun onLongClick(v: View?): Boolean {
return toggleChecked(layoutPosition)
}
}
}

View file

@ -0,0 +1,65 @@
package code.name.monkey.retromusic.adapter.backup
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ItemListBackupBinding
import java.io.File
class BackupAdapter(
val activity: FragmentActivity,
var dataSet: MutableList<File>,
val backupClickedListener: BackupClickedListener
) : RecyclerView.Adapter<BackupAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
ItemListBackupBinding.inflate(LayoutInflater.from(activity), parent, false)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.binding.title.text = dataSet[position].nameWithoutExtension
}
override fun getItemCount(): Int = dataSet.size
@SuppressLint("NotifyDataSetChanged")
fun swapDataset(dataSet: List<File>) {
this.dataSet = ArrayList(dataSet)
notifyDataSetChanged()
}
inner class ViewHolder(val binding: ItemListBackupBinding) :
RecyclerView.ViewHolder(binding.root) {
init {
binding.menu.setOnClickListener { view ->
val popupMenu = PopupMenu(activity, view)
popupMenu.inflate(R.menu.menu_backup)
popupMenu.setOnMenuItemClickListener { menuItem ->
return@setOnMenuItemClickListener backupClickedListener.onBackupMenuClicked(
dataSet[bindingAdapterPosition],
menuItem
)
}
popupMenu.show()
}
itemView.setOnClickListener {
backupClickedListener.onBackupClicked(dataSet[bindingAdapterPosition])
}
}
}
interface BackupClickedListener {
fun onBackupClicked(file: File)
fun onBackupMenuClicked(file: File, menuItem: MenuItem): Boolean
}
}

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,23 +12,22 @@
* 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.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.AppCompatImageView;
import com.google.android.material.card.MaterialCardView;
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
implements View.OnLongClickListener, View.OnClickListener {
@ -41,18 +40,13 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
@Nullable
public ImageView image;
@Nullable
public ImageView artistImage;
@Nullable
public ImageView playerImage;
@Nullable
public ViewGroup imageContainer;
@Nullable
public MaterialCardView imageContainerCard;
@Nullable
public FrameLayout imageContainer;
@Nullable
public TextView imageText;
@ -63,20 +57,17 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
public View mask;
@Nullable
public View menu;
public AppCompatImageView menu;
@Nullable
public View paletteColorContainer;
@Nullable
public ImageButton playSongs;
@Nullable
public RecyclerView recyclerView;
@Nullable
public TextView text;
@Nullable
public TextView text2;
@Nullable
public TextView time;
@ -87,23 +78,20 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
super(itemView);
title = itemView.findViewById(R.id.title);
text = itemView.findViewById(R.id.text);
text2 = itemView.findViewById(R.id.text2);
image = itemView.findViewById(R.id.image);
artistImage = itemView.findViewById(R.id.artistImage);
playerImage = itemView.findViewById(R.id.player_image);
time = itemView.findViewById(R.id.time);
imageText = itemView.findViewById(R.id.imageText);
imageContainer = itemView.findViewById(R.id.imageContainer);
imageTextContainer = itemView.findViewById(R.id.imageTextContainer);
imageContainerCard = itemView.findViewById(R.id.imageContainerCard);
imageContainer = itemView.findViewById(R.id.imageContainer);
menu = itemView.findViewById(R.id.menu);
dragView = itemView.findViewById(R.id.drag_view);
paletteColorContainer = itemView.findViewById(R.id.paletteColorContainer);
recyclerView = itemView.findViewById(R.id.recycler_view);
mask = itemView.findViewById(R.id.mask);
playSongs = itemView.findViewById(R.id.playSongs);
dummyContainer = itemView.findViewById(R.id.dummy_view);
if (imageContainerCard != null) {
@ -113,6 +101,7 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
itemView.setOnLongClickListener(this);
}
@Nullable
@Override
public View getSwipeableContainerView() {
return null;
@ -120,7 +109,6 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
@Override
public void onClick(View v) {
}
@Override
@ -129,11 +117,12 @@ public class MediaEntryViewHolder extends AbstractDraggableSwipeableItemViewHold
}
public void setImageTransitionName(@NonNull String transitionName) {
if (imageContainerCard != null) {
imageContainerCard.setTransitionName(transitionName);
}
if (image != null) {
image.setTransitionName(transitionName);
}
itemView.setTransitionName(transitionName);
/* if (imageContainerCard != null) {
imageContainerCard.setTransitionName(transitionName);
}
if (image != null) {
image.setTransitionName(transitionName);
}*/
}
}

View file

@ -0,0 +1,65 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.playlist
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.util.MusicUtil
class LegacyPlaylistAdapter(
private val activity: FragmentActivity,
private var list: List<Playlist>,
private val layoutRes: Int,
private val playlistClickListener: PlaylistClickListener
) :
RecyclerView.Adapter<LegacyPlaylistAdapter.ViewHolder>() {
fun swapData(list: List<Playlist>) {
this.list = list
notifyDataSetChanged()
}
class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView)
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(layoutRes, parent, false)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val playlist: Playlist = list[position]
holder.title?.text = playlist.name
holder.text?.text = MusicUtil.getPlaylistInfoString(activity, playlist.getSongs())
holder.itemView.setOnClickListener {
playlistClickListener.onPlaylistClick(playlist)
}
}
override fun getItemCount(): Int {
return list.size
}
interface PlaylistClickListener {
fun onPlaylistClick(playlist: Playlist)
}
}

View file

@ -0,0 +1,186 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.playlist
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isGone
import androidx.core.view.setPadding
import androidx.fragment.app.FragmentActivity
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.toSongs
import code.name.monkey.retromusic.extensions.dipToPix
import code.name.monkey.retromusic.glide.RetroGlideExtension.playlistOptions
import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
class PlaylistAdapter(
override val activity: FragmentActivity,
var dataSet: List<PlaylistWithSongs>,
private var itemLayoutRes: Int,
private val listener: IPlaylistClickListener
) : AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, PlaylistWithSongs>(
activity,
R.menu.menu_playlists_selection
), PopupTextProvider {
init {
setHasStableIds(true)
}
fun swapDataSet(dataSet: List<PlaylistWithSongs>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
override fun getItemId(position: Int): Long {
return dataSet[position].playlistEntity.playListId
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
return createViewHolder(view)
}
private fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view)
}
private fun getPlaylistTitle(playlist: PlaylistEntity): String {
return playlist.playlistName.ifEmpty { "-" }
}
private fun getPlaylistText(playlist: PlaylistWithSongs): String {
return MusicUtil.getPlaylistInfoString(activity, playlist.songs.toSongs())
}
override fun getPopupText(position: Int): String {
val sectionName: String = when (PreferenceUtil.playlistSortOrder) {
PlaylistSortOrder.PLAYLIST_A_Z, PlaylistSortOrder.PLAYLIST_Z_A -> dataSet[position].playlistEntity.playlistName
PlaylistSortOrder.PLAYLIST_SONG_COUNT, PlaylistSortOrder.PLAYLIST_SONG_COUNT_DESC -> dataSet[position].songs.size.toString()
else -> {
return ""
}
}
return MusicUtil.getSectionName(sectionName)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val playlist = dataSet[position]
holder.itemView.isActivated = isChecked(playlist)
holder.title?.text = getPlaylistTitle(playlist.playlistEntity)
holder.text?.text = getPlaylistText(playlist)
holder.menu?.isGone = isChecked(playlist)
if (itemLayoutRes == R.layout.item_list) {
holder.image?.setPadding(activity.dipToPix(8F).toInt())
holder.image?.setImageDrawable(getIconRes())
} else {
Glide.with(activity)
.load(PlaylistPreview(playlist))
.playlistOptions()
.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 {
return dataSet.size
}
override fun getIdentifier(position: Int): PlaylistWithSongs {
return dataSet[position]
}
override fun getName(model: PlaylistWithSongs): String {
return model.playlistEntity.playlistName
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<PlaylistWithSongs>) {
when (menuItem.itemId) {
else -> SongsMenuHelper.handleMenuClick(
activity,
getSongList(selection),
menuItem.itemId
)
}
}
private fun getSongList(playlists: List<PlaylistWithSongs>): List<Song> {
val songs = mutableListOf<Song>()
playlists.forEach {
songs.addAll(it.songs.toSongs())
}
return songs
}
inner class ViewHolder(itemView: View) : code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder(itemView) {
init {
menu?.setOnClickListener { view ->
val popupMenu = PopupMenu(activity, view)
popupMenu.inflate(R.menu.menu_item_playlist)
popupMenu.setOnMenuItemClickListener { item ->
PlaylistMenuHelper.handleMenuClick(activity, dataSet[layoutPosition], item)
}
popupMenu.show()
}
imageTextContainer?.apply {
cardElevation = 0f
setCardBackgroundColor(Color.TRANSPARENT)
}
}
override fun onClick(v: View?) {
if (isInQuickSelectMode) {
toggleChecked(layoutPosition)
} else {
itemView.transitionName = "playlist"
listener.onPlaylistClick(dataSet[layoutPosition], itemView)
}
}
override fun onLongClick(v: View?): Boolean {
toggleChecked(layoutPosition)
return true
}
}
companion object {
val TAG: String = PlaylistAdapter::class.java.simpleName
}
}

View file

@ -1,21 +1,33 @@
package io.github.muntashirakon.music.adapter.song
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.song
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.CabHolder
import io.github.muntashirakon.music.model.Song
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
abstract class AbsOffsetSongAdapter(
activity: AppCompatActivity,
activity: FragmentActivity,
dataSet: MutableList<Song>,
@LayoutRes itemLayoutRes: Int,
cabHolder: CabHolder?
) : SongAdapter(activity, dataSet, itemLayoutRes, cabHolder) {
@LayoutRes itemLayoutRes: Int
) : SongAdapter(activity, dataSet, itemLayoutRes) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
if (viewType == OFFSET_ITEM) {
@ -76,4 +88,4 @@ abstract class AbsOffsetSongAdapter(
const val OFFSET_ITEM = 0
const val SONG = 1
}
}
}

View file

@ -0,0 +1,134 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.song
import android.view.MenuItem
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.db.toSongsEntity
import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.ViewUtil
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel
class OrderablePlaylistSongAdapter(
private val playlistId: Long,
activity: FragmentActivity,
dataSet: MutableList<Song>,
itemLayoutRes: Int,
) : SongAdapter(activity, dataSet, itemLayoutRes),
DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
val libraryViewModel: LibraryViewModel by activity.viewModel()
init {
this.setHasStableIds(true)
this.setMultiSelectMenuRes(R.menu.menu_playlists_songs_selection)
}
override fun getItemId(position: Int): Long {
// requires static value, it means need to keep the same value
// even if the item position has been changed.
return dataSet[position].id
}
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<Song>) {
when (menuItem.itemId) {
R.id.action_remove_from_playlist -> RemoveSongFromPlaylistDialog.create(
selection.toSongsEntity(
playlistId
)
)
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
else -> super.onMultipleItemAction(menuItem, selection)
}
}
inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) {
override var songMenuRes: Int
get() = R.menu.menu_item_playlist_song
set(value) {
super.songMenuRes = value
}
override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_remove_from_playlist -> {
RemoveSongFromPlaylistDialog.create(song.toSongEntity(playlistId))
.show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
return true
}
}
return super.onSongMenuItemClick(item)
}
init {
dragView?.isVisible = true
}
}
override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean {
if (isInQuickSelectMode) {
return false
}
return ViewUtil.hitTest(holder.imageText!!, x, y) || ViewUtil.hitTest(
holder.dragView!!,
x,
y
)
}
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
dataSet.add(toPosition, dataSet.removeAt(fromPosition))
}
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange? {
return null
}
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
return true
}
override fun onItemDragStarted(position: Int) {
notifyDataSetChanged()
}
override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) {
notifyDataSetChanged()
}
fun saveSongs(playlistEntity: PlaylistEntity) {
activity.lifecycleScope.launch(Dispatchers.IO) {
libraryViewModel.insertSongs(dataSet.toSongsEntity(playlistEntity))
}
}
}

View file

@ -1,16 +1,34 @@
package io.github.muntashirakon.music.adapter.song
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.song
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.MusicPlayerRemote.isPlaying
import io.github.muntashirakon.music.helper.MusicPlayerRemote.playNextSong
import io.github.muntashirakon.music.helper.MusicPlayerRemote.removeFromQueue
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.ViewUtil
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicPlayerRemote.isPlaying
import code.name.monkey.retromusic.helper.MusicPlayerRemote.playNextSong
import code.name.monkey.retromusic.helper.MusicPlayerRemote.removeFromQueue
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
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.ItemDraggableRange
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
@ -19,17 +37,15 @@ import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemConstant
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultAction
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionDefault
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionRemoveItem
import com.h6ah4i.android.widget.advrecyclerview.swipeable.annotation.SwipeableItemResults
import me.zhanghai.android.fastscroll.PopupTextProvider
class PlayingQueueAdapter(
activity: AppCompatActivity,
activity: FragmentActivity,
dataSet: MutableList<Song>,
private var current: Int,
itemLayoutRes: Int
) : SongAdapter(
activity, dataSet, itemLayoutRes, null
), DraggableItemAdapter<PlayingQueueAdapter.ViewHolder>,
itemLayoutRes: Int,
) : SongAdapter(activity, dataSet, itemLayoutRes),
DraggableItemAdapter<PlayingQueueAdapter.ViewHolder>,
SwipeableItemAdapter<PlayingQueueAdapter.ViewHolder>,
PopupTextProvider {
@ -41,8 +57,8 @@ class PlayingQueueAdapter(
override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
holder.imageText?.text = (position - current).toString()
holder.time?.text = MusicUtil.getReadableDurationString(dataSet[position].duration)
val song = dataSet[position]
holder.time?.text = MusicUtil.getReadableDurationString(song.duration)
if (holder.itemViewType == HISTORY || holder.itemViewType == CURRENT) {
setAlpha(holder, 0.5f)
}
@ -58,7 +74,13 @@ class PlayingQueueAdapter(
}
override fun loadAlbumCover(song: Song, holder: SongAdapter.ViewHolder) {
// We don't want to load it in this adapter
if (holder.image == null) {
return
}
Glide.with(activity)
.load(RetroGlideExtension.getSongModel(song))
.songCoverOptions(song)
.into(holder.image!!)
}
fun swapDataSet(dataSet: List<Song>, position: Int) {
@ -76,7 +98,6 @@ class PlayingQueueAdapter(
holder.image?.alpha = alpha
holder.title?.alpha = alpha
holder.text?.alpha = alpha
holder.imageText?.alpha = alpha
holder.paletteColorContainer?.alpha = alpha
holder.dragView?.alpha = alpha
holder.menu?.alpha = alpha
@ -129,8 +150,15 @@ class PlayingQueueAdapter(
}
init {
imageText?.visibility = View.VISIBLE
dragView?.visibility = View.VISIBLE
dragView?.isVisible = true
}
override fun onClick(v: View?) {
if (isInQuickSelectMode) {
toggleChecked(layoutPosition)
} else {
MusicPlayerRemote.playSongAt(layoutPosition)
}
}
override fun onSongMenuItemClick(item: MenuItem): Boolean {
@ -152,8 +180,8 @@ class PlayingQueueAdapter(
mDragStateFlags = flags
}
override fun getSwipeableContainerView(): View? {
return dummyContainer
override fun getSwipeableContainerView(): View {
return dummyContainer!!
}
}
@ -164,52 +192,46 @@ class PlayingQueueAdapter(
private const val UP_NEXT = 2
}
override fun onSwipeItem(
holder: ViewHolder?,
position: Int, @SwipeableItemResults result: Int
): SwipeResultAction {
return if (result === SwipeableItemConstants.RESULT_CANCELED) {
override fun onSwipeItem(holder: ViewHolder, position: Int, result: Int): SwipeResultAction {
return if (result == SwipeableItemConstants.RESULT_CANCELED) {
SwipeResultActionDefault()
} else {
SwipedResultActionRemoveItem(this, position, activity)
SwipedResultActionRemoveItem(this, position)
}
}
override fun onGetSwipeReactionType(holder: ViewHolder?, position: Int, x: Int, y: Int): Int {
return if (onCheckCanStartDrag(holder!!, position, x, y)) {
override fun onGetSwipeReactionType(holder: ViewHolder, position: Int, x: Int, y: Int): Int {
return if (onCheckCanStartDrag(holder, position, x, y)) {
SwipeableItemConstants.REACTION_CAN_NOT_SWIPE_BOTH_H
} else {
SwipeableItemConstants.REACTION_CAN_SWIPE_BOTH_H
}
}
override fun onSwipeItemStarted(p0: ViewHolder?, p1: Int) {
override fun onSwipeItemStarted(holder: ViewHolder, p1: Int) {
}
override fun onSetSwipeBackground(holder: ViewHolder?, position: Int, result: Int) {
override fun onSetSwipeBackground(holder: ViewHolder, position: Int, result: Int) {
}
internal class SwipedResultActionRemoveItem(
private val adapter: PlayingQueueAdapter,
private val position: Int,
private val activity: AppCompatActivity
) : SwipeResultActionRemoveItem() {
private var songToRemove: Song? = null
private val isPlaying: Boolean = MusicPlayerRemote.isPlaying
private val songProgressMillis = 0
override fun onPerformAction() {
//currentlyShownSnackbar = null
// currentlyShownSnackbar = null
}
override fun onSlideAnimationEnd() {
//initializeSnackBar(adapter, position, activity, isPlaying)
// initializeSnackBar(adapter, position, activity, isPlaying)
songToRemove = adapter.dataSet[position]
//If song removed was the playing song, then play the next song
// If song removed was the playing song, then play the next song
if (isPlaying(songToRemove!!)) {
playNextSong()
}
//Swipe animation is much smoother when we do the heavy lifting after it's completed
// Swipe animation is much smoother when we do the heavy lifting after it's completed
adapter.setSongToRemove(songToRemove!!)
removeFromQueue(songToRemove!!)
}

View file

@ -0,0 +1,81 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.song
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.accentOutlineColor
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.google.android.material.button.MaterialButton
class ShuffleButtonSongAdapter(
activity: FragmentActivity,
dataSet: MutableList<Song>,
itemLayoutRes: Int
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes) {
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
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)
val landscape = RetroUtil.isLandscape
if ((PreferenceUtil.songGridSize > 2 && !landscape) || (PreferenceUtil.songGridSizeLand > 5 && landscape)) {
holder.menu?.isVisible = false
}
}
}
inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) {
val playAction: MaterialButton? = itemView.findViewById(R.id.playAction)
val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction)
override fun onClick(v: View?) {
if (itemViewType == OFFSET_ITEM) {
MusicPlayerRemote.openAndShuffleQueue(dataSet, true)
return
}
super.onClick(v)
}
}
}

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.song
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
class SimpleSongAdapter(
context: FragmentActivity,
songs: ArrayList<Song>,
layoutRes: Int
) : SongAdapter(context, songs, layoutRes) {
override fun swapDataSet(dataSet: List<Song>) {
this.dataSet = dataSet.toMutableList()
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
val fixedTrackNumber = MusicUtil.getFixedTrackNumber(dataSet[position].trackNumber)
val trackAndTime = (if (fixedTrackNumber > 0) "$fixedTrackNumber | " else "") +
MusicUtil.getReadableDurationString(dataSet[position].duration)
holder.time?.text = trackAndTime
holder.text2?.text = dataSet[position].artistName
}
override fun getItemCount(): Int {
return dataSet.size
}
}

View file

@ -1,31 +1,47 @@
package io.github.muntashirakon.music.adapter.song
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.adapter.song
import android.app.ActivityOptions
import android.content.res.ColorStateList
import android.content.res.Resources
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.adapter.base.AbsMultiSelectAdapter
import io.github.muntashirakon.music.adapter.base.MediaEntryViewHolder
import io.github.muntashirakon.music.extensions.hide
import io.github.muntashirakon.music.extensions.show
import io.github.muntashirakon.music.glide.RetroMusicColoredTarget
import io.github.muntashirakon.music.glide.SongGlideRequest
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.helper.SortOrder
import io.github.muntashirakon.music.helper.menu.SongMenuHelper
import io.github.muntashirakon.music.helper.menu.SongsMenuHelper
import io.github.muntashirakon.music.interfaces.CabHolder
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.NavigationUtil
import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.color.MediaNotificationProcessor
import com.afollestad.materialcab.MaterialCab
import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import androidx.navigation.findNavController
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import me.zhanghai.android.fastscroll.PopupTextProvider
@ -34,16 +50,14 @@ import me.zhanghai.android.fastscroll.PopupTextProvider
*/
open class SongAdapter(
protected val activity: AppCompatActivity,
override val activity: FragmentActivity,
var dataSet: MutableList<Song>,
protected var itemLayoutRes: Int,
cabHolder: CabHolder?,
showSectionName: Boolean = true
) : AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>(
activity,
cabHolder,
R.menu.menu_media_selection
), MaterialCab.Callback, PopupTextProvider {
), PopupTextProvider {
private var showSectionName = true
@ -58,7 +72,7 @@ open class SongAdapter(
}
override fun getItemId(position: Int): Long {
return dataSet[position].id.toLong()
return dataSet[position].id
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@ -79,14 +93,15 @@ open class SongAdapter(
val song = dataSet[position]
val isChecked = isChecked(song)
holder.itemView.isActivated = isChecked
if (isChecked) {
holder.menu?.hide()
} else {
holder.menu?.show()
}
holder.menu?.isGone = isChecked
holder.title?.text = getSongTitle(song)
holder.text?.text = getSongText(song)
holder.text2?.text = getSongText(song)
loadAlbumCover(song, holder)
val landscape = RetroUtil.isLandscape
if ((PreferenceUtil.songGridSize > 2 && !landscape) || (PreferenceUtil.songGridSizeLand > 5 && landscape)) {
holder.menu?.isVisible = false
}
}
private fun setColors(color: MediaNotificationProcessor, holder: ViewHolder) {
@ -94,6 +109,7 @@ open class SongAdapter(
holder.title?.setTextColor(color.primaryTextColor)
holder.text?.setTextColor(color.secondaryTextColor)
holder.paletteColorContainer?.setBackgroundColor(color.backgroundColor)
holder.menu?.imageTintList = ColorStateList.valueOf(color.primaryTextColor)
}
holder.mask?.backgroundTintList = ColorStateList.valueOf(color.primaryTextColor)
}
@ -102,9 +118,10 @@ open class SongAdapter(
if (holder.image == null) {
return
}
SongGlideRequest.Builder.from(Glide.with(activity), song)
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
Glide.with(activity)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(colors: MediaNotificationProcessor) {
setColors(colors, holder)
@ -112,14 +129,18 @@ open class SongAdapter(
})
}
private fun getSongTitle(song: Song): String? {
private fun getSongTitle(song: Song): String {
return song.title
}
private fun getSongText(song: Song): String? {
private fun getSongText(song: Song): String {
return song.artistName
}
private fun getSongText2(song: Song): String {
return song.albumName
}
override fun getItemCount(): Int {
return dataSet.size
}
@ -128,26 +149,31 @@ open class SongAdapter(
return dataSet[position]
}
override fun getName(song: Song): String {
return song.title
override fun getName(model: Song): String {
return model.title
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<Song>) {
override fun onMultipleItemAction(menuItem: MenuItem, selection: List<Song>) {
SongsMenuHelper.handleMenuClick(activity, selection, menuItem.itemId)
}
override fun getPopupText(position: Int): String {
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_ALBUM -> dataSet[position].albumName
SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName
SortOrder.SongSortOrder.SONG_YEAR -> return MusicUtil.getYearString(dataSet[position].year)
SortOrder.SongSortOrder.COMPOSER -> dataSet[position].composer
SortOrder.SongSortOrder.SONG_ALBUM_ARTIST -> dataSet[position].albumArtist
else -> {
return ""
}
}
return MusicUtil.getSectionName(sectionName)
}
@ -157,7 +183,6 @@ open class SongAdapter(
get() = dataSet[layoutPosition]
init {
setImageTransitionName(activity.getString(R.string.transition_album_art))
menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) {
override val song: Song
get() = this@ViewHolder.song
@ -172,15 +197,14 @@ open class SongAdapter(
}
protected open fun onSongMenuItemClick(item: MenuItem): Boolean {
if (image != null && image!!.visibility == View.VISIBLE) {
if (image != null && image!!.isVisible) {
when (item.itemId) {
R.id.action_go_to_album -> {
val activityOptions = ActivityOptions.makeSceneTransitionAnimation(
activity,
imageContainerCard ?: image,
activity.getString(R.string.transition_album_art)
)
NavigationUtil.goToAlbumOptions(activity, song.albumId, activityOptions)
activity.findNavController(R.id.fragment_container)
.navigate(
R.id.albumDetailsFragment,
bundleOf(EXTRA_ALBUM_ID to song.albumId)
)
return true
}
}
@ -197,6 +221,7 @@ open class SongAdapter(
}
override fun onLongClick(v: View?): Boolean {
println("Long click")
return toggleChecked(layoutPosition)
}
}

View file

@ -1,32 +1,30 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appshortcuts
package code.name.monkey.retromusic.appshortcuts
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.graphics.drawable.Icon
import android.graphics.drawable.LayerDrawable
import android.os.Build
import android.util.TypedValue
import androidx.annotation.RequiresApi
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.ThemeStore
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.util.PreferenceUtil
import io.github.muntashirakon.music.util.RetroUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.util.PreferenceUtil
@RequiresApi(Build.VERSION_CODES.N_MR1)
object AppShortcutIconGenerator {
@ -60,28 +58,20 @@ object AppShortcutIconGenerator {
}
private fun generateThemedIcon(
context: Context, iconId: Int, foregroundColor: Int, backgroundColor: Int
context: Context,
iconId: Int,
foregroundColor: Int,
backgroundColor: Int,
): Icon {
// Get and tint foreground and background drawables
val vectorDrawable = RetroUtil.getTintedVectorDrawable(context, iconId, foregroundColor)
val backgroundDrawable = RetroUtil.getTintedVectorDrawable(
context, R.drawable.ic_app_shortcut_background, backgroundColor
)
val vectorDrawable = context.getTintedDrawable(iconId, foregroundColor)
val backgroundDrawable =
context.getTintedDrawable(R.drawable.ic_app_shortcut_background, backgroundColor)
// Squash the two drawables together
val layerDrawable = LayerDrawable(arrayOf(backgroundDrawable, vectorDrawable))
// Return as an Icon
return Icon.createWithBitmap(drawableToBitmap(layerDrawable))
}
private fun drawableToBitmap(drawable: Drawable): Bitmap {
val bitmap = Bitmap.createBitmap(
drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
return bitmap
return Icon.createWithBitmap(layerDrawable.toBitmap())
}
}

View file

@ -0,0 +1,84 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.appshortcuts
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.core.os.bundleOf
import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
import code.name.monkey.retromusic.extensions.extraNotNull
import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist
import code.name.monkey.retromusic.model.smartplaylist.ShuffleAllPlaylist
import code.name.monkey.retromusic.model.smartplaylist.TopTracksPlaylist
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PLAY_PLAYLIST
import code.name.monkey.retromusic.service.MusicService.Companion.INTENT_EXTRA_PLAYLIST
import code.name.monkey.retromusic.service.MusicService.Companion.INTENT_EXTRA_SHUFFLE_MODE
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_NONE
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_SHUFFLE
class AppShortcutLauncherActivity : Activity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
when (extraNotNull(KEY_SHORTCUT_TYPE, SHORTCUT_TYPE_NONE).value) {
SHORTCUT_TYPE_SHUFFLE_ALL -> {
startServiceWithPlaylist(
SHUFFLE_MODE_SHUFFLE, ShuffleAllPlaylist()
)
DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.id)
}
SHORTCUT_TYPE_TOP_TRACKS -> {
startServiceWithPlaylist(
SHUFFLE_MODE_NONE, TopTracksPlaylist()
)
DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.id)
}
SHORTCUT_TYPE_LAST_ADDED -> {
startServiceWithPlaylist(
SHUFFLE_MODE_NONE, LastAddedPlaylist()
)
DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.id)
}
}
finish()
}
private fun startServiceWithPlaylist(shuffleMode: Int, playlist: Playlist) {
val intent = Intent(this, MusicService::class.java)
intent.action = ACTION_PLAY_PLAYLIST
val bundle = bundleOf(
INTENT_EXTRA_PLAYLIST to playlist,
INTENT_EXTRA_SHUFFLE_MODE to shuffleMode
)
intent.putExtras(bundle)
startService(intent)
}
companion object {
const val KEY_SHORTCUT_TYPE = "io.github.muntashirakon.Music.appshortcuts.ShortcutType"
const val SHORTCUT_TYPE_SHUFFLE_ALL = 0L
const val SHORTCUT_TYPE_TOP_TRACKS = 1L
const val SHORTCUT_TYPE_LAST_ADDED = 2L
const val SHORTCUT_TYPE_NONE = 4L
}
}

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appshortcuts
package code.name.monkey.retromusic.appshortcuts
import android.annotation.TargetApi
import android.content.Context
@ -21,34 +21,31 @@ import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon
import android.os.Build
import io.github.muntashirakon.music.appshortcuts.shortcuttype.LastAddedShortcutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.SearchShortCutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.ShuffleAllShortcutType
import io.github.muntashirakon.music.appshortcuts.shortcuttype.TopTracksShortcutType
import java.util.*
import androidx.core.content.getSystemService
import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
@TargetApi(Build.VERSION_CODES.N_MR1)
class DynamicShortcutManager(private val context: Context) {
private val shortcutManager: ShortcutManager =
this.context.getSystemService(ShortcutManager::class.java)
private val shortcutManager: ShortcutManager? =
this.context.getSystemService()
private val defaultShortcuts: List<ShortcutInfo>
get() = Arrays.asList(
SearchShortCutType(context).shortcutInfo,
get() = listOf(
ShuffleAllShortcutType(context).shortcutInfo,
TopTracksShortcutType(context).shortcutInfo,
LastAddedShortcutType(context).shortcutInfo
)
fun initDynamicShortcuts() {
//if (shortcutManager.dynamicShortcuts.size == 0) {
shortcutManager.dynamicShortcuts = defaultShortcuts
//}
// if (shortcutManager.dynamicShortcuts.size == 0) {
shortcutManager?.dynamicShortcuts = defaultShortcuts
// }
}
fun updateDynamicShortcuts() {
shortcutManager.updateShortcuts(defaultShortcuts)
shortcutManager?.updateShortcuts(defaultShortcuts)
}
companion object {
@ -61,12 +58,16 @@ class DynamicShortcutManager(private val context: Context) {
icon: Icon,
intent: Intent
): ShortcutInfo {
return ShortcutInfo.Builder(context, id).setShortLabel(shortLabel)
.setLongLabel(longLabel).setIcon(icon).setIntent(intent).build()
return ShortcutInfo.Builder(context, id)
.setShortLabel(shortLabel)
.setLongLabel(longLabel)
.setIcon(icon)
.setIntent(intent)
.build()
}
fun reportShortcutUsed(context: Context, shortcutId: String) {
context.getSystemService(ShortcutManager::class.java).reportShortcutUsed(shortcutId)
context.getSystemService<ShortcutManager>()?.reportShortcutUsed(shortcutId)
}
}
}

View file

@ -1,26 +1,26 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appshortcuts.shortcuttype
package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi
import android.content.Context
import android.content.Intent
import android.content.pm.ShortcutInfo
import android.os.Build
import android.os.Bundle
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity
import androidx.core.os.bundleOf
import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1)
abstract class BaseShortcutType(internal var context: Context) {
@ -33,11 +33,10 @@ abstract class BaseShortcutType(internal var context: Context) {
* @param shortcutType Describes the type of shortcut to create (ShuffleAll, TopTracks, custom playlist, etc.)
* @return
*/
internal fun getPlaySongsIntent(shortcutType: Int): Intent {
internal fun getPlaySongsIntent(shortcutType: Long): Intent {
val intent = Intent(context, AppShortcutLauncherActivity::class.java)
intent.action = Intent.ACTION_VIEW
val b = Bundle()
b.putInt(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE, shortcutType)
val b = bundleOf(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE to shortcutType)
intent.putExtras(b)
return intent
}

View file

@ -1,26 +1,26 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appshortcuts.shortcuttype
package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi
import android.content.Context
import android.content.pm.ShortcutInfo
import android.os.Build
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.appshortcuts.AppShortcutIconGenerator
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1)
class LastAddedShortcutType(context: Context) : BaseShortcutType(context) {
@ -42,6 +42,6 @@ class LastAddedShortcutType(context: Context) : BaseShortcutType(context) {
companion object {
val id: String
get() = BaseShortcutType.ID_PREFIX + "last_added"
get() = ID_PREFIX + "last_added"
}
}

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi
import android.content.Context
import android.content.pm.ShortcutInfo
import android.os.Build
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1)
class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) {
override val shortcutInfo: ShortcutInfo
get() = ShortcutInfo.Builder(context, id)
.setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short))
.setLongLabel(context.getString(R.string.app_shortcut_shuffle_all_long))
.setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_shuffle_all))
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL))
.build()
companion object {
val id: String
get() = ID_PREFIX + "shuffle_all"
}
}

View file

@ -1,26 +1,25 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package io.github.muntashirakon.music.appshortcuts.shortcuttype
package code.name.monkey.retromusic.appshortcuts.shortcuttype
import android.annotation.TargetApi
import android.content.Context
import android.content.pm.ShortcutInfo
import android.os.Build
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.appshortcuts.AppShortcutIconGenerator
import io.github.muntashirakon.music.appshortcuts.AppShortcutLauncherActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
@TargetApi(Build.VERSION_CODES.N_MR1)
class TopTracksShortcutType(context: Context) : BaseShortcutType(context) {
@ -40,6 +39,6 @@ class TopTracksShortcutType(context: Context) : BaseShortcutType(context) {
companion object {
val id: String
get() = BaseShortcutType.ID_PREFIX + "top_tracks"
get() = ID_PREFIX + "top_tracks"
}
}

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
@ -20,21 +20,26 @@ import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.text.TextUtils
import android.view.View
import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.glide.SongGlideRequest
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.service.MusicService.*
import io.github.muntashirakon.music.util.RetroUtil
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide
import com.bumptech.glide.request.animation.GlideAnimation
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
class AppWidgetBig : BaseAppWidget() {
private var target: Target<Bitmap>? = null // for cancellation
@ -54,31 +59,24 @@ class AppWidgetBig : BaseAppWidget() {
)
appWidgetView.setImageViewResource(R.id.image, R.drawable.default_audio_art)
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_next,
MaterialValueHelper.getPrimaryTextColor(context, false)
)!!, 1f
)
R.id.button_next, context.getTintedDrawable(
R.drawable.ic_skip_next,
MaterialValueHelper.getPrimaryTextColor(context, false)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_previous,
MaterialValueHelper.getPrimaryTextColor(context, false)
)!!, 1f
)
R.id.button_prev,
context.getTintedDrawable(
R.drawable.ic_skip_previous,
MaterialValueHelper.getPrimaryTextColor(context, false)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, BaseAppWidget.Companion.createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_play_arrow_white_32dp,
MaterialValueHelper.getPrimaryTextColor(context, false)
)!!, 1f
)
R.id.button_toggle_play_pause,
context.getTintedDrawable(
R.drawable.ic_play_arrow_white_32dp,
MaterialValueHelper.getPrimaryTextColor(context, false)
).toBitmap()
)
linkButtons(context, appWidgetView)
@ -97,7 +95,7 @@ class AppWidgetBig : BaseAppWidget() {
val song = service.currentSong
// Set the titles and artwork
if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
if (song.title.isEmpty() && song.artistName.isEmpty()) {
appWidgetView.setViewVisibility(
R.id.media_titles,
View.INVISIBLE
@ -119,33 +117,27 @@ class AppWidgetBig : BaseAppWidget() {
val playPauseRes =
if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play_arrow_white_32dp
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, createBitmap(
RetroUtil.getTintedVectorDrawable(
service,
playPauseRes,
primaryColor
)!!, 1f
)
R.id.button_toggle_play_pause,
service.getTintedDrawable(
playPauseRes,
primaryColor
).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
service,
R.drawable.ic_skip_next,
primaryColor
)!!, 1f
)
R.id.button_next,
service.getTintedDrawable(
R.drawable.ic_skip_next,
primaryColor
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
service,
R.drawable.ic_skip_previous,
primaryColor
)!!, 1f
)
R.id.button_prev,
service.getTintedDrawable(
R.drawable.ic_skip_previous,
primaryColor
).toBitmap()
)
// Link actions buttons to intents
@ -153,27 +145,31 @@ class AppWidgetBig : BaseAppWidget() {
// Load the album cover async and push the update on completion
val p = RetroUtil.getScreenSize(service)
val widgetImageSize = Math.min(p.x, p.y)
val widgetImageSize = p.x.coerceAtMost(p.y)
val appContext = service.applicationContext
service.runOnUiThread {
if (target != null) {
Glide.clear(target)
Glide.with(service).clear(target)
}
target = SongGlideRequest.Builder.from(Glide.with(appContext), song)
.checkIgnoreMediaStore(appContext).asBitmap().build()
.into(object : SimpleTarget<Bitmap>(widgetImageSize, widgetImageSize) {
target = Glide.with(appContext)
.asBitmap()
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.into(object : CustomTarget<Bitmap>(widgetImageSize, widgetImageSize) {
override fun onResourceReady(
resource: Bitmap,
glideAnimation: GlideAnimation<in Bitmap>
transition: Transition<in Bitmap>?,
) {
update(resource)
}
override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) {
super.onLoadFailed(e, errorDrawable)
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
update(null)
}
override fun onLoadCleared(placeholder: Drawable?) {}
private fun update(bitmap: Bitmap?) {
if (bitmap == null) {
appWidgetView.setImageViewResource(
@ -193,15 +189,22 @@ class AppWidgetBig : BaseAppWidget() {
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action =
Intent(context, MainActivity::class.java).putExtra(MainActivity.EXPAND_PANEL, true)
var pendingIntent: PendingIntent
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
pendingIntent = PendingIntent.getActivity(context, 0, action, 0)
var pendingIntent =
PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.clickable_area, pendingIntent)
// Previous track
@ -229,6 +232,5 @@ class AppWidgetBig : BaseAppWidget() {
}
return mInstance!!
}
}
}

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
@ -20,23 +20,28 @@ import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.text.TextUtils
import android.view.View
import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.glide.SongGlideRequest
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.service.MusicService.*
import io.github.muntashirakon.music.util.ImageUtil
import io.github.muntashirakon.music.util.RetroUtil
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
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.request.animation.GlideAnimation
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
class AppWidgetCard : BaseAppWidget() {
private var target: Target<BitmapPaletteWrapper>? = null // for cancellation
@ -52,31 +57,25 @@ class AppWidgetCard : BaseAppWidget() {
appWidgetView.setImageViewResource(R.id.image, R.drawable.default_audio_art)
val secondaryColor = MaterialValueHelper.getSecondaryTextColor(context, true)
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_next,
secondaryColor
)!!, 1f
)
R.id.button_next,
context.getTintedDrawable(
R.drawable.ic_skip_next,
secondaryColor
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_previous,
secondaryColor
)!!, 1f
)
R.id.button_prev,
context.getTintedDrawable(
R.drawable.ic_skip_previous,
secondaryColor
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_play_arrow_white_32dp,
secondaryColor
)!!, 1f
)
R.id.button_toggle_play_pause,
context.getTintedDrawable(
R.drawable.ic_play_arrow_white_32dp,
secondaryColor
).toBitmap()
)
linkButtons(context, appWidgetView)
@ -93,7 +92,7 @@ class AppWidgetCard : BaseAppWidget() {
val song = service.currentSong
// Set the titles and artwork
if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
if (song.title.isEmpty() && song.artistName.isEmpty()) {
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
} else {
appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE)
@ -105,33 +104,27 @@ class AppWidgetCard : BaseAppWidget() {
val playPauseRes =
if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play_arrow_white_32dp
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, createBitmap(
RetroUtil.getTintedVectorDrawable(
service,
playPauseRes,
MaterialValueHelper.getSecondaryTextColor(service, true)
)!!, 1f
)
R.id.button_toggle_play_pause,
service.getTintedDrawable(
playPauseRes,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
service,
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(service, true)
)!!, 1f
)
R.id.button_next,
service.getTintedDrawable(
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
service,
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(service, true)
)!!, 1f
)
R.id.button_prev,
service.getTintedDrawable(
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
// Link actions buttons to intents
@ -149,14 +142,17 @@ class AppWidgetCard : BaseAppWidget() {
// Load the album cover async and push the update on completion
service.runOnUiThread {
if (target != null) {
Glide.clear(target)
Glide.with(service).clear(target)
}
target = SongGlideRequest.Builder.from(Glide.with(service), song)
.checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop()
.into(object : SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.centerCrop()
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
glideAnimation: GlideAnimation<in BitmapPaletteWrapper>
transition: Transition<in BitmapPaletteWrapper>?,
) {
val palette = resource.palette
update(
@ -170,38 +166,31 @@ class AppWidgetCard : BaseAppWidget() {
)
}
override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) {
super.onLoadFailed(e, errorDrawable)
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
update(null, MaterialValueHelper.getSecondaryTextColor(service, true))
}
override fun onLoadCleared(placeholder: Drawable?) {}
private fun update(bitmap: Bitmap?, color: Int) {
// Set correct drawable for pause state
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, ImageUtil.createBitmap(
ImageUtil.getTintedVectorDrawable(
service, playPauseRes, color
)
)
R.id.button_toggle_play_pause,
service.getTintedDrawable(playPauseRes, color).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next, ImageUtil.createBitmap(
ImageUtil.getTintedVectorDrawable(
service, R.drawable.ic_skip_next, color
)
)
R.id.button_next,
service.getTintedDrawable(R.drawable.ic_skip_next, color).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, ImageUtil.createBitmap(
ImageUtil.getTintedVectorDrawable(
service, R.drawable.ic_skip_previous, color
)
)
R.id.button_prev,
service.getTintedDrawable(R.drawable.ic_skip_previous, color).toBitmap()
)
val image = getAlbumArtDrawable(service.resources, bitmap)
val image = getAlbumArtDrawable(service, bitmap)
val roundedBitmap = createRoundedBitmap(
image, imageSize, imageSize, cardRadius, 0F, cardRadius, 0F
)
@ -217,14 +206,22 @@ class AppWidgetCard : BaseAppWidget() {
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action: Intent = Intent(context, MainActivity::class.java).putExtra("expand", true)
var pendingIntent: PendingIntent
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
pendingIntent = PendingIntent.getActivity(context, 0, action, 0)
var pendingIntent =
PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.image, pendingIntent)
views.setOnClickPendingIntent(R.id.media_titles, pendingIntent)

View file

@ -0,0 +1,218 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
class AppWidgetCircle : BaseAppWidget() {
private var target: Target<BitmapPaletteWrapper>? = null // for cancellation
/**
* Initialize given widgets to default state, where we launch Music on default click and hide
* actions if service not running.
*/
override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) {
val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_circle)
appWidgetView.setImageViewResource(R.id.image, R.drawable.default_audio_art)
val secondaryColor = MaterialValueHelper.getSecondaryTextColor(context, true)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
context.getTintedDrawable(
R.drawable.ic_play_arrow,
secondaryColor
).toBitmap()
)
linkButtons(context, appWidgetView)
pushUpdate(context, appWidgetIds, appWidgetView)
}
/**
* Update all active widget instances by pushing changes
*/
override fun performUpdate(service: MusicService, appWidgetIds: IntArray?) {
val appWidgetView = RemoteViews(service.packageName, R.layout.app_widget_circle)
val isPlaying = service.isPlaying
val song = service.currentSong
// Set correct drawable for pause state
val playPauseRes =
if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play_arrow
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
service.getTintedDrawable(
playPauseRes,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
val isFavorite = runBlocking(Dispatchers.IO) {
return@runBlocking MusicUtil.isFavorite(song)
}
val favoriteRes =
if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border
appWidgetView.setImageViewBitmap(
R.id.button_toggle_favorite,
service.getTintedDrawable(
favoriteRes,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
// Link actions buttons to intents
linkButtons(service, appWidgetView)
if (imageSize == 0) {
val p = RetroUtil.getScreenSize(service)
imageSize = p.x.coerceAtMost(p.y)
}
// Load the album cover async and push the update on completion
service.runOnUiThread {
if (target != null) {
Glide.with(service).clear(target)
}
target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.apply(RequestOptions.circleCropTransform())
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
transition: Transition<in BitmapPaletteWrapper>?,
) {
val palette = resource.palette
update(
resource.bitmap, palette.getVibrantColor(
palette.getMutedColor(
MaterialValueHelper.getSecondaryTextColor(
service, true
)
)
)
)
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
update(null, MaterialValueHelper.getSecondaryTextColor(service, true))
}
private fun update(bitmap: Bitmap?, color: Int) {
// Set correct drawable for pause state
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
service.getTintedDrawable(
playPauseRes, color
).toBitmap()
)
// Set favorite button drawables
appWidgetView.setImageViewBitmap(
R.id.button_toggle_favorite,
service.getTintedDrawable(
favoriteRes, color
).toBitmap()
)
if (bitmap != null) {
appWidgetView.setImageViewBitmap(R.id.image, bitmap)
}
pushUpdate(service, appWidgetIds, appWidgetView)
}
override fun onLoadCleared(placeholder: Drawable?) {}
})
}
}
/**
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
var pendingIntent =
PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.image, pendingIntent)
// Favorite track
pendingIntent = buildPendingIntent(context, TOGGLE_FAVORITE, serviceName)
views.setOnClickPendingIntent(R.id.button_toggle_favorite, pendingIntent)
// Play and pause
pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE, serviceName)
views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent)
}
companion object {
const val NAME = "app_widget_circle"
private var mInstance: AppWidgetCircle? = null
private var imageSize = 0
val instance: AppWidgetCircle
@Synchronized get() {
if (mInstance == null) {
mInstance = AppWidgetCircle()
}
return mInstance!!
}
}
}

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
@ -21,23 +21,28 @@ import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.text.TextUtils
import android.view.View
import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.glide.SongGlideRequest
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.service.MusicService.*
import io.github.muntashirakon.music.util.ImageUtil
import io.github.muntashirakon.music.util.RetroUtil
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
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.request.animation.GlideAnimation
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
class AppWidgetClassic : BaseAppWidget() {
private var target: Target<BitmapPaletteWrapper>? = null // for cancellation
@ -49,38 +54,31 @@ class AppWidgetClassic : BaseAppWidget() {
override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) {
val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_classic)
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
appWidgetView.setImageViewResource(R.id.image, R.drawable.default_audio_art)
appWidgetView.setImageViewBitmap(
R.id.button_next,
createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(context, true)
)!!, 1f
)
context.getTintedDrawable(
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(context, true)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(context, true)
)!!, 1f
)
context.getTintedDrawable(
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(context, true)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_play_arrow_white_32dp,
MaterialValueHelper.getSecondaryTextColor(context, true)
)!!, 1f
)
context.getTintedDrawable(
R.drawable.ic_play_arrow_white_32dp,
MaterialValueHelper.getSecondaryTextColor(context, true)
).toBitmap()
)
linkButtons(context, appWidgetView)
@ -97,7 +95,7 @@ class AppWidgetClassic : BaseAppWidget() {
val song = service.currentSong
// Set the titles and artwork
if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
if (song.title.isEmpty() && song.artistName.isEmpty()) {
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
} else {
appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE)
@ -120,14 +118,18 @@ class AppWidgetClassic : BaseAppWidget() {
val appContext = service.applicationContext
service.runOnUiThread {
if (target != null) {
Glide.clear(target)
Glide.with(service).clear(target)
}
target = SongGlideRequest.Builder.from(Glide.with(service), song)
.checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop()
.into(object : SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
//.checkIgnoreMediaStore()
.centerCrop()
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
glideAnimation: GlideAnimation<in BitmapPaletteWrapper>
transition: Transition<in BitmapPaletteWrapper>?,
) {
val palette = resource.palette
update(
@ -143,49 +145,42 @@ class AppWidgetClassic : BaseAppWidget() {
)
}
override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) {
super.onLoadFailed(e, errorDrawable)
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
update(null, Color.WHITE)
}
override fun onLoadCleared(placeholder: Drawable?) {}
private fun update(bitmap: Bitmap?, color: Int) {
// Set correct drawable for pause state
val playPauseRes =
if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play_arrow
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
ImageUtil.createBitmap(
ImageUtil.getTintedVectorDrawable(
service,
playPauseRes,
color
)
)
service.getTintedDrawable(
playPauseRes,
color
).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next,
ImageUtil.createBitmap(
ImageUtil.getTintedVectorDrawable(
service,
R.drawable.ic_skip_next,
color
)
)
service.getTintedDrawable(
R.drawable.ic_skip_next,
color
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
ImageUtil.createBitmap(
ImageUtil.getTintedVectorDrawable(
service,
R.drawable.ic_skip_previous,
color
)
)
service.getTintedDrawable(
R.drawable.ic_skip_previous,
color
).toBitmap()
)
val image = getAlbumArtDrawable(service.resources, bitmap)
val image = getAlbumArtDrawable(service, bitmap)
val roundedBitmap =
createRoundedBitmap(
image,
@ -208,14 +203,21 @@ class AppWidgetClassic : BaseAppWidget() {
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action = Intent(context, MainActivity::class.java).putExtra("expand", true)
var pendingIntent: PendingIntent
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
pendingIntent = PendingIntent.getActivity(context, 0, action, 0)
var pendingIntent = PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.image, pendingIntent)
views.setOnClickPendingIntent(R.id.media_titles, pendingIntent)

View file

@ -0,0 +1,264 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.view.View
import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.util.DensityUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
class AppWidgetMD3 : BaseAppWidget() {
private var target: Target<BitmapPaletteWrapper>? = null // for cancellation
/**
* Initialize given widgets to default state, where we launch Music on default click and hide
* actions if service not running.
*/
override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) {
val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_md3)
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
appWidgetView.setImageViewResource(R.id.image, R.drawable.default_audio_art)
val secondaryColor = MaterialValueHelper.getSecondaryTextColor(context, true)
appWidgetView.setImageViewBitmap(
R.id.button_next,
context.getTintedDrawable(
R.drawable.ic_skip_next,
secondaryColor
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
context.getTintedDrawable(
R.drawable.ic_skip_previous,
secondaryColor
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
context.getTintedDrawable(
R.drawable.ic_play_arrow_white_32dp,
secondaryColor
).toBitmap()
)
linkButtons(context, appWidgetView)
pushUpdate(context, appWidgetIds, appWidgetView)
}
/**
* Update all active widget instances by pushing changes
*/
override fun performUpdate(service: MusicService, appWidgetIds: IntArray?) {
val appWidgetView = RemoteViews(service.packageName, R.layout.app_widget_md3)
val isPlaying = service.isPlaying
val song = service.currentSong
// Set the titles and artwork
if (song.title.isEmpty() && song.artistName.isEmpty()) {
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
} else {
appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE)
appWidgetView.setTextViewText(R.id.title, song.title)
appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song))
}
// Set correct drawable for pause state
val playPauseRes =
if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play_arrow_white_32dp
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
service.getTintedDrawable(
playPauseRes,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next,
service.getTintedDrawable(
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
service.getTintedDrawable(
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(service, true)
).toBitmap()
)
// Link actions buttons to intents
linkButtons(service, appWidgetView)
if (imageSize == 0) {
imageSize =
service.resources.getDimensionPixelSize(R.dimen.app_widget_card_image_size)
}
if (cardRadius == 0f) {
cardRadius =
DensityUtil.dip2px(service, 8F).toFloat()
}
// Load the album cover async and push the update on completion
service.runOnUiThread {
if (target != null) {
Glide.with(service).clear(target)
}
target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
.load(RetroGlideExtension.getSongModel(song))
.centerCrop()
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
transition: Transition<in BitmapPaletteWrapper>?,
) {
val palette = resource.palette
update(
resource.bitmap, palette.getVibrantColor(
palette.getMutedColor(
MaterialValueHelper.getSecondaryTextColor(
service, true
)
)
)
)
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
update(null, MaterialValueHelper.getSecondaryTextColor(service, true))
}
override fun onLoadCleared(placeholder: Drawable?) {}
private fun update(bitmap: Bitmap?, color: Int) {
// Set correct drawable for pause state
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
service.getTintedDrawable(playPauseRes, color).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next,
service.getTintedDrawable(R.drawable.ic_skip_next, color).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
service.getTintedDrawable(R.drawable.ic_skip_previous, color).toBitmap()
)
val image = getAlbumArtDrawable(service, bitmap)
val roundedBitmap = createRoundedBitmap(
image,
imageSize,
imageSize,
cardRadius,
cardRadius,
cardRadius,
cardRadius
)
appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap)
pushUpdate(service, appWidgetIds, appWidgetView)
}
})
}
}
/**
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
var pendingIntent =
PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.image, pendingIntent)
views.setOnClickPendingIntent(R.id.media_titles, pendingIntent)
// Previous track
pendingIntent = buildPendingIntent(context, ACTION_REWIND, serviceName)
views.setOnClickPendingIntent(R.id.button_prev, pendingIntent)
// Play and pause
pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE, serviceName)
views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent)
// Next track
pendingIntent = buildPendingIntent(context, ACTION_SKIP, serviceName)
views.setOnClickPendingIntent(R.id.button_next, pendingIntent)
}
companion object {
const val NAME = "app_widget_md3"
private var mInstance: AppWidgetMD3? = null
private var imageSize = 0
private var cardRadius = 0F
val instance: AppWidgetMD3
@Synchronized get() {
if (mInstance == null) {
mInstance = AppWidgetMD3()
}
return mInstance!!
}
}
}

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
@ -20,22 +20,28 @@ import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.text.TextUtils
import android.view.View
import android.widget.RemoteViews
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.glide.SongGlideRequest
import io.github.muntashirakon.music.glide.palette.BitmapPaletteWrapper
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.service.MusicService.*
import io.github.muntashirakon.music.util.RetroUtil
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.glide.RetroGlideExtension.asBitmapPalette
import code.name.monkey.retromusic.glide.RetroGlideExtension.songCoverOptions
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
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.request.animation.GlideAnimation
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
class AppWidgetSmall : BaseAppWidget() {
private var target: Target<BitmapPaletteWrapper>? = null // for cancellation
@ -51,33 +57,26 @@ class AppWidgetSmall : BaseAppWidget() {
appWidgetView.setImageViewResource(R.id.image, R.drawable.default_audio_art)
appWidgetView.setImageViewBitmap(
R.id.button_next,
createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(context, true)
)!!, 1f
)
context.getTintedDrawable(
R.drawable.ic_skip_next,
MaterialValueHelper.getSecondaryTextColor(context, true)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev,
createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(context, true)
)!!, 1f
)
context.getTintedDrawable(
R.drawable.ic_skip_previous,
MaterialValueHelper.getSecondaryTextColor(context, true)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause,
createBitmap(
RetroUtil.getTintedVectorDrawable(
context,
R.drawable.ic_play_arrow_white_32dp,
MaterialValueHelper.getSecondaryTextColor(context, true)
)!!, 1f
)
context.getTintedDrawable(
R.drawable.ic_play_arrow_white_32dp,
MaterialValueHelper.getSecondaryTextColor(context, true)
).toBitmap()
)
linkButtons(context, appWidgetView)
@ -94,10 +93,10 @@ class AppWidgetSmall : BaseAppWidget() {
val song = service.currentSong
// Set the titles and artwork
if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
if (song.title.isEmpty() && song.artistName.isEmpty()) {
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
} else {
if (TextUtils.isEmpty(song.title) || TextUtils.isEmpty(song.artistName)) {
if (song.title.isEmpty() || song.artistName.isEmpty()) {
appWidgetView.setTextViewText(R.id.text_separator, "")
} else {
appWidgetView.setTextViewText(R.id.text_separator, "")
@ -122,14 +121,18 @@ class AppWidgetSmall : BaseAppWidget() {
val appContext = service.applicationContext
service.runOnUiThread {
if (target != null) {
Glide.clear(target)
Glide.with(service).clear(target)
}
target = SongGlideRequest.Builder.from(Glide.with(service), song)
.checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop()
.into(object : SimpleTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
target = Glide.with(service)
.asBitmapPalette()
.songCoverOptions(song)
//.checkIgnoreMediaStore()
.load(RetroGlideExtension.getSongModel(song))
.centerCrop()
.into(object : CustomTarget<BitmapPaletteWrapper>(imageSize, imageSize) {
override fun onResourceReady(
resource: BitmapPaletteWrapper,
glideAnimation: GlideAnimation<in BitmapPaletteWrapper>
transition: Transition<in BitmapPaletteWrapper>?,
) {
val palette = resource.palette
update(
@ -143,8 +146,12 @@ class AppWidgetSmall : BaseAppWidget() {
)
}
override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) {
super.onLoadFailed(e, errorDrawable)
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
update(null, MaterialValueHelper.getSecondaryTextColor(service, true))
}
override fun onLoadCleared(placeholder: Drawable?) {
update(null, MaterialValueHelper.getSecondaryTextColor(service, true))
}
@ -153,30 +160,21 @@ class AppWidgetSmall : BaseAppWidget() {
val playPauseRes = if (isPlaying) R.drawable.ic_pause
else R.drawable.ic_play_arrow_white_32dp
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, createBitmap(
RetroUtil.getTintedVectorDrawable(
service, playPauseRes, color
)!!, 1f
)
R.id.button_toggle_play_pause,
service.getTintedDrawable(playPauseRes, color).toBitmap()
)
// Set prev/next button drawables
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
service, R.drawable.ic_skip_next, color
)!!, 1f
)
R.id.button_next,
service.getTintedDrawable(R.drawable.ic_skip_next, color).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
service, R.drawable.ic_skip_previous, color
)!!, 1f
)
R.id.button_prev,
service.getTintedDrawable(R.drawable.ic_skip_previous, color).toBitmap()
)
val image = getAlbumArtDrawable(service.resources, bitmap)
val image = getAlbumArtDrawable(service, bitmap)
val roundedBitmap = createRoundedBitmap(
image, imageSize, imageSize, cardRadius, 0f, 0f, 0f
)
@ -192,14 +190,22 @@ class AppWidgetSmall : BaseAppWidget() {
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action = Intent(context, MainActivity::class.java).putExtra("expand", true)
var pendingIntent: PendingIntent
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
pendingIntent = PendingIntent.getActivity(context, 0, action, 0)
var pendingIntent =
PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.image, pendingIntent)
views.setOnClickPendingIntent(R.id.media_titles, pendingIntent)

View file

@ -1,72 +1,68 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets
package code.name.monkey.retromusic.appwidgets
import android.app.PendingIntent
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.text.TextUtils
import android.view.View
import android.widget.RemoteViews
import androidx.core.content.ContextCompat
import io.github.muntashirakon.music.App
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.activities.MainActivity
import io.github.muntashirakon.music.appwidgets.base.BaseAppWidget
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.service.MusicService.*
import io.github.muntashirakon.music.util.RetroUtil
import androidx.core.graphics.drawable.toBitmap
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget
import code.name.monkey.retromusic.extensions.getTintedDrawable
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
import code.name.monkey.retromusic.util.PreferenceUtil
class AppWidgetText : BaseAppWidget() {
override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) {
val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_text)
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
context, R.drawable.ic_skip_next, ContextCompat.getColor(
context, R.color.md_white_1000
)
)!!, 1f
)
R.id.button_next,
context.getTintedDrawable(R.drawable.ic_skip_next, ContextCompat.getColor(
context, code.name.monkey.appthemehelper.R.color.md_white_1000
)).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
context, R.drawable.ic_skip_previous, ContextCompat.getColor(
context, R.color.md_white_1000
)
)!!, 1f
R.id.button_prev,
context.getTintedDrawable(R.drawable.ic_skip_previous, ContextCompat.getColor(
context, code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, createBitmap(
RetroUtil.getTintedVectorDrawable(
context, R.drawable.ic_play_arrow_white_32dp, ContextCompat.getColor(
context, R.color.md_white_1000
)
)!!, 1f
R.id.button_toggle_play_pause,
context.getTintedDrawable(R.drawable.ic_play_arrow_white_32dp, ContextCompat.getColor(
context, code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
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(
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)
@ -77,14 +73,21 @@ class AppWidgetText : BaseAppWidget() {
* Link up various button actions using [PendingIntent].
*/
private fun linkButtons(context: Context, views: RemoteViews) {
val action = Intent(context, MainActivity::class.java).putExtra("expand", true)
var pendingIntent: PendingIntent
val action = Intent(context, MainActivity::class.java)
.putExtra(
MainActivity.EXPAND_PANEL,
PreferenceUtil.isExpandPanel
)
val serviceName = ComponentName(context, MusicService::class.java)
// Home
action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
pendingIntent = PendingIntent.getActivity(context, 0, action, 0)
var pendingIntent = PendingIntent.getActivity(
context, 0, action, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
views.setOnClickPendingIntent(R.id.image, pendingIntent)
views.setOnClickPendingIntent(R.id.media_titles, pendingIntent)
@ -108,7 +111,7 @@ class AppWidgetText : BaseAppWidget() {
val song = service.currentSong
// Set the titles and artwork
if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) {
if (song.title.isEmpty() && song.artistName.isEmpty()) {
appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE)
} else {
appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE)
@ -122,41 +125,32 @@ class AppWidgetText : BaseAppWidget() {
val playPauseRes = if (isPlaying) R.drawable.ic_pause
else R.drawable.ic_play_arrow_white_32dp
appWidgetView.setImageViewBitmap(
R.id.button_toggle_play_pause, createBitmap(
RetroUtil.getTintedVectorDrawable(
App.getContext(), playPauseRes, ContextCompat.getColor(
App.getContext(), R.color.md_white_1000
)
)!!, 1f
)
R.id.button_toggle_play_pause,
service.getTintedDrawable(playPauseRes, ContextCompat.getColor(
service, code.name.monkey.appthemehelper.R.color.md_white_1000)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_next, createBitmap(
RetroUtil.getTintedVectorDrawable(
App.getContext(),
R.drawable.ic_skip_next,
ContextCompat.getColor(
App.getContext(), R.color.md_white_1000
)
)!!, 1f
)
R.id.button_next,
service.getTintedDrawable(
R.drawable.ic_skip_next,
ContextCompat.getColor(
service,
code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
appWidgetView.setImageViewBitmap(
R.id.button_prev, createBitmap(
RetroUtil.getTintedVectorDrawable(
App.getContext(),
R.drawable.ic_skip_previous,
ContextCompat.getColor(
App.getContext(), R.color.md_white_1000
)
)!!, 1f
)
R.id.button_prev,
service.getTintedDrawable(
R.drawable.ic_skip_previous,
ContextCompat.getColor(
service, code.name.monkey.appthemehelper.R.color.md_white_1000
)
).toBitmap()
)
pushUpdate(service.applicationContext, appWidgetIds, appWidgetView)
}
companion object {

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets
package code.name.monkey.retromusic.appwidgets
import android.appwidget.AppWidgetManager
import android.content.BroadcastReceiver
@ -20,7 +20,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import io.github.muntashirakon.music.service.MusicService
import code.name.monkey.retromusic.service.MusicService
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {

View file

@ -1,18 +1,18 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package io.github.muntashirakon.music.appwidgets.base
package code.name.monkey.retromusic.appwidgets.base
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
@ -20,19 +20,20 @@ import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.graphics.*
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.os.Build
import android.text.TextUtils
import android.widget.RemoteViews
import androidx.core.content.ContextCompat
import io.github.muntashirakon.music.App
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.service.MusicService.*
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.service.MusicService.Companion.APP_WIDGET_UPDATE
import code.name.monkey.retromusic.service.MusicService.Companion.EXTRA_APP_WIDGET_NAME
import code.name.monkey.retromusic.service.MusicService.Companion.FAVORITE_STATE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.META_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.PLAY_STATE_CHANGED
abstract class BaseAppWidget : AppWidgetProvider() {
@ -40,7 +41,9 @@ abstract class BaseAppWidget : AppWidgetProvider() {
* {@inheritDoc}
*/
override fun onUpdate(
context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
defaultAppWidget(context, appWidgetIds)
val updateIntent = Intent(APP_WIDGET_UPDATE)
@ -55,14 +58,16 @@ abstract class BaseAppWidget : AppWidgetProvider() {
*/
fun notifyChange(service: MusicService, what: String) {
if (hasInstances(service)) {
if (META_CHANGED == what || PLAY_STATE_CHANGED == what) {
if (META_CHANGED == what || PLAY_STATE_CHANGED == what || FAVORITE_STATE_CHANGED == what) {
performUpdate(service, null)
}
}
}
protected fun pushUpdate(
context: Context, appWidgetIds: IntArray?, views: RemoteViews
context: Context,
appWidgetIds: IntArray?,
views: RemoteViews
) {
val appWidgetManager = AppWidgetManager.getInstance(context)
if (appWidgetIds != null) {
@ -86,14 +91,20 @@ abstract class BaseAppWidget : AppWidgetProvider() {
}
protected fun buildPendingIntent(
context: Context, action: String, serviceName: ComponentName
context: Context,
action: String,
serviceName: ComponentName
): PendingIntent {
val intent = Intent(action)
intent.component = serviceName
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
PendingIntent.getForegroundService(context, 0, intent, 0)
return if (VersionUtils.hasOreo()) {
PendingIntent.getForegroundService(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
} else {
PendingIntent.getService(context, 0, intent, 0)
PendingIntent.getService(
context, 0, intent, if (VersionUtils.hasMarshmallow())
PendingIntent.FLAG_IMMUTABLE
else 0
)
}
}
@ -101,18 +112,18 @@ abstract class BaseAppWidget : AppWidgetProvider() {
abstract fun performUpdate(service: MusicService, appWidgetIds: IntArray?)
protected fun getAlbumArtDrawable(resources: Resources, bitmap: Bitmap?): Drawable {
protected fun getAlbumArtDrawable(context: Context, bitmap: Bitmap?): Drawable {
return if (bitmap == null) {
ContextCompat.getDrawable(App.getContext(), R.drawable.default_audio_art)!!
ContextCompat.getDrawable(context, R.drawable.default_audio_art)!!
} else {
BitmapDrawable(resources, bitmap)
BitmapDrawable(context.resources, bitmap)
}
}
protected fun getSongArtistAndAlbum(song: Song): String {
val builder = StringBuilder()
builder.append(song.artistName)
if (!TextUtils.isEmpty(song.artistName) && !TextUtils.isEmpty(song.albumName)) {
if (song.artistName.isNotEmpty() && song.albumName.isNotEmpty()) {
builder.append("")
}
builder.append(song.albumName)
@ -156,20 +167,12 @@ abstract class BaseAppWidget : AppWidgetProvider() {
return rounded
}
fun createBitmap(drawable: Drawable, sizeMultiplier: Float): Bitmap {
val bitmap = Bitmap.createBitmap(
(drawable.intrinsicWidth * sizeMultiplier).toInt(),
(drawable.intrinsicHeight * sizeMultiplier).toInt(),
Bitmap.Config.ARGB_8888
)
val c = Canvas(bitmap)
drawable.setBounds(0, 0, c.width, c.height)
drawable.draw(c)
return bitmap
}
protected fun composeRoundedRectPath(
rect: RectF, tl: Float, tr: Float, bl: Float, br: Float
rect: RectF,
tl: Float,
tr: Float,
bl: Float,
br: Float
): Path {
val path = Path()
path.moveTo(rect.left + tl, rect.top)

View file

@ -0,0 +1,102 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.auto;
import androidx.annotation.NonNull;
/**
* Created by Beesham Sarendranauth (Beesham)
*/
public class AutoMediaIDHelper {
// Media IDs used on browseable items of MediaBrowser
public static final String MEDIA_ID_EMPTY_ROOT = "__EMPTY_ROOT__";
public static final String MEDIA_ID_ROOT = "__ROOT__";
public static final String MEDIA_ID_MUSICS_BY_SEARCH = "__BY_SEARCH__"; // TODO
public static final String MEDIA_ID_MUSICS_BY_HISTORY = "__BY_HISTORY__";
public static final String MEDIA_ID_MUSICS_BY_TOP_TRACKS = "__BY_TOP_TRACKS__";
public static final String MEDIA_ID_MUSICS_BY_SUGGESTIONS = "__BY_SUGGESTIONS__";
public static final String MEDIA_ID_MUSICS_BY_PLAYLIST = "__BY_PLAYLIST__";
public static final String MEDIA_ID_MUSICS_BY_ALBUM = "__BY_ALBUM__";
public static final String MEDIA_ID_MUSICS_BY_ARTIST = "__BY_ARTIST__";
public static final String MEDIA_ID_MUSICS_BY_ALBUM_ARTIST = "__BY_ALBUM_ARTIST__";
public static final String MEDIA_ID_MUSICS_BY_GENRE = "__BY_GENRE__";
public static final String MEDIA_ID_MUSICS_BY_SHUFFLE = "__BY_SHUFFLE__";
public static final String MEDIA_ID_MUSICS_BY_QUEUE = "__BY_QUEUE__";
public static final String RECENT_ROOT = "__RECENT__";
private static final String CATEGORY_SEPARATOR = "__/__";
private static final String LEAF_SEPARATOR = "__|__";
/**
* Create a String value that represents a playable or a browsable media.
* <p/>
* Encode the media browseable categories, if any, and the unique music ID, if any,
* into a single String mediaID.
* <p/>
* MediaIDs are of the form <categoryType>__/__<categoryValue>__|__<musicUniqueId>, to make it
* easy to find the category (like genre) that a music was selected from, so we
* can correctly build the playing queue. This is specially useful when
* one music can appear in more than one list, like "by genre -> genre_1"
* and "by artist -> artist_1".
*
* @param mediaID Unique ID for playable items, or null for browseable items.
* @param categories Hierarchy of categories representing this item's browsing parents.
* @return A hierarchy-aware media ID.
*/
public static String createMediaID(String mediaID, String... categories) {
StringBuilder sb = new StringBuilder();
if (categories != null) {
for (int i = 0; i < categories.length; i++) {
if (!isValidCategory(categories[i])) {
throw new IllegalArgumentException("Invalid category: " + categories[i]);
}
sb.append(categories[i]);
if (i < categories.length - 1) {
sb.append(CATEGORY_SEPARATOR);
}
}
}
if (mediaID != null) {
sb.append(LEAF_SEPARATOR).append(mediaID);
}
return sb.toString();
}
public static String extractCategory(@NonNull String mediaID) {
int pos = mediaID.indexOf(LEAF_SEPARATOR);
if (pos >= 0) {
return mediaID.substring(0, pos);
}
return mediaID;
}
public static String extractMusicID(@NonNull String mediaID) {
int pos = mediaID.indexOf(LEAF_SEPARATOR);
if (pos >= 0) {
return mediaID.substring(pos + LEAF_SEPARATOR.length());
}
return null;
}
public static boolean isBrowseable(@NonNull String mediaID) {
return !mediaID.contains(LEAF_SEPARATOR);
}
private static boolean isValidCategory(String category) {
return category == null ||
(!category.contains(CATEGORY_SEPARATOR) && !category.contains(LEAF_SEPARATOR));
}
}

View file

@ -0,0 +1,283 @@
/*
* Copyright (c) 2019 Hemanth Savarala.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package code.name.monkey.retromusic.auto
import android.content.Context
import android.content.res.Resources
import android.support.v4.media.MediaBrowserCompat
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.*
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import java.lang.ref.WeakReference
/**
* Created by Beesham Sarendranauth (Beesham)
*/
class AutoMusicProvider(
private val mContext: Context,
private val songsRepository: SongRepository,
private val albumsRepository: AlbumRepository,
private val artistsRepository: ArtistRepository,
private val genresRepository: GenreRepository,
private val playlistsRepository: PlaylistRepository,
private val topPlayedRepository: TopPlayedRepository
) {
private var mMusicService: WeakReference<MusicService>? = null
fun setMusicService(service: MusicService) {
mMusicService = WeakReference(service)
}
fun getChildren(mediaId: String?, resources: Resources): List<MediaBrowserCompat.MediaItem> {
val mediaItems: MutableList<MediaBrowserCompat.MediaItem> = ArrayList()
when (mediaId) {
AutoMediaIDHelper.MEDIA_ID_ROOT -> {
mediaItems.addAll(getRootChildren(resources))
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_PLAYLIST -> for (playlist in playlistsRepository.playlists()) {
mediaItems.add(
AutoMediaItem.with(mContext)
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_PLAYLIST, playlist.id)
.icon(R.drawable.ic_playlist_play)
.title(playlist.name)
.subTitle(playlist.getInfoString(mContext))
.asPlayable()
.build()
)
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_ALBUM -> for (album in albumsRepository.albums()) {
mediaItems.add(
AutoMediaItem.with(mContext)
.path(mediaId, album.id)
.title(album.title)
.subTitle(album.albumArtist ?: album.artistName)
.icon(MusicUtil.getMediaStoreAlbumCoverUri(album.id))
.asPlayable()
.build()
)
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_ARTIST -> for (artist in artistsRepository.artists()) {
mediaItems.add(
AutoMediaItem.with(mContext)
.asPlayable()
.path(mediaId, artist.id)
.title(artist.name)
.build()
)
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_ALBUM_ARTIST -> for (artist in artistsRepository.albumArtists()) {
mediaItems.add(
AutoMediaItem.with(mContext)
.asPlayable()
// we just pass album id here as we don't have album artist id's
.path(mediaId, artist.safeGetFirstAlbum().id)
.title(artist.name)
.build()
)
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_GENRE -> for (genre in genresRepository.genres()) {
mediaItems.add(
AutoMediaItem.with(mContext)
.asPlayable()
.path(mediaId, genre.id)
.title(genre.name)
.build()
)
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_QUEUE ->
mMusicService?.get()?.playingQueue
?.let {
for (song in it) {
mediaItems.add(
AutoMediaItem.with(mContext)
.asPlayable()
.path(mediaId, song.id)
.title(song.title)
.subTitle(song.artistName)
.icon(MusicUtil.getMediaStoreAlbumCoverUri(song.albumId))
.build()
)
}
}
else -> {
getPlaylistChildren(mediaId, mediaItems)
}
}
return mediaItems
}
private fun getPlaylistChildren(
mediaId: String?,
mediaItems: MutableList<MediaBrowserCompat.MediaItem>
) {
val songs = when (mediaId) {
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_TOP_TRACKS -> {
topPlayedRepository.topTracks()
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_HISTORY -> {
topPlayedRepository.recentlyPlayedTracks()
}
AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_SUGGESTIONS -> {
topPlayedRepository.notRecentlyPlayedTracks().take(8)
}
else -> {
emptyList()
}
}
songs.forEach { song ->
mediaItems.add(
getPlayableSong(mediaId, song)
)
}
}
private fun getRootChildren(resources: Resources): List<MediaBrowserCompat.MediaItem> {
val mediaItems: MutableList<MediaBrowserCompat.MediaItem> = ArrayList()
val libraryCategories = PreferenceUtil.libraryCategory
libraryCategories.forEach {
if (it.visible) {
when (it.category) {
CategoryInfo.Category.Albums -> {
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_ALBUM)
.gridLayout(true)
.icon(R.drawable.ic_album)
.title(resources.getString(R.string.albums)).build()
)
}
CategoryInfo.Category.Artists -> {
if (PreferenceUtil.albumArtistsOnly) {
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_ALBUM_ARTIST)
.icon(R.drawable.ic_album_artist)
.title(resources.getString(R.string.album_artist)).build()
)
} else {
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_ARTIST)
.icon(R.drawable.ic_artist)
.title(resources.getString(R.string.artists)).build()
)
}
}
CategoryInfo.Category.Genres -> {
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_GENRE)
.icon(R.drawable.ic_guitar)
.title(resources.getString(R.string.genres)).build()
)
}
CategoryInfo.Category.Playlists -> {
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_PLAYLIST)
.icon(R.drawable.ic_playlist_play)
.title(resources.getString(R.string.playlists)).build()
)
}
else -> {
}
}
}
}
mediaItems.add(
AutoMediaItem.with(mContext)
.asPlayable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_SHUFFLE)
.icon(R.drawable.ic_shuffle)
.title(resources.getString(R.string.action_shuffle_all))
.subTitle(MusicUtil.getPlaylistInfoString(mContext, songsRepository.songs()))
.build()
)
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_QUEUE)
.icon(R.drawable.ic_queue_music)
.title(resources.getString(R.string.queue))
.subTitle(MusicUtil.getPlaylistInfoString(mContext, MusicPlayerRemote.playingQueue))
.asBrowsable().build()
)
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_TOP_TRACKS)
.icon(R.drawable.ic_trending_up)
.title(resources.getString(R.string.my_top_tracks))
.subTitle(
MusicUtil.getPlaylistInfoString(
mContext,
topPlayedRepository.topTracks()
)
)
.asBrowsable().build()
)
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_SUGGESTIONS)
.icon(R.drawable.ic_face)
.title(resources.getString(R.string.suggestion_songs))
.subTitle(
MusicUtil.getPlaylistInfoString(
mContext,
topPlayedRepository.notRecentlyPlayedTracks().takeIf {
it.size > 9
} ?: emptyList()
)
)
.asBrowsable().build()
)
mediaItems.add(
AutoMediaItem.with(mContext)
.asBrowsable()
.path(AutoMediaIDHelper.MEDIA_ID_MUSICS_BY_HISTORY)
.icon(R.drawable.ic_history)
.title(resources.getString(R.string.history))
.subTitle(
MusicUtil.getPlaylistInfoString(
mContext,
topPlayedRepository.recentlyPlayedTracks()
)
)
.asBrowsable().build()
)
return mediaItems
}
private fun getPlayableSong(mediaId: String?, song: Song): MediaBrowserCompat.MediaItem {
return AutoMediaItem.with(mContext)
.asPlayable()
.path(mediaId, song.id)
.title(song.title)
.subTitle(song.artistName)
.icon(MusicUtil.getMediaStoreAlbumCoverUri(song.albumId))
.build()
}
}

View file

@ -0,0 +1,100 @@
package code.name.monkey.retromusic.auto
import android.content.Context
import android.net.Uri
import android.support.v4.media.MediaBrowserCompat
import android.support.v4.media.MediaDescriptionCompat
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.core.os.bundleOf
internal object AutoMediaItem {
fun with(context: Context): Builder {
return Builder(context)
}
internal class Builder(private val mContext: Context) {
private var mBuilder: MediaDescriptionCompat.Builder?
private var mFlags = 0
fun path(fullPath: String): Builder {
mBuilder?.setMediaId(fullPath)
return this
}
fun path(path: String?, id: Long): Builder {
return path(AutoMediaIDHelper.createMediaID(id.toString(), path))
}
fun title(title: String): Builder {
mBuilder?.setTitle(title)
return this
}
fun subTitle(subTitle: String): Builder {
mBuilder?.setSubtitle(subTitle)
return this
}
fun icon(uri: Uri?): Builder {
mBuilder?.setIconUri(uri)
return this
}
fun icon(iconDrawableId: Int): Builder {
mBuilder?.setIconBitmap(
ResourcesCompat.getDrawable(
mContext.resources,
iconDrawableId,
mContext.theme
)?.toBitmap()
)
return this
}
fun gridLayout(isGrid: Boolean): Builder {
val hints = bundleOf(
CONTENT_STYLE_SUPPORTED to true,
CONTENT_STYLE_BROWSABLE_HINT to
if (isGrid) CONTENT_STYLE_GRID_ITEM_HINT_VALUE
else CONTENT_STYLE_LIST_ITEM_HINT_VALUE,
CONTENT_STYLE_PLAYABLE_HINT to
if (isGrid) CONTENT_STYLE_GRID_ITEM_HINT_VALUE
else CONTENT_STYLE_LIST_ITEM_HINT_VALUE
)
mBuilder?.setExtras(hints)
return this
}
fun asBrowsable(): Builder {
mFlags = mFlags or MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
return this
}
fun asPlayable(): Builder {
mFlags = mFlags or MediaBrowserCompat.MediaItem.FLAG_PLAYABLE
return this
}
fun build(): MediaBrowserCompat.MediaItem {
val result = MediaBrowserCompat.MediaItem(mBuilder!!.build(), mFlags)
mBuilder = null
mFlags = 0
return result
}
init {
mBuilder = MediaDescriptionCompat.Builder()
}
companion object{
// Hints - see https://developer.android.com/training/cars/media#default-content-style
const val CONTENT_STYLE_SUPPORTED = "android.media.browse.CONTENT_STYLE_SUPPORTED"
const val CONTENT_STYLE_BROWSABLE_HINT = "android.media.browse.CONTENT_STYLE_BROWSABLE_HINT"
const val CONTENT_STYLE_PLAYABLE_HINT = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT"
const val CONTENT_STYLE_LIST_ITEM_HINT_VALUE = 1
const val CONTENT_STYLE_GRID_ITEM_HINT_VALUE = 2
}
}
}

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
package code.name.monkey.retromusic.db
import androidx.room.*
@Dao
interface BlackListStoreDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertBlacklistPath(blackListStoreEntity: BlackListStoreEntity)
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertBlacklistPath(blackListStoreEntities: List<BlackListStoreEntity>)
@Delete
suspend fun deleteBlacklistPath(blackListStoreEntity: BlackListStoreEntity)
@Query("DELETE FROM BlackListStoreEntity")
suspend fun clearBlacklist()
@Query("SELECT * FROM BlackListStoreEntity")
fun blackListPaths(): List<BlackListStoreEntity>
}

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