android wear (coding)

62
Android Wear Douglas Drumond [email protected]

Upload: douglas-drumond

Post on 16-Jul-2015

194 views

Category:

Software


0 download

TRANSCRIPT

Android WearDouglas Drumond

[email protected]

Background

Coding

Not Coding

Notifications

Notifications

Notifications

Notifications

Nada a ser feito

Enhanced notifications

Enhanced notifications

Nada a ser feito

Coding

Ação só p/ relógio// Create an intent for the reply action Intent actionIntent = new Intent(this, ActionActivity.class); PendingIntent actionPendingIntent =         PendingIntent.getActivity(this, 0, actionIntent,                 PendingIntent.FLAG_UPDATE_CURRENT);

// Create the action NotificationCompat.Action action =         new NotificationCompat.Action.Builder(R.drawable.ic_action,                 getString(R.string.label), actionPendingIntent)                 .build();

// Build the notification and add the action via WearableExtender Notification notification =         new NotificationCompat.Builder(mContext)                 .setSmallIcon(R.drawable.ic_message)                 .setContentTitle(getString(R.string.title))                 .setContentText(getString(R.string.content))                 .extend(new WearableExtender().addAction(action))                 .build();

Ação só p/ relógio// Create an intent for the reply action Intent actionIntent = new Intent(this, ActionActivity.class); PendingIntent actionPendingIntent =         PendingIntent.getActivity(this, 0, actionIntent,                 PendingIntent.FLAG_UPDATE_CURRENT);

// Create the action NotificationCompat.Action action =         new NotificationCompat.Action.Builder(R.drawable.ic_action,                 getString(R.string.label), actionPendingIntent)                 .build();

// Build the notification and add the action via WearableExtender Notification notification =         new NotificationCompat.Builder(mContext)                 .setSmallIcon(R.drawable.ic_message)                 .setContentTitle(getString(R.string.title))                 .setContentText(getString(R.string.content))                 .extend(new WearableExtender().addAction(action))                 .build();

Voz

// Key for the string that's delivered in the action's intent private static final String EXTRA_VOICE_REPLY = "extra_voice_reply";

String replyLabel = getResources().getString(R.string.reply_label);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)         .setLabel(replyLabel)         .build();

Voz com opções

public static final String EXTRA_VOICE_REPLY = "extra_voice_reply"; ... String replyLabel = getResources().getString(R.string.reply_label); String[] replyChoices = getResources().getStringArray(R.array.reply_choices);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)         .setLabel(replyLabel)         .setChoices(replyChoices)         .build();

Voz// Create an intent for the reply action Intent replyIntent = new Intent(this, ReplyActivity.class); PendingIntent replyPendingIntent =         PendingIntent.getActivity(this, 0, replyIntent,                 PendingIntent.FLAG_UPDATE_CURRENT);

// Create the reply action and add the remote input NotificationCompat.Action action =         new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,                 getString(R.string.label), replyPendingIntent)                 .addRemoteInput(remoteInput)                 .build();

// Build the notification and add the action via WearableExtender Notification notification =         new NotificationCompat.Builder(mContext)                 .setSmallIcon(R.drawable.ic_message)                 .setContentTitle(getString(R.string.title))                 .setContentText(getString(R.string.content))                 .extend(new WearableExtender().addAction(action))                 .build();

Voz// Create an intent for the reply action Intent replyIntent = new Intent(this, ReplyActivity.class); PendingIntent replyPendingIntent =         PendingIntent.getActivity(this, 0, replyIntent,                 PendingIntent.FLAG_UPDATE_CURRENT);

// Create the reply action and add the remote input NotificationCompat.Action action =         new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,                 getString(R.string.label), replyPendingIntent)                 .addRemoteInput(remoteInput)                 .build();

// Build the notification and add the action via WearableExtender Notification notification =         new NotificationCompat.Builder(mContext)                 .setSmallIcon(R.drawable.ic_message)                 .setContentTitle(getString(R.string.title))                 .setContentText(getString(R.string.content))                 .extend(new WearableExtender().addAction(action))                 .build();

Voz

private CharSequence getMessageText(Intent intent) {     Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);     if (remoteInput != null) {         return remoteInput.getCharSequence(EXTRA_VOICE_REPLY);     }     return null; }

Paginação

Paginação

NotificationCompat.Builder notificationBuilder =         new NotificationCompat.Builder(this)         .setSmallIcon(R.drawable.new_message)         .setContentTitle("Page 1")         .setContentText("Short message")         .setContentIntent(viewPendingIntent);

Paginação

BigTextStyle secondPageStyle = new NotificationCompat.BigTextStyle(); secondPageStyle.setBigContentTitle("Page 2")                .bigText("A lot of text...");

// Create second page notification Notification secondPageNotification =         new NotificationCompat.Builder(this)         .setStyle(secondPageStyle)         .build();

Paginação

// Extend the notification builder with the second page Notification notification = notificationBuilder         .extend(new NotificationCompat.WearableExtender()                 .addPage(secondPageNotification))         .build();

Paginação

// Extend the notification builder with the second page Notification notification = notificationBuilder         .extend(new NotificationCompat.WearableExtender()                 .addPage(secondPageNotification))         .build();

Pilha

Pilha

setGroup com mesmo ID

PilhaNotification notif = new NotificationCompat.Builder(mContext)          .setContentTitle("New mail from " + sender1)          .setContentText(subject1)          .setSmallIcon(R.drawable.new_mail)          .setGroup(GROUP_KEY_EMAILS)          .build();

… Notification notif2 = new NotificationCompat.Builder(mContext)          .setContentTitle("New mail from " + sender2)          .setContentText(subject2)          .setSmallIcon(R.drawable.new_mail)          .setGroup(GROUP_KEY_EMAILS)          .build();

PilhaNotification notif = new NotificationCompat.Builder(mContext)          .setContentTitle("New mail from " + sender1)          .setContentText(subject1)          .setSmallIcon(R.drawable.new_mail)          .setGroup(GROUP_KEY_EMAILS)          .build();

… Notification notif2 = new NotificationCompat.Builder(mContext)          .setContentTitle("New mail from " + sender2)          .setContentText(subject2)          .setSmallIcon(R.drawable.new_mail)          .setGroup(GROUP_KEY_EMAILS)          .build();

Wearable Apps

O que não tem• android.webkit

• android.print

• android.app.backup

• android.appwidget

• android.hardware.usb

Requisitos

• SDK tools versão 23.0.0 ou superior

• SDK Android 4.4W (API 20)

Custom notificationpublic void onCreate(Bundle bundle){     ...     setContentView(R.layout.notification_activity); }

<activity android:name="com.example.NotificationActivity"      android:exported="true"      android:allowEmbedded="true"      android:theme="@android:style/Theme.DeviceDefault.Light" />

Intent notificationIntent = new Intent(this, NotificationActivity.class); PendingIntent notificationPendingIntent = PendingIntent.getActivity(this, 0, notificationIntent,         PendingIntent.FLAG_UPDATE_CURRENT);

Layouts

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical">

    <TextView         android:id="@+id/text"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/hello_square" /> </LinearLayout>

Layouts

Layouts

compile 'com.google.android.support:wearable:+'

Layouts

<android.support.wearable.view.WatchViewStub     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/watch_view_stub"     android:layout_width="match_parent"     android:layout_height="match_parent"     app:rectLayout="@layout/rect_activity_wear"     app:roundLayout="@layout/round_activity_wear"> </android.support.wearable.view.WatchViewStub>

Layouts

<android.support.wearable.view.WatchViewStub     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/watch_view_stub"     android:layout_width="match_parent"     android:layout_height="match_parent"     app:rectLayout="@layout/rect_activity_wear"     app:roundLayout="@layout/round_activity_wear"> </android.support.wearable.view.WatchViewStub>

Layouts

@Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_wear); }

Layouts

@Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_wear);     WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {        @Override public void onLayoutInflated(WatchViewStub stub) {            // Now you can access your views            TextView tv = (TextView) stub.findViewById(R.id.text);            ...        }    });}

Layouts

WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {    @Override public void onLayoutInflated(WatchViewStub stub) {    // Now you can access your views     TextView tv = (TextView) stub.findViewById(R.id.text);    ... }});

Layouts

<android.support.wearable.view.BoxInsetLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:layout_height="match_parent"     android:layout_width=“match_parent> … </android.support.wearable.view.BoxInsetLayout>

Layouts

Layouts• android.support.wearable.view.BoxInsetLayout

• android.support.wearable.view.CardScrollView

• android.support.wearable.view.CardFrame

• android.support.wearable.view.WearableListView

• WearableListView.Adapter

Confirmação

Confirmation• DelayedConfirmationView

// Two seconds to cancel the actionmDelayedView.setTotalTimeMs(2000);// Start the timermDelayedView.start();

• DelayedConfirmationListener public void onTimerFinished(View view); // Usuário não cancelou, continuepublic void onTimerSelected(View view); // Usuário cancelou, abortar

Fechando

• Default: swipe da esquerda

• Pode ser desabilitado

• Long press

Fechando

<style name="AppTheme" parent="Theme.DeviceDefault">     <item name="android:windowSwipeToDismiss">false</item> </style>

Fechando

<FrameLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_height="match_parent"     android:layout_width="match_parent">

    <!-- resto do layout -->

    <android.support.wearable.view.DismissOverlayView         android:id="@+id/dismiss_overlay"         android:layout_height="match_parent"         android:layout_width="match_parent"/> <FrameLayout>

Fechando

mDismissOverlay = (DismissOverlayView) findViewById(R.id.dismiss_overlay);mDismissOverlay.setIntroText(R.string.long_press_intro);mDismissOverlay.showIntroIfNecessary();

// Configure a gesture detectormDetector = new GestureDetector(this, new SimpleOnGestureListener() { public void onLongPress(MotionEvent ev) {    mDismissOverlay.show(); }});

O que mais?

• Transferência de dados entre wearable e device:

• Wearable Data Layer

• Watch Face:

• CanvasWatchFaceService, CanvasWatchFaceService.Engine…

Próximos passos?

• http://developer.android.com/wear/

WatchFace

• https://github.com/ustwo/Clockwise

• http://wear.ustwo.com

Obrigado

Obrigado

+DouglasDrumond

@douglasdrumond

www.cafelinear.com

[email protected]

+GdgCampinasOrg

@gdgcampinas

www.gdg-campinas.org