Git Product home page Git Product logo

bartrunnerandroid's Introduction

Important

Sadly, I'm no longer able to keep up maintenance of this project. The app uses decade-old APIs that are no longer well supported in the latest Android versions, and the BART APIs this app uses have become buggy and poorly supported. This app would essentially need a rewrite to use BART's GTFS-RT feed and modern Android APIs. Since I'm no longer able to dedicate enough time to the rewrite and maintenance of the app, the app has been unpublished from the Play Store.

Logo

Build Status

This is my "fun project", where I get a chance to work my Android development muscles and hopefully create something free and useful for the SF Bay Area community.

Reporting bugs/requesting features

Please file bugs and suggestions as GitHub issues

Developed by

Doug Keen - [email protected]

Special thanks to

  • Victor Stuber for some amazing work on the feature graphic and the app icon
  • All pull request contributors, who are keeping this project alive!

License

Copyright 2012 Doug Keen

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

bartrunnerandroid's People

Contributors

cesquivias avatar dougkeen avatar loadedion avatar robertokl 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bartrunnerandroid's Issues

Release tag for v2.2.21

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

NullPointerException

//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)

Unable to keep favorite route (S22 Ultra)

The app seems to unable to save favorite routes in S22 Ultra

Repro Steps:

  1. Add favorite routes (any number)
  2. Hard kill the app and reopen (same happens if OS kills it eventually; also with rebooting)
  3. No favorite routes

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.

No Notifications

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.

NullPointerException

//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)

Notification doesn't show up on Android Wear

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?

one API used in okhttp package may affect your app!

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)>

Undo delete of favorite route

I accidently swiped away a favorite route but I wanted to. Please have a way of undoing the deletion or maybe have a confirmation

Feature Request: Add station for Oakland International Airport

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.

The application crashes suddenly after selecting departures.

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

  1. Open the BART Runner app.
  2. Click on the any Favorite Route.
  3. Then click on any Departures option.
  4. And you will see that the application crashes suddenly.

• App version: 2.2.17 (latest)
• Operating system: Android 9.0

Recording Of The Bug
bug

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)

Crashes on Marshmallow

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

Lock the list of favorite routes

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.

Build difficulty

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.

BART Runner crashes in airplane mode

=====STEPS TO REPRODUCE=====

  1. enter airplane mode
  2. open bart runner app
  3. tap quick departure lookup at bottom of screen, choose an origin and destination, hit ok

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)

Performance issue

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.

App shows cancelled trains

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.

v2.2.19 to F-Droid

Thank you for Bart Runner.

Will you be able to update v2.2.20 to F-Droid?

Trip selection issue

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.

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.