Ok, Google. O que é
+Nelson Glauber
@nglauber
nglauber.blogspot.com
Android Wear?
Nelson Glauber
Engenheiro de Sistemas do C.E.S.A.R.
Professor da Unibratec
Google Developer Expert
@nglauber
+NelsonGlauber
www.nglauber.com.br
UI baseada em um
stream de cards
Clima Trânsito Lembretes Vôos
Batimentos
Cardíacos
Atender/rejeitar
ligações
Busca por
voz
Navegação Música
Navegação
sem mobile
Música sem
mobile
Lembretes
Voice
memos
UX para wear
NÃO é UX para
um (mini)
smartphone
http://minuum.com/typing-on-android-wear/
Lançadas
automaticamente Glanceable
Princípios de UI
Micro-interações
Princípios de UI
Não interrompa o usuário… Crie grandes áreas de toque
Não seja um
“shoulder tapper"
Desenvolvendo para Android Wear
Android Wear
Device
O que precisamos?
Android Studio
Escolha seu modelo
LG
G Watch R
Motorola
Moto 360
LG Watch 

Urban Silver
Escolha seu modelo
Asus
ZenWatch
LG G Watch
Samsung
Gear Live
Sony
SmartWatch 3
Android Wear App
adb -d forward tcp:5601 tcp:5601
Depuração USB ou Bluetooth
adb forward tcp:4444 localabstract:/adb-hub; adb connect localhost:4444
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Notificações simples
Notificações com ação
Notificações com ação
✓ Se quiser a ação no mobile e no wearable,
use a classe NotificationCompat.Action.
✓ Se quiser a ação apenas no wearable use o
método addAction(Action) da classe
NotificationCompat.WearableExtender.
Notificações empilhadas
Notificações com páginas
Detalhes sobre notificações…
✓ Notificações disparadas pelo mobile, são
exibidas no mobile e no wear, mas são
executadas no mobile.

✓ Notificações disparadas pelo wear, só são
exibidas e executadas no wear.

✓ Você pode exibir notificações apenas no
mobile ou apenas no wear.
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Respondendo com voz
Comandos de voz
Call me a car/taxi Take a note
Set alarm for 8 AM Set timer for 10 minutes
Start/stop bike Start/stop a run
Start/stop workout Show heart rate
Show step count App Name :)
https://developer.android.com/training/wearables/apps/voice.html
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Aplicações Wear
MinhaApp
MobileAPK WearAPK
Dependências
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
wearApp project(':wear')
compile ‘com.android.support:appcompat-v7:23.+'
compile 'com.google.android.gms:play-services-wearable:+'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.support:wearable:1.3.0'
compile 'com.google.android.gms:play-services-wearable:+'
}
WatchViewStub
BoxInsetLayout
WearableListView
CircledImageView
GridViewPager
GridPagerAdapter
FragmentGridPagerAdapter
CardFragment
DelayedConfirmationView
ConfirmationActivity
DismissOverlayView
Componentes
android.support.wearable.view
Tela Quadrada ou Redonda?
Tela Quadrada ou Redonda?
BoxInsetLayout
<android.support.wearable.view.WatchViewStub
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/watch_view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rectLayout="@layout/rect_activity_main_wear"
app:roundLayout="@layout/round_activity_main_wear">
</android.support.wearable.view.WatchViewStub>
res/layout/rect_activity_main_wear.xml
res/layout/round_activity_main_wear.xml
WearableListView
WearableListView
WearableListView.ClickListener
WearableListView.Adapter
CircledImageView
GridViewPager
GridViewPager
GridPagerAdapter
FragmentGridPagerAdapter
CardFragment
CardFrame
2D Picker
Estrutura de um app wear
2D Picker
DelayedConfirmationView
<android.support.wearable.view.DelayedConfirmationView
android:id="@+id/delayed_confirm"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/cancel_circle"
app:circle_border_color="@color/lightblue"
app:circle_border_width="4dp"
app:circle_radius=“16dp"/>
DelayedConfirmationView mDelayedView =
(DelayedConfirmationView) findViewById(R.id.delayed_confirm);
mDelayedView.setListener(
new DelayedConfirmationView.DelayedConfirmationListener(){
@Override
public void onTimerFinished(View view) {
}
@Override
public void onTimerSelected(View view) {
}
});
ConfirmationActivity
Intent intent = new Intent(context, ConfirmationActivity.class);
intent.putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE,
ConfirmationActivity.SUCCESS_ANIMATION);
intent.putExtra(ConfirmationActivity.EXTRA_MESSAGE,
getString(R.string.msg_sent));
context.startActivity(intent);
My app always-on!!!
public class MainWearActivity extends WearableActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main_wear);

setAmbientEnabled();

...

}

@Override

public void onEnterAmbient(Bundle ambientDetails) {

super.onEnterAmbient(ambientDetails);

}



@Override

public void onExitAmbient() {

super.onExitAmbient();



@Override

public void onUpdateAmbient() {

super.onUpdateAmbient();

}

}
DismissOverlayView
<style name="AppTheme" parent="Theme.DeviceDefault">
<item name="android:windowSwipeToDismiss">false</item>
</style>
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Comunicação Mobile/Wear
MinhaApp
MobileAPK WearAPK
Google Play Services
GoogleApiClient googleApiClient =
new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.addConnectionCallbacks(cc)
.addOnConnectionFailedListener(cfl)
.build();
compile ‘com.google.android.gms:play-services-wearable:8.1.0’
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
Node API
Message API
Data API
Channel API
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(
new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult result) {
Node node = result.getNodes().get(0);
}
});
Wearable.NodeApi.addListener(
mGoogleApiClient, new NodeApi.NodeListener() {
@Override
public void onPeerConnected(Node node) {
}
@Override
public void onPeerDisconnected(Node node) {
}
});
Node API
Wearable.MessageApi.sendMessage(mGoogleApiClient,
node.getId(), "/mensagens", new byte[]{ 1, 2, 3 } );
Message API
Wearable.MessageApi.addListener(mGoogleApiClient,
new MessageApi.MessageListener() {
@Override
public void onMessageReceived(MessageEvent messageEvent) {
String remetente = messageEvent.getSourceNodeId();
String caminho = messageEvent.getPath();
byte[] dados = messageEvent.getData();
}
});
PutDataMapRequest putDataMapRequest =
PutDataMapRequest.create("/dados");
DataMap dataMap = putDataMapRequest.getDataMap();
dataMap.putInt("numero", 1);
dataMap.putString("nome", "Glauber");
Wearable.DataApi.putDataItem(
mGoogleApiClient,
putDataMapRequest.asPutDataRequest());
Data API
Wearable.DataApi.addListener(mGoogleApiClient,
new DataApi.DataListener() {
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent dataEvent : dataEvents){
if (dataEvent.getType() == DataEvent.TYPE_CHANGED){
DataMapItem dataMapItem =
DataMapItem.fromDataItem(dataEvent.getDataItem());
Uri uri = dataMapItem.getUri();
if (uri.getPath().equals("/dados")) {
DataMap dataMap = dataMapItem.getDataMap();
int numero = dataMap.getInt("numero");
String nome = dataMap.getString("nome");
}
}
}
}
});
WearableListenerService
extends Service
implements
NodeApi.NodeListener,
MessageApi.MessageListener,
DataApi.DataListener
Node API
Message API
Data API
<service android:name=“br.com.nglauber.nextlevelapps.MeuService”>
<intent-filter>
<action
android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
</intent-filter>
</service>
Channel API
Maps!!!
WatchFaces
Funcionar em telas redondas e quadradas
Pense no modo interativo e ambiente
Use preto e branco para telas
OLED em modo ambiente e
mantenha 95% dos pixels pretos
Acomode bem os
elementos do sistema
Adicione configurações ao
aplicativo do Android Wear
• Android Wear for iOS is
available for iPhone 5
and later.
• Watches that support
iOS include:
✓ ASUS ZenWatch 2
✓ Huawei Watch
✓ LG Watch Urbane
✓ Moto 360 (2nd Gen)
✓ Moto 360 for Women
✓ Moto 360 Sport.
Dúvidas?
http://developer.android.com/training/building-wearables.html
Nelson Glauber
Engenheiro de Sistemas do C.E.S.A.R.
Professor da Unibratec
Google Developer Expert
@nglauber
+NelsonGlauber
www.nglauber.com.br

Android Wear DevFest Sudeste 2015