33. Process
• Define the feature objectives and goals
Wednesday, January 16, 13
34. Process
• Define the feature objectives and goals
• Architect the feature
Wednesday, January 16, 13
35. Process
• Define the feature objectives and goals
• Architect the feature
• Break into small features
Wednesday, January 16, 13
36. Process
• Define the feature objectives and goals
• Architect the feature
• Break into small features
• Design, Develop & Test
Wednesday, January 16, 13
39. After development
• User Trials
• Beta Release
Wednesday, January 16, 13
40. After development
• User Trials
• Beta Release
• Crash Reports
Wednesday, January 16, 13
41. After development
• User Trials
• Beta Release
• Crash Reports
• Analytics
Wednesday, January 16, 13
42. Launch!
• Test version upgrades, don’t leave too many logs,
write nice blog post about it and push the LIVE
button.
• Monitor crash reports, user reviews & analytics.
• 1st weekend is very crucial.
• Beers and bragging
Wednesday, January 16, 13
43. Start Building
OS version
Target the mass
Wednesday, January 16, 13
51. It’s a phone
Phone processing power and memory- There
are many fast selling and popular low end
devices.
Its a phone
After all its a mobile phone so think about how
will your app handle interruptions (incoming
call) & poor network connectivity.
Make Android work for you
- Use Intents to use functionalities from other
apps.
- Use content providers to get information from
OS.
Wednesday, January 16, 13
53. Give back to Android
• Open up intents so that other apps can
use it. Connect the apps.
Wednesday, January 16, 13
54. Android Tips
Jess Anders
janders@evernote.com
Wednesday, January 16, 13
55. Fragment Tips
• Fragment.getActivity() (or null)
• FragmentTransactions after
onPause()
• Keep track of state of onCreateView
and onDestroyView
Wednesday, January 16, 13
56. Caution posting to Handlers
mHandler.post(new Runnable() {
public void run() {
if (mIsExited) {
return;
}
updateUI(mNote);
}
});
Wednesday, January 16, 13
57. Expect the user not to save
• Auto-save in Evernote client
• Food auto-save
• Meal Activity
Wednesday, January 16, 13
58. Small Heap & Images
Analyze the problem and worst case scenarios.
◦ Calculations Spreadsheet for Food 1.0
• Determine if you can do the work in Java code
• For Food, we came up with a piece-by-piece
approach with BitmapRegionDecoder (2.3+)
• For the multi-shot camera, we reused this, but
then had a fallback of a native library to process
the large photos on older devices.
Wednesday, January 16, 13
59. What we needed for Food 1.0
3MP - 2046 x 1536 ~ 12.5MB 1536 x 1536 ~ 9.2MB
5MP - 2560 x 1920 ~ 19.5MB
8MP - 3264 x 2448 ~ 31.8MB
Worst Case all in-memory Using this method
8MP ~ 41MB 9.2MB + 1MB*2 = 11.2MB
Wednesday, January 16, 13
60. Resizing in Max Heap...
<activity
android:name=".MultiShotCameraActivity"
android:process=":photosProcess"
android:configChanges="keyboardHidden|screenLayout|
orientation|screenSize"
android:theme="@android:style/
Theme.NoTitleBar.Fullscreen" />
Wednesday, January 16, 13
66. The Evernote Platform & Android SDK
Ty Smith
@tylersmithnet
Wednesday, January 16, 13
67. The Evernote Platform
• The platform ties together all of our products - and it’s
available to everybody.
• We build great apps that help you capture and recall
important information.
• Third party developers add new and different ways to
capture and recall information, and put your Evernote
data in context with all of the other services you use.
Wednesday, January 16, 13
68. What’s in that cloud?
• Six billion HTTP requests last month.
• 20 thousand third party developers
• 1.5 billion notes have been created to date
• 380TB of user data
• 40 million registered users
Wednesday, January 16, 13
71. Remember Everything
• All of your notes live together in context. Search for a
meal, and you’ll find related meetings, web clips, and
more.
• Every app that adds content to your Evernote account
makes every other app smarter.
Wednesday, January 16, 13
72. The Platform Team
• Develop APIs, SDKs, sample code and docs
• Educate developer communities about the Evernote
Platform
• Support developers
• Promote great apps to our user base
Wednesday, January 16, 13
74. Android SDK
• Open Source and an open roadmap
https://github.com/evernote/evernote-sdk-android
• Library Project for easy integration
• Maven Central for dependency management
• OAuth2 for secure authentication
• Thrift for server-client communication
Wednesday, January 16, 13
75. Android SDK: Authentication
private static final String CONSUMER_KEY = "Your consumer key";
private static final String CONSUMER_SECRET = "Your consumer secret";
private static final String EVERNOTE_HOST = EvernoteSession.HOST_SANDBOX;
private EvernoteSession mEvernoteSession;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mEvernoteSession = EvernoteSession.init(this,
CONSUMER_KEY,
CONSUMER_SECRET,
EVERNOTE_HOST,
null);
if (!mEvernoteSession.isLoggedIn())
mEvernoteSession.authenticate(this);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == EvernoteSession.REQUEST_CODE_OAUTH &&
resultCode == Activity.RESULT_OK)
//Success, Update UI when OAuth activity returns result
}
Wednesday, January 16, 13
76. Android SDK: Creating a note
/**
* This is a network request, call outside of main thread
*/
public void createNote(String title, String content) {
Note note = new Note();
note.setTitle(title);
String enmlContent = EvernoteUtil.NOTE_PREFIX +
content +
EvernoteUtil.NOTE_SUFFIX;
note.setContent(enmlContent);
note = mEvernoteSession.createNoteStore().createNote(mEvernoteSession.getAuthToken(), note);
}
Wednesday, January 16, 13
77. Intent: Creating a note
public static final String ACTION_NEW_NOTE = "com.evernote.action.CREATE_NEW_NOTE";
public void newNoteWithContent(View view) {
String text = "This is a sample text file.nThis is line two.";
String title = "New Note with Content";
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);
startActivity(intent);
}
Wednesday, January 16, 13
78. Intent: Viewing a note
public static final String ACTION_VIEW_NOTE = "com.evernote.action.VIEW_NOTE";
public void viewNote(View view) {
String noteGuid = "63781605-3c3d-4e56-90a8-8be5e3ae7eee";
boolean hideTitleBar = true;
Intent intent = new Intent();
intent.setAction(ACTION_VIEW_NOTE);
intent.putExtra(EXTRA_NOTE_GUID, noteGuid);
intent.putExtra(EXTRA_FULL_SCREEN, hideTitleBar);
startActivity(intent);
}
Wednesday, January 16, 13
79. Thanks!
@evernote_dev
http://dev.evernote.com
Wednesday, January 16, 13