Post on 12-May-2015
description
Android Meetup
Wednesday, January 16, 13
Designing a Useful and Sexy ProductMiki Setlur@mikisetlur
Wednesday, January 16, 13
Looking back...
Wednesday, January 16, 13
Looking back...
Wednesday, January 16, 13
Be Useful & Sexy
Wednesday, January 16, 13
Be Useful & Sexy
Wednesday, January 16, 13
Useful: Select / create intuitive design patterns
Wednesday, January 16, 13
Useful: Select / create intuitive design patternsExample: studying android’s action bar and menu patterns
Wednesday, January 16, 13
Sexy: Focus aesthetics in the right places
Wednesday, January 16, 13
Sexy: Focus aesthetics in the right placesExample: home screen explorations before v4 launch
Wednesday, January 16, 13
Sexy: Focus aesthetics in the right placesExample: home screen explorations before v4 launch
Wednesday, January 16, 13
Useful: Go through the flows
Wednesday, January 16, 13
Useful: Go through the flowsExample: prototyping tablet navigation
Wednesday, January 16, 13
Sexy: Love for Android-only :)
Wednesday, January 16, 13
Sexy: Love for Android-only :)Example: designing scalable, customizable widgets
Wednesday, January 16, 13
Sexy: Be clean, crisp and clear
Wednesday, January 16, 13
Sexy: Be clean, crisp and clearExample: redesigned note composer
Wednesday, January 16, 13
Useful: Think all sizes and orientations
Wednesday, January 16, 13
Useful: Think all sizes and orientationsExample: layout change
Wednesday, January 16, 13
Useful: Think all sizes and orientationsExample: layout change
Wednesday, January 16, 13
Useful: Think all sizes and orientations
Wednesday, January 16, 13
Useful: Think all sizes and orientationsExample: cues rather than layout change
Wednesday, January 16, 13
Useful: Think all sizes and orientationsExample: cues rather than layout change
Wednesday, January 16, 13
Useful: Test with real users
Wednesday, January 16, 13
Useful: Test with real usersExample: discovering flaws
Wednesday, January 16, 13
Useful: Test with real users
Wednesday, January 16, 13
Useful: Test with real usersExample: eliminating flaws
Wednesday, January 16, 13
Inside EvernoteHemant Garg
hgarg@evernote.com
Wednesday, January 16, 13
Wednesday, January 16, 13
Wednesday, January 16, 13
Wednesday, January 16, 13
Process
Wednesday, January 16, 13
• Define the feature objectives and goals
Process
Wednesday, January 16, 13
• Define the feature objectives and goals
• Architect the feature
Process
Wednesday, January 16, 13
• Define the feature objectives and goals
• Architect the feature
• Break into small features
Process
Wednesday, January 16, 13
• Define the feature objectives and goals
• Architect the feature
• Break into small features
• Design, Develop & Test
Process
Wednesday, January 16, 13
After development
Wednesday, January 16, 13
After development
• User Trials
Wednesday, January 16, 13
After development
• User Trials
• Beta Release
Wednesday, January 16, 13
After development
• User Trials
• Beta Release
• Crash Reports
Wednesday, January 16, 13
After development
• User Trials
• Beta Release
• Crash Reports
• Analytics
Wednesday, January 16, 13
• 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
Launch!
Wednesday, January 16, 13
OS version Target the mass
Start Building
Wednesday, January 16, 13
OS version..
Wednesday, January 16, 13
OS version..
• Android Compatibility Library
Wednesday, January 16, 13
OS version..
• Android Compatibility Library
• Reflections
Wednesday, January 16, 13
OS version..
• Android Compatibility Library
• Reflections
• Emulators
Wednesday, January 16, 13
Phone sizes
Start Building
Wednesday, January 16, 13
Phone sizes...
• Scrollview & Linear Layouts
Wednesday, January 16, 13
Phone sizes...• Fragments
Wednesday, January 16, 13
Phone processing power and memory- There are many fast selling and popular low end devices.
Its a phoneAfter 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.
It’s a phone
Wednesday, January 16, 13
Give back to Android
Wednesday, January 16, 13
Give back to Android
• Open up intents so that other apps can use it. Connect the apps.
Wednesday, January 16, 13
Android TipsJess Anders
janders@evernote.com
Wednesday, January 16, 13
Fragment Tips
• Fragment.getActivity() (or null)
• FragmentTransactions after onPause()
• Keep track of state of onCreateView and onDestroyView
Wednesday, January 16, 13
Caution posting to Handlers
mHandler.post(new Runnable() { public void run() { if (mIsExited) { return; } updateUI(mNote); }});
Wednesday, January 16, 13
Expect the user not to save
• Auto-save in Evernote client
• Food auto-save
• Meal Activity
Wednesday, January 16, 13
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.
Small Heap & Images
Wednesday, January 16, 13
1536 x 1536 ~ 9.2MB3MP - 2046 x 1536 ~ 12.5MB5MP - 2560 x 1920 ~ 19.5MB8MP - 3264 x 2448 ~ 31.8MB
Worst Case all in-memory8MP ~ 41MB
Using this method9.2MB + 1MB*2 = 11.2MB
What we needed for Food 1.0
Wednesday, January 16, 13
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
Building EvernoteAhmed El-Helw
@ahmedre
Wednesday, January 16, 13
Difficulties
• Many distribution channels
• Multiple branches of development
• Dependencies on other teams' libraries
Wednesday, January 16, 13
• Security
• Build History
• Easy Distribution
Goal
Wednesday, January 16, 13
Property File
apks
property
Lint, testing, ...
Dependencies
Process
Wednesday, January 16, 13
Benefits
Wednesday, January 16, 13
The Evernote Platform & Android SDKTy Smith
@tylersmithnet
Wednesday, January 16, 13
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
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
Evernote’s Apps
Wednesday, January 16, 13
The Evernote Ecosystem
Wednesday, January 16, 13
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
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
Hackathons
Wednesday, January 16, 13
Android SDK
• Open Source and an open roadmaphttps://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
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;
@Overridepublic 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);}
@Overridepublic 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
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
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
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
Thanks!@evernote_dev
http://dev.evernote.com
Wednesday, January 16, 13