App to App: Design and Surface Local APIs

Post on 12-May-2015

2,316 views 0 download

Tags:

transcript

Ty Smith - @tylersmithnetSr. Android Engineer, Evernote

App to App: Design and Surface Local APIs

Sunday, September 29, 13

#EC2013

The S Note Story

Sunday, September 29, 13

#EC2013

The S Note Story

Sunday, September 29, 13

#EC2013

The S Note Story

Sunday, September 29, 13

#EC2013

The S Note Story

Sunday, September 29, 13

#EC2013

The S Note Story

Sunday, September 29, 13

#EC2013

The S Note Story

Sunday, September 29, 13

#EC2013

Web API vs Local API

Sunday, September 29, 13

#EC2013

Web API vs Local API

Web API

•Powerful

•Flexible

•Comfortable

•Complex

•Inconsistent data

•Service limitations

Local API

•Immediate results

•Managed complexity

•Consistent data

•Not as available

•Too Simple

Sunday, September 29, 13

#EC2013

Web API vs Local API

Web API

•Powerful

•Flexible

•Comfortable

•Complex

•Inconsistent data

•Service limitations

Local API

•Immediate results

•Managed complexity

•Consistent data

•Not as available

•Too Simple

Sunday, September 29, 13

#EC2013

Web API vs Local API

Web API

•Powerful

•Flexible

•Comfortable

•Complex

•Inconsistent data

•Service limitations

Local API

•Immediate results

•Managed complexity

•Consistent data

•Not as available

•Too Simple

Sunday, September 29, 13

#EC2013

Web API vs Local API

Web API

•Powerful

•Flexible

•Comfortable

•Complex

•Inconsistent data

•Service limitations

Local API

•Immediate results

•Managed complexity

•Consistent data

•Not as available

•Too Simple

Sunday, September 29, 13

#EC2013

Web API vs Local API

Web API

•Powerful

•Flexible

•Comfortable

•Complex

•Inconsistent data

•Service limitations

Local API

•Immediate results

•Managed complexity

•Consistent data

•Not as available

•Too Simple

Sunday, September 29, 13

#EC2013

Web API vs Local API

Web API

•Powerful

•Flexible

•Comfortable

•Complex

•Inconsistent data

•Service limitations

Local API

•Immediate results

•Managed complexity

•Consistent data

•Not as available

•Too Simple

Sunday, September 29, 13

#EC2013

What next?

Sunday, September 29, 13

#EC2013

What next?

Sunday, September 29, 13

#EC2013

Android Components

Sunday, September 29, 13

#EC2013

Android Components

1. Intents

Sunday, September 29, 13

#EC2013

Android Components

1. Intents

2. Content Provider

Sunday, September 29, 13

#EC2013

Android Components

1. Intents

2. Content Provider

3. Account Manager

Sunday, September 29, 13

#EC2013

Android Components

1. Intents

2. Content Provider

3. Account Manager

4. Sync Adapter

Sunday, September 29, 13

#EC2013

Android Components

1. Intents

2. Content Provider

3. Account Manager

4. Sync Adapter

5. Bound Service

Sunday, September 29, 13

#EC2013

Intents

Sunday, September 29, 13

#EC2013

Intents

•Simple message between two components

Sunday, September 29, 13

#EC2013

Intents

•Simple message between two components

•Bundle - key/value data

Sunday, September 29, 13

#EC2013

Intents

•Simple message between two components

•Bundle - key/value data

•Limited payload size (500k)

Sunday, September 29, 13

#EC2013

Intents

•Simple message between two components

•Bundle - key/value data

•Limited payload size (500k)

•Inefficient for batch operations

Sunday, September 29, 13

#EC2013

Intents

•Simple message between two components

•Bundle - key/value data

•Limited payload size (500k)

•Inefficient for batch operations

•URI Support

Sunday, September 29, 13

#EC2013

Intents: Android Standards

Sunday, September 29, 13

#EC2013

Intents: Android Standards

•Intent.ACTION_SEND

Sunday, September 29, 13

#EC2013

Intents: Android Standards

•Intent.ACTION_SEND

•Intent.EXTRA_STREAM

Sunday, September 29, 13

#EC2013

Intents: Android Standards

•Intent.ACTION_SEND

•Intent.EXTRA_STREAM

•Intent.ACTION_VIEW

Sunday, September 29, 13

#EC2013

Intents: Android Standards

•Intent.ACTION_SEND

•Intent.EXTRA_STREAM

•Intent.ACTION_VIEW

•Intent.ACTION_EDIT

Sunday, September 29, 13

#EC2013

Intents: View And EDIT

Sunday, September 29, 13

#EC2013

Intents: View And EDIT

•Set Action

Sunday, September 29, 13

#EC2013

Intents: View And EDIT

•Set Action

•Data URI

Sunday, September 29, 13

#EC2013

Intents: View And EDIT

•Set Action

•Data URI

•MIME Type

Sunday, September 29, 13

#EC2013

Intents: View And EDIT

•Set Action

•Data URI

•MIME Type

•startActivity...ForResult()

Sunday, September 29, 13

#EC2013

Intents: View And EDIT

•Set Action

•Data URI

•MIME Type

•startActivity...ForResult()

•onActivityResult()

Sunday, September 29, 13

#EC2013

Intents: Evernote CRUD

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: Evernote CRUD

public static final String NOTE_PICKER = "com.evernote.action.NOTE_PICKER"; public static final String VIEW_NOTE = "com.evernote.action.VIEW_NOTE";

public static final String NEW_NOTE = "com.evernote.action.CREATE_NEW_NOTE";  public static final String EDIT_NOTE = "com.evernote.action.EDIT_NOTE"; public static final String UPDATE_NOTE = "com.evernote.action.UPDATE_NOTE"; public static final String DELETE_NOTE = "com.evernote.action.DELETE_NOTE";

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

New Note Intent

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

New Note Intent

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

New Note Intent

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: New Note Overview

New Note Intent

onActivityResult()

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: Evernote New Note

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Intents: Evernote New Note

public static final String NEW_NOTE = "com.evernote.action.CREATE_NEW_NOTE";

public void newNoteWithContent(Uri image) {  String title = "Sample Title";  String text = "Sample description.";   Intent intent = new Intent();  intent.setAction(ACTION_NEW_NOTE);   // Set the note's title and plaintext content  intent.putExtra(Intent.EXTRA_TITLE, title);  intent.putExtra(Intent.EXTRA_TEXT, text); // Set the Data URI for the image intent.setData(image);  startActivityForResult(intent);}

gist.github.com/TylerSmithNet/6735496

Sunday, September 29, 13

#EC2013

Content Provider

Sunday, September 29, 13

#EC2013

Content Provider

•A well defined database access layer

Sunday, September 29, 13

#EC2013

Content Provider

•A well defined database access layer

•SQLite

Sunday, September 29, 13

#EC2013

Content Provider

•A well defined database access layer

•SQLite

•Interact with large volumes of data

Sunday, September 29, 13

#EC2013

Content Provider

•A well defined database access layer

•SQLite

•Interact with large volumes of data

•Authority

Sunday, September 29, 13

#EC2013

Content Provider

•A well defined database access layer

•SQLite

•Interact with large volumes of data

•Authority

•Permissions

Sunday, September 29, 13

#EC2013

Content Provider: URI

content:// com.example / notes / 1

Sunday, September 29, 13

#EC2013

Content Provider: URI

content:// com.example / notes / 1

Scheme

Sunday, September 29, 13

#EC2013

Content Provider: URI

content:// com.example / notes / 1

Scheme Authority

Sunday, September 29, 13

#EC2013

Content Provider: URI

content:// com.example / notes / 1

Scheme Authority Data Type

Sunday, September 29, 13

#EC2013

Content Provider: URI

content:// com.example / notes / 1

Scheme Authority Data Type Id

Sunday, September 29, 13

#EC2013

Content Provider: Implementing

Sunday, September 29, 13

#EC2013

Content Provider: Implementing

•Override Methods

Sunday, September 29, 13

#EC2013

Content Provider: Implementing

•Override Methods

•URI Matcher

Sunday, September 29, 13

#EC2013

Content Provider: Implementing

•Override Methods

•URI Matcher

•Cursors

Sunday, September 29, 13

#EC2013

Content Provider: Implementing

•Override Methods

•URI Matcher

•Cursors

•File Handlers

Sunday, September 29, 13

#EC2013

Content Provider: Query

Sunday, September 29, 13

#EC2013

Content Provider: Query

Uri authUri = Uri.parse("content://com.evernote.evernoteprovider"); Uri notesUri = Uri.withAppendedPath(authUri, "notes"); String[] projection = new String[]{"guid", "title"}; Cursor cursor = getContentResolver().query( notesUri, projection, null, null, null);

Sunday, September 29, 13

#EC2013

Account Manager

Sunday, September 29, 13

#EC2013

Account Manager

•Accessible Account

Sunday, September 29, 13

#EC2013

Account Manager

•Accessible Account

•Third Party Auth

Sunday, September 29, 13

#EC2013

Account Manager

•Accessible Account

•Third Party Auth

•Consistent Settings

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

getAuthToken(...)

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

getAuthToken(...)

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

getAuthToken(...)

Sunday, September 29, 13

#EC2013

Account Manager: OAuth

getAuthToken(...)

Future<Bundle>

Sunday, September 29, 13

#EC2013

Sync Adapter

Sunday, September 29, 13

#EC2013

Sync Adapter

•Synchronizes App and Web Service

Sunday, September 29, 13

#EC2013

Sync Adapter

•Synchronizes App and Web Service

•Network/battery optimized syncing

Sunday, September 29, 13

#EC2013

Sync Adapter

•Synchronizes App and Web Service

•Network/battery optimized syncing

•Provided to third party apps

Sunday, September 29, 13

#EC2013

Sync Adapter

•Synchronizes App and Web Service

•Network/battery optimized syncing

•Provided to third party apps

•Schedule and GCM

Sunday, September 29, 13

#EC2013

Sync Adapter: Caveats

Sunday, September 29, 13

#EC2013

Sync Adapter: Caveats

•Requires Content Provider and Account Manager

Sunday, September 29, 13

#EC2013

Sync Adapter: Caveats

•Sync every hourContentResolver.addPeriodicSync(account, EvernoteContract.AUTHORITY, new Bundle(), 3600);

•Requires Content Provider and Account Manager

Sunday, September 29, 13

#EC2013

Sync Adapter: Caveats

•Sync every hourContentResolver.addPeriodicSync(account, EvernoteContract.AUTHORITY, new Bundle(), 3600);

•Requires Content Provider and Account Manager

Sunday, September 29, 13

#EC2013

Sync Adapter: Caveats

•Sync every hourContentResolver.addPeriodicSync(account, EvernoteContract.AUTHORITY, new Bundle(), 3600);

•Sync with Jitterint jitter = new Random().nextInt(300);

ContentResolver.addPeriodicSync(account, EvernoteContract.AUTHORITY, new Bundle(), 3600+jitter);

•Requires Content Provider and Account Manager

Sunday, September 29, 13

#EC2013

Bound Service

Sunday, September 29, 13

#EC2013

Bound Service

•Android Interface Definition Language (AIDL)

Sunday, September 29, 13

#EC2013

Bound Service

•Android Interface Definition Language (AIDL)

•Directly call defined methods

Sunday, September 29, 13

#EC2013

Bound Service

•Android Interface Definition Language (AIDL)

•Directly call defined methods

•Communicate between process or app

Sunday, September 29, 13

#EC2013

Bound Service

•Android Interface Definition Language (AIDL)

•Directly call defined methods

•Communicate between process or app

•Requires consumer to contain interface

Sunday, September 29, 13

#EC2013

Bound Service: Evernote and Dashclock

github.com/TylerSmithNet/EvernoteReminderDashclock

Sunday, September 29, 13

#EC2013

Bound Service: Evernote and Dashclock

•Implements Dashclock jar (AIDL)

github.com/TylerSmithNet/EvernoteReminderDashclock

Sunday, September 29, 13

#EC2013

Bound Service: Evernote and Dashclock

•Implements Dashclock jar (AIDL)

•Queries Evernote Content Provider

github.com/TylerSmithNet/EvernoteReminderDashclock

Sunday, September 29, 13

#EC2013

Bound Service: Evernote and Dashclock

•Implements Dashclock jar (AIDL)

•Queries Evernote Content Provider

•Note list intent for clicks

github.com/TylerSmithNet/EvernoteReminderDashclock

Sunday, September 29, 13

#EC2013

Bound Service: Evernote and Dashclock

•Implements Dashclock jar (AIDL)

•Queries Evernote Content Provider

•Note list intent for clicks

•Open Source

github.com/TylerSmithNet/EvernoteReminderDashclock

Sunday, September 29, 13

#EC2013

Wrap up

Sunday, September 29, 13

#EC2013

Wrap up

•Let the system do the work

Sunday, September 29, 13

#EC2013

Wrap up

•Let the system do the work

•Base API design choice on user stories

Sunday, September 29, 13

#EC2013

Wrap up

•Let the system do the work

•Base API design choice on user stories

•Give the user the best experience

Sunday, September 29, 13

Ty SmithEvernote@tylersmithnet

Thanks, Questions?dev.evernote.com

Sunday, September 29, 13