Top Banner
NO INTERNET? NO PROBLEM!
83

No internet? No Problem!

Jan 21, 2018

Download

Technology

Annyce Davis
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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