SlideShare a Scribd company logo
Office Delve – for Office 365
Konstantin Loginov
About me
• 7 years in Mobile development:
 Windows Mobile
 webOS
 Windows Phone 7/8
 iOS (native/Xamarin)
 Android
Current Position: Software Engineer in Microsoft
LinkedIn / email
Office Delve
• “Flipboard for Office365” ©
• Code name: Oslo
• Tangled creation story
Steps towards Delve Mobile
Steps towards Delve Mobile
• Started as a team of two
• Android first
• Pivoted multiple times
& created various MVPs
• Application as an engagement driver for
the whole service
Development
Working process
• Non-formal Scrum, 2-weeks-long sprint
• Bi-weekly releases
• Team Foundation Server 2013 for task tracking
• Slack for team collaboration (love it!)
• GIT as revision control system
• Android studio (latest Canary build) as an IDE
• Internal tool for bug-tracking and code reviews
• OneNote as a knowledge base
• Today: 4 Android devs & 3.5 iOS devs
We love opensource
• Dagger (dependency injection)
• ButterKnife (view injection)
• EventBus
• Retrofit
• OkHttp
• Picasso
• Esty StaggeredGridView
• Compatibility libs
Upcoming: Mortar & Flow.
(As others, we Square )
• Mockito (Testing)
• AssertJ (Testing)
Design patterns we use
• Dependency injection
• Publish–subscribe pattern
• Data Access Object
Dependency Injection
Dependency Injection - Dagger
class DataProvider {
DataSource dataSource =
new DelveApi();
}
class DataProvider {
@Inject
DataSource dataSource;
}
11
class DataProvider {
private DataSource dataSource;
@Inject
DataProvider(DataSource dataSource) {
this.dataSource = dataSource;
}
}
Dependency Injection - Dagger
• Standard javax.inject annotations (JSR-30)
• Need to declare “modules” for compile-time validation and code
generation
• Specifies “provider” methods
• @Singleton annotation
• Lists supported classes (which in turn generates code)
• Supports override
• Inject mocks in tests
• Substituting back-ends is a one-line change
Dependency Injection - Dagger 2
• Just released
• No reflection, no ObjectGraph/Injector, @Component interface
• We’re planning to switch to it soon
Publish–subscribe pattern - EventBus
• We use greenrobot/EventBus
• Performs well with Activities, Fragments, and background threads
• Decouples event senders and receivers
• Avoids complex and error-prone dependencies and life cycle issues
Activity
(hosts fragments)
Data Access Layer
(Subscriber)
Fragment A
Fragment B
Data
Subscriber
Error Subscriber
ERROR
Navigation Event
Subscriber
Data
Subscriber
Open Fragment A
Data Access Object
• DAO is an object that provides an abstract interface to the database.
By mapping application calls to the persistence layer, DAO provides
specific data operations without exposing details of the database.
User
User getById(String userId)
List<User> queryMatch(String q, int l, int o)
SqlLocalStorageUserDao
User getById(String userId) {
/* Getting data from SQLite */
}
List<User> queryMatch(String q,int l,int o) {
/* Getting data from SQLite */
}
UserDaoImpl
DataProvider Layer
….
localStorage.getUser(userId);
….
UserDao userDao;
User getUser(String userId) {
return userDao.getUserById(userId);
}
String userId;
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Pinterest-style navigation model
• V1
Pros:
• Gestures between tabs
• Easy to implement
Cons:
• 3 «heavy» pages in ViewPager
• No Tab-switching-buttons in Profile/Document pages
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Pinterest-style navigation model
• V2
Pros:
• Still easy to implement
• Pretty effective
• Tab-buttons everywhere
Cons:
• No gestures
• Not keeping state of not-selected tab-fragments
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
Pinterest-style navigation model
• V3 (current)
Pros:
• Should be familiar for instagram users
Cons:
• Ugly in implementation
• Breaking OS design-guidelines
Pinterest-style navigation model – Going forward
• V4 (future)
Yeah! We like changes in Navigation model 
• Side nav as the way of switching between pivots
• Material design
Testing
Testing
• Manual testing
• Alpha & Beta programs
• Unit tests (Test Coverage 75+%)
 Mockito
 AssertJ
• Monkey testing
( adb shell monkey -p com.microsoft.delvemobile -v 10000 )
• Memory profiling
Mockito
• Mocks made easy
• Don’t “expect” before the fact; query object afterwards
• Simple to use
• Stages of a test
• Setup (as necessary)
• Test
• Verification
38
Mockito: Verify Interactions
// mock creation
List mockedList = mock(List.class);
// using mock object; observe that it didn't throw any
// "unexpected interaction exception" exception
mockedList.add("one");
mockedList.clear();
// selective & explicit verification
verify(mockedList).add("one");
verify(mockedList).clear();
39
Mockito: Verify Interactions 2
verify(mockedList, times(2)).add("one");
verify(mockedList, atLeastOnce()).add("one");
verify(mockedList, never()).clear();
40
Mockito: Stub Method Calls
// you can mock concrete classes, not only interfaces
LinkedList mockedList = mock(LinkedList.class);
// stubbing; before the actual execution
when(mockedList.get(0)).thenReturn("first");
// the following prints "first"
System.out.println(mockedList.get(0));
// the following prints "null" because get(999) was not stubbed
System.out.println(mockedList.get(999));
41
Mockito: Advanced Features
• Spy: Partial stubbing of real object through proxy
• Mocking by annotation
• Argument matching
42
AssertJ: Readable Asserts
Regular JUnit
assertEquals(
View.GONE,
view.getVisibility());
AssertJ Android
assertThat(view).isGone();
43
public static final int GONE = 0x00000008;
AssertJ: Readable Assert Chaining
Regular JUnit
assertEquals(View.VISIBLE,
layout.getVisibility());
assertEquals(VERTICAL,
layout.getOrientation());
assertEquals(4,
layout.getChildCount());
assertEquals(SHOW_DIVIDERS_MIDDLE,
layout.getShowDividers());
AssertJ Android
assertThat(layout)
.isVisible()
.isVertical()
.hasChildCount(4)
.hasShowDividers(
SHOW_DIVIDERS_MIDDLE);
44
Analytics & Crashalitics
We use (on both platforms):
• Crittercism (http://www.crittercism.com/)
• MixPanel (https://mixpanel.com/)
• AppFigures (https://appfigures.com/)
Data reviewed daily
Crittercism
• Automated Crash logging
• Automated network request logging
• Breadcrumbs
• Handled exceptions logging
• Alarms & lifetime dashboard
• latency
• error rate
• request volume
Crittercism: cases
• Delve Mobile crashed 44 times (14-26 April)
• Our crash rate:
• Average crash rate:
Crittercism: our crashes
• Most popular crash (50+% of total number):• Breadcrumbs we got:
MixPanel
• Funnels
• User-events
• Measure user’s retention & engagement
Feedback we got
Feedback we got through feedback-form:
• Disabling notifications feature-request
• Empty documents feed issues
Things we learn
• Cross-platform design does not work
• Square rocks
• Majority of our users are using Android 5.0+
• Learn about your users before start: majority of our users are using
iOS  (~1:3)
• Fragments are bad
• Crittercism is amazing
Mobile Developers Talks: Delve Mobile

More Related Content

PDF
Maintainable JavaScript 2011
PDF
Distributing information on iOS
PDF
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
DOCX
ObjectCreatorUserGuide
PDF
Parse London Meetup - Cloud Code Tips & Tricks
PPTX
JavaScript APIs you’ve never heard of (and some you have)
PDF
ReactJS for Programmers
PPTX
ECS19 - Edin Kapic - WHO IS THAT? DEVELOPING AI-ASSISTED EMPLOYEE IMAGE TAGGING
Maintainable JavaScript 2011
Distributing information on iOS
Advanced Memory Management on iOS and Android - Mark Probst and Rodrigo Kumpera
ObjectCreatorUserGuide
Parse London Meetup - Cloud Code Tips & Tricks
JavaScript APIs you’ve never heard of (and some you have)
ReactJS for Programmers
ECS19 - Edin Kapic - WHO IS THAT? DEVELOPING AI-ASSISTED EMPLOYEE IMAGE TAGGING

What's hot (20)

PDF
2nd-Order-SQLi-Josh
PPTX
Creating Single Page Web App using Backbone JS
PDF
The Snake and the Butler
PDF
Modern Web Developement
PPTX
Javascript talk
PDF
UI testing in Xcode 7
PPT
Backbone.js
PDF
Developing iOS REST Applications
PDF
A To-do Web App on Google App Engine
PDF
JavaScript - Chapter 11 - Events
PPTX
J Query Presentation of David
PDF
iOS Development Methodology
PPTX
Async best practices DotNet Conference 2016
PPTX
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
PDF
Creating a WYSIWYG Editor with React
PPTX
Using FakeIteasy
KEY
Opensocial
PPTX
Object Oriented Programing in JavaScript
PPT
Introduction.to.j query
PDF
Breaking Dependencies to Allow Unit Testing
2nd-Order-SQLi-Josh
Creating Single Page Web App using Backbone JS
The Snake and the Butler
Modern Web Developement
Javascript talk
UI testing in Xcode 7
Backbone.js
Developing iOS REST Applications
A To-do Web App on Google App Engine
JavaScript - Chapter 11 - Events
J Query Presentation of David
iOS Development Methodology
Async best practices DotNet Conference 2016
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
Creating a WYSIWYG Editor with React
Using FakeIteasy
Opensocial
Object Oriented Programing in JavaScript
Introduction.to.j query
Breaking Dependencies to Allow Unit Testing
Ad

Similar to Mobile Developers Talks: Delve Mobile (20)

PDF
From Legacy to Hexagonal (An Unexpected Android Journey)
PPTX
Modeveast Appcelerator Presentation
PDF
How to Contribute to Apache Usergrid
PDF
Building Top-Notch Androids SDKs
KEY
iPhone Development Intro
PPTX
Real World Asp.Net WebApi Applications
PPTX
5 x HTML5 worth using in APEX (5)
PPT
iPhone development from a Java perspective (Jazoon '09)
PPTX
Testing Ext JS and Sencha Touch
PDF
WebNet Conference 2012 - Designing complex applications using html5 and knock...
PDF
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
PPTX
Jquery fundamentals
PPTX
Adding a modern twist to legacy web applications
PDF
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
PDF
React state management with Redux and MobX
PDF
CBDW2014 - MockBox, get ready to mock your socks off!
PDF
PPTX
Javascript first-class citizenery
PPTX
Plone FSR
PDF
Introduction to interactive data visualisation using R Shiny
From Legacy to Hexagonal (An Unexpected Android Journey)
Modeveast Appcelerator Presentation
How to Contribute to Apache Usergrid
Building Top-Notch Androids SDKs
iPhone Development Intro
Real World Asp.Net WebApi Applications
5 x HTML5 worth using in APEX (5)
iPhone development from a Java perspective (Jazoon '09)
Testing Ext JS and Sencha Touch
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Lotusphere 2012 Speedgeeking - jQuery & Domino, a RAD Combination
Jquery fundamentals
Adding a modern twist to legacy web applications
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
React state management with Redux and MobX
CBDW2014 - MockBox, get ready to mock your socks off!
Javascript first-class citizenery
Plone FSR
Introduction to interactive data visualisation using R Shiny
Ad

Recently uploaded (20)

PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PDF
BMEC211 - INTRODUCTION TO MECHATRONICS-1.pdf
PPTX
bas. eng. economics group 4 presentation 1.pptx
PDF
Embodied AI: Ushering in the Next Era of Intelligent Systems
PDF
Arduino robotics embedded978-1-4302-3184-4.pdf
PDF
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
PPTX
Construction Project Organization Group 2.pptx
PPT
Project quality management in manufacturing
PPTX
Lesson 3_Tessellation.pptx finite Mathematics
PDF
Evaluating the Democratization of the Turkish Armed Forces from a Normative P...
PPTX
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
PPTX
Sustainable Sites - Green Building Construction
PDF
Well-logging-methods_new................
PPT
Mechanical Engineering MATERIALS Selection
PPTX
Lecture Notes Electrical Wiring System Components
PPTX
Recipes for Real Time Voice AI WebRTC, SLMs and Open Source Software.pptx
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PPTX
Foundation to blockchain - A guide to Blockchain Tech
PPTX
OOP with Java - Java Introduction (Basics)
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
BMEC211 - INTRODUCTION TO MECHATRONICS-1.pdf
bas. eng. economics group 4 presentation 1.pptx
Embodied AI: Ushering in the Next Era of Intelligent Systems
Arduino robotics embedded978-1-4302-3184-4.pdf
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
Construction Project Organization Group 2.pptx
Project quality management in manufacturing
Lesson 3_Tessellation.pptx finite Mathematics
Evaluating the Democratization of the Turkish Armed Forces from a Normative P...
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
Sustainable Sites - Green Building Construction
Well-logging-methods_new................
Mechanical Engineering MATERIALS Selection
Lecture Notes Electrical Wiring System Components
Recipes for Real Time Voice AI WebRTC, SLMs and Open Source Software.pptx
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
Foundation to blockchain - A guide to Blockchain Tech
OOP with Java - Java Introduction (Basics)

Mobile Developers Talks: Delve Mobile

  • 1. Office Delve – for Office 365 Konstantin Loginov
  • 2. About me • 7 years in Mobile development:  Windows Mobile  webOS  Windows Phone 7/8  iOS (native/Xamarin)  Android Current Position: Software Engineer in Microsoft LinkedIn / email
  • 3. Office Delve • “Flipboard for Office365” © • Code name: Oslo • Tangled creation story
  • 5. Steps towards Delve Mobile • Started as a team of two • Android first • Pivoted multiple times & created various MVPs • Application as an engagement driver for the whole service
  • 7. Working process • Non-formal Scrum, 2-weeks-long sprint • Bi-weekly releases • Team Foundation Server 2013 for task tracking • Slack for team collaboration (love it!) • GIT as revision control system • Android studio (latest Canary build) as an IDE • Internal tool for bug-tracking and code reviews • OneNote as a knowledge base • Today: 4 Android devs & 3.5 iOS devs
  • 8. We love opensource • Dagger (dependency injection) • ButterKnife (view injection) • EventBus • Retrofit • OkHttp • Picasso • Esty StaggeredGridView • Compatibility libs Upcoming: Mortar & Flow. (As others, we Square ) • Mockito (Testing) • AssertJ (Testing)
  • 9. Design patterns we use • Dependency injection • Publish–subscribe pattern • Data Access Object
  • 11. Dependency Injection - Dagger class DataProvider { DataSource dataSource = new DelveApi(); } class DataProvider { @Inject DataSource dataSource; } 11 class DataProvider { private DataSource dataSource; @Inject DataProvider(DataSource dataSource) { this.dataSource = dataSource; } }
  • 12. Dependency Injection - Dagger • Standard javax.inject annotations (JSR-30) • Need to declare “modules” for compile-time validation and code generation • Specifies “provider” methods • @Singleton annotation • Lists supported classes (which in turn generates code) • Supports override • Inject mocks in tests • Substituting back-ends is a one-line change
  • 13. Dependency Injection - Dagger 2 • Just released • No reflection, no ObjectGraph/Injector, @Component interface • We’re planning to switch to it soon
  • 14. Publish–subscribe pattern - EventBus • We use greenrobot/EventBus • Performs well with Activities, Fragments, and background threads • Decouples event senders and receivers • Avoids complex and error-prone dependencies and life cycle issues
  • 15. Activity (hosts fragments) Data Access Layer (Subscriber) Fragment A Fragment B Data Subscriber Error Subscriber ERROR Navigation Event Subscriber Data Subscriber Open Fragment A
  • 16. Data Access Object • DAO is an object that provides an abstract interface to the database. By mapping application calls to the persistence layer, DAO provides specific data operations without exposing details of the database. User User getById(String userId) List<User> queryMatch(String q, int l, int o) SqlLocalStorageUserDao User getById(String userId) { /* Getting data from SQLite */ } List<User> queryMatch(String q,int l,int o) { /* Getting data from SQLite */ } UserDaoImpl DataProvider Layer …. localStorage.getUser(userId); …. UserDao userDao; User getUser(String userId) { return userDao.getUserById(userId); } String userId;
  • 25. Pinterest-style navigation model • V1 Pros: • Gestures between tabs • Easy to implement Cons: • 3 «heavy» pages in ViewPager • No Tab-switching-buttons in Profile/Document pages
  • 29. Pinterest-style navigation model • V2 Pros: • Still easy to implement • Pretty effective • Tab-buttons everywhere Cons: • No gestures • Not keeping state of not-selected tab-fragments
  • 34. Pinterest-style navigation model • V3 (current) Pros: • Should be familiar for instagram users Cons: • Ugly in implementation • Breaking OS design-guidelines
  • 35. Pinterest-style navigation model – Going forward • V4 (future) Yeah! We like changes in Navigation model  • Side nav as the way of switching between pivots • Material design
  • 37. Testing • Manual testing • Alpha & Beta programs • Unit tests (Test Coverage 75+%)  Mockito  AssertJ • Monkey testing ( adb shell monkey -p com.microsoft.delvemobile -v 10000 ) • Memory profiling
  • 38. Mockito • Mocks made easy • Don’t “expect” before the fact; query object afterwards • Simple to use • Stages of a test • Setup (as necessary) • Test • Verification 38
  • 39. Mockito: Verify Interactions // mock creation List mockedList = mock(List.class); // using mock object; observe that it didn't throw any // "unexpected interaction exception" exception mockedList.add("one"); mockedList.clear(); // selective & explicit verification verify(mockedList).add("one"); verify(mockedList).clear(); 39
  • 40. Mockito: Verify Interactions 2 verify(mockedList, times(2)).add("one"); verify(mockedList, atLeastOnce()).add("one"); verify(mockedList, never()).clear(); 40
  • 41. Mockito: Stub Method Calls // you can mock concrete classes, not only interfaces LinkedList mockedList = mock(LinkedList.class); // stubbing; before the actual execution when(mockedList.get(0)).thenReturn("first"); // the following prints "first" System.out.println(mockedList.get(0)); // the following prints "null" because get(999) was not stubbed System.out.println(mockedList.get(999)); 41
  • 42. Mockito: Advanced Features • Spy: Partial stubbing of real object through proxy • Mocking by annotation • Argument matching 42
  • 43. AssertJ: Readable Asserts Regular JUnit assertEquals( View.GONE, view.getVisibility()); AssertJ Android assertThat(view).isGone(); 43 public static final int GONE = 0x00000008;
  • 44. AssertJ: Readable Assert Chaining Regular JUnit assertEquals(View.VISIBLE, layout.getVisibility()); assertEquals(VERTICAL, layout.getOrientation()); assertEquals(4, layout.getChildCount()); assertEquals(SHOW_DIVIDERS_MIDDLE, layout.getShowDividers()); AssertJ Android assertThat(layout) .isVisible() .isVertical() .hasChildCount(4) .hasShowDividers( SHOW_DIVIDERS_MIDDLE); 44
  • 45. Analytics & Crashalitics We use (on both platforms): • Crittercism (http://www.crittercism.com/) • MixPanel (https://mixpanel.com/) • AppFigures (https://appfigures.com/) Data reviewed daily
  • 46. Crittercism • Automated Crash logging • Automated network request logging • Breadcrumbs • Handled exceptions logging • Alarms & lifetime dashboard • latency • error rate • request volume
  • 47. Crittercism: cases • Delve Mobile crashed 44 times (14-26 April) • Our crash rate: • Average crash rate:
  • 48. Crittercism: our crashes • Most popular crash (50+% of total number):• Breadcrumbs we got:
  • 49. MixPanel • Funnels • User-events • Measure user’s retention & engagement
  • 50. Feedback we got Feedback we got through feedback-form: • Disabling notifications feature-request • Empty documents feed issues
  • 51. Things we learn • Cross-platform design does not work • Square rocks • Majority of our users are using Android 5.0+ • Learn about your users before start: majority of our users are using iOS  (~1:3) • Fragments are bad • Crittercism is amazing