Giter Club home page Giter Club logo

gramophone's People

Contributors

123duo3 avatar akanetan avatar ankitstha avatar atrafon avatar cachiusa avatar doriandu45 avatar e829dce avatar fosslatic avatar grigger74 avatar imjyotiraditya avatar jxstavasy avatar lightsummer233 avatar mastoduy avatar nekomekoraiyuu avatar neroices avatar nift4 avatar nukesource avatar nurkeinneid avatar omersusin avatar pxeemo avatar rehork avatar reindex-ot avatar santossi avatar softinterlingua avatar softonicblip avatar topazrn avatar vertekplus avatar weblate avatar yurical avatar yuyuko1024 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gramophone's Issues

[BUG] When updating from the release installed from F-droid to a current dev release, icon disappears from launcher

Describe the bug
The bug is reproduced reliably by uninstalling everything, reinstalling 1.0.1 from F-droid, placing the icon on homescreen, and then updating from a dev apk; the icon disappears from homescreen/launcher.

See these relevant logs, especially I'm think about the resource path change, would this explain something?

12-03 18:00:10.285  1373  1415 I ActivityManager: Force stopping org.akanework.gramophone appid=10373 user=-1: installPackageLI
12-03 18:00:10.285  1373  1415 I ActivityManager: Killing 30042:org.akanework.gramophone/u0a373 (adj 902): stop org.akanework.gramophone
12-03 18:00:10.498  1373  1451 I PackageManager: Package org.akanework.gramophone codePath changed from /data/app/org.akanework.gramophone-xUmAcNl8BZ7oAbKjLfQxRw== to /data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==; Retaining data and using new
12-03 18:00:10.499  1373  1451 W PackageManager: Code path for org.akanework.gramophone changing from /data/app/org.akanework.gramophone-xUmAcNl8BZ7oAbKjLfQxRw== to /data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==
12-03 18:00:10.499  1373  1451 W PackageManager: Resource path for org.akanework.gramophone changing from /data/app/org.akanework.gramophone-xUmAcNl8BZ7oAbKjLfQxRw== to /data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==
12-03 18:00:10.774  1373  1451 W PackageManager: Privileged permission android.permission.READ_PRIVILEGED_PHONE_STATE for package com.android.vending - not in privapp-permissions whitelist
12-03 18:00:10.775  1373  1451 W PackageManager: Privileged permission android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME for package com.android.vending - not in privapp-permissions whitelist
12-03 18:00:10.775  1373  1451 W PackageManager: Privileged permission android.permission.REBOOT for package com.android.vending - not in privapp-permissions whitelist
12-03 18:00:10.775  1373  1451 W PackageManager: Privileged permission android.permission.CHANGE_OVERLAY_PACKAGES for package com.android.vending - not in privapp-permissions whitelist
12-03 18:00:10.785  1373  1451 W PackageManager: Privileged permission android.permission.FORCE_STOP_PACKAGES for package com.google.android.gms - not in privapp-permissions whitelist
12-03 18:00:10.786  1373  1451 W PackageManager: Privileged permission android.permission.ALLOCATE_AGGRESSIVE for package com.google.android.gms - not in privapp-permissions whitelist
12-03 18:00:10.786  1373  1451 W PackageManager: Privileged permission android.permission.MODIFY_DAY_NIGHT_MODE for package com.google.android.gms - not in privapp-permissions whitelist
12-03 18:00:10.787  1373  1451 W PackageManager: Privileged permission android.permission.MEDIA_CONTENT_CONTROL for package com.google.android.gms - not in privapp-permissions whitelist
12-03 18:00:10.794  1373  1451 W PackageManager: Privileged permission android.permission.GET_ACCOUNTS_PRIVILEGED for package com.sonyericsson.album - not in privapp-permissions whitelist
12-03 18:00:10.800  1373  1451 W PackageManager: Privileged permission android.permission.READ_FRAME_BUFFER for package com.sonymobile.assist - not in privapp-permissions whitelist
12-03 18:00:10.800  1373  1451 W PackageManager: Privileged permission android.permission.CHANGE_CONFIGURATION for package com.sonymobile.assist - not in privapp-permissions whitelist
12-03 18:00:11.784  1373  1451 I zygote64: Explicit concurrent copying GC freed 350470(16MB) AllocSpace objects, 44(880KB) LOS objects, 42% free, 32MB/56MB, paused 13.880ms total 683.432ms
12-03 18:00:11.801  1033 14252 E         : Couldn't opendir /data/app/vmdl68976705.tmp: No such file or directory
12-03 18:00:11.801  1033 14252 E installd: Failed to delete /data/app/vmdl68976705.tmp: No such file or directory
12-03 18:00:11.804  1373  1451 I ActivityManager: Force stopping org.akanework.gramophone appid=10373 user=0: pkg removed
12-03 18:00:11.868  1966  1966 D Avrcp   : AvrcpServiceBroadcastReceiver-> Action: android.intent.action.PACKAGE_REMOVED
12-03 18:00:11.873  1966  1966 D BluetoothMapAppObserver: onReceive
12-03 18:00:11.873  1966  1966 D BluetoothMapAppObserver: The removed package is: org.akanework.gramophone
12-03 18:00:11.885  1373  1951 I ActivityManager: START u0 {dat=file:///data/user_de/0/com.google.android.packageinstaller/no_backup/package3172483816408597591.apk flg=0x2000000 cmp=com.google.android.packageinstaller/com.android.packageinstaller.InstallSuccess (has extras)} from uid 10048
12-03 18:00:11.889  1373  1951 D ActivityTrigger: activityStartTrigger: Activity is Triggerred in full screen ApplicationInfo{a2ff1ca com.google.android.packageinstaller}
12-03 18:00:11.889  1373  1951 E ActivityTrigger: activityStartTrigger: not whiteListedcom.google.android.packageinstaller/com.android.packageinstaller.InstallSuccess/26
12-03 18:00:11.889  1373  1951 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{a2ff1ca com.google.android.packageinstaller} is now in focus and seems to be in full-screen mode
12-03 18:00:11.889  1373  1951 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.google.android.packageinstaller/com.android.packageinstaller.InstallSuccess/26
12-03 18:00:11.889  1373  1951 D ActivityTrigger: ActivityTrigger activityPauseTrigger
12-03 18:00:11.890 29660 29785 I davx5   : [syncadapter.SyncUtils] App launched or other package (un)installed; current tasks provider = TasksOrg
12-03 18:00:11.892  1373  1451 I ActivityManager: Force stopping org.akanework.gramophone appid=10373 user=0: pkg removed
12-03 18:00:11.894  1373  1451 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{a2ff1ca com.google.android.packageinstaller} is now in focus and seems to be in full-screen mode
12-03 18:00:11.894  1373  1451 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.google.android.packageinstaller/com.android.packageinstaller.InstallSuccess/26
12-03 18:00:11.906 30201 30201 I Finsky  : [2] xad.g(1): xad - Received: android.intent.action.PACKAGE_REMOVED, [Mts5stGbxTFpDGtXXQga1tq71fmd0TCoxjv5xEdWP50]
12-03 18:00:11.916  1373  1373 I ActivityManager: Start proc 30359:com.android.keychain/1000 for service com.android.keychain/.KeyChainService
12-03 18:00:11.919  1373 30364 E PacketFilter: combine fail
12-03 18:00:11.924  1373  5907 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{a2ff1ca com.google.android.packageinstaller} is now in focus and seems to be in full-screen mode
12-03 18:00:11.924  1373  5907 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.google.android.packageinstaller/com.android.packageinstaller.InstallSuccess/26
12-03 18:00:11.934  1373  1438 W ResourceType: ResTable_typeSpec entry count inconsistent: given 1398, previously 1470
12-03 18:00:11.934  1373  1438 W ResourceType: ResTable_typeSpec entry count inconsistent: given 324, previously 340
12-03 18:00:11.934  1373  1438 W ResourceType: ResTable_typeSpec entry count inconsistent: given 348, previously 3130
12-03 18:00:11.939  2175  2175 D ImsResolver: maybeAddedImsService, packageName: org.akanework.gramophone
12-03 18:00:11.941  1966  1966 D Avrcp   : AvrcpServiceBroadcastReceiver-> Action: android.intent.action.PACKAGE_ADDED
12-03 18:00:11.941  1966  1966 D Avrcp   : AvrcpServiceBroadcastReceiver-> packageName: org.akanework.gramophone
12-03 18:00:11.941  1966  1966 D Avrcp   : packageName: org.akanework.gramophone removed: false
12-03 18:00:11.944  1966  1966 D Avrcp   : isBrowsableListUpdated: package includes MediaBrowserService, true
12-03 18:00:11.946  3055  3055 I InstalledPackageCache: Update: Received update request for 0
12-03 18:00:11.948  1966  1966 D Avrcp   : Trying to connect to com.sonyericsson.music.proxyservice.PlaybackService
12-03 18:00:11.948  1966  1966 D Avrcp   : Exit handlePackageModified
12-03 18:00:11.948  1966  1966 D BluetoothMapAppObserver: onReceive
12-03 18:00:11.948  1966  1966 D BluetoothMapAppObserver: The installed package is: org.akanework.gramophone
12-03 18:00:11.954  1966  1966 D BluetoothMapAppObserver: Found 0 application(s) with intent android.bluetooth.action.BLUETOOTH_MAP_PROVIDER
12-03 18:00:11.955  1966  1966 D BluetoothMapAppObserver: Found 0 application(s) with intent android.bluetooth.action.BLUETOOTH_MAP_IM_PROVIDER

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo 8.0

Auto - pause music when earphones are disconnected.

Is your feature request related to a problem? Please describe.
When playing music and disconnecting a wired or Bluetooth earphones, the music does not pause by itself and continues to play.
I would like the music to stop, because the moment i disconnect my earphones the song will play from my phone's speaker.

[BUG] Wrong translation license

The translation files are licensed AGPLv3+, when the source code files are licensed GPLv3+

Describe the bug

The license of the translation files should be changed to GPLv3+

To Reproduce

Distribute app as GPLv3+, when files are AGPLv3+.
I think there is some in-built compatibility that allows this, but seems to be in error.

Expected behavior

https://hosted.weblate.org/projects/gramophone/#information
should match
https://github.com/AkaneTan/Gramophone/blob/beta/LICENSE

Screenshots

Desktop (please complete the following information):

  • OS: N/A
  • Browser N/A
  • Version N/A

Smartphone (please complete the following information):

  • Device: N/A
  • OS: N/A
  • Browser N/A
  • Version N/A

Additional context

Can be fixed in https://hosted.weblate.org/settings/gramophone/strings-xml/

add possibility to play .wav files

Great improvement to the previous Symphonica version! I like the new project. The only thing I'm missing is the ability to play other file formats like .wav.

It would be really convenient if you'd add the possibility to play .wav files.

[BUG] certain songs won't play on gramophone but will on other music players

for some reason, some songs won't even play even after refreshing so many times. i tried deleting the file and redowloading it a few times, even downloading it in different formats such as mp3 and flac but the result was the same. all my other songs have the same bitrate and file type

i decided to try to play the same file on oto music and it works flawlessly so i'm clueless about what it could be

no matter how many times i try, even force closing the app or deleting data or uninstall gramophone as a whole the result is the same

i downloaded all the songs i have using spowlo on default settings
Screenshot_20231202-142054
Screenshot_20231202-142023

Manage & Add your playlist

Is your feature request related to a problem? Please describe.

  • Manage & Add your playlist
    I am currently experiencing difficulties creating new playlists or adding songs to existing playlists. Could you please provide information on when this feature will be implemented or if there are any updates on its availability?

Thanks in advance.

[BUG]歌曲详细信息中的文件路径显示不了

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

[BUG] When compared to README screenshots, tabs underlining seems like the upper part of something with no lower part

Describe the bug
When compared to README screenshots, tabs underlining seems like the upper part of something with no lower part, see the screenshot below (purple underlining have rounded corner on the upper side but a straight cut on the lower side under "Songs").

Expected behavior
This looked more natural the way it looked on the README's screenshots, but slight redesigns might have happened since

Screenshots

Screenshot

Screenshot_20231106-174843

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo (8.0)
  • Version 1.0.1

[BUG] No covers are displayed

Describe the bug
Gramophone currently shows no covers at all

To Reproduce
Just install Gramophone, probably on older Android (see below) and have songs that should have covers whether it is in metadata or a cover picture in the folder and see that none are displayed

Expected behavior
Covers should be loaded

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo (8.0)
  • Version 1.0.1

Additional context
This might be because of some changes in behavior along Android versions, and maybe some information can be found there: chr56/Phonograph_Plus#65 (comment)

These logs seems related:

Logs
11-06 17:41:03.324  3226  3426 E DatabaseUtils: Writing exception to parcel
11-06 17:41:03.324  3226  3426 E DatabaseUtils: java.lang.SecurityException: External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1620562783893: Neither user 10248 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.app.ContextImpl.enforce(ContextImpl.java:1735)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1767)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.content.ContextWrapper.enforceCallingOrSelfPermission(ContextWrapper.java:756)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.enforceCallingOrSelfPermissionAndAppOps(MediaProvider.java:5680)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.checkAccess(MediaProvider.java:4604)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.ensureFileExists(MediaProvider.java:3473)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.getAlbumArtOutputUri(MediaProvider.java:4887)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.makeThumbInternal(MediaProvider.java:5020)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.getThumb(MediaProvider.java:4950)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.openFile(MediaProvider.java:4503)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.content.ContentProvider.openAssetFile(ContentProvider.java:1545)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.content.ContentProvider.openTypedAssetFile(ContentProvider.java:1725)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.content.ContentProvider.openTypedAssetFile(ContentProvider.java:1791)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:425)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:308)
11-06 17:41:03.324  3226  3426 E DatabaseUtils: 	at android.os.Binder.execTransact(Binder.java:674)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: Writing exception to parcel
11-06 17:41:03.327  3226  3704 E DatabaseUtils: java.lang.SecurityException: External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1620562614225: Neither user 10248 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.app.ContextImpl.enforce(ContextImpl.java:1735)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1767)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.content.ContextWrapper.enforceCallingOrSelfPermission(ContextWrapper.java:756)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.enforceCallingOrSelfPermissionAndAppOps(MediaProvider.java:5680)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.checkAccess(MediaProvider.java:4604)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.ensureFileExists(MediaProvider.java:3473)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.getAlbumArtOutputUri(MediaProvider.java:4887)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.makeThumbInternal(MediaProvider.java:5020)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.getThumb(MediaProvider.java:4950)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.openFile(MediaProvider.java:4503)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.content.ContentProvider.openAssetFile(ContentProvider.java:1545)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.content.ContentProvider.openTypedAssetFile(ContentProvider.java:1725)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.content.ContentProvider.openTypedAssetFile(ContentProvider.java:1791)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:425)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:308)
11-06 17:41:03.327  3226  3704 E DatabaseUtils: 	at android.os.Binder.execTransact(Binder.java:674)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: Writing exception to parcel
11-06 17:41:03.340  3226  3240 E DatabaseUtils: java.lang.SecurityException: External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1611423074907: Neither user 10248 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.app.ContextImpl.enforce(ContextImpl.java:1735)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1767)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.content.ContextWrapper.enforceCallingOrSelfPermission(ContextWrapper.java:756)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.enforceCallingOrSelfPermissionAndAppOps(MediaProvider.java:5680)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.checkAccess(MediaProvider.java:4604)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.ensureFileExists(MediaProvider.java:3473)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.getAlbumArtOutputUri(MediaProvider.java:4887)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.makeThumbInternal(MediaProvider.java:5020)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.getThumb(MediaProvider.java:4950)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at com.android.providers.media.MediaProvider.openFile(MediaProvider.java:4503)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.content.ContentProvider.openAssetFile(ContentProvider.java:1545)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.content.ContentProvider.openTypedAssetFile(ContentProvider.java:1725)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.content.ContentProvider.openTypedAssetFile(ContentProvider.java:1791)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:425)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:308)
11-06 17:41:03.340  3226  3240 E DatabaseUtils: 	at android.os.Binder.execTransact(Binder.java:674)

What's strange though is that the application does have the storage permission though.

[FR] Prefered Disaply Style in Album Tab is not saved.

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Alubum Tab'
  2. Change Default view
  3. Restrat the app
  4. Bug:- the view reset to default one, (large Album art view)

Desktop (please complete the following information):

  • OS: Andoid 13
  • Version : Gramophone-1.0.2.00fe62-release

Smartphone (please complete the following information):

  • Device: Moto G54
  • OS: Andoid 13 Spet Patch

Additional Feature Requests "Take ur Time"

  1. A good Home Screen Widget.
  2. Option to set Default tab while opening app (Def one is songs, want to change it to Albums)
  3. Add option to clear Playing Queue.
  4. Tag Editor

Lastly, Thanks for such a beautiful Offline Music Player, Hope to see fixes and improments in future.

[FR] Volume slider and a like button

I was oto music player user since very long period of time. So i got used to of these 2 features:

  1. A volume slider in now playing, here is the screenshot from oto music player now playing
    Screenshot_20231123-071940
  2. Also if you can a like (Add to favorite) button will be appreciated.
    Thanks

Query on web streaming

The roadmap states that web streaming is a goal of this project. I would like to ask what this means. Is the plan to support some selfhosted streaming api like subsonic/jellyfin or rather support a large streaming service like spotify or youtube?

Folder removal

The app uses various folders for searching music.
The fact is that you can't remove the folders that you don't want and you can't select a singular folder for music.

Can you add this?

[BUG] Audio skipping during playback of ACC codec .m4a format

Audio skipping during playback of ACC codec .m4a format

Some of my .m4a format audio file skipping/shuttering during playback. It is strange some audio with same codec works just fine. I checked if specific audio file was corrupted in case, but with native audio player it seems to play just fine. I have provided below some logs during specific event when audio skips happen. Could be just related to my old outdated hardware/codec. I hope there is way to troubleshoot this.

Expected behavior
A Smooth playback without any shutter of audio.

Logcat Details

11.09 14:13:23.865 10138 952 952 com.android.systemui V/MediaTimeout: processState: PlaybackState {state=3, position=6295, buffered position=64505, speed=1.0, updated=47267352, actions=7340031, custom actions=[Action:mName='Shuffle, mIcon=2131165386, mExtras=Bundle[EMPTY_PARCEL], Action:mName='Close, mIcon=2131165340, mExtras=Bundle[EMPTY_PARCEL]], active item id=26, error=null}
11.09 14:13:24.282 1046 555 17703 W/C2SoftAacDec: aacDecoder_DecodeFrame decoderErr = 0x4004
11.09 14:13:24.283 1046 555 17703 W/C2SoftAacDec: AAC decoder returned error 0x4004, substituting silence
11.09 14:13:24.666 1046 555 17703 W/C2SoftAacDec: aacDecoder_DecodeFrame decoderErr = 0x4004
11.09 14:13:24.666 1046 555 17703 W/C2SoftAacDec: AAC decoder returned error 0x4004, substituting silence

11.09 14:13:25.048 1041 465 570 W/APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1

11.09 14:13:25.585 1046 555 17703 W/C2SoftAacDec: aacDecoder_DecodeFrame decoderErr = 0x4004
11.09 14:13:25.585 1046 555 17703 W/C2SoftAacDec: AAC decoder returned error 0x4004, substituting silence

11.09 14:13:25.971 1046 555 17703 W/C2SoftAacDec: aacDecoder_DecodeFrame decoderErr = 0x4004
11.09 14:13:25.971 1046 555 17703 W/C2SoftAacDec: AAC decoder returned error 0x4004, substituting silence
11.09 14:13:26.322 10212 17148 17702 org.akanework.gramophone D/CCodecBuffers: [c2.android.aac.decoder#20:1D-Input.Impl[N]] codec released a buffer owned by client (index 3)
11.09 14:13:26.326 10212 17148 17702 org.akanework.gramophone D/CCodecBuffers: [c2.android.aac.decoder#20:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
11.09 14:13:26.869 10138 952 952 com.android.systemui V/MediaTimeout: processState: PlaybackState {state=3, position=9294, buffered position=64505, speed=1.0, updated=47270357, actions=7340031, custom actions=[Action:mName='Shuffle, mIcon=2131165386, mExtras=Bundle[EMPTY_PARCEL], Action:mName='Close, mIcon=2131165340, mExtras=Bundle[EMPTY_PARCEL]], active item id=26, error=null}

11.09 14:13:31.669 10212 17148 17702 org.akanework.gramophone D/CCodecBuffers: [c2.android.aac.decoder#20:1D-Input.Impl[N]] codec released a buffer owned by client (index 1)
11.09 14:13:31.678 10212 17148 17702 org.akanework.gramophone D/CCodecBuffers: [c2.android.aac.decoder#20:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
11.09 14:13:32.179 1046 555 17703 W/C2SoftAacDec: aacDecoder_DecodeFrame decoderErr = 0x4004
11.09 14:13:32.179 1046 555 17703 W/C2SoftAacDec: AAC decoder returned error 0x4004, substituting silence
11.09 14:13:32.186 10212 17148 17702 org.akanework.gramophone D/CCodecBuffers: [c2.android.aac.decoder#20:1D-Input.Impl[N]] codec released a buffer owned by client (index 2)
11.09 14:13:32.464 1046 555 17703 D/BufferPoolAccessor2.0: bufferpool2 0xb3939418 : 6(24576 size) total buffers - 1(4096 size) used buffers - 14552/14558 (recycle/alloc) - 91/14557 (fetch/transfer)
11.09 14:13:32.499 10212 17148 17164 org.akanework.gramophone I/work.gramophon: Background young concurrent copying GC freed 51887(1918KB) AllocSpace objects, 12(2592KB) LOS objects, 23% free, 14MB/18MB, paused 176us total 116.912ms

Smartphone info:

  • Device:
    SDK: 30
    PRODUCT_NAME: hlte
    DEVICE_NAME: hlte
    BOARD_NAME: MSM8974
    SUPPORTED_ABIS: armeabi-v7a, armeabi
    MANUFACTURER: samsung
    BRAND: samsung
    MODEL: SM-N9005
  • OS: [Lineage OS based on Android 11]

Show more details when the stop timer is running in the player

Is your feature request related to a problem? Please describe.
Currently when a timer is started in the app only the timer icon gets bolder and there is no indication on how much of the timer is left.
Tapping the timer icon brings up the page to set the timer and does not have any info of current running timer.

Describe the solution you'd like
When there is an active timer, add info on how much of the timer is left to the now playing page.

you can't exclude the folders you need

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.

[BUG] Crashes Upon Clicking a Song

Describe the bug
An error saying "No Virtual Method"

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Gramophone'
  2. Click on 'Any Song'
  3. See error

Expected behavior
crashes when clicking a song

Screenshots
Screenshot_2023-12-03-23-58-17-43

Smartphone (please complete the following information):

  • Device: [e.g. OPPO A37S]
  • OS: [e.g. android 5.1.1]
  • Browser [e.g. chrome]
  • Version [e.g. 1.0.2.bd8ec5]

[FR] Editable Lyrics and Auto-fetch from Online

Dear Gramophone Development Team,

I hope this message finds you well. I am an avid user of the Gramophone app, and I must say that I thoroughly enjoy its sleek UI and seamless music playback experience. However, I have identified a couple of features that, in my opinion, could enhance the user experience even further.

Firstly, the ability to edit lyrics directly within the app would be a fantastic addition. Many users, including myself, often come across situations where we'd like to customize or correct lyrics for a more personalized experience. Incorporating an editable lyrics feature would undoubtedly cater to this need.

Secondly, an auto-fetch lyrics option from online sources would be immensely beneficial. This feature could save users time and effort by automatically retrieving accurate and up-to-date lyrics for the songs they're listening to. This could be particularly handy when exploring new music or rediscovering old favorites.

I understand that implementing new features requires time and resources, but I believe these additions would significantly elevate the Gramophone app's functionality and appeal to a broader audience.

Thank you for your dedication to providing an exceptional music listening experience. I look forward to potential updates and improvements.

[BUG] NoClassDefFoundError in logs

Describe the bug
While player isn't used, there are these huge exceptions in logs.

Those should probably be taken care of, and these exception are at a log level of "information", which it probably shouldn't: these are exceptions.

To Reproduce
No STR

Expected behavior
No such exceptions in logs.

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo (8.0)
  • It's a gramophone debug build I was asked to test in another issue (not sure exactly which one)

Additional context
The logs:

12-28 23:09:43.559  7341  7341 I zygote64: Rejecting re-init on previously-failed class java.lang.Class<u1.p0>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/media/AudioTrack$StreamEventCallback;
12-28 23:09:43.559  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.559  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.559  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.559  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.559  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.559  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.559  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.559  7341  7341 I zygote64: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.media.AudioTrack$StreamEventCallback" on path: DexPathList[[zip file "/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/base.apk"],nativeLibraryDirectories=[/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/lib/arm64, /system/lib64, /system/vendor/lib64]]
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93)
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
12-28 23:09:43.559  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.559  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.559  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.559  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.559  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.559  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.559  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.559  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.559  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.559  7341  7341 I zygote64:
12-28 23:09:43.560  7341  7341 I zygote64: Rejecting re-init on previously-failed class java.lang.Class<u1.p0>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/media/AudioTrack$StreamEventCallback;
12-28 23:09:43.560  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.560  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.560  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.560  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.560  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.560  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.560  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.560  7341  7341 I zygote64: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.media.AudioTrack$StreamEventCallback" on path: DexPathList[[zip file "/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/base.apk"],nativeLibraryDirectories=[/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/lib/arm64, /system/lib64, /system/vendor/lib64]]
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93)
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
12-28 23:09:43.560  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.560  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.560  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.560  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.560  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.560  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.560  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.560  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.560  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.560  7341  7341 I zygote64:
12-28 23:09:43.561  7341  7341 I zygote64: Rejecting re-init on previously-failed class java.lang.Class<u1.p0>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/media/AudioTrack$StreamEventCallback;
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.561  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.561  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.561  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.561  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.561  7341  7341 I zygote64: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.media.AudioTrack$StreamEventCallback" on path: DexPathList[[zip file "/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/base.apk"],nativeLibraryDirectories=[/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/lib/arm64, /system/lib64, /system/vendor/lib64]]
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.561  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.561  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.561  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.561  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.561  7341  7341 I zygote64:
12-28 23:09:43.561  7341  7341 I zygote64: Rejecting re-init on previously-failed class java.lang.Class<u1.p0>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/media/AudioTrack$StreamEventCallback;
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.561  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.561  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.561  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.561  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.561  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.562  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.562  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.562  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.562  7341  7341 I zygote64: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.media.AudioTrack$StreamEventCallback" on path: DexPathList[[zip file "/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/base.apk"],nativeLibraryDirectories=[/data/app/org.akanework.gramophone-5OLWvLmuX83BTRBCaWSfOw==/lib/arm64, /system/lib64, /system/vendor/lib64]]
12-28 23:09:43.562  7341  7341 I zygote64:   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93)
12-28 23:09:43.562  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
12-28 23:09:43.562  7341  7341 I zygote64:   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
12-28 23:09:43.562  7341  7341 I zygote64:   at boolean o0.g.s() (SourceFile:1)
12-28 23:09:43.562  7341  7341 I zygote64:   at boolean com.bumptech.glide.c.F() (SourceFile:5)
12-28 23:09:43.562  7341  7341 I zygote64:   at java.lang.Object q3.a.b(java.lang.Class, java.util.HashSet) (SourceFile:1)
12-28 23:09:43.562  7341  7341 I zygote64:   at void q3.a.a(android.os.Bundle) (SourceFile:84)
12-28 23:09:43.562  7341  7341 I zygote64:   at boolean androidx.startup.InitializationProvider.onCreate() (SourceFile:51)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo, boolean) (ContentProvider.java:1919)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.content.ContentProvider.attachInfo(android.content.Context, android.content.pm.ProviderInfo) (ContentProvider.java:1894)
12-28 23:09:43.562  7341  7341 I zygote64:   at android.app.ContentProviderHolder android.app.ActivityThread.installProvider(android.content.Context, android.app.ContentProviderHolder, android.content.pm.ProviderInfo, boolean, boolean, boolean) (ActivityThread.java:6316)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.app.ActivityThread.installContentProviders(android.content.Context, java.util.List) (ActivityThread.java:5882)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:5803)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.app.ActivityThread.-wrap1(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:-1)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1666)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.os.Looper.loop() (Looper.java:251)
12-28 23:09:43.562  7341  7341 I zygote64:   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6572)
12-28 23:09:43.562  7341  7341 I zygote64:   at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-28 23:09:43.562  7341  7341 I zygote64:   at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
12-28 23:09:43.562  7341  7341 I zygote64:   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
12-28 23:09:43.562  7341  7341 I zygote64:

[BUG] Settings menu bottom not completely visible when it's too long

Describe the bug
Settings menu can slide when it's short and shouldn't be able to, and when it's long enough the very bottom is partially hidden

To Reproduce
Just visit settings with this release

Expected behavior
We shouldn't be able to slide from settings menu short enough, and should be able to see everything when it's long enough.

Screenshots

Screenshots

This one is short enough, see on first screenshot. Despite that, you can slide and end up in the state of second screenshot.
Screenshot_20231203-173342
Screenshot_20231203-173345

That one is long enough, and the very bottom is partially hidden
Screenshot_20231203-173311

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo 8.0
  • Release from #37 (comment)

investigate using media3 with system mediaplayer

Is your feature request related to a problem? Please describe.
CPU usage

Describe the solution you'd like
MediaPlayer uses less CPU

Describe alternatives you've considered
Not doing it - less work

Additional context
Media3 supports custom implementations of the "Player" interface, doesn't need to be ExoPlayer, so app architecture can stay the same and only GramophonePlaybackService will need changes

[BUG] Crash on app switching, or phone direction change

Describe the bug
Can't reproduce reliably currently nor am I sure this happened when switching to landscape/portrait or just coming back to Gramophone from something else, but it ended up totally crashed

Expected behavior
No crash

Logs from adb logcat and Screenshot from exception from within application

12-03 16:58:41.903  7854  7854 E AndroidRuntime: FATAL EXCEPTION: main
12-03 16:58:41.903  7854  7854 E AndroidRuntime: Process: org.akanework.gramophone, PID: 7854
12-03 16:58:41.903  7854  7854 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {org.akanework.gramophone/org.akanework.gramophone.ui.MainActivity}: java.util.concurrent.CancellationException: Task was cancelled.
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3650)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3690)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1648)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:105)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:251)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6572)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: Caused by: java.util.concurrent.CancellationException: Task was cancelled.
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at j6.l.g(SourceFile:33)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at j6.l.get(Unknown Source:21)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at org.akanework.gramophone.ui.components.PlayerBottomSheet.setVisible(SourceFile:28)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at o7.a.B(SourceFile:1)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.support.v4.media.k.Q(SourceFile:51)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at d1.e1.q(SourceFile:70)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at d1.e1.k(SourceFile:58)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at d1.y0.N(SourceFile:62)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at d1.y0.u(SourceFile:36)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at d1.i0.onStart(SourceFile:68)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at h.o.onStart(SourceFile:1)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.Activity.performStart(Activity.java:6992)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.Activity.performRestart(Activity.java:7066)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.Activity.performResume(Activity.java:7071)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3625)
12-03 16:58:41.903  7854  7854 E AndroidRuntime: 	... 8 more
12-03 16:58:41.976  1373  1438 W ActivityManager: setHasOverlayUi called on unknown pid: 785
Screenshots

Screenshot_20231203-165903
Screenshot_20231203-165907

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo 8.0
  • Release from #37 (comment)

[BUG] Crashes Upon Opening the App for the first time

Describe the bug
something about the permissions being denied "WRITE_EXTERNAL_STORAGE"

To Reproduce
Steps to reproduce the behavior:

  1. Click on 'Gramophone'
  2. See error

Expected behavior
when opening it for the first time it will crash saying about permission denied

Screenshots
Screenshot_2023-12-03-23-34-55-72

Smartphone (please complete the following information):

  • Device: [e.g. OPPO A37S]
  • OS: [e.g. Android 5.1.1]
  • Browser [e.g. chrome]
  • Version [e.g. 1.0.2.88d94e]

Lyrics support in .opus and .m4a files

Is your feature request related to a problem? Please describe.
Lyrics are not supported in opus files and not found in m4a

Describe the solution you'd like
Added the support for opus and fix for m4a

Describe alternatives you've considered
Support for external lrc (Idk if its already implemented or it will be added in the next update, but I know the app already have)

[BUG] There's a delay to show the songs, and it shows there are 0 songs for a couple of seconds

Describe the bug
There's a delay to show the songs and it shows there's 0 songs for a couple of seconds on every start. Bug was experienced on the release from #37 (comment) and is a regression: 1.0.1 was showing everything instantly.

To Reproduce
Just launch the application

Expected behavior
This should be an instant show like it was on previous release.

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo 8.0
  • Release from #37 (comment)

Playlist creation

Would be nice to have an option to create playlist by adding folders instead of manually picking artists/albums (similar to how aimp handles playlist creation).

splash screen

androidx splash screen lib and keep showing until load done

SD CARD AUDIO FILE NOT INDXING[BUG]

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

[BUG] Album cover does not show up

Describe the bug
The album cover does not show up if I manually add it trough a software like Mp3tag.

To Reproduce
Steps to reproduce the behavior:

  1. Download an audio file
  2. Attribute an image to the album cover to the file with a software such as Mp3tag
  3. Send the audio file to the phone
  4. Play the audio file on Gramophone

Expected behavior
I expected the album cover to show up, but it only show up on the lock screen or the toolbar at the top.

Screenshots
Screenshot_20240104-043012.png

Screenshot_20240104-043021~2.png

Screenshot_20240104-043027~2.png

Desktop (please complete the following information):

  • OS: [Windows 11]
  • Browser [Chrome]

Smartphone (please complete the following information):

  • Device: [Pixel 7]
  • OS: [Android 14]
  • Browser [Cromite]
  • Version [120.0.6099.144]

[FR] Subsonic

Hey, I'd like to suggest adding the Subsonic API as a web streaming backend when it comes out. It's a self-hostable, popular API implemented by many popular media/music servers, like Navidrome.
All Android apps for Subsonic (even those that claim to be following MD3 guidelines) still look like trash, but Gramophone has THE best design I've ever seen in a music player app! Good job!

[BUG] System buttons with no backgrounds can be very hard to read in some situations

Describe the bug
System buttons with no backgrounds can be very hard to read in some situations

To Reproduce
Just run Gramophone in on an Android presenting the buttons visible in the screenshot below

Expected behavior
It should be easier to read those buttons

Screenshots

Screenshot

Screenshot_20231106-174843
Screenshot_20231106-173137

Smartphone (please complete the following information):

  • Device: Xperia XZ
  • OS: Android Oreo (8.0)
  • Version 1.0.1

Additional context
This might be somewhat related to issues I reported where the buttons where white on a white background. I can add references to those issues if you think it'd be of any help.

Izzyondroid update

@IzzySoft hi sorry for the ping, but the app on izzydroid is outdated XD
Can I expect an update soon?
P.S. I saw the fastlane thing for songsync, is it also something necessary for Gramophone?

[BUG] "music format not supported!" text appears when trying to see lyrics

Describe the bug
after installing the version 1.0.2.bd8ec5 audio playback works great but there's a new issue now. whenever i try to read the lyrics of any song, the message described in the title will appear regardless of the song and audio format and quality.
To Reproduce
Steps to reproduce the behavior:

  1. open gramophone
  2. select any song
  3. tap on the lyrics button
  4. error shows up

Expected behavior
lyrics showing up normally and no error message should appear whatsoever

Screenshots
Screenshot_20231203-083415

Smartphone (please complete the following information):

  • Device: pixel 6
  • OS: android 14

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.