Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Droid On Wheels

1,376 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
  • Be the first to comment

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

×