No internet? No Problem!

83
NO INTERNET? NO PROBLEM!

Transcript of No internet? No Problem!

Page 1: No internet? No Problem!

NO INTERNET? NO PROBLEM!

Page 2: No internet? No Problem!

OFF GRID ELECTRIC

From: https://medium.com/@Offgrid

Page 3: No internet? No Problem!

OFF GRID ELECTRIC

Page 4: No internet? No Problem!

AGENDA

ARCHITECTURELIBRARIES

CHALLENGES

Page 5: No internet? No Problem!

CHALLENGES

Page 6: No internet? No Problem!
Page 7: No internet? No Problem!
Page 8: No internet? No Problem!

3G COVERAGE IN ARUSHA, TZ

Page 9: No internet? No Problem!

4G LTE COVERAGE IN WASHINGTON, DC

Page 10: No internet? No Problem!

DON’T ASSUME

BE RESILIENT

Page 11: No internet? No Problem!

ARCHITECTURE

Page 12: No internet? No Problem!

BE USEFUL

Our App ‣Store data locally ‣Separate UI and network ‣Queue requests

Page 13: No internet? No Problem!

MVP(Model View Presenter)

Page 14: No internet? No Problem!

EVENT BUS/RXJAVA

DATABASE

REPOSITORY

REPOSITORY

ACTIVITY

FRAGMENT

JOBS

PRESENTER

PRESENTER

SERVICE

Page 15: No internet? No Problem!

DOWNLOAD ALL THE THINGS

Page 16: No internet? No Problem!

DISPLAY A VIEW

Is pre-populated data needed?

Page 17: No internet? No Problem!

EVENT BUS/RXJAVA

FRAGMENT PRESENTER SERVICE REPOSITORY DATABASE

Page 18: No internet? No Problem!

TAKE AN ACTION

Is the Network Available?

Page 19: No internet? No Problem!

EVENT BUS/RXJAVA

FRAGMENT PRESENTER SERVICE REPOSITORY DATABASE

JOB

Page 20: No internet? No Problem!

APP SERVER

Page 21: No internet? No Problem!

CONFLICT RESOLUTION

Page 22: No internet? No Problem!

REQUEST TIMESTAMPS

Page 23: No internet? No Problem!

STATUS FIELDS

ACTION STATE

Page 24: No internet? No Problem!

BUNDLING REQUESTS

/users/commissions /users/info /users/roles

Page 25: No internet? No Problem!

BUNDLING REQUESTS

/users/commissions

/users/info

/users/roles/users/me

Page 26: No internet? No Problem!

EVENT BUS/RXJAVA

DATABASE

REPOSITORY

REPOSITORY

ACTIVITY

FRAGMENT

JOBS

PRESENTER

PRESENTER

SERVICE

Page 27: No internet? No Problem!

LIBRARIES

Page 28: No internet? No Problem!

WHAT WE USE

‣Realm ‣EventBus ‣Android Job

Page 29: No internet? No Problem!

STORE DATA LOCALLY

Page 30: No internet? No Problem!
Page 31: No internet? No Problem!

REALM - MODEL CLASS

@RealmClasspublic class Place implements RealmModel {

}

Page 32: No internet? No Problem!

REALM - MODEL CLASS

@RealmClasspublic class Place implements RealmModel { @PrimaryKey private String localId;

@Index private Long remoteId;private Gps location; …

}

Page 33: No internet? No Problem!

REALM - MODEL CLASS

localId remoteId location

19444498-2a40… 1458260

65031f36-bde9…

e85c9757-f546…

Page 34: No internet? No Problem!

REALM - ADDING A RECORD

public class PlaceRepository implements Repository<Place> { @Override public void add (final Place item) {

}

Page 35: No internet? No Problem!

REALM - ADDING A RECORD

public class PlaceRepository implements Repository<Place> { @Override public void add (final Place item) { Realm realm = Realm.getDefaultInstance(); realm.executeTransaction((realm) -> { realm.insertOrUpdate(item); }); realm.close(); }

Page 36: No internet? No Problem!

REALM - QUERY RESULT

@Overridepublic Place toResult (Realm realm) { return realm.where(Place.class)

}

Page 37: No internet? No Problem!

REALM - QUERY RESULT

@Overridepublic Place toResult (Realm realm) { return realm.where(Place.class) .equalTo(PLACE_ID, placeId) .findFirst();}

Page 38: No internet? No Problem!

REALM - QUERY RESULT

@Overridepublic Place toResult (Realm realm) { return realm.where(Place.class) .equalTo(PLACE_ID, placeId) .findFirst();}

Page 39: No internet? No Problem!
Page 40: No internet? No Problem!

SEPARATE UI AND NETWORK

Page 41: No internet? No Problem!

EVENTBUS

From: http://greenrobot.org/eventbus

Page 42: No internet? No Problem!

EVENTBUS - SETUP

@Provides @Singletonpublic Bus provideBus () { return new Bus(EventBus.builder() .logNoSubscriberMessages(BuildConfig.DEBUG) .throwSubscriberException(false) .build());}

Page 43: No internet? No Problem!

EVENTBUS - REGISTER

public class LeadsMapPresenter { private final Bus bus; private LeadsMapView leadsMapView; @Inject LeadsMapPresenter (Bus bus) { this.bus = bus; } …

Page 44: No internet? No Problem!

EVENTBUS - REGISTER

public class LeadsMapPresenter { public void attachView (LeadsMapView view) { this.leadsMapView = view; bus.register(this); }

Page 45: No internet? No Problem!

EVENTBUS - REGISTER

public class LeadsMapPresenter { public void attachView (LeadsMapView view) { … }

public void detachView () { this.leadsMapView = null; bus.unregister(this); }

Page 46: No internet? No Problem!

EVENT BUS/RXJAVA

FRAGMENT PRESENTER SERVICE REPOSITORY DATABASE

JOB

Page 47: No internet? No Problem!

EVENTBUS - POST EVENT

api.submitPlace(place).enqueue(new Callback<Place>() {

…JOB

Page 48: No internet? No Problem!

EVENTBUS - POST EVENT

api.submitPlace(place).enqueue(new Callback<Place>() { public void onResponse (…, Response<Place> response) { if (response.isSuccessful()) { }

JOB

Page 49: No internet? No Problem!

EVENTBUS - POST EVENT

api.submitPlace(place).enqueue(new Callback<Place>() { public void onResponse (…, Response<Place> response) { if (response.isSuccessful()) { Place updatedPlace = response.body(); bus.post(new PlaceSubmissionSuccessEvent(updatedPlace)); }

JOB

Page 50: No internet? No Problem!

EVENTBUS - RETRIEVE EVENT

public class LeadsMapPresenter { @Subscribe public void handle (PlaceSubmissionSuccessEvent event) { leadsMapView.displaySuccessMessage(); }

PRESENTER

Page 51: No internet? No Problem!

EVENTBUS - SEND STATUS BAR NOTIFICATION

SERVICE

Page 52: No internet? No Problem!

EVENTBUS - SEND STATUS BAR NOTIFICATION

SERVICE

@Subscribe(priority = 1) open fun onEvent(event: PaymentSuccessEvent) {

}

Page 53: No internet? No Problem!

EVENTBUS - SEND STATUS BAR NOTIFICATION

SERVICE

@Subscribe(priority = 1) open fun onEvent(event: PaymentSuccessEvent) { val notif = getString(R.string.payment_submitted_message) createNotification(notif, 1) }

Page 54: No internet? No Problem!
Page 55: No internet? No Problem!

QUEUE REQUESTS

Page 56: No internet? No Problem!
Page 57: No internet? No Problem!
Page 58: No internet? No Problem!

ANDROID JOB

Page 59: No internet? No Problem!

ANDROID JOB

‣Alarm Manager

‣Job Scheduler

‣GCM Network Manager

Page 60: No internet? No Problem!

ANDROID JOB - COMPARISON

Library Min API Google Play?

JobScheduler 21 No

Firebase Job Dispatcher 9 Yes

Android Job 14 No

Page 61: No internet? No Problem!

ANDROID JOB

JOB MANAGER

JOB CREATOR

Page 62: No internet? No Problem!

ANDROID JOB

JOB MANAGERPROVIDER

JOB

JOB CREATOR

PROVIDER

JOB

PROVIDER

JOB

Page 63: No internet? No Problem!

ANDROID JOB

JOB MANAGERPROVIDER

JOB

JOB CREATOR

PROVIDER

JOB

PROVIDER

JOB

JOB REQUEST

Page 64: No internet? No Problem!

ANDROID JOB

JOB MANAGERPROVIDER

JOB

JOB CREATOR

PROVIDER

JOB

PROVIDER

JOB

JOB REQUEST

JOB

Page 65: No internet? No Problem!

ANDROID JOB - CREATOR

public class ConfettiJobCreator implements JobCreator { Map<String, Provider<Job>> jobs; public Job create (String tag) {

}}

Page 66: No internet? No Problem!

ANDROID JOB - CREATOR

public Job create (String tag) { Provider<Job> jobProvider = jobs.get(tag); return jobProvider.get(); }

Page 67: No internet? No Problem!

ANDROID JOB

JOB MANAGERPROVIDER

JOB

JOB CREATOR

JOB REQUEST

JOB

Page 68: No internet? No Problem!

ANDROID JOB - JOB EXECUTION

protected Result onRunJob (final Params params) {

}

JOB

Page 69: No internet? No Problem!

ANDROID JOB - JOB EXECUTION

protected Result onRunJob (final Params params) { PersistableBundleCompat extras = params.getExtras(); String placeId = extras.getString(PARAM_PLACE_ID);

}

JOB

Page 70: No internet? No Problem!

ANDROID JOB - JOB EXECUTION

protected Result onRunJob (final Params params) { PersistableBundleCompat extras = params.getExtras(); String placeId = extras.getString(PARAM_PLACE_ID); return submitRequest(placeId) ? SUCCESS: FAILURE;}

JOB

Page 71: No internet? No Problem!

ANDROID JOB

JOB MANAGERPROVIDER

JOB

JOB CREATOR

JOB REQUEST

JOB

Page 72: No internet? No Problem!

ANDROID JOB - SCHEDULING

public static JobRequest get (String placeId) { PersistableBundleCompat extras = …; extras.putString(PARAM_PLACE_ID, placeId);

}

Page 73: No internet? No Problem!

ANDROID JOB - SCHEDULING

public static JobRequest get (String placeId) { PersistableBundleCompat extras = …; extras.putString(PARAM_PLACE_ID, placeId); return new JobRequest.Builder(SendPlaceRequestJob.JOB_TAG)

}

Page 74: No internet? No Problem!

ANDROID JOB - SCHEDULING

public static JobRequest get (String placeId) { PersistableBundleCompat extras = …; extras.putString(PARAM_PLACE_ID, placeId); return new JobRequest.Builder(SendPlaceRequestJob.JOB_TAG) .setExecutionWindow(10_000L, 20_000L) .setRequiredNetworkType(NetworkType.CONNECTED)

}

Page 75: No internet? No Problem!

ANDROID JOB - SCHEDULING

public static JobRequest get (String placeId) { PersistableBundleCompat extras = …; extras.putString(PARAM_PLACE_ID, placeId); return new JobRequest.Builder(SendPlaceRequestJob.JOB_TAG) .setExecutionWindow(10_000L, 20_000L) .setRequiredNetworkType(NetworkType.CONNECTED) .setExtras(extras) }

Page 76: No internet? No Problem!

ANDROID JOB - SCHEDULING

public static JobRequest get (String placeId) { PersistableBundleCompat extras = …; extras.putString(PARAM_PLACE_ID, placeId); return new JobRequest.Builder(SendPlaceRequestJob.JOB_TAG) .setExecutionWindow(10_000L, 20_000L) .setRequiredNetworkType(NetworkType.CONNECTED) .setExtras(extras) .setRequirementsEnforced(true) .build();}

Page 77: No internet? No Problem!

if has network connection attempt to submit request

Page 78: No internet? No Problem!

if has network connection attempt to submit request

else queue request

Page 79: No internet? No Problem!

ANDROID JOB - SCHEDULING

jobManager.schedule( );

Page 80: No internet? No Problem!

ANDROID JOB - SCHEDULING

jobManager.schedule(SendPlaceRequestJob.buildJobRequest(id));

JOB REQUEST

JOB QUEUE

Page 81: No internet? No Problem!

WHAT WE USE

‣Realm ‣EventBus ‣Android Job

Page 82: No internet? No Problem!

WHAT’S NEXT?

‣SMS Fallback ‣Async Code Paths ‣Push Notifications

Page 83: No internet? No Problem!

THANKS

@brwngrldev adavis.info

--- @moyheen

medium.com/@moyinoluwa