GithubHelp home page GithubHelp logo

naman14 / timberx Goto Github PK

View Code? Open in Web Editor NEW
1.5K 39.0 355.0 4.65 MB

Material theme music player that works across all form factors (phones, wear, auto, cast, assistant) and uses latest tools (Kotlin, Architecture components, Room, Databinding)

Home Page: https://namand.in

Kotlin 95.28% Java 4.72%
android kotlin music-player wearos material-theme cast hacktoberfest

timberx's Introduction

Build Status

TimberX

Fully featured Material theme music player that works all form factors and uses latest tools

Get it on Google Play

Alternately, Download from Github releases


TimberX is built with latest development tools and design patterns.

  • Written in Kotlin
  • Android Architecture Components (Viewmodels, Livedata, Room)
  • Databinding
  • Dependency injection with KOIN

TimberX works across all devices including

  • Phones
  • Android Wear
  • Android Auto
  • Chromecast and other cast devices
  • Google Assistant

If you are looking for more UI customisability, instead checkout out Timber.

Phones

Cast

Cast individual songs or load a queue

Android Wear

Browsing music library from wear device and common playback controls are supported.

Android Auto




Google Assistant

TimberX works with Google Assistant. Common voice commands that work with assistant are

  • play music on timber
  • play 'song name' on timber
  • play
  • pause
  • next song
  • previous song

License

(c) 2019 Naman Dwivedi

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.

You should have received a copy of the GNU General Public License along with this app. If not, see https://www.gnu.org/licenses/.

timberx's People

Contributors

afollestad avatar aliazaz avatar costular avatar deandreamatias avatar enwokoma avatar iamvukasin avatar naman14 avatar paolovalerdi avatar shmykelsa avatar vistaus avatar zjunior06 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  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

timberx's Issues

Support album artist tag

TimberX doesn't seem to support the album artist tag, which makes the artist listing unnecessarily long and clumsy to navigate (not to mention the horrible Last.fm album art). For example, see TimberX v1.5 versus Vanilla and Odyssey.

TimberX:

screenshot_20190303-130012-fs8

Vanilla:

screenshot_20190303-130255-fs8

Odyssey:

screenshot_20190303-125935-fs8

Use a plugin to enforce code styles

All of my open source projects use Spotless.

If you use CI code style violations are caught there as well, with plugins like this.


I would also recommend something like Codacy which is free, and checks code quality and provides suggestions on how to make it better. I use that on most of my projects as well :)

Deleting playlist

Description what you'd like to happen:

I think it's self-explanatory.

Describe alternatives you've considered:

None.

Google Cast not working at all

App Version:

1.3

Affected Device(s):

LG V10 with Android 7.0

Describe the Bug:

Whenever I hit the "cast" button, app shows as connected, but in fact music still plays in the loudspeaker and TimberX is not connected at all

To Reproduce:

  1. Open app
  2. Start playing song
  3. Start casting

Expected Behavior:

Audio should be played through Google Cast devices. It does not work on 2 Google Home minis and 1 Chromecast. All other music apps work.

Crash when clicking Delete from device

Please consider making a Pull Request if you are capable of doing so.

App Version:

1.5

Affected Device(s):

All

Describe the Bug:

A clear description of what is the bug is.

To Reproduce:
1.
2.
3.

Expected Behavior:

A clear description of what you expected to happen.

Suggestion for album covers

Im suggesting to make make album cover with its full size , but with rounded corners ,bcuz now its just cutted in a half

Break out player logic from the Music Service

There is a lot of logic in the service itself, none of which is testable. It would be great to break out all of that logic into a separate class.

That separate class would be unit testable and also injectable.

I can make a PR for this.

List of enhancements

I want to suggest a few enhancements that would make the app even better and also report some bugs:

  1. On clicking the search icon there is an abrupt switch to the search ui, a Transition would be better.
  2. Change the font to Google Product sans.
  3. Increase the size of the shuffle and repeat icons.
  4. The create playlists extended fab moves scrolls up with the scrolling of the album's list.
  5. Use Adaptive icon.
  6. If you are using the new outlined icons, then the pause icon should also be outlined to match other icons.
  7. Increase the height(width) of the song progress indicator in the minimised form as it is barely visible in smaller screens.

Songs aren't being sorted by track correctly

When I open my folders, album they are sort by the logical of the cpu not by the of humans. PHP has a special function to sort things in the human ways like 1, 2, 3 ... 9, 10. I think there is also one in kotlin. In TimberX it's sort 1,10, 2. That's not good in my opinion. It would be great if you could change it. Thanks and it's a great work of you! I like this player and think its much more worth than 0,99 โ‚ฌ (80,60 rupien).

Option menu not working

App version: 1.2

Option menu clicked isn't working in the "Now Playing" view/activity (menu at the top right corner)

The ability to play all music in a folder

Hello,

I think it would be great to have a simple widget, but I'm sure it's already on todo list.

The feature I really miss is being able to play whole folder. For example, I have folder with all the music from one band. That folder contains many other folders (albums). Now I want to hold on the folder and be able to select to play it as a whole. Or maybe 3 dot opening menu. Something like that. I can't play it from the artist selection, as many of the songs have more artist than one.

Otherwise, it's a good simplistic app. A few improvements and it'll be the best music player out there!

Song ProgressBar sometimes doesn't reset when song completes

Please consider making a Pull Request if you are capable of doing so.

App Version:

1.2

Affected Device(s):

All

Describe the Bug:

A clear description of what is the bug is.

To Reproduce:
1.
2.
3.

Expected Behavior:

A clear description of what you expected to happen.

Spotify integration

Is it possible to add a fully spotify integration? It would be very nice as an alternative client if it is better.

Tech debt: Split up app into various modules

The app is not huge but it's not tiny - app/build.gradle has a ton of dependencies.

The build time and maintainability would highly benefit from having more than a single module. This allows Gradle to better take advantage of caching so you only build what has changed, etc.

App showing genres without songs

App Version:

1.5

Affected Device(s):

Huawei Nexus 6P with Android 8.1

Describe the Bug:

Genres without any song are listed as " -1 songs" in the "Genres" section of the app.

To Reproduce:

  1. Go to the "Genres" tab
  2. Click on any genre which has -1 songs
  3. Check there's no songs for that genre

Expected Behavior:

The application shouldn't list genres without any songs.

Song Thumbnails Incorrect

Please consider making a Pull Request if you are capable of doing so.

App Version:

1.50

Affected Device(s):

Moto G5 Plus - Android 8.1 Oreo

Describe the Bug:

Some of the thumbnails for songs on my phone are just images from my photo gallery. The art for the album itself (both in library and now playing) is correct. But when looking at the songs tab or songlist for an album, the thumbnails are wrong.

The album is tagged properly with art and info.

To Reproduce:

  1. Add album to phone and make sure it appears in library
  2. Open album to look at song list (or 'songs' tab)

Expected Behavior:

The thumbnails for the songs would match the album cover. Not be pictures from my photo gallery/camera roll

Use dependency injection

Dagger or something a little easier to use/setup like KOIN.

This would be very useful for your repository classes - you could/should get rid of getInstance() singleton access. It would be great for media player API stuff too. KOIN lets you inject View Models as well.

Oh, and this makes everything very unit testable as dependencies can be mocked, etc.

New logo so the app stand out in play store

Great app, I am curently using this app as my music player. I really love it simple UI.
I think you need to revamp the logo so your app will stand out in the sea of music player in play store. I can design a new logo for you, I am a graphic designer and love to contribute to open source project as a practice to get better in graphic design. just let me know if you want a new logo for TimberX. cheers.

Dark/amoled themes

I would like to see a dark mode (dark grey / OLED theme) on this app.
It would make this application perfect !

Add CI to test PRs and branches for successful builds

All that you gotta do is create an account on Travis.ci and add the repository. I can add the configuration to the repo here when you're ready, and we can add a badge to the README.

IMO this is very important because we want to make sure master is building successfully and that PRs won't break anything if they are merged (especially if unit tests are added to the repo). ๐Ÿ˜

Crash on first launch in the background service

The background service seems to be started my the media connection before the storage permission is granted, resulting in a crash.

I also noticed that if the crash is avoided, the app remains at a blank screen. The fragments should ideally be added to the view pager and the toolbar should be shown, until the permission is granted.

Changes to now playing UI/UX?

It seems a bit unintuitive that when you slide up the bar that shows currently playing music name, it opens a bottomsheet with controls and if you tap on it, abruptly switches to a full screen control ui with the same functionality of the bottomsheet...

I think instead of using a separate bottomsheet, you should expand it to the full screen ui with a slide up animation on tap and get rid of the bottomsheet (just like Google Play music and most other music players)....

What do you think?

"delete from device"

app is closing itself after deleting track
using oneplus 5t oxygen os
bug is reproducable

Android Auto completely broken

App Version:

1.5

Affected Device(s):

LG V10 with Android 7.0

Describe the Bug:

No audio is reproduced when selecting a song in the car + no selection is taken

To Reproduce:

  1. Connect phone to car
  2. Select TimberX
  3. Select a song

Expected Behavior:

The song should start playing. The playback screen doesn't change too, leaving the old song.

Plus, I think Android Auto UI should be improved with more buttons (like shuffle play, repeat etc...) and with the ability to browse the library better.

Not working with Google Assistant

Google assistant isn't picking up the app to play songs with it. When i tell google assistant to play "song" with TimberX (or timber x, Timber, timberx music player) it isn't recognizing the app

Song progress seeker doesn't move

Please consider making a Pull Request if you are capable of doing so.

App Version:

v1.5

Affected Device(s):

Android 8.1

Describe the Bug:

Seekbar/ progressbar doesn't move at all, although it does respond to time seeking.
To Reproduce:

  1. Play a song
    screenshot_20190210-143545

Crash on opening the app - Clone and run

App version: 1.5
Android Studio Version: 3.3.1

Steps to reproduce:

  1. Clone repo from github
  2. Add your own google-services.json
  3. Build and run project

Result: Crash

Crash log:

2019-02-27 00:01:17.769 23477-23515/com.naman14.timberx E/KOIN: [ERROR] - Error while resolving instance for class 'com.naman14.timberx.playback.players.SongPlayer' - error: org.koin.error.BeanInstanceCreationException: Can't create definition for 'Factory [name='RealSongPlayer',class='com.naman14.timberx.playback.players.RealSongPlayer', binds~(com.naman14.timberx.playback.players.SongPlayer)]' due to error :
    		Can't create handler inside thread Thread[DefaultDispatcher-worker-1,5,main] that has not called Looper.prepare()
    		android.os.Handler.<init>(Handler.java:205)
    		android.os.Handler.<init>(Handler.java:118)
    		android.support.v4.media.session.MediaSessionCompat.setCallback(MediaSessionCompat.java:550)
    		android.support.v4.media.session.MediaSessionCompat.setCallback(MediaSessionCompat.java:535)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:495)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:456)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:430)
    		com.naman14.timberx.playback.players.RealSongPlayer.<init>(SongPlayer.kt:142)
    		com.naman14.timberx.playback.MediaModuleKt$mediaModule$1$3.invoke(MediaModule.kt:36)
    		com.naman14.timberx.playback.MediaModuleKt$mediaModule$1$3.invoke(Unknown Source:2)
    		org.koin.core.instance.holder.InstanceHolder$DefaultImpls.create(InstanceHolder.kt:17)
    		org.koin.core.instance.holder.FactoryInstanceHolder.create(FactoryInstanceHolder.kt:10)
    		org.koin.core.instance.holder.FactoryInstanceHolder.get(FactoryInstanceHolder.kt:13)
    		org.koin.core.instance.InstanceFactory.retrieveInstance(InstanceFactory.kt:53)
    		org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:138)
    		org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:39)
    		org.koin.core.stack.ResolutionStack.resolve(ResolutionStack.kt:44)
    		org.koin.core.instance.InstanceRegistry.resolveInstance(InstanceRegistry.kt:137)
    		org.koin.core.instance.InstanceRegistry.access$resolveInstance(InstanceRegistry.kt:39)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:98)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:39)
    		org.koin.core.time.DurationKt.logDuration(Duration.kt:11)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:97)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:39)
    		org.koin.core.time.DurationKt.measureDuration(Duration.kt:19)
    		org.koin.core.instance.InstanceRegistry.proceedResolution(InstanceRegistry.kt:87)
    		org.koin.core.instance.InstanceRegistry.resolve(InstanceRegistry.kt:61)
    		com.naman14.timberx.playback.TimberMusicService$$special$$inlined$inject$7.invoke(ComponentCallbacksExt.kt:147)
    		kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    		com.naman14.timberx.playback.TimberMusicService.getPlayer(Unknown Source:26)
    		com.naman14.timberx.playback.TimberMusicService.access$getPlayer$p(TimberMusicService.kt:66)
    		com.naman14.timberx.playback.TimberMusicService$onCreate$1$1.invokeSuspend(TimberMusicService.kt:114)
    		kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)
    		kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
    		kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
    		kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
    		kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) 
2019-02-27 00:01:17.866 23477-23515/com.naman14.timberx E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
    Process: com.naman14.timberx, PID: 23477
    org.koin.error.BeanInstanceCreationException: Can't create definition for 'Factory [name='RealSongPlayer',class='com.naman14.timberx.playback.players.RealSongPlayer', binds~(com.naman14.timberx.playback.players.SongPlayer)]' due to error :
    		Can't create handler inside thread Thread[DefaultDispatcher-worker-1,5,main] that has not called Looper.prepare()
    		android.os.Handler.<init>(Handler.java:205)
    		android.os.Handler.<init>(Handler.java:118)
    		android.support.v4.media.session.MediaSessionCompat.setCallback(MediaSessionCompat.java:550)
    		android.support.v4.media.session.MediaSessionCompat.setCallback(MediaSessionCompat.java:535)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:495)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:456)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:430)
    		com.naman14.timberx.playback.players.RealSongPlayer.<init>(SongPlayer.kt:142)
    		com.naman14.timberx.playback.MediaModuleKt$mediaModule$1$3.invoke(MediaModule.kt:36)
    		com.naman14.timberx.playback.MediaModuleKt$mediaModule$1$3.invoke(Unknown Source:2)
    		org.koin.core.instance.holder.InstanceHolder$DefaultImpls.create(InstanceHolder.kt:17)
    		org.koin.core.instance.holder.FactoryInstanceHolder.create(FactoryInstanceHolder.kt:10)
    		org.koin.core.instance.holder.FactoryInstanceHolder.get(FactoryInstanceHolder.kt:13)
    		org.koin.core.instance.InstanceFactory.retrieveInstance(InstanceFactory.kt:53)
    		org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:138)
    		org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:39)
    		org.koin.core.stack.ResolutionStack.resolve(ResolutionStack.kt:44)
    		org.koin.core.instance.InstanceRegistry.resolveInstance(InstanceRegistry.kt:137)
    		org.koin.core.instance.InstanceRegistry.access$resolveInstance(InstanceRegistry.kt:39)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:98)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:39)
    		org.koin.core.time.DurationKt.logDuration(Duration.kt:11)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:97)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:39)
    		org.koin.core.time.DurationKt.measureDuration(Duration.kt:19)
    		org.koin.core.instance.InstanceRegistry.proceedResolution(InstanceRegistry.kt:87)
    		org.koin.core.instance.InstanceRegistry.resolve(InstanceRegistry.kt:61)
    		com.naman14.timberx.playback.TimberMusicService$$special$$inlined$inject$7.invoke(ComponentCallbacksExt.kt:147)
    		kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    		com.naman14.timberx.playback.TimberMusicService.getPlayer(Unknown Source:26)
    		com.naman14.timberx.playback.TimberMusicService.access$getPlayer$p(TimberMusicService.kt:66)
    		com.naman14.timberx.playback.TimberMusicService$onCreate$1$1.invokeSuspend(TimberMusicService.kt:114)
    		kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)
    		kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
    		kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
    		kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
    		kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
        at org.koin.core.instance.holder.InstanceHolder$DefaultImpls.create(InstanceHolder.kt:23)
        at org.koin.core.instance.holder.FactoryInstanceHolder.create(FactoryInstanceHolder.kt:10)
        at org.koin.core.instance.holder.FactoryInstanceHolder.get(FactoryInstanceHolder.kt:13)
        at org.koin.core.instance.InstanceFactory.retrieveInstance(InstanceFactory.kt:53)
2019-02-27 00:01:17.866 23477-23515/com.naman14.timberx E/AndroidRuntime:     at org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:138)
        at org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:39)
        at org.koin.core.stack.ResolutionStack.resolve(ResolutionStack.kt:44)
        at org.koin.core.instance.InstanceRegistry.resolveInstance(InstanceRegistry.kt:137)
        at org.koin.core.instance.InstanceRegistry.access$resolveInstance(InstanceRegistry.kt:39)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:98)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:39)
        at org.koin.core.time.DurationKt.logDuration(Duration.kt:11)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:97)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:39)
        at org.koin.core.time.DurationKt.measureDuration(Duration.kt:19)
        at org.koin.core.instance.InstanceRegistry.proceedResolution(InstanceRegistry.kt:87)
        at org.koin.core.instance.InstanceRegistry.resolve(InstanceRegistry.kt:61)
        at com.naman14.timberx.playback.TimberMusicService$$special$$inlined$inject$7.invoke(ComponentCallbacksExt.kt:147)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at com.naman14.timberx.playback.TimberMusicService.getPlayer(Unknown Source:26)
        at com.naman14.timberx.playback.TimberMusicService.access$getPlayer$p(TimberMusicService.kt:66)
        at com.naman14.timberx.playback.TimberMusicService$onCreate$1$1.invokeSuspend(TimberMusicService.kt:114)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)
        at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
2019-02-27 00:01:17.866 23477-23515/com.naman14.timberx E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
    Process: com.naman14.timberx, PID: 23477
    org.koin.error.BeanInstanceCreationException: Can't create definition for 'Factory [name='RealSongPlayer',class='com.naman14.timberx.playback.players.RealSongPlayer', binds~(com.naman14.timberx.playback.players.SongPlayer)]' due to error :
    		Can't create handler inside thread Thread[DefaultDispatcher-worker-1,5,main] that has not called Looper.prepare()
    		android.os.Handler.<init>(Handler.java:205)
    		android.os.Handler.<init>(Handler.java:118)
    		android.support.v4.media.session.MediaSessionCompat.setCallback(MediaSessionCompat.java:550)
    		android.support.v4.media.session.MediaSessionCompat.setCallback(MediaSessionCompat.java:535)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:495)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:456)
    		android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:430)
    		com.naman14.timberx.playback.players.RealSongPlayer.<init>(SongPlayer.kt:142)
    		com.naman14.timberx.playback.MediaModuleKt$mediaModule$1$3.invoke(MediaModule.kt:36)
    		com.naman14.timberx.playback.MediaModuleKt$mediaModule$1$3.invoke(Unknown Source:2)
    		org.koin.core.instance.holder.InstanceHolder$DefaultImpls.create(InstanceHolder.kt:17)
    		org.koin.core.instance.holder.FactoryInstanceHolder.create(FactoryInstanceHolder.kt:10)
    		org.koin.core.instance.holder.FactoryInstanceHolder.get(FactoryInstanceHolder.kt:13)
    		org.koin.core.instance.InstanceFactory.retrieveInstance(InstanceFactory.kt:53)
    		org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:138)
    		org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:39)
    		org.koin.core.stack.ResolutionStack.resolve(ResolutionStack.kt:44)
    		org.koin.core.instance.InstanceRegistry.resolveInstance(InstanceRegistry.kt:137)
    		org.koin.core.instance.InstanceRegistry.access$resolveInstance(InstanceRegistry.kt:39)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:98)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:39)
    		org.koin.core.time.DurationKt.logDuration(Duration.kt:11)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:97)
    		org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:39)
    		org.koin.core.time.DurationKt.measureDuration(Duration.kt:19)
    		org.koin.core.instance.InstanceRegistry.proceedResolution(InstanceRegistry.kt:87)
    		org.koin.core.instance.InstanceRegistry.resolve(InstanceRegistry.kt:61)
    		com.naman14.timberx.playback.TimberMusicService$$special$$inlined$inject$7.invoke(ComponentCallbacksExt.kt:147)
    		kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    		com.naman14.timberx.playback.TimberMusicService.getPlayer(Unknown Source:26)
    		com.naman14.timberx.playback.TimberMusicService.access$getPlayer$p(TimberMusicService.kt:66)
    		com.naman14.timberx.playback.TimberMusicService$onCreate$1$1.invokeSuspend(TimberMusicService.kt:114)
    		kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)
    		kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
    		kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
    		kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
    		kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
        at org.koin.core.instance.holder.InstanceHolder$DefaultImpls.create(InstanceHolder.kt:23)
        at org.koin.core.instance.holder.FactoryInstanceHolder.create(FactoryInstanceHolder.kt:10)
        at org.koin.core.instance.holder.FactoryInstanceHolder.get(FactoryInstanceHolder.kt:13)
        at org.koin.core.instance.InstanceFactory.retrieveInstance(InstanceFactory.kt:53)
2019-02-27 00:01:17.867 23477-23515/com.naman14.timberx E/AndroidRuntime:     at org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:138)
        at org.koin.core.instance.InstanceRegistry$resolveInstance$1.invoke(InstanceRegistry.kt:39)
        at org.koin.core.stack.ResolutionStack.resolve(ResolutionStack.kt:44)
        at org.koin.core.instance.InstanceRegistry.resolveInstance(InstanceRegistry.kt:137)
        at org.koin.core.instance.InstanceRegistry.access$resolveInstance(InstanceRegistry.kt:39)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:98)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1$2.invoke(InstanceRegistry.kt:39)
        at org.koin.core.time.DurationKt.logDuration(Duration.kt:11)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:97)
        at org.koin.core.instance.InstanceRegistry$proceedResolution$$inlined$synchronized$lambda$1.invoke(InstanceRegistry.kt:39)
        at org.koin.core.time.DurationKt.measureDuration(Duration.kt:19)
        at org.koin.core.instance.InstanceRegistry.proceedResolution(InstanceRegistry.kt:87)
        at org.koin.core.instance.InstanceRegistry.resolve(InstanceRegistry.kt:61)
        at com.naman14.timberx.playback.TimberMusicService$$special$$inlined$inject$7.invoke(ComponentCallbacksExt.kt:147)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at com.naman14.timberx.playback.TimberMusicService.getPlayer(Unknown Source:26)
        at com.naman14.timberx.playback.TimberMusicService.access$getPlayer$p(TimberMusicService.kt:66)
        at com.naman14.timberx.playback.TimberMusicService$onCreate$1$1.invokeSuspend(TimberMusicService.kt:114)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)
        at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
2019-02-27 00:01:18.162 23477-23511/com.naman14.timberx E/libc: Access denied finding property "vendor.debug.egl.swapinterval"
2019-02-27 00:01:18.170 23477-23511/com.naman14.timberx E/libc: Access denied finding property "vendor.debug.egl.swapinterval"

doAsync classes will leak

Stuff like:

class doAsync(val handler: () -> Unit) : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void?): Void? {
        handler()
        return null
    }
}

Will very likely cause a memory leak if the task doesn't end before the app is minimized. It's better to use scoped coroutines or RxJava.

How to add music and albums?

Cannot find any instructions or an area within the app on android studio about how to link any music to the app. Is there a folder for the music?
is there any server scripts i need to get?

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.