dougkeen / bartrunnerandroid Goto Github PK
View Code? Open in Web Editor NEWBART Runner Android app
BART Runner Android app
Hello, we are working on a project called DiagDroid (http://www.cudroid.com/DiagDroid/) for detecting potential performance issues. Our tool could find performance degradation caused by improper usage of asynchronous executions.
We find that in some cases your app may suffer a long queuing/processing delay.
Case 1:
Related source code Class: EtdService
Line 216
Circumstance The task would wait for a long time to get executed.
Problem I find that the execution of GetRealTimeDeparturesTask
in this line often conflicts with GetRouteFareTask
and GetRouteFareTask
. This is because you invoke the AsyncTask via execute()
method. This method executes the AsyncTasks in sequential which means all the scheduled tasks have to wait until the previous task finishes execution.
Suggested modification I suggest you use executeOnExecutor
method with separate thread pool for different purposed AsyncTasks.
Case 2:
Related source code Class: GetRealTimeDeparturesTask
Line: 64
Circumstance The task usually executes for a long time. During my test, it costs on average >1 second to finish. The cancellation of previous GetRealTimeDeparturesTask
does not work properly.
Problem I think you have noticed to cancel the obsolete tasks. But you immediately go into the method getDeparturesFromNetwork
which consumes most time of the task. If the cancel command is not issued as soon as the asynctask is executed (which is very likely to happen), you failed to cancel this task.
Suggested modification You may design an interrupt on cancelling the network request via utilizing the cancel() method of OkHttpClient
(Call
class).
Other AsyncTasks GetScheduleInformationTask and GetRouteFareTask which are separately invoked in Line 248 of EtdService
and Line 217 of RoutesListActivity
have similar issue.
ps. I will release my tool with a tutorial on how to use it about one week later (http://www.cudroid.com/DiagDroid/), welcome to have a try on it. Thanks.
Version 2.2.11 on Oreo has broken notifications. Selecting a specific train no longer pins a notification for that trip on the notification bar.
Tested on both Android 5.1.1 and 6.0.1.
Alarm doesn't sound after being created
I wonder if the project.properties file is correct as it only references ActionBarSherlock within HoloEverywhere when it seems to require Holo theme sherlock. At any rate I get a build failure with such an error at Release_2.1.1.
I've noticed that when I select a particular train, and an ongoing notification is created, the notification doesn't show up on Android Wear. Is there any chance you could fix that?
The app seems to unable to save favorite routes in S22 Ultra
Repro Steps:
Info:
Version: 2.2.21
Phone: Samsung S22 Ultra
Android version: Android 12 (prior) and 13 (current)
Other: Clearing cache, uninstalling, etc; doesn't fix it.
Received several reports of crashing. Looks related to ActionBarSherlock/HoloEverywhere:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dougkeen.bart/com.dougkeen.bart.activities.RoutesListActivity_}: java.lang.RuntimeException: java.lang.IllegalAccessException: java.lang.Class<org.holoeverywhere.addon.AddonSherlock$HoloActionBarSherlockNative> is not accessible from java.lang.Class<com.actionbarsherlock.ActionBarSherlock>
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: java.lang.Class<org.holoeverywhere.addon.AddonSherlock$HoloActionBarSherlockNative> is not accessible from java.lang.Class<com.actionbarsherlock.ActionBarSherlock>
at com.actionbarsherlock.ActionBarSherlock.wrap(ActionBarSherlock.java:239)
at org.holoeverywhere.addon.AddonSherlock$AddonSherlockA.getSherlock(AddonSherlock.java:53)
at org.holoeverywhere.addon.AddonSherlock$AddonSherlockA.installDecorView(AddonSherlock.java:60)
at android.support.v4.app._HoloActivity$1.action(_HoloActivity.java:587)
at android.support.v4.app._HoloActivity$1.action(_HoloActivity.java:1)
at org.holoeverywhere.addon.IAddonBasicAttacher.performAddonAction(IAddonBasicAttacher.java:167)
at org.holoeverywhere.app.Activity.performAddonAction(Activity.java:497)
at android.support.v4.app._HoloActivity.requestDecorView(_HoloActivity.java:584)
at android.support.v4.app._HoloActivity.setContentView(_HoloActivity.java:604)
at com.dougkeen.bart.activities.RoutesListActivity_.setContentView(RoutesListActivity_.java:107)
at com.dougkeen.bart.activities.RoutesListActivity_.onCreate(RoutesListActivity_.java:42)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
... 9 more
Caused by: java.lang.IllegalAccessException: java.lang.Class<org.holoeverywhere.addon.AddonSherlock$HoloActionBarSherlockNative> is not accessible from java.lang.Class<com.actionbarsherlock.ActionBarSherlock>
at java.lang.reflect.Constructor.newInstance(Native Method)
at com.actionbarsherlock.ActionBarSherlock.wrap(ActionBarSherlock.java:231)
... 22 more
Starting with a recent update, when I select a trip from a list (favorites or quick lookup) the app goes back to the home screen instead of staying on the list screen and showing the trip at the top. When I navigate back to the screen, the trip is still selected and I can clear it without leaving the list. I'm using a Pixel 2 on Android version 9.
=====STEPS TO REPRODUCE=====
EXPECTED RESULTS:
I'm actually not sure if it has cached offline data or is supposed to pop up an error message of some sort
NUMBER OF TIMES YOU WERE ABLE TO REPRODUCE (e.g. 3/10): 10/10
DEVICES TESTED: Nexus 5X Android O preview, Pixel Android N
Issue is 100% reproducible with airplane mode.
Build: sailfish-userdebug 7.1.2 N2G48C 4104010 dev-keys
Package [com.dougkeen.bart] (a4f88e8):
versionCode=37 minSdk=14 targetSdk=25
versionName=2.2.10
java.lang.RuntimeException: An error occurred while executing doInBackground()
GMS RETRACE
at android.os.AsyncTask$3.done(AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.NullPointerException: application interceptor com.dougkeen.bart.networktasks.NetworkUtils$RetryInterceptor@3c77394 returned null
GMS RETRACE
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:235)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)
at com.squareup.okhttp.Call.execute(Call.java:80)
at com.dougkeen.bart.networktasks.GetRealTimeDeparturesTask.getDeparturesFromNetwork(GetRealTimeDeparturesTask.java:94)
at com.dougkeen.bart.networktasks.GetRealTimeDeparturesTask.doInBackground(GetRealTimeDeparturesTask.java:65)
at com.dougkeen.bart.networktasks.GetRealTimeDeparturesTask.doInBackground(GetRealTimeDeparturesTask.java:20)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
Now that the Antioch extension is open, and PITT trains are renamed ANTC, estimates all along the yellow line are broken.
I accidently swiped away a favorite route but I wanted to. Please have a way of undoing the deletion or maybe have a confirmation
Hi @dougkeen
Expected behavior
The BART Runner users need to be able to use Favorite Routes -> Selecting any Departures action on this application.
Actual behavior
Firstly, I have chosen any route from Favorite Routes section, then I clicked on any Departures, The application crashes suddenly after selecting departures.
How to reproduce
• App version: 2.2.17 (latest)
• Operating system: Android 9.0
Logcat Report
java.lang.SecurityException: Permission Denial: startForeground from pid=31105, uid=10184 requires android.permission.FOREGROUND_SERVICE at android.os.Parcel.createException(Parcel.java:1953) at android.os.Parcel.readException(Parcel.java:1921) at android.os.Parcel.readException(Parcel.java:1871) at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5144) at android.app.Service.startForeground(Service.java:695) at com.dougkeen.bart.services.BoardedDepartureService.updateNotification(BoardedDepartureService.java:327) at com.dougkeen.bart.services.BoardedDepartureService.onHandleIntent(BoardedDepartureService.java:202) at com.dougkeen.bart.services.BoardedDepartureService$ServiceHandler.handleMessage(BoardedDepartureService.java:66) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:201) at android.os.HandlerThread.run(HandlerThread.java:65) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:9573) at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1226) at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:901) at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:21069) at android.app.IActivityManager$Stub.onTransact$setServiceForeground$(IActivityManager.java:10581)
The release note said it should be fixed. Anything else I need to do?
Downloaded this app to try and it crashed immediately.
Thank you for Bart Runner.
Will you be able to update v2.2.20 to F-Droid?
//package name: com.dougkeen.bart
//version: 2.2.6
//target sdk version: android-18
java.lang.NullPointerException
at com.dougkeen.bart.data.DepartureArrayAdapter.getView(DepartureArrayAdapter.java:56)
at android.widget.AbsListView.obtainView(AbsListView.java:2177)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
at android.widget.ListView.onMeasure(ListView.java:1159)
at android.view.View.measure(View.java:15848)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:15848)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:15848)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)
at android.view.View.measure(View.java:15848)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15848)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:15848)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
at android.view.View.measure(View.java:15848)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
At some point recently Bart made a semantic change to their API to make it also return cancelled trips alongside real ones.
From http://api.bart.gov/docs/etd/etd.aspx
<cancelflag>
indicates a scheduled ETD that has been cancelled and is not in service.
<dynamicflag>
indicates an unscheduled ETD that has been added to service.
The Bart runner app doesn't know about this new field, so it shows the cancelled trains alongside real ones.
I could probably implement a PR which filters them out of the API response entirely. A better solution would probably be to show them in strikethrough, but that's not something I have a clear idea how to do.
I was getting used of "pull to refresh" and frequently use pull trying to refresh the list, only to find some favorite routes get swiped away.
It will be good if the list is locked by default and can only be swiped away by unlocking first.
//package name: com.dougkeen.bart
//version: 2.2.6
//target sdk version: android-18
java.lang.NullPointerException
at com.dougkeen.bart.services.EtdService$EtdServiceEngine.applyScheduleInformation(EtdService.java:285)
at com.dougkeen.bart.services.EtdService$EtdServiceEngine$2.onResult(EtdService.java:233)
at com.dougkeen.bart.networktasks.GetScheduleInformationTask.onPostExecute(GetScheduleInformationTask.java:104)
at com.dougkeen.bart.networktasks.GetScheduleInformationTask.onPostExecute(GetScheduleInformationTask.java:20)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Hi, We find "<java.util.zip.Deflater: int deflate(byte[],int,int,int)>" called in "<okio.DeflaterSink: void deflate(boolean)>" on line 94 are actually added in SDK since level 19, but your minSdkVersion is only 14.
Though this API is in external library, it seems to be reachable from your APP. please help to check whether it may cause problem to your app.
there are several possible path to that API, we list them here to facilitate your checking.
all reachable paths:
reachable path 1:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(android.view.View,android.view.ViewGroup$LayoutParams)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void sendConnectionPreface()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 2:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(int)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void sendConnectionPreface()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 3:
--><com.dougkeen.bart.activities.RoutesListActivity_: void onCreate(android.os.Bundle)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(int)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void sendConnectionPreface()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 4:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(android.view.View)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void sendConnectionPreface()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 5:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(android.view.View,android.view.ViewGroup$LayoutParams)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection$Builder: com.squareup.okhttp.internal.framed.FramedConnection build()>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder,com.squareup.okhttp.internal.framed.FramedConnection$1)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder)>
--><java.lang.Thread: void run()>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 6:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(int)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection$Builder: com.squareup.okhttp.internal.framed.FramedConnection build()>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder,com.squareup.okhttp.internal.framed.FramedConnection$1)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder)>
--><java.lang.Thread: void run()>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 7:
--><com.dougkeen.bart.activities.RoutesListActivity_: void onCreate(android.os.Bundle)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(int)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection$Builder: com.squareup.okhttp.internal.framed.FramedConnection build()>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder,com.squareup.okhttp.internal.framed.FramedConnection$1)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder)>
--><java.lang.Thread: void run()>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 8:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(android.view.View)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response execute()>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponseWithInterceptorChain(boolean)>
--><com.squareup.okhttp.Call$ApplicationInterceptorChain: com.squareup.okhttp.Response proceed(com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Call: com.squareup.okhttp.Response getResponse(com.squareup.okhttp.Request,boolean)>
--><com.squareup.okhttp.internal.http.HttpEngine: void sendRequest()>
--><com.squareup.okhttp.internal.http.HttpEngine: void connect()>
--><com.squareup.okhttp.OkHttpClient$1: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,com.squareup.okhttp.Connection,com.squareup.okhttp.internal.http.HttpEngine,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connectAndSetOwner(com.squareup.okhttp.OkHttpClient,java.lang.Object,com.squareup.okhttp.Request)>
--><com.squareup.okhttp.Connection: void connect(int,int,int,com.squareup.okhttp.Request,java.util.List,boolean)>
--><com.squareup.okhttp.Connection: void connectSocket(int,int,int,com.squareup.okhttp.Request,com.squareup.okhttp.internal.ConnectionSpecSelector)>
--><com.squareup.okhttp.internal.framed.FramedConnection$Builder: com.squareup.okhttp.internal.framed.FramedConnection build()>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder,com.squareup.okhttp.internal.framed.FramedConnection$1)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void (com.squareup.okhttp.internal.framed.FramedConnection$Builder)>
--><java.lang.Thread: void run()>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 9:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(android.view.View,android.view.ViewGroup$LayoutParams)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.ResponseBody: java.lang.String string()>
--><com.squareup.okhttp.ResponseBody: byte[] bytes()>
--><okio.RealBufferedSource: byte[] readByteArray()>
--><okio.Buffer: long writeAll(okio.Source)>
--><com.squareup.okhttp.internal.framed.FramedStream$FramedDataSource: long read(okio.Buffer,long)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void writeWindowUpdateLater(int,long)>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 10:
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(int)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.ResponseBody: java.lang.String string()>
--><com.squareup.okhttp.ResponseBody: byte[] bytes()>
--><okio.RealBufferedSource: byte[] readByteArray()>
--><okio.Buffer: long writeAll(okio.Source)>
--><com.squareup.okhttp.internal.framed.FramedStream$FramedDataSource: long read(okio.Buffer,long)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void writeWindowUpdateLater(int,long)>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
reachable path 11:
--><com.dougkeen.bart.activities.RoutesListActivity_: void onCreate(android.os.Bundle)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void setContentView(int)>
--><com.dougkeen.bart.activities.RoutesListActivity_: void afterSetContentView_()>
--><com.dougkeen.bart.activities.RoutesListActivity: void afterViews()>
--><com.dougkeen.bart.activities.RoutesListActivity: void refreshFares()>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.Object doInBackground(java.lang.Object[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String doInBackground(com.dougkeen.bart.networktasks.GetRouteFareTask$Params[])>
--><com.dougkeen.bart.networktasks.GetRouteFareTask: java.lang.String getFareFromNetwork(com.dougkeen.bart.networktasks.GetRouteFareTask$Params,int)>
--><com.squareup.okhttp.ResponseBody: java.lang.String string()>
--><com.squareup.okhttp.ResponseBody: byte[] bytes()>
--><okio.RealBufferedSource: byte[] readByteArray()>
--><okio.Buffer: long writeAll(okio.Source)>
--><com.squareup.okhttp.internal.framed.FramedStream$FramedDataSource: long read(okio.Buffer,long)>
--><com.squareup.okhttp.internal.framed.FramedConnection: void writeWindowUpdateLater(int,long)>
--><com.squareup.okhttp.internal.NamedRunnable: void run()>
--><com.squareup.okhttp.internal.framed.FramedConnection$2: void execute()>
--><com.squareup.okhttp.internal.framed.Http2$Writer: void windowUpdate(int,long)>
--><okio.RealBufferedSink: void flush()>
--><okio.DeflaterSink: void flush()>
--><okio.DeflaterSink: void deflate(boolean)>
Any chance a release tag could be added for the current build v2.2.21 so it can be built on F-Droid? The latest tagged release is v2.2.19. Thanks
The latest version in F-Droid is 2.2.6 (Added on Oct 31, 2015) as opposed to the Play Store, which has 2.2.10
https://f-droid.org/packages/com.dougkeen.bart/
https://play.google.com/store/apps/details?id=com.dougkeen.bart&hl=en
FWIW, I'm running version 2.2.8 on Android version 6.0.1.
Now that there's a connector running between the Coliseum Station and OAK, it would be great to have OAK added to the list of stations. Not sure if you've already looked into this, but is this just a matter of adding the new station in, or does BART's API not support this station?
Thanks for the app BTW! I'm a huge fan of it.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.