Android 3

Preview:

DESCRIPTION

What's new in Android 3.0 Honeycomb

Citation preview

Android 3.0 Honeycomb

Robert CooperReach Health

What is Honeycomb?

Tablet-specific version of Android New UI Metaphors New LaF (Holographic) New/Improved APIs. Old APIs made optional (telephony, etc) New Technologies

Basis for future releases 3.1 seems to be on-deck Merged with phone branch?

What are we going to talk about?

Hopefully everything, at least briefly. Detailed discussion of the things I just you

are most likely to care about as a developer :P

New UI Metaphor

ActionBar Used for “App Global” Tabs Special MenuItems or SubMenus App Icon with a “Logical Home” operation

No Hard Buttons NotificationBar now includes “Back”, “Home”

and “Tasks” Long-Touch context menus deprecated as

a model

New UI Metaphor

New Look and Feel

Holographic look and feel added Make it more TRON-ish… … but not too TRON-ish Lots of glows, varied depth line markers,

3D transitions Improved text ops mechanics

New Look and Feel

New Look and Feel

New Look and Feel

New APIs

Fragments Sub-Activities

Loaders Async-Friendly Content Fetchers

ActionBar New Menuing and Nav System.

Enhanced Interaction for Widgets and Notifications

Drag and Drop

New APIs: Fragments

Fragments Fragments are Sub-Activities that can be

recomposed based on UI factors (screen size, orientation, etc)

Part of 3.0, but available as a build-in backport as far back as 1.6 with the “Android Compatibility Package” (Available in the SDK/AVD Manager)

New APIs: Fragments

Fragments mimic Activity lifecycle: onCreate() onStart() onCreateView()* onPause() onStop()

New APIs: Fragments

Fragments laid out as part of Layouts<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    android:layout_width="match_parent"    android:layout_height="match_parent">    <fragment android:name="com.example.news.ArticleListFragment"            android:id="@+id/list"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="match_parent" />    <fragment android:name="com.example.news.ArticleReaderFragment"            android:id="@+id/viewer"            android:layout_weight="2"            android:layout_width="0dp"            android:layout_height="match_parent" /></LinearLayout>

New APIs: Fragments

Each Fragment becomes unique in the application

Can move between Activities with different combinations of Fragments by passing Fragment model/URI information using the FragmentManager API.

FragmentTransaction can be used to manipulate fragment state and “back” behavior

New APIs: Fragments

FragmentTransaction

Fragment newFragment = new ExampleFragment();FragmentTransaction transaction = getFragmentManager().beginTransaction();

transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);

transaction.commit();

New APIs: Loaders

Loaders provide a standard way to load data for Fragments

AsyncTaskLoader provides API for loading data asynchronously

CursorLoader loads a paged dataset asynchronously – this is likely what you want to read, for example, an Atom Pub Proto data source remotely.

New APIs: ActionBar

Moving MenuItems to the ActionBar

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/menu_add"          android:icon="@drawable/ic_menu_save"          android:title="@string/menu_save"          android:showAsAction="ifRoom|withText" /></menu>

New APIs: ActionBar

Custom Views in ActionBar<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/menu_search"        android:title="Search"        android:icon="@drawable/ic_menu_search"        android:showAsAction="ifRoom"    android:actionLayout="@layout/searchview"

android:actionViewClass="android.widget.SearchView"

/></menu>

New APIs: ActionBar

Custom Views in ActionBar (cont)

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();

New APIs: ActionBar

Navigation Big win over iOS!

Implicit “Home” widget (vs iOS Nav Bar) App Global Tabs (vs iOS Tool Bar) App List Navigation

New APIs: ActionBar

Getting the “Home” icon viewView home = a.findViewById(android.R.id.home);home.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { a.finish(); }}); Adding “Up” marker

ActionBar actionBar = this.getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);

New APIs: ActionBar

ActionBar Tabs final ActionBar actionBar = getActionBar();

actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS);

// remove the activity title to make space for tabsactionBar.setDisplayShowTitleEnabled(false);

Fragment artistsFragment = new ArtistsFragment();actionBar.addTab(actionBar.newTab()

.setText(R.string.tab_artists)    .setTabListener(new TabListener(artistsFragment)));

Fragment albumsFragment = new AlbumsFragment();actionBar.addTab(actionBar.newTab()

.setText(R.string.tab_albums)     .setTabListener(new TabListener(albumsFragment)));

New APIs: ActionBar

ActionBar List (Spinner) Navigation ActionBar actionBar = getActionBar();

actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_LIST); actionBar.setListNavigationCallbacks( new SpinnerAdapter(){ public View getDropDownView(int position,  View convertView, View Group parent){ // … }

}, new OnNavigationListener(){ public boolean onNavigationItemSelected( int itemPosition, long itemId){ //… } });

New APIs: Notifications

Notifications can now use RemoteViews to allow interaction with the popup notification, rather than just launch an intent.

RemoteViews layout = new RemoteViews( getPackageName(), R.layout.notification);

notification.contentView = layout;

layout.setOnClickPendingIntent( R.id.my_button, getDialogPendingIntent( "You pressed it!"));

New APIs: Notifications

PendingIntent getDialogPendingIntent( String dialogText) {

        return PendingIntent.getActivity(                this, // send back to the creating Act.                dialogText.hashCode(),                 new Intent(ACTION_DIALOG)                        .putExtra(Intent.EXTRA_TEXT,

dialogText)                        .addFlags(

Intent.FLAG_ACTIVITY_NEW_TASK),                0);    }

New APIs: Notifications

Handling the PendingIntent:

if (ACTION_DIALOG.equals(intent.getAction())) {            showDialog(

intent.getStringExtra( Intent.EXTRA_TEXT))}

PendingIntent then becomes an invisible call back into your Activity.

New APIs: Drag and Drop

Any View can now be dragged about the screen.

To begin a drag action call:myView.startDrag( dragData, dragShadowBuilder, localData,

0 /*unused int flags */); Can be called from you

OnClick/OnLongClick listeners… localData is just any Object that will be

sent with each DragEvent.

New APIs: Drag and Drop

dragData: is a ClipData object. This contains the data representation of what is being dragged:

ClipData.Item item = new ClipData.Item(v.getTag()); ClipData dragData = new ClipData(v.getTag(), ClipData.MIMETYPE_TEXT_PLAIN,item);

Be sure to use the “tag” property for your model data!

New APIs: Drag and Drop

Create the DrawShadowBuilder. This returns the view that is dragged about under the pointer.

This class takes a View as an argument and looks a lot like the stock View paint lifecycle.@Overridepublic void onProvideShadowMetrics (Point size, Point touch)@Overridepublic void onDrawShadow(Canvas canvas)

The first method sets the bounds, the second paints to the canvas.

You can use the View’s existing draw() method then mutate it

New APIs: Drag and Drop

DragEvents onDragEvent(DragEvent) or

View.OnDragListener on any view (These are really for Drop Targets)

DragEvent.getAction() returns one of the possible event action types.

New APIs: Drag and Drop

ACTION_DRAG_STARTED Sent to all active Views – check here for drop target

validity! ACTION_DRAG_ENTERED

Sent when the touch enters the box of the View ACTION_DRAG_LOCATION

Sent on each move while in the box of the View ACTION_DRAG_EXITED

Sent when the touch leaves the box. ACTION_DROP

Sent on drop event *ONLY* when the View/Listener returned “true” from the ACTION_DRAG_STARTED event.

New Technologies

Support for Hardware Accelerated Graphics Applies to stock animations and drawing APIs Comes damned near for free but… … if you haven’t tested it, it doesn’t work. Romain Guy eats his words! :P

Property animation RenderScript

A C99-ish script for doing OpenGL ops Should be like falling off a log for people with

OpenCL experience (read: not me)

New Technologies: GFX Aceleration

Activation/Deactivation Step 1: Add…

android:hardwareAccelerated="true|false“

…to your <application> or <activity> Step 2: Profit!

New Technologies: Propery Anim

Looks a whole lot like every other reflective animator (Swing-X, Gwittir, Moo Tools, etc)

Lots of possible options, but easily summarized:ObjectAnimator anim = ObjectAnimator.ofFloat(

someObject, “someProperty", startValue, endValue); anim.setInterpolater( someInterpolater );

anim.setDuration(1000);anim.start();

New Technologies: Property Anim

Lots of stock interpolators (mutation strategies) AccelerateDecelerateInterpolator : Sinoidal AccelerateInterpolator : Geometric AnticipateInterpolator : Start backwards, then

fling forward BounceInterpolator : Bounces around the end

value Linear Interpolator : Even steps “And many, many more!”

New Technologies: RenderScript

Not even going to get into this. Example from Google:

#pragma version(1)#pragma rs java_package_name(com.android.example.hellocompute)

rs_allocation gIn;rs_allocation gOut;rs_script gScript;

const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) {    float4 f4 = rsUnpackColor8888(*v_in);

    float3 mono = dot(f4.rgb, gMonoMult);    *v_out = rsPackColorTo8888(mono);}

void filter() {    rsForEach(gScript, gIn, gOut, 0);}

… but wait, there’s more!

DownloadManager API is VASTLY improved over the Gingerbread version! It is actually usable now!

HTTP Live Streaming support Improved SIP API over Gingerbread. Accessibility improvements

YMMV

Still questions about what API 12 will mean ActionBar/New Notifications on Phones? Is that

a good idea? Keeping phones with the current menu

strategy? How to detect “Tablet-y” systems?

Google TV? Lots and Lots of “Reflectively constructed

strategies” – I it is manageable, but getting harder to support older devices

Recommended