Droid On Wheels

1,046 views
964 views

Published on

Experience of creating an Enterprise Android application for Fleet Tracking, Dispatch and Navigation needs of Olacabs (India's largest cab aggregator).
Created for Droidcon presentation

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,046
On SlideShare
0
From Embeds
0
Number of Embeds
69
Actions
Shares
0
Downloads
42
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • <more content>
  • Add more content
  • Droid On Wheels

    1. 1. Droid on wheels Sangharsh Boudhh sangharsh@olacabs.com @sboudhh
    2. 2. Outline • Why?? • Business need • Introduction to the In-cab device • Challenges of enterprise application • Dive into few features • Over the air upgrade • Recovering from loss of GPS • Backend Engineering • One Touch booking
    3. 3. Motivation • Multipurpose system • Fleet tracking • Booking lifecycle management • Navigation support for Drivers • Affordable • Easy to install and uninstall
    4. 4. How’s it doing • Powers thousands of cabs • Clocks 10K hours run per day • Covers thousands of customers every day
    5. 5. Here comes, Droid on Wheels
    6. 6. Booking alert
    7. 7. Destination
    8. 8. Building an Enterprise Application • Lots of remote management • Tighter control
    9. 9. Our case • • • • • Lots of permissions  Single app mode Remote app version upgrade Robust communication Failovers and Auto recovery
    10. 10. Deep dive
    11. 11. Over the air upgrade • Push notification / Check on startup • Download APK on device memory • No SD card required • Size: less than 1 MB • Start install intent
    12. 12. Download APK DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(downloadURL); HttpResponse execute = httpClient.execute(httpGet); InputStream reader = execute.getEntity().getContent(); FileOutputStream writer = context.openFileOutput(UpdateUtils.DOWNLOAD_FILENAME, Context.MODE_WORLD_READABLE); byte[] buffer = new byte[1024 * 8]; int bytesRead = 0; while ((bytesRead = reader.read(buffer)) != -1) { writer.write(buffer, 0, bytesRead); } writer.close();
    13. 13. Launch install Intent myIntent = new Intent(Intent.ACTION_VIEW); Uri dataUri = Uri.fromFile(new File(downloadedApkPath)); myIntent.setDataAndType(dataUri, "application/vnd.android.packagearchive"); context.startActivity(myIntent);
    14. 14. GPS recovery • Scenario • Doesn’t catch GPS after considerable time • Switches on after long time • Thanks to developers of GPS Status • Trigger from server
    15. 15. GPS recovery private boolean downloadGPSXtra(LocationManager locationManager) { Bundle b = new Bundle(); boolean result = locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "force_xtra_injection", b); return result & locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "force_time_injection", b); } private boolean clearGPSXtra(LocationManager locationManager) { return locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "delete_aiding_data", null); }
    16. 16. Communication • Server to App: GCM with SMS failover • App to server: HTTP with SMS failover
    17. 17. Navigation • Route plotting • Compass based rotating map • Plotting route with Google Directions API • Using polyline • Proximity indicator • Acoustic indication of proximity
    18. 18. Cashless payments • Customers and drivers as well • Powered by Ezetap
    19. 19. Third-party libraries • • • • • Loopj: Asynchronous HTTP client GCM: Push notifications Crittercism: Crash reporting GSON: JSON (de-)serialization New relic: Performance monitoring
    20. 20. Fleet Tracking
    21. 21. One Touch booking • Android & iOS App • REST API • Geo spatial index • MongoDB
    22. 22. Putting it all together
    23. 23. Credits • • • • • Ankit Bhati Sangharsh Boudhh Ankit Kumar Rupam Ghosh Nitesh Yadav • • • • Mohit Kumar Usha Loutongbam Pritesh Malde Plus many more...

    ×