23
Droid on wheels Sangharsh Boudhh [email protected] @sboudhh

Droid On Wheels

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Droid On Wheels

Droid on wheelsSangharsh Boudhh

[email protected]

@sboudhh

Page 2: Droid On Wheels

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

Page 3: Droid On Wheels

Motivation

• Multipurpose system• Fleet tracking• Booking lifecycle management• Navigation support for Drivers

• Affordable• Easy to install and uninstall

Page 4: Droid On Wheels

How’s it doing

• Powers thousands of cabs• Clocks 10K hours run per day• Covers thousands of customers every day

Page 5: Droid On Wheels

Here comes, Droid on Wheels

Page 6: Droid On Wheels

Booking alert

Page 7: Droid On Wheels

Destination

Page 8: Droid On Wheels

Building an Enterprise Application

• Lots of remote management• Tighter control

Page 9: Droid On Wheels

Our case

• Lots of permissions • Single app mode• Remote app version upgrade• Robust communication• Failovers and Auto recovery

Page 10: Droid On Wheels

Deep dive

Page 11: Droid On Wheels

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

Page 12: Droid On Wheels

Download APKDefaultHttpClient 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();

Page 13: Droid On Wheels

Launch installIntent myIntent = new Intent(Intent.ACTION_VIEW);

Uri dataUri = Uri.fromFile(new File(downloadedApkPath));

myIntent.setDataAndType(dataUri, "application/vnd.android.package-archive");

context.startActivity(myIntent);

Page 14: Droid On Wheels

GPS recovery

• Scenario• Doesn’t catch GPS after considerable time• Switches on after long time

• Thanks to developers of GPS Status• Trigger from server

Page 15: Droid On Wheels

GPS recoveryprivate 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);

}

Page 16: Droid On Wheels

Communication

• Server to App: GCM with SMS failover• App to server: HTTP with SMS failover

Page 17: Droid On Wheels

Navigation

• Route plotting• Compass based rotating map• Plotting route with Google Directions API• Using polyline

• Proximity indicator• Acoustic indication of proximity

Page 18: Droid On Wheels

Cashless payments

• Customers and drivers as well• Powered by Ezetap

Page 19: Droid On Wheels

Third-party libraries

• Loopj: Asynchronous HTTP client• GCM: Push notifications• Crittercism: Crash reporting• GSON: JSON (de-)serialization• New relic: Performance monitoring

Page 20: Droid On Wheels

Fleet Tracking

Page 21: Droid On Wheels

One Touch booking

• Android & iOS App• REST API• Geo spatial index• MongoDB

Page 22: Droid On Wheels

Putting it all together

Page 23: Droid On Wheels

Credits

• Ankit Bhati• Sangharsh Boudhh• Ankit Kumar• Rupam Ghosh• Nitesh Yadav

• Mohit Kumar• Usha Loutongbam• Pritesh Malde• Plus many more...