Giter VIP home page Giter VIP logo

mypodcasts-android's Introduction

mypodcasts-android

travis build MIT licensed

Podcast client for android.

Let's make a good app to listen our favorite podcasts with all amazing features that we imagine for free!

Download the APK

The APK is available here

Contributing:

I have a set of features to be worked and I plan to make them available as soon as possible which are:

  • Fix orientation change bug on audio playing.
  • Download Complete Feedback.
  • Feed search (using mypodcasts-api on top of some existing API that retrieves those).

Some of this issues are listed already, so any help will be well received.

Running tests:

I strongly recommend to use Android Studio for a smooth integration, but follow the command below if you wanna run all unit tests on your own environment:

$ ./gradlew test

Known issues with Android Studio

Some actions need to be taken by if you face this error below when trying to run the tests locally through Android Studio:

java.io.FileNotFoundException: build/intermediates/bundles/debug/AndroidManifest.xml (No such file or directory)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at org.robolectric.res.FileFsFile.getInputStream(FileFsFile.java:78)
	at org.robolectric.manifest.AndroidManifest.parseAndroidManifest(AndroidManifest.java:130)
	at org.robolectric.manifest.AndroidManifest.getTargetSdkVersion(AndroidManifest.java:480)
	at org.robolectric.RobolectricTestRunner.pickSdkVersion(RobolectricTestRunner.java:380)
	at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:173)
	at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:63)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:140)

Set the Working directory with the variable $MODULE_DIR$ and it should be fine. More details about this issue can be followed on robolectric#1648.

Running locally with stubbed service

As we don't have any API live yet, there is a stub that return some feeds for local tests purposes.

$ ./stub.sh

Once the server is up, you can run your app normally as a regular android project.

Take a look at the backend API mypodcasts-api if you want to contribute in there as well.

mypodcasts-android's People

Contributors

alabeduarte avatar fernando-alves avatar

Stargazers

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

Watchers

 avatar  avatar  avatar

mypodcasts-android's Issues

Increment versionCode with each release

package: name='com.mypodcasts' versionCode='1' versionName='0.1.7' platformBuildVersionName='6.0-2166767'

According to @IzzySoft on #20

Please remember increasing versionCode with each release. That's how updates are recognized internally. F-Droid repo cannot deal with multiple copies the same package if they also have identical versionCode ๐Ÿ˜‰

AudioPlayerActivity has leaked window

Stacktrace reveals window leaked error after switch from AudioPlayerActivity (audio player screen) to previous screen. The app doesn't crash though, but the logs shows the erros below:


07-19 16:17:15.168 6553-6553/com.mypodcasts E/WindowManager: android.view.WindowLeaked: Activity com.mypodcasts.player.AudioPlayerActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{26b0590c V.ED.... R......D 0,0-1080,232} that was originally added here
 at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
 at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271)
 at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
 at android.widget.MediaController.show(MediaController.java:354)
 at android.widget.MediaController.show(MediaController.java:314)
 at com.mypodcasts.player.AudioPlayerActivity.onTouchEvent(AudioPlayerActivity.java:90)
 at android.app.Activity.dispatchTouchEvent(Activity.java:2745)
 at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2330)
 at android.view.View.dispatchPointerEvent(View.java:8666)
 at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4123)
 at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3989)
 at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
 at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
 at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
 at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3680)
 at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
 at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3737)
 at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
 at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
 at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
 at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
 at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
 at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5807)
 at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5781)
 at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5752)
 at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5897)
 at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
 at android.os.MessageQueue.nativePollOnce(Native Method)
 at android.os.MessageQueue.next(MessageQueue.java:143)
 at android.os.Looper.loop(Looper.java:122)
 at android.app.ActivityThread.main(ActivityThread.java:5254)
 at java.lang.reflect.Method.invoke(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:372)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Fix orientation change bug on audio playing.

Looks like when the device orientation change occurrs or when the user switch between episodes, touching over them, pressing back button and selecting another fast, the AudioPlayer is losing the prepared state. When the app crash, then the following error occurs:

00:26 E/AndroidRuntime: java.lang.IllegalStateException
00:26 E/AndroidRuntime:     at android.media.MediaPlayer.getCurrentPosition(Native Method)
00:26 E/AndroidRuntime:     at com.mypodcasts.player.AudioPlayer.getCurrentPosition(AudioPlayer.java:63)
00:26 E/AndroidRuntime:     at android.widget.MediaController.setProgress(MediaController.java:431)
00:26 E/AndroidRuntime:     at android.widget.MediaController.access$500(MediaController.java:72)
00:26 E/AndroidRuntime:     at android.widget.MediaController$3.handleMessage(MediaController.java:402)
00:26 E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
00:26 E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
00:26 E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5343)
00:26 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
00:26 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
00:26 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
00:26 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

AsyncTask Hunting

Improve AsyncTasks memory allocation through monitoring and code changes.

Currently all async tasks are inner classes with implicit references to its activity.

Read more here

App crashes when rotate device while displaying progress dialog

java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{1b5cb0c6 V.E..... R......D 0,0-684,232} not attached to window manager
    at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396)
    at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322)
    at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
    at android.app.Dialog.dismissDialog(Dialog.java:341)
    at android.app.Dialog.dismiss(Dialog.java:324)
    at com.mypodcasts.episodes.latestepisodes.LatestEpisodesActivity$LatestEpisodesAsyncTask.onPostExecute(LatestEpisodesActivity.java:64)
    at com.mypodcasts.episodes.latestepisodes.LatestEpisodesActivity$LatestEpisodesAsyncTask.onPostExecute(LatestEpisodesActivity.java:45)
    at retryable.asynctask.ConcreteAsyncTask.onPostExecute(ConcreteAsyncTask.java:34)
    at retryable.asynctask.ConcreteAsyncTask.onPostExecute(ConcreteAsyncTask.java:8)
    at android.os.AsyncTask.finish(AsyncTask.java:636)
    at android.os.AsyncTask.access$500(AsyncTask.java:177)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5343)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

Publish APK?

Any plans to make an .apk available here, so non-devs could give the app a try as well?

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.