SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
Engineering Wunderlist for Android
Cesar Valiente
+CesarValiente @CesarValiente
Wunderlist, 6Wunderkinder and me
Together we’ll be better!!
First of all…
• Wunderlist 2 was created as a monolithic app.
• Wunderlist 3 (from now on, just Wunderlist) has been
built to be highly independent between layers.
• Real time sync.
1. General architecture
1.2 Three layers
Android
Layer
Sync
Layer
SDK
Layer
Presentation layer
(UI/Android stuff)
Model layer
(Business logic)
Data layer
(Accessing to the API data)
Android project Java project Java project
Sync boundaries SDK boundaries
1.3 What does it mean?
• Independent layers. Accessibility.
• Clean architecture.
• Abstract, easy to change, modular —> interfaces.
package com.wunderlist.sdk;
2. Sdk
• Websocket (real time).
• REST.
• Services
• API data models.
• Serializers/deserializers.
• Interfaces/callbacks.
• Sync and async tests.
Network
API model
2.1 Websocket (real time)
“ WebSocket is a protocol providing full-duplex
communications channels over a single TCP connection.
The WebSocket protocol was standardized by the IETF
as RFC 6455 in 2011, and the WebSocket API in Web
IDL is being standardized by the W3C.”
2.1.1 Websocket (real time)
2.1.2 Websocket. Details
• Main way to sync.
• java-websocket, netty,…. OkHttp ws!
2.1.3 Websocket. Mutations
void handleMessage(String message) {
try {
JsonObject jsonObject = Json.parseJson(message);
if (HealthResponse.isHealthResponse(jsonObject)) {
………………
} else if (Response.isValidJsonForObject(jsonObject)) {
………………
} else if (Mutation.isValidJsonForObject(jsonObject)) {
receiveMutation((Mutation)Json.fromJson(
jsonObject, Mutation.class));
} else {
Log.warn("Oh oh! We got a corrupted object on websocket: "
+ message);
}
} catch (JsonSyntaxException e) {
Log.warn("Discarding a malformed json object on websocket: "
+ message);
}
}
2.1.4 Websocket. Real-time example
2.2 REST
• Conventional REST API services for synchronous requests.
• Secondary (fallback) way to sync.
• Using Square OkHttp.
• To encourage hunting bugs and API stress tests, we always
use production API.
2.3 Others
• Services, manages an API endpoint (Users, Lists, Tasks, etc.)
• API data models, same structure as API scheme data objects (basic
models, just data).
• Json serializers/deserializers. Using Gson. Integrity (health) checks.
• Callbacks.
• Sync/Async unit tests (Junit and mockito) to test requests/
responses.
package com.wunderlist.sync;
3. Sync
• Data models.
• Deserializers from the basic model.
• Cache.
• Services that manage data.
• Matryoshka (aka Russian doll).
• Conflict resolver (included in Matryoshka).
This layer manages all business logic of Wunderlist, where we make all
sync operations.
Data
Sync logic
3.1 Data models
Sync data models in
this layer manage the
raw data that we
already have from the
SDK data models.
public class WLUser extends WLApiObject<User> {
public static Type collectionType =
new TypeToken<List<WLUser>>() {}.getType();
@Persist
private boolean isMe;
private String pictureUrl;
private WLUser(User user) {
super(user);
}
public static WLUser buildFromBaseModel(User user) {
return new WLUser(user);
}
public static WLUser buildFromEmail(String email) {
……………
}
………………………………………
}
3.2 Deserializers
public class WLTaskDeserializer
extends WLApiObjectDeserializer<Task, WLTask> {
@Override
protected Type getType() {
return Task.class;
}
@Override
protected WLTask newInstance(Task baseModel) {
return new WLTask(baseModel);
}
}
• Deserializers make the parsing stuff from the raw API model, to the model we
are going to use within the app.
• Our deserializers are used by Gson to work with the correct scheme.
3.3 Cache
• Caches for different models (Tasks, Lists, Memberships,
etc.)
• DataStore interface which our database model (in Android
layer) and Cache implement to work on the same way.
• Cache has to be filled in a background thread (not UI).
• Two dynamic data structures, List and Map.
3.4 Services
• Used to communicate the Android layer with the SDK (AppDataController, retrieves API data).
public class WLTaskService extends WLService<WLTask, TaskService> {
public WLTaskService(Client client) {
super(new TaskService(client));
}
…………………………
public void getCompletedTasks(final WLList list, final SyncCallback uiCallbacks) {
ResponseCallback responseCallback = new ResponseCallback() {
@Override
public void onSuccess(Response response) {
…………………………
uiCallbacks.onSuccess(tasks);
}
@Override
public void onFailure(Response response) {
…………………………
uiCallbacks.onFailure(response);
}
};
service.getCompletedTasksForList(list.getId(), responseCallback);
}
…………………………
}
3.5. Matryoshka (aka Russian Doll)
3.5.1 What is this?
• Set of wooden dolls of decreasing size placed
one inside the other.
• Mechanism to properly sync entire model.
3.5.2 How does it work?
• Revision based.
• When a child is updated the revision
changes the whole tree up (eg.: when a Task
is created the List's revision is incremented, as
well the root).
3.5.2.1 How does it work?
3.5.2.2 How does it work?
Yay!!! is like a Matryoshka!!!
so… is recursive ;-)
package com.wunderlist.wunderlistandroid;
4. Android layer
• This is the UI + Android libs and code.
• Maximized decoupling among UI and
business logic.
4.1 Model View Presenter
Presenter
(Supervising controller)
Passive view
User events
Updates model
Updates view
State-changes event
Model
4.2 EventBus
• We use EventBus to update the UI when we have loaded
asynchronously our requested data…
• … but also when something that we are listen for happens, like a
mutation.
EventBus is an Android optimised publish/subscribe event bus. A typical
use case for Android apps is gluing Activities, Fragments, and
background threads together.
4.2.1 EventBus (example)
Activity/Fragment
A
Fragment
B
Code which manages
a mutation
(do something that the
Activity/Fragment A
uses to update its UI)
(this data has to be used
by the Activity/Fragment A)
BUS
Subscription Data Data Data
4.3 Loaders
• We use loaders to request data to our database model/cache.
• The loaders, once they finish, return the data to the Activity/Fragment.
• The loaders can also subscribe themselves to the EventBus and listen for
events.
Introduced in Android 3.0, loaders make it easy to asynchronously
load data in an activity or fragment.
4.4 Loaders and EventBus (example)
Loader
(Gets the data and
does something with it)
Activity/Fragment
DataSource
BUS
Subscription Data Data
4.5 Database
• We can not decuple the Android database (SQLite)
here …
• … but we try to make as much abstract as we can
the work between data persistence, cache, and API
data.
4.6 Others
• We use others useful open source libraries to
manage different stuff, like:
- Image management, Square Picasso.
- Network request queue, Path PriorityJobQueue.
Questions?
!!!‫תודה‬
+CesarValiente @CesarValiente
Thank you!!!!
Gracias!!!
License
• Content: (cc) 2014-2015 Cesar Valiente Gordo & 6Wunderkinder
GmbH. Some rights reserved. This document is distributed under the
Creative Commons Attribution-ShareAlike 3.0 license, available in
http://creativecommons.org/licenses/by-sa/3.0/
• All images used in this presentation belong to their owners.

Weitere ähnliche Inhalte

Was ist angesagt?

Android - Thread, Handler and AsyncTask
Android - Thread, Handler and AsyncTaskAndroid - Thread, Handler and AsyncTask
Android - Thread, Handler and AsyncTaskHoang Ngo
 
Distributing information on iOS
Distributing information on iOSDistributing information on iOS
Distributing information on iOSMake School
 
Building a production ready meteor app
Building a production ready meteor appBuilding a production ready meteor app
Building a production ready meteor appRitik Malhotra
 
Servlet and JSP
Servlet and JSPServlet and JSP
Servlet and JSPGary Yeh
 
Servlet sessions
Servlet sessionsServlet sessions
Servlet sessionsvantinhkhuc
 
Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Fabio Collini
 
Prometheus: From technical metrics to business observability
Prometheus: From technical metrics to business observabilityPrometheus: From technical metrics to business observability
Prometheus: From technical metrics to business observabilityJulien Pivotto
 
Paris Tech Meetup talk : Troubles start at version 1.0
Paris Tech Meetup talk : Troubles start at version 1.0Paris Tech Meetup talk : Troubles start at version 1.0
Paris Tech Meetup talk : Troubles start at version 1.0Laurent Cerveau
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade ServerlessKatyShimizu
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootJosué Neis
 
Reactive Thinking in Java with RxJava2
Reactive Thinking in Java with RxJava2Reactive Thinking in Java with RxJava2
Reactive Thinking in Java with RxJava2Yakov Fain
 
Deploy meteor in production
Deploy meteor in productionDeploy meteor in production
Deploy meteor in productionMiro Radenovic
 
Scaling with Scala: refactoring a back-end service into the mobile age
Scaling with Scala: refactoring a back-end service into the mobile ageScaling with Scala: refactoring a back-end service into the mobile age
Scaling with Scala: refactoring a back-end service into the mobile ageDragos Manolescu
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsDebora Gomez Bertoli
 
[143]Inside fuse deview 2016
[143]Inside fuse   deview 2016[143]Inside fuse   deview 2016
[143]Inside fuse deview 2016NAVER D2
 

Was ist angesagt? (19)

Android - Thread, Handler and AsyncTask
Android - Thread, Handler and AsyncTaskAndroid - Thread, Handler and AsyncTask
Android - Thread, Handler and AsyncTask
 
Learn Drupal 8 Render Pipeline
Learn Drupal 8 Render PipelineLearn Drupal 8 Render Pipeline
Learn Drupal 8 Render Pipeline
 
Distributing information on iOS
Distributing information on iOSDistributing information on iOS
Distributing information on iOS
 
Building a production ready meteor app
Building a production ready meteor appBuilding a production ready meteor app
Building a production ready meteor app
 
Servlet and JSP
Servlet and JSPServlet and JSP
Servlet and JSP
 
Servlet sessions
Servlet sessionsServlet sessions
Servlet sessions
 
Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2
 
Prometheus: From technical metrics to business observability
Prometheus: From technical metrics to business observabilityPrometheus: From technical metrics to business observability
Prometheus: From technical metrics to business observability
 
Paris Tech Meetup talk : Troubles start at version 1.0
Paris Tech Meetup talk : Troubles start at version 1.0Paris Tech Meetup talk : Troubles start at version 1.0
Paris Tech Meetup talk : Troubles start at version 1.0
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBoot
 
Lecture 2
Lecture 2Lecture 2
Lecture 2
 
Java Server Pages
Java Server PagesJava Server Pages
Java Server Pages
 
Reactive Thinking in Java with RxJava2
Reactive Thinking in Java with RxJava2Reactive Thinking in Java with RxJava2
Reactive Thinking in Java with RxJava2
 
Deploy meteor in production
Deploy meteor in productionDeploy meteor in production
Deploy meteor in production
 
Celery introduction
Celery introductionCelery introduction
Celery introduction
 
Scaling with Scala: refactoring a back-end service into the mobile age
Scaling with Scala: refactoring a back-end service into the mobile ageScaling with Scala: refactoring a back-end service into the mobile age
Scaling with Scala: refactoring a back-end service into the mobile age
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture components
 
[143]Inside fuse deview 2016
[143]Inside fuse   deview 2016[143]Inside fuse   deview 2016
[143]Inside fuse deview 2016
 

Andere mochten auch

Creating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBM
Creating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBMCreating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBM
Creating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBMDroidConTLV
 
AWS Summit Berlin 2013 - Keynote - 6wunderkinder
AWS Summit Berlin 2013 - Keynote - 6wunderkinderAWS Summit Berlin 2013 - Keynote - 6wunderkinder
AWS Summit Berlin 2013 - Keynote - 6wunderkinderAWS Germany
 
Simple todo app with meteor
Simple todo app with meteorSimple todo app with meteor
Simple todo app with meteorAlex Long
 
Bibstrip Wunderlist - lijstjes maken
Bibstrip Wunderlist - lijstjes makenBibstrip Wunderlist - lijstjes maken
Bibstrip Wunderlist - lijstjes makenKatrien Schroyens
 
Myriam al dhaheri 201017821 - wunderlist – helps you manage your daily list...
Myriam al dhaheri   201017821 - wunderlist – helps you manage your daily list...Myriam al dhaheri   201017821 - wunderlist – helps you manage your daily list...
Myriam al dhaheri 201017821 - wunderlist – helps you manage your daily list...Myriam Al Dhaheri
 
To Do List Karma - Life style gamification - Manu Melwin Joy
To Do List Karma - Life style gamification - Manu Melwin JoyTo Do List Karma - Life style gamification - Manu Melwin Joy
To Do List Karma - Life style gamification - Manu Melwin Joymanumelwin
 
Todoist iPhone App - Onboarding Roast
Todoist iPhone App - Onboarding RoastTodoist iPhone App - Onboarding Roast
Todoist iPhone App - Onboarding RoastSanket Nadhani
 
Todoist Logo Design Process
Todoist Logo Design ProcessTodoist Logo Design Process
Todoist Logo Design ProcessTodoist
 
How To Grow Your SMS Marketing Database
How To Grow Your SMS Marketing DatabaseHow To Grow Your SMS Marketing Database
How To Grow Your SMS Marketing DatabaseTatango
 
Mobile Means Business
Mobile Means BusinessMobile Means Business
Mobile Means BusinessTack Mobile
 
The Mobile Content Mandate
The Mobile Content MandateThe Mobile Content Mandate
The Mobile Content MandateKaren McGrane
 
The Do's and Dont's of Stellar Push and In-App Messaging: September 2014 Webinar
The Do's and Dont's of Stellar Push and In-App Messaging: September 2014 WebinarThe Do's and Dont's of Stellar Push and In-App Messaging: September 2014 Webinar
The Do's and Dont's of Stellar Push and In-App Messaging: September 2014 WebinarLocalytics
 
Create and Convert Mobile Moments of Truth
Create and Convert Mobile Moments of TruthCreate and Convert Mobile Moments of Truth
Create and Convert Mobile Moments of TruthGreg Hickman
 
Social Action Mobile Marketing
Social Action Mobile MarketingSocial Action Mobile Marketing
Social Action Mobile MarketingWaterfall Mobile
 
Mobile Metrics 101: Everything web marketers need to know about app analytics
Mobile Metrics 101: Everything web marketers need to know about app analyticsMobile Metrics 101: Everything web marketers need to know about app analytics
Mobile Metrics 101: Everything web marketers need to know about app analyticsLocalytics
 

Andere mochten auch (20)

Creating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBM
Creating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBMCreating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBM
Creating killer apps powered by watson cognitive services - Ronen Siman-Tov, IBM
 
Project
ProjectProject
Project
 
AWS Summit Berlin 2013 - Keynote - 6wunderkinder
AWS Summit Berlin 2013 - Keynote - 6wunderkinderAWS Summit Berlin 2013 - Keynote - 6wunderkinder
AWS Summit Berlin 2013 - Keynote - 6wunderkinder
 
Nano Goals App
Nano Goals AppNano Goals App
Nano Goals App
 
Simple todo app with meteor
Simple todo app with meteorSimple todo app with meteor
Simple todo app with meteor
 
Bibstrip Wunderlist - lijstjes maken
Bibstrip Wunderlist - lijstjes makenBibstrip Wunderlist - lijstjes maken
Bibstrip Wunderlist - lijstjes maken
 
Myriam al dhaheri 201017821 - wunderlist – helps you manage your daily list...
Myriam al dhaheri   201017821 - wunderlist – helps you manage your daily list...Myriam al dhaheri   201017821 - wunderlist – helps you manage your daily list...
Myriam al dhaheri 201017821 - wunderlist – helps you manage your daily list...
 
To Do List Karma - Life style gamification - Manu Melwin Joy
To Do List Karma - Life style gamification - Manu Melwin JoyTo Do List Karma - Life style gamification - Manu Melwin Joy
To Do List Karma - Life style gamification - Manu Melwin Joy
 
Todoist iPhone App - Onboarding Roast
Todoist iPhone App - Onboarding RoastTodoist iPhone App - Onboarding Roast
Todoist iPhone App - Onboarding Roast
 
Todoist Logo Design Process
Todoist Logo Design ProcessTodoist Logo Design Process
Todoist Logo Design Process
 
9 Daily Habits of Entrepreneurs.
9 Daily Habits of Entrepreneurs.9 Daily Habits of Entrepreneurs.
9 Daily Habits of Entrepreneurs.
 
How To Grow Your SMS Marketing Database
How To Grow Your SMS Marketing DatabaseHow To Grow Your SMS Marketing Database
How To Grow Your SMS Marketing Database
 
Empower Customer Engagement with Mobile Context
Empower Customer Engagement with Mobile ContextEmpower Customer Engagement with Mobile Context
Empower Customer Engagement with Mobile Context
 
Mobile Means Business
Mobile Means BusinessMobile Means Business
Mobile Means Business
 
The Mobile Content Mandate
The Mobile Content MandateThe Mobile Content Mandate
The Mobile Content Mandate
 
The Do's and Dont's of Stellar Push and In-App Messaging: September 2014 Webinar
The Do's and Dont's of Stellar Push and In-App Messaging: September 2014 WebinarThe Do's and Dont's of Stellar Push and In-App Messaging: September 2014 Webinar
The Do's and Dont's of Stellar Push and In-App Messaging: September 2014 Webinar
 
Create and Convert Mobile Moments of Truth
Create and Convert Mobile Moments of TruthCreate and Convert Mobile Moments of Truth
Create and Convert Mobile Moments of Truth
 
Social Action Mobile Marketing
Social Action Mobile MarketingSocial Action Mobile Marketing
Social Action Mobile Marketing
 
Mobile Metrics 101: Everything web marketers need to know about app analytics
Mobile Metrics 101: Everything web marketers need to know about app analyticsMobile Metrics 101: Everything web marketers need to know about app analytics
Mobile Metrics 101: Everything web marketers need to know about app analytics
 
Computers
ComputersComputers
Computers
 

Ähnlich wie Engineering Wunderlist for Android - Ceasr Valiente, 6Wunderkinder

Tuning and optimizing webcenter spaces application white paper
Tuning and optimizing webcenter spaces application white paperTuning and optimizing webcenter spaces application white paper
Tuning and optimizing webcenter spaces application white paperVinay Kumar
 
Data Handning with Sqlite for Android
Data Handning with Sqlite for AndroidData Handning with Sqlite for Android
Data Handning with Sqlite for AndroidJakir Hossain
 
Apachecon 2002 Struts
Apachecon 2002 StrutsApachecon 2002 Struts
Apachecon 2002 Strutsyesprakash
 
Real time data-pipeline from inception to production
Real time data-pipeline from inception to productionReal time data-pipeline from inception to production
Real time data-pipeline from inception to productionShreya Mukhopadhyay
 
Windows Azure and a little SQL Data Services
Windows Azure and a little SQL Data ServicesWindows Azure and a little SQL Data Services
Windows Azure and a little SQL Data Servicesukdpe
 
Programming the Physical World with Device Shadows and Rules Engine
Programming the Physical World with Device Shadows and Rules EngineProgramming the Physical World with Device Shadows and Rules Engine
Programming the Physical World with Device Shadows and Rules EngineAmazon Web Services
 
Clean architectures with fast api pycones
Clean architectures with fast api   pyconesClean architectures with fast api   pycones
Clean architectures with fast api pyconesAlvaro Del Castillo
 
Nyc big datagenomics-pizarroa-sept2017
Nyc big datagenomics-pizarroa-sept2017Nyc big datagenomics-pizarroa-sept2017
Nyc big datagenomics-pizarroa-sept2017delagoya
 
Android application architecture
Android application architectureAndroid application architecture
Android application architectureRomain Rochegude
 
(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT
(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT
(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoTAmazon Web Services
 
Azure data analytics platform - A reference architecture
Azure data analytics platform - A reference architecture Azure data analytics platform - A reference architecture
Azure data analytics platform - A reference architecture Rajesh Kumar
 
Spark what's new what's coming
Spark what's new what's comingSpark what's new what's coming
Spark what's new what's comingDatabricks
 
Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...
Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...
Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...TAISEEREISA
 
IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...
IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...
IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...In-Memory Computing Summit
 
MSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance AppsMSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance AppsMarc Obaldo
 
AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)
AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)
AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)Amazon Web Services
 
Lecture 05. UI programming for Mobile Apps
Lecture 05. UI programming for Mobile AppsLecture 05. UI programming for Mobile Apps
Lecture 05. UI programming for Mobile AppsMaksym Davydov
 
3 Mobile App Dev Problems - Monospace
3 Mobile App Dev Problems - Monospace3 Mobile App Dev Problems - Monospace
3 Mobile App Dev Problems - MonospaceFrank Krueger
 

Ähnlich wie Engineering Wunderlist for Android - Ceasr Valiente, 6Wunderkinder (20)

Tuning and optimizing webcenter spaces application white paper
Tuning and optimizing webcenter spaces application white paperTuning and optimizing webcenter spaces application white paper
Tuning and optimizing webcenter spaces application white paper
 
Data Handning with Sqlite for Android
Data Handning with Sqlite for AndroidData Handning with Sqlite for Android
Data Handning with Sqlite for Android
 
Apachecon 2002 Struts
Apachecon 2002 StrutsApachecon 2002 Struts
Apachecon 2002 Struts
 
Real time data-pipeline from inception to production
Real time data-pipeline from inception to productionReal time data-pipeline from inception to production
Real time data-pipeline from inception to production
 
Windows Azure and a little SQL Data Services
Windows Azure and a little SQL Data ServicesWindows Azure and a little SQL Data Services
Windows Azure and a little SQL Data Services
 
Programming the Physical World with Device Shadows and Rules Engine
Programming the Physical World with Device Shadows and Rules EngineProgramming the Physical World with Device Shadows and Rules Engine
Programming the Physical World with Device Shadows and Rules Engine
 
Clean architectures with fast api pycones
Clean architectures with fast api   pyconesClean architectures with fast api   pycones
Clean architectures with fast api pycones
 
Sql lite android
Sql lite androidSql lite android
Sql lite android
 
Nyc big datagenomics-pizarroa-sept2017
Nyc big datagenomics-pizarroa-sept2017Nyc big datagenomics-pizarroa-sept2017
Nyc big datagenomics-pizarroa-sept2017
 
Android application architecture
Android application architectureAndroid application architecture
Android application architecture
 
(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT
(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT
(MBL305) You Have Data from the Devices, Now What?: Getting the Value of the IoT
 
Azure data analytics platform - A reference architecture
Azure data analytics platform - A reference architecture Azure data analytics platform - A reference architecture
Azure data analytics platform - A reference architecture
 
Spark what's new what's coming
Spark what's new what's comingSpark what's new what's coming
Spark what's new what's coming
 
Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...
Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...
Chapter 3.pptx Oracle SQL or local Android database setup SQL, SQL-Lite, codi...
 
IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...
IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...
IMC Summit 2016 Breakout - William Bain - Implementing Extensible Data Struct...
 
MSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance AppsMSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance Apps
 
AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)
AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)
AWS re:Invent 2016: IoT Visualizations and Analytics (IOT306)
 
Microsoft Azure
Microsoft AzureMicrosoft Azure
Microsoft Azure
 
Lecture 05. UI programming for Mobile Apps
Lecture 05. UI programming for Mobile AppsLecture 05. UI programming for Mobile Apps
Lecture 05. UI programming for Mobile Apps
 
3 Mobile App Dev Problems - Monospace
3 Mobile App Dev Problems - Monospace3 Mobile App Dev Problems - Monospace
3 Mobile App Dev Problems - Monospace
 

Mehr von DroidConTLV

Mobile Development in the Information Age - Yossi Elkrief, Nike
Mobile Development in the Information Age - Yossi Elkrief, NikeMobile Development in the Information Age - Yossi Elkrief, Nike
Mobile Development in the Information Age - Yossi Elkrief, NikeDroidConTLV
 
Doing work in the background - Darryn Campbell, Zebra Technologies
Doing work in the background - Darryn Campbell, Zebra TechnologiesDoing work in the background - Darryn Campbell, Zebra Technologies
Doing work in the background - Darryn Campbell, Zebra TechnologiesDroidConTLV
 
No more video loss - Alex Rivkin, Motorola Solutions
No more video loss - Alex Rivkin, Motorola SolutionsNo more video loss - Alex Rivkin, Motorola Solutions
No more video loss - Alex Rivkin, Motorola SolutionsDroidConTLV
 
Mobile at Scale: from startup to a big company - Dor Samet, Booking.com
Mobile at Scale: from startup to a big company - Dor Samet, Booking.comMobile at Scale: from startup to a big company - Dor Samet, Booking.com
Mobile at Scale: from startup to a big company - Dor Samet, Booking.comDroidConTLV
 
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, ClimacellLiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, ClimacellDroidConTLV
 
MVVM In real life - Lea Cohen Tannoudji, Lightricks
MVVM In real life - Lea Cohen Tannoudji, LightricksMVVM In real life - Lea Cohen Tannoudji, Lightricks
MVVM In real life - Lea Cohen Tannoudji, LightricksDroidConTLV
 
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)DroidConTLV
 
Building Apps with Flutter - Hillel Coren, Invoice Ninja
Building Apps with Flutter - Hillel Coren, Invoice NinjaBuilding Apps with Flutter - Hillel Coren, Invoice Ninja
Building Apps with Flutter - Hillel Coren, Invoice NinjaDroidConTLV
 
New Android Project: The Most Important Decisions - Vasiliy Zukanov
New Android Project: The Most Important Decisions - Vasiliy ZukanovNew Android Project: The Most Important Decisions - Vasiliy Zukanov
New Android Project: The Most Important Decisions - Vasiliy ZukanovDroidConTLV
 
Designing a Design System - Shai Mishali, Gett
Designing a Design System - Shai Mishali, GettDesigning a Design System - Shai Mishali, Gett
Designing a Design System - Shai Mishali, GettDroidConTLV
 
The Mighty Power of the Accessibility Service - Guy Griv, Pepper
The Mighty Power of the Accessibility Service - Guy Griv, PepperThe Mighty Power of the Accessibility Service - Guy Griv, Pepper
The Mighty Power of the Accessibility Service - Guy Griv, PepperDroidConTLV
 
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDevKotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDevDroidConTLV
 
Flutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, TikalFlutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, TikalDroidConTLV
 
Reactive UI in android - Gil Goldzweig Goldbaum, 10bis
Reactive UI in android - Gil Goldzweig Goldbaum, 10bisReactive UI in android - Gil Goldzweig Goldbaum, 10bis
Reactive UI in android - Gil Goldzweig Goldbaum, 10bisDroidConTLV
 
Fun with flutter animations - Divyanshu Bhargava, GoHighLevel
Fun with flutter animations - Divyanshu Bhargava, GoHighLevelFun with flutter animations - Divyanshu Bhargava, GoHighLevel
Fun with flutter animations - Divyanshu Bhargava, GoHighLevelDroidConTLV
 
DroidconTLV 2019
DroidconTLV 2019DroidconTLV 2019
DroidconTLV 2019DroidConTLV
 
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, MondayOk google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, MondayDroidConTLV
 
Introduction to React Native - Lev Vidrak, Wix
Introduction to React Native - Lev Vidrak, WixIntroduction to React Native - Lev Vidrak, Wix
Introduction to React Native - Lev Vidrak, WixDroidConTLV
 
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGeneBang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGeneDroidConTLV
 
Educating your app – adding ML edge to your apps - Maoz Tamir
Educating your app – adding ML edge to your apps - Maoz TamirEducating your app – adding ML edge to your apps - Maoz Tamir
Educating your app – adding ML edge to your apps - Maoz TamirDroidConTLV
 

Mehr von DroidConTLV (20)

Mobile Development in the Information Age - Yossi Elkrief, Nike
Mobile Development in the Information Age - Yossi Elkrief, NikeMobile Development in the Information Age - Yossi Elkrief, Nike
Mobile Development in the Information Age - Yossi Elkrief, Nike
 
Doing work in the background - Darryn Campbell, Zebra Technologies
Doing work in the background - Darryn Campbell, Zebra TechnologiesDoing work in the background - Darryn Campbell, Zebra Technologies
Doing work in the background - Darryn Campbell, Zebra Technologies
 
No more video loss - Alex Rivkin, Motorola Solutions
No more video loss - Alex Rivkin, Motorola SolutionsNo more video loss - Alex Rivkin, Motorola Solutions
No more video loss - Alex Rivkin, Motorola Solutions
 
Mobile at Scale: from startup to a big company - Dor Samet, Booking.com
Mobile at Scale: from startup to a big company - Dor Samet, Booking.comMobile at Scale: from startup to a big company - Dor Samet, Booking.com
Mobile at Scale: from startup to a big company - Dor Samet, Booking.com
 
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, ClimacellLiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
LiveData on Steroids - Giora Shevach + Shahar Ben Moshe, Climacell
 
MVVM In real life - Lea Cohen Tannoudji, Lightricks
MVVM In real life - Lea Cohen Tannoudji, LightricksMVVM In real life - Lea Cohen Tannoudji, Lightricks
MVVM In real life - Lea Cohen Tannoudji, Lightricks
 
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
Best Practices for Using Mobile SDKs - Lilach Wagner, SafeDK (AppLovin)
 
Building Apps with Flutter - Hillel Coren, Invoice Ninja
Building Apps with Flutter - Hillel Coren, Invoice NinjaBuilding Apps with Flutter - Hillel Coren, Invoice Ninja
Building Apps with Flutter - Hillel Coren, Invoice Ninja
 
New Android Project: The Most Important Decisions - Vasiliy Zukanov
New Android Project: The Most Important Decisions - Vasiliy ZukanovNew Android Project: The Most Important Decisions - Vasiliy Zukanov
New Android Project: The Most Important Decisions - Vasiliy Zukanov
 
Designing a Design System - Shai Mishali, Gett
Designing a Design System - Shai Mishali, GettDesigning a Design System - Shai Mishali, Gett
Designing a Design System - Shai Mishali, Gett
 
The Mighty Power of the Accessibility Service - Guy Griv, Pepper
The Mighty Power of the Accessibility Service - Guy Griv, PepperThe Mighty Power of the Accessibility Service - Guy Griv, Pepper
The Mighty Power of the Accessibility Service - Guy Griv, Pepper
 
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDevKotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
Kotlin Multiplatform in Action - Alexandr Pogrebnyak - IceRockDev
 
Flutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, TikalFlutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, Tikal
 
Reactive UI in android - Gil Goldzweig Goldbaum, 10bis
Reactive UI in android - Gil Goldzweig Goldbaum, 10bisReactive UI in android - Gil Goldzweig Goldbaum, 10bis
Reactive UI in android - Gil Goldzweig Goldbaum, 10bis
 
Fun with flutter animations - Divyanshu Bhargava, GoHighLevel
Fun with flutter animations - Divyanshu Bhargava, GoHighLevelFun with flutter animations - Divyanshu Bhargava, GoHighLevel
Fun with flutter animations - Divyanshu Bhargava, GoHighLevel
 
DroidconTLV 2019
DroidconTLV 2019DroidconTLV 2019
DroidconTLV 2019
 
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, MondayOk google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
Ok google, it's time to bot! - Hadar Franco, Albert + Stav Levi, Monday
 
Introduction to React Native - Lev Vidrak, Wix
Introduction to React Native - Lev Vidrak, WixIntroduction to React Native - Lev Vidrak, Wix
Introduction to React Native - Lev Vidrak, Wix
 
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGeneBang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
 
Educating your app – adding ML edge to your apps - Maoz Tamir
Educating your app – adding ML edge to your apps - Maoz TamirEducating your app – adding ML edge to your apps - Maoz Tamir
Educating your app – adding ML edge to your apps - Maoz Tamir
 

Kürzlich hochgeladen

The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 

Kürzlich hochgeladen (20)

The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

Engineering Wunderlist for Android - Ceasr Valiente, 6Wunderkinder

  • 1. Engineering Wunderlist for Android Cesar Valiente +CesarValiente @CesarValiente
  • 4. First of all… • Wunderlist 2 was created as a monolithic app. • Wunderlist 3 (from now on, just Wunderlist) has been built to be highly independent between layers. • Real time sync.
  • 6. 1.2 Three layers Android Layer Sync Layer SDK Layer Presentation layer (UI/Android stuff) Model layer (Business logic) Data layer (Accessing to the API data) Android project Java project Java project Sync boundaries SDK boundaries
  • 7. 1.3 What does it mean? • Independent layers. Accessibility. • Clean architecture. • Abstract, easy to change, modular —> interfaces.
  • 9. 2. Sdk • Websocket (real time). • REST. • Services • API data models. • Serializers/deserializers. • Interfaces/callbacks. • Sync and async tests. Network API model
  • 10. 2.1 Websocket (real time) “ WebSocket is a protocol providing full-duplex communications channels over a single TCP connection. The WebSocket protocol was standardized by the IETF as RFC 6455 in 2011, and the WebSocket API in Web IDL is being standardized by the W3C.”
  • 12. 2.1.2 Websocket. Details • Main way to sync. • java-websocket, netty,…. OkHttp ws!
  • 13. 2.1.3 Websocket. Mutations void handleMessage(String message) { try { JsonObject jsonObject = Json.parseJson(message); if (HealthResponse.isHealthResponse(jsonObject)) { ……………… } else if (Response.isValidJsonForObject(jsonObject)) { ……………… } else if (Mutation.isValidJsonForObject(jsonObject)) { receiveMutation((Mutation)Json.fromJson( jsonObject, Mutation.class)); } else { Log.warn("Oh oh! We got a corrupted object on websocket: " + message); } } catch (JsonSyntaxException e) { Log.warn("Discarding a malformed json object on websocket: " + message); } }
  • 15. 2.2 REST • Conventional REST API services for synchronous requests. • Secondary (fallback) way to sync. • Using Square OkHttp. • To encourage hunting bugs and API stress tests, we always use production API.
  • 16. 2.3 Others • Services, manages an API endpoint (Users, Lists, Tasks, etc.) • API data models, same structure as API scheme data objects (basic models, just data). • Json serializers/deserializers. Using Gson. Integrity (health) checks. • Callbacks. • Sync/Async unit tests (Junit and mockito) to test requests/ responses.
  • 18. 3. Sync • Data models. • Deserializers from the basic model. • Cache. • Services that manage data. • Matryoshka (aka Russian doll). • Conflict resolver (included in Matryoshka). This layer manages all business logic of Wunderlist, where we make all sync operations. Data Sync logic
  • 19. 3.1 Data models Sync data models in this layer manage the raw data that we already have from the SDK data models. public class WLUser extends WLApiObject<User> { public static Type collectionType = new TypeToken<List<WLUser>>() {}.getType(); @Persist private boolean isMe; private String pictureUrl; private WLUser(User user) { super(user); } public static WLUser buildFromBaseModel(User user) { return new WLUser(user); } public static WLUser buildFromEmail(String email) { …………… } ……………………………………… }
  • 20. 3.2 Deserializers public class WLTaskDeserializer extends WLApiObjectDeserializer<Task, WLTask> { @Override protected Type getType() { return Task.class; } @Override protected WLTask newInstance(Task baseModel) { return new WLTask(baseModel); } } • Deserializers make the parsing stuff from the raw API model, to the model we are going to use within the app. • Our deserializers are used by Gson to work with the correct scheme.
  • 21. 3.3 Cache • Caches for different models (Tasks, Lists, Memberships, etc.) • DataStore interface which our database model (in Android layer) and Cache implement to work on the same way. • Cache has to be filled in a background thread (not UI). • Two dynamic data structures, List and Map.
  • 22. 3.4 Services • Used to communicate the Android layer with the SDK (AppDataController, retrieves API data). public class WLTaskService extends WLService<WLTask, TaskService> { public WLTaskService(Client client) { super(new TaskService(client)); } ………………………… public void getCompletedTasks(final WLList list, final SyncCallback uiCallbacks) { ResponseCallback responseCallback = new ResponseCallback() { @Override public void onSuccess(Response response) { ………………………… uiCallbacks.onSuccess(tasks); } @Override public void onFailure(Response response) { ………………………… uiCallbacks.onFailure(response); } }; service.getCompletedTasksForList(list.getId(), responseCallback); } ………………………… }
  • 23. 3.5. Matryoshka (aka Russian Doll)
  • 24. 3.5.1 What is this? • Set of wooden dolls of decreasing size placed one inside the other. • Mechanism to properly sync entire model.
  • 25. 3.5.2 How does it work? • Revision based. • When a child is updated the revision changes the whole tree up (eg.: when a Task is created the List's revision is incremented, as well the root).
  • 26. 3.5.2.1 How does it work?
  • 27. 3.5.2.2 How does it work? Yay!!! is like a Matryoshka!!! so… is recursive ;-)
  • 29. 4. Android layer • This is the UI + Android libs and code. • Maximized decoupling among UI and business logic.
  • 30. 4.1 Model View Presenter Presenter (Supervising controller) Passive view User events Updates model Updates view State-changes event Model
  • 31. 4.2 EventBus • We use EventBus to update the UI when we have loaded asynchronously our requested data… • … but also when something that we are listen for happens, like a mutation. EventBus is an Android optimised publish/subscribe event bus. A typical use case for Android apps is gluing Activities, Fragments, and background threads together.
  • 32. 4.2.1 EventBus (example) Activity/Fragment A Fragment B Code which manages a mutation (do something that the Activity/Fragment A uses to update its UI) (this data has to be used by the Activity/Fragment A) BUS Subscription Data Data Data
  • 33. 4.3 Loaders • We use loaders to request data to our database model/cache. • The loaders, once they finish, return the data to the Activity/Fragment. • The loaders can also subscribe themselves to the EventBus and listen for events. Introduced in Android 3.0, loaders make it easy to asynchronously load data in an activity or fragment.
  • 34. 4.4 Loaders and EventBus (example) Loader (Gets the data and does something with it) Activity/Fragment DataSource BUS Subscription Data Data
  • 35. 4.5 Database • We can not decuple the Android database (SQLite) here … • … but we try to make as much abstract as we can the work between data persistence, cache, and API data.
  • 36. 4.6 Others • We use others useful open source libraries to manage different stuff, like: - Image management, Square Picasso. - Network request queue, Path PriorityJobQueue.
  • 39. License • Content: (cc) 2014-2015 Cesar Valiente Gordo & 6Wunderkinder GmbH. Some rights reserved. This document is distributed under the Creative Commons Attribution-ShareAlike 3.0 license, available in http://creativecommons.org/licenses/by-sa/3.0/ • All images used in this presentation belong to their owners.