SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
+Peter Friese 
@peterfriese 
#AndroidWear
REAL LIFE 
GET 
PHONE 
LOST IN 
PHONE
Design Principles
Design Principles 
• Launched automatically
Design Principles 
• Launched automatically 
• Glanceable
Design Principles 
• Launched automatically 
• Glanceable 
• Suggest and Demand
Design Principles 
• Launched automatically 
• Glanceable 
• Suggest and Demand 
• Zero or low interaction
Developing for 
Android Wear
Simple Notifications 
Look, ma - no work required!
Simple Notifications 
sendNotification() 
Intent viewIntent = new Intent(context, DummyActivity.class); 
PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.setContentIntent(viewPendingIntent) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Can we do better?
Enhanced Notifications 
BigPictureStyle
BigPictureStyle 
sendNotification() 
Intent viewIntent = new Intent(context, DummyActivity.class); 
PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.setStyle( 
new NotificationCompat.BigPictureStyle() 
.bigPicture(BitmapFactory.decodeResource(context.getResources(), 
R.drawable.sanfrancisco)) 
.setBigContentTitle("Flight AW123 is ready to board.") 
.setSummaryText("Please proceed to gate C 17 to board. Have a nice flight!")) 
.setContentIntent(viewPendingIntent) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Enhanced Notifications 
Pages
Pages 
sendNotification() 
ArrayList<Notification> pages = new ArrayList<Notification>(); 
pages.add(new NotificationCompat.Builder(context) 
.setContentTitle("Your seat") 
.setContentText("17A") 
.extend(new NotificationCompat.WearableExtender() 
.setBackground(BitmapFactory.decodeResource(context.getResources(), 
R.drawable.a380_seat))) 
.build());
Background Only Pages 
sendNotification() 
pages.add(new NotificationCompat.Builder(context) 
.extend(new NotificationCompat.WearableExtender() 
.setHintShowBackgroundOnly(true) 
.setBackground(BitmapFactory.decodeResource(context.getResources(), 
R.drawable.qrcode))) 
.build());
Adding Pages to Notifications 
sendNotification() 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.setContentIntent(viewPendingIntent) 
.extend(new NotificationCompat.WearableExtender() 
.addPages(pages)) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Enhanced Notifications 
Voice Input
Voice Input 
sendNotification() 
// Feedback intent 
Intent replyIntent = new Intent(context, DummyActivity.class); 
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0);
Voice Input 
sendNotification() 
// Feedback intent 
Intent replyIntent = new Intent(context, DummyActivity.class); 
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); 
String replyLabel = context.getResources().getString(R.string.reply_label); 
String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses);
Voice Input 
sendNotification() 
// Feedback intent 
Intent replyIntent = new Intent(context, DummyActivity.class); 
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); 
String replyLabel = context.getResources().getString(R.string.reply_label); 
String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses); 
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) 
.setLabel(replyLabel) 
.setChoices(cannedResponses) 
.build();
Voice Input 
sendNotification() 
// Feedback intent 
Intent replyIntent = new Intent(context, DummyActivity.class); 
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); 
String replyLabel = context.getResources().getString(R.string.reply_label); 
String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses); 
RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) 
.setLabel(replyLabel) 
.setChoices(cannedResponses) 
.build(); 
NotificationCompat.Action replyAction = 
new NotificationCompat.Action.Builder( 
R.drawable.chatbubble_working, 
replyLabel, 
replyPendingIntent) 
.addRemoteInput(remoteInput) 
.build();
Sending a Voice Input Notification 
sendNotification() 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.extend(new NotificationCompat.WearableExtender() 
.addPages(pages) 
.addAction(replyAction)) 
.build(); 
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
notificationManager.notify(notificationId++, notification);
Receiving Voice Input 
onCreate() 
Bundle remoteInputResults = RemoteInput.getResultsFromIntent(intent); 
if (remoteInputResults != null) { 
CharSequence utterance = remoteInputResults.getCharSequence(Constants.EXTRA_VOICE_REPLY); 
Toast.makeText(this, utterance, Toast.LENGTH_LONG).show(); 
}
Enhanced Notifications 
Actions
Actions 
sendNotification() 
Intent mapIntent = new Intent(Intent.ACTION_VIEW); 
Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); 
mapIntent.setData(geoUri); 
PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0);
Actions 
sendNotification() 
Intent mapIntent = new Intent(Intent.ACTION_VIEW); 
Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); 
mapIntent.setData(geoUri); 
PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0); 
NotificationCompat.Action walkingDirectionsAction = 
new NotificationCompat.Action.Builder( 
R.drawable.ic_full_directions_walking, "Directions to gate", mapPendingIntent) 
.build();
Actions 
sendNotification() 
Intent mapIntent = new Intent(Intent.ACTION_VIEW); 
Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); 
mapIntent.setData(geoUri); 
PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0); 
NotificationCompat.Action walkingDirectionsAction = 
new NotificationCompat.Action.Builder( 
R.drawable.ic_full_directions_walking, "Directions to gate", mapPendingIntent) 
.build(); 
! 
Notification notification = new NotificationCompat.Builder(context) 
.setSmallIcon(R.drawable.ic_launcher) 
.setSmallIcon(R.drawable.plane) 
.setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) 
.setContentText("Please proceed to gate C 17 to board. Have a nice flight!") 
.addAction(walkingDirectionsAction) 
.extend(new NotificationCompat.WearableExtender() 
.addPages(pages) 
.addAction(replyAction) 
.addAction(walkingDirectionsAction)) 
.build();
Wearable apps 
Launching 
Using app-provided 
voice actions 
Using the start 
menu
Launching 
AndroidManifest.xml 
<application 
android:icon="@drawable/greenlinelogo" 
android:label="@string/app_name" 
android:theme="@android:style/Theme.DeviceDefault" > 
<activity 
android:name="de.peterfriese.weartravel.MainActivity" 
android:label="@string/app_name_voice" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
</application>
Wearable Apps 
Custom Layouts
Layout - List 
activity_checkin.xml 
<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"> 
<FrameLayout 
android:id="@+id/frame_layout" 
android:layout_height="match_parent" 
android:layout_width="match_parent" 
app:layout_box="left|bottom|right"> 
<android.support.wearable.view.WearableListView 
android:id="@+id/checkin_list" 
android:layout_height="match_parent" 
android:layout_width="match_parent"> 
</android.support.wearable.view.WearableListView> 
</FrameLayout> 
</android.support.wearable.view.BoxInsetLayout>
Layout - Item 
checkin_listview_item.xml 
<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<android.support.wearable.view.CircledImageView 
android:id="@+id/image" 
android:alpha="0.5" 
android:layout_height="52dp" 
android:layout_marginLeft="16dp" 
android:layout_width="52dp" 
app:circle_border_color="#FFFFFFFF" 
app:circle_border_width="2dp" 
app:circle_color="#00000000" 
/> 
<TextView 
android:id="@+id/text" 
android:alpha="0.5" 
android:fontFamily="sans-serif-condensed-light" 
android:gravity="center_vertical" 
android:layout_height="52dp" 
android:layout_marginLeft="72dp" 
android:layout_marginRight="16dp"
<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
Layout - Item 
checkin_listview_item.xml 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<android.support.wearable.view.CircledImageView 
android:id="@+id/image" 
android:alpha="0.5" 
android:layout_height="52dp" 
android:layout_marginLeft="16dp" 
android:layout_width="52dp" 
app:circle_border_color="#FFFFFFFF" 
app:circle_border_width="2dp" 
app:circle_color="#00000000" 
/> 
<TextView 
android:id="@+id/text" 
android:alpha="0.5" 
android:fontFamily="sans-serif-condensed-light" 
android:gravity="center_vertical" 
android:layout_height="52dp" 
android:layout_marginLeft="72dp" 
android:layout_marginRight="16dp" 
android:layout_width="wrap_content" 
android:textColor="@color/white" 
android:textSize="14sp" 
/> 
</merge>
MyViewItem 
CheckInActivity.java 
private final class MyItemView extends FrameLayout implements WearableListView.Item { 
final CircledImageView image; 
final TextView text; 
private float mScale; 
public MyItemView(Context context) { 
super(context); 
View.inflate(context, R.layout.checkin_listview_item, this); 
image = (CircledImageView) findViewById(R.id.image); 
text = (TextView) findViewById(R.id.text); 
} 
@Override 
public float getProximityMinValue() { 
return mDefaultCircleRadius; 
} 
@Override 
public float getProximityMaxValue() { 
return mSelectedCircleRadius; 
}
private float mScale; 
public MyItemView(Context context) { 
MyViewItem 
super(context); 
View.inflate(context, R.layout.checkin_listview_item, this); 
image = (CircledImageView) findViewById(R.id.image); 
text = (TextView) findViewById(R.id.text); 
CheckInActivity.java 
} 
@Override 
public float getProximityMinValue() { 
return mDefaultCircleRadius; 
} 
@Override 
public float getProximityMaxValue() { 
return mSelectedCircleRadius; 
} 
@Override 
public float getCurrentProximityValue() { 
return mScale; 
} 
@Override 
public void setScalingAnimatorValue(float value) { 
mScale = value; 
image.setCircleRadius(mScale); 
image.setCircleRadiusPressed(mScale); 
} 
@Override
@Override 
public float getProximityMaxValue() { 
MyViewItem 
return mSelectedCircleRadius; 
} 
@Override 
public float getCurrentProximityValue() { 
CheckInActivity.java 
return mScale; 
} 
@Override 
public void setScalingAnimatorValue(float value) { 
mScale = value; 
image.setCircleRadius(mScale); 
image.setCircleRadiusPressed(mScale); 
} 
@Override 
public void onScaleUpStart() { 
image.setAlpha(1f); 
text.setAlpha(1f); 
} 
@Override 
public void onScaleDownStart() { 
image.setAlpha(0.5f); 
text.setAlpha(0.5f); 
} 
}
Adapter - Bind ViewHolder 
CheckInActivity.java 
public class MyListAdapter extends WearableListView.Adapter { 
@Override 
public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); 
} 
@Override 
public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { 
MyItemView myItemView = (MyItemView) viewHolder.itemView; 
TextView textView = (TextView) myItemView.findViewById(R.id.text); 
textView.setText(String.format("Seat %d", i)); 
Integer resourceId = R.drawable.ic_action_done; 
CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); 
imageView.setImageResource(resourceId); 
} 
@Override 
public int getItemCount() { 
return 17; 
}
Adapter - Bind ViewHolder 
public class MyListAdapter extends WearableListView.Adapter { 
CheckInActivity.java 
@Override 
public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); 
} 
@Override 
public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { 
MyItemView myItemView = (MyItemView) viewHolder.itemView; 
TextView textView = (TextView) myItemView.findViewById(R.id.text); 
textView.setText(String.format("Seat %d", i)); 
Integer resourceId = R.drawable.ic_action_done; 
CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); 
imageView.setImageResource(resourceId); 
} 
@Override 
public int getItemCount() { 
return 17; 
} 
}
Activity 
CheckInActivity.java 
public class CheckInActivity extends Activity implements WearableListView.ClickListener { 
private WearableListView mListView; 
private MyListAdapter mAdapter; 
private float mDefaultCircleRadius; 
private float mSelectedCircleRadius; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_checkin); 
mDefaultCircleRadius = 
getResources().getDimension(R.dimen.default_settings_circle_radius); 
mSelectedCircleRadius = 
getResources().getDimension(R.dimen.selected_settings_circle_radius); 
mAdapter = new MyListAdapter(); 
mListView = (WearableListView) findViewById(R.id.checkin_list); 
mListView.setAdapter(mAdapter); 
mListView.setClickListener(CheckInActivity.this); 
}
private float mDefaultCircleRadius; 
private float mSelectedCircleRadius; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
Activity 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_checkin); 
mDefaultCircleRadius = 
CheckInActivity.java 
getResources().getDimension(R.dimen.default_settings_circle_radius); 
mSelectedCircleRadius = 
getResources().getDimension(R.dimen.selected_settings_circle_radius); 
mAdapter = new MyListAdapter(); 
mListView = (WearableListView) findViewById(R.id.checkin_list); 
mListView.setAdapter(mAdapter); 
mListView.setClickListener(CheckInActivity.this); 
} 
@Override 
public void onClick(WearableListView.ViewHolder viewHolder) { 
Toast.makeText(this, String.format("You selected item #%s”, 
viewHolder.getPosition()), Toast.LENGTH_SHORT).show(); 
} 
@Override 
public void onTopEmptyRegionClick() { 
Toast.makeText(this, "You tapped into the empty area above the list”, 
Toast.LENGTH_SHORT).show(); 
}
Data Layer 
Performing a Check-In on Your Watch
Transferring Assets 
sendDataToWearable() 
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); 
Asset asset = Asset.createFromBytes(byteStream.toByteArray()); 
PutDataMapRequest dataMap = 
PutDataMapRequest.create(Constants.FLIGHT_PATH + "/" + Uri.encode("SFO")); 
dataMap.getDataMap().putString(Constants.EXTRA_FLIGHTNUMBER, "AC123"); 
dataMap.getDataMap().putString(Constants.EXTRA_GATE, "C 17"); 
dataMap.getDataMap().putAsset(Constants.EXTRA_DESTINATION, imageAssetDestination); 
PutDataRequest request = dataMap.asPutDataRequest(); 
// Send the data over 
DataApi.DataItemResult result = 
Wearable.DataApi.putDataItem(googleApiClient, request).await();
Sending Messages 
sendDataToWearable() 
// If successful store the data path 
// Construct an array of all successfully sent data paths 
DataMap itemPathMap = new DataMap(); 
itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, 
result.getDataItem().getUri().toString()); 
// Convert to bytes to be send with the message 
byte[] dataMapBytes = itemPathMap.toByteArray();
Sending Messages 
sendDataToWearable() 
// If successful store the data path 
// Construct an array of all successfully sent data paths 
DataMap itemPathMap = new DataMap(); 
itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, 
result.getDataItem().getUri().toString()); 
// Convert to bytes to be send with the message 
byte[] dataMapBytes = itemPathMap.toByteArray(); 
Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); 
while (itr.hasNext()) { 
// Notify all nodes to "start", providing the data paths of all 
// transmitted tourist attractions. What "start" does will be up 
// to the wearable. 
! 
}
Sending Messages 
sendDataToWearable() 
// If successful store the data path 
// Construct an array of all successfully sent data paths 
DataMap itemPathMap = new DataMap(); 
itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, 
result.getDataItem().getUri().toString()); 
// Convert to bytes to be send with the message 
byte[] dataMapBytes = itemPathMap.toByteArray(); 
Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); 
while (itr.hasNext()) { 
// Notify all nodes to "start", providing the data paths of all 
// transmitted tourist attractions. What "start" does will be up 
// to the wearable. 
Wearable.MessageApi.sendMessage(googleApiClient, itr.next(), 
Constants.START_PATH, dataMapBytes); 
}
Receiving Data 
AndroidManifest.xml (wearable) 
<service 
android:name="de.peterfriese.weartravel.ListenerService"> 
<intent-filter> 
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> 
</intent-filter> 
</service>
Receiving Data 
ListenerService.java 
public class ListenerService extends WearableListenerService { 
@Override 
public void onDataChanged(DataEventBuffer dataEvents) { 
Log.d(TAG, "onDataChanged: " + dataEvents); 
final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents); 
for (DataEvent event : events) { 
if (event.getType() == DataEvent.TYPE_CHANGED) { 
// Not doing anything here but logging 
Uri uri = event.getDataItem().getUri(); 
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); 
String title = dataMapItem.getDataMap().getString("extra_flightnumber"); 
Log.v(TAG, "Data changed: " + uri + ", " + title); 
} 
} 
} 
@Override 
public void onMessageReceived(MessageEvent messageEvent) { 
Log.v(TAG, "onMessageReceived: " + messageEvent);
if (event.getType() == DataEvent.TYPE_CHANGED) { 
// Not doing anything here but logging 
Uri uri = event.getDataItem().getUri(); 
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); 
String title = dataMapItem.getDataMap().getString("extra_flightnumber"); 
Log.v(TAG, "Data changed: " + uri + ", " + title); 
Receiving Data 
} 
ListenerService.} 
java 
} 
@Override 
public void onMessageReceived(MessageEvent messageEvent) { 
Log.v(TAG, "onMessageReceived: " + messageEvent); 
if (Constants.START_PATH.equals(messageEvent.getPath())) { 
DataMap dataMap = DataMap.fromByteArray(messageEvent.getData()); 
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 
.addApi(Wearable.API) 
.build(); 
ConnectionResult connectionResult = googleApiClient.blockingConnect( 
Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); 
if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { 
Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); 
return; 
} 
String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS);
ConnectionResult connectionResult = googleApiClient.blockingConnect( 
Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); 
Receiving Data 
if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { 
Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); 
return; 
} 
String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS); 
Uri uri = Uri.parse(flightUri); 
DataApi.DataItemResult dataItemResult = 
ListenerService.java 
Wearable.DataApi.getDataItem(googleApiClient, uri).await(); 
DataItem dataItem = dataItemResult.getDataItem(); 
if (dataItem != null) { 
DataMap flightDataMap = 
DataMapItem.fromDataItem(dataItem).getDataMap(); 
String flightNumber = flightDataMap.getString(Constants.EXTRA_FLIGHTNUMBER); 
String gate = flightDataMap.getString(Constants.EXTRA_GATE); 
Bitmap destinationBitmap = Utilities.loadBitmapFromAsset( 
googleApiClient, 
flightDataMap.getAsset(Constants.EXTRA_DESTINATION)); 
sendNotification(flightNumber, gate, destinationBitmap); 
} 
googleApiClient.disconnect(); 
} 
}
Demo
Thank you! 
+PeterFriese 
@ 
#AndroidWear
Q & A 
+PeterFriese 
@ 
#AndroidWear
Introduction to Android Wear - Peter Friese

Weitere ähnliche Inhalte

Was ist angesagt?

Quest 1 define a class batsman with the following specifications
Quest  1 define a class batsman with the following specificationsQuest  1 define a class batsman with the following specifications
Quest 1 define a class batsman with the following specificationsrajkumari873
 
Practical Class 12th (c++programs+sql queries and output)
Practical Class 12th (c++programs+sql queries and output) Practical Class 12th (c++programs+sql queries and output)
Practical Class 12th (c++programs+sql queries and output) Aman Deep
 
12th CBSE Practical File
12th CBSE Practical File12th CBSE Practical File
12th CBSE Practical FileAshwin Francis
 
Imugi: Compiler made with Python
Imugi: Compiler made with PythonImugi: Compiler made with Python
Imugi: Compiler made with PythonHan Lee
 
The redux saga begins
The redux saga beginsThe redux saga begins
The redux saga beginsDaniel Franz
 
Programming with GUTs
Programming with GUTsProgramming with GUTs
Programming with GUTsKevlin Henney
 
2014 computer science_question_paper
2014 computer science_question_paper2014 computer science_question_paper
2014 computer science_question_papervandna123
 
What We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingWhat We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingKevlin Henney
 
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...Kevlin Henney
 
The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202Mahmoud Samir Fayed
 
The evolution of redux action creators
The evolution of redux action creatorsThe evolution of redux action creators
The evolution of redux action creatorsGeorge Bukhanov
 
project report in C++ programming and SQL
project report in C++ programming and SQLproject report in C++ programming and SQL
project report in C++ programming and SQLvikram mahendra
 
A Mock to far - GeeCon
A Mock to far -  GeeConA Mock to far -  GeeCon
A Mock to far - GeeConMichał Lipski
 

Was ist angesagt? (20)

Quest 1 define a class batsman with the following specifications
Quest  1 define a class batsman with the following specificationsQuest  1 define a class batsman with the following specifications
Quest 1 define a class batsman with the following specifications
 
Practical Class 12th (c++programs+sql queries and output)
Practical Class 12th (c++programs+sql queries and output) Practical Class 12th (c++programs+sql queries and output)
Practical Class 12th (c++programs+sql queries and output)
 
Railwaynew
RailwaynewRailwaynew
Railwaynew
 
12th CBSE Practical File
12th CBSE Practical File12th CBSE Practical File
12th CBSE Practical File
 
Add invoice
Add invoiceAdd invoice
Add invoice
 
Programs
ProgramsPrograms
Programs
 
Imugi: Compiler made with Python
Imugi: Compiler made with PythonImugi: Compiler made with Python
Imugi: Compiler made with Python
 
The redux saga begins
The redux saga beginsThe redux saga begins
The redux saga begins
 
Functional C++
Functional C++Functional C++
Functional C++
 
Programming with GUTs
Programming with GUTsProgramming with GUTs
Programming with GUTs
 
2014 computer science_question_paper
2014 computer science_question_paper2014 computer science_question_paper
2014 computer science_question_paper
 
What We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingWhat We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit Testing
 
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
 
Struct examples
Struct examplesStruct examples
Struct examples
 
Mock geecon2
Mock geecon2Mock geecon2
Mock geecon2
 
The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202The Ring programming language version 1.8 book - Part 65 of 202
The Ring programming language version 1.8 book - Part 65 of 202
 
Cpp c++ 1
Cpp c++ 1Cpp c++ 1
Cpp c++ 1
 
The evolution of redux action creators
The evolution of redux action creatorsThe evolution of redux action creators
The evolution of redux action creators
 
project report in C++ programming and SQL
project report in C++ programming and SQLproject report in C++ programming and SQL
project report in C++ programming and SQL
 
A Mock to far - GeeCon
A Mock to far -  GeeConA Mock to far -  GeeCon
A Mock to far - GeeCon
 

Andere mochten auch

API Management - a hands on workshop - Paul Fremantle
API Management - a hands on workshop - Paul FremantleAPI Management - a hands on workshop - Paul Fremantle
API Management - a hands on workshop - Paul FremantleJAXLondon2014
 
Apache Stratos: the PaaS from Apache - Lakmal Warusawithana
Apache Stratos: the PaaS from Apache - Lakmal WarusawithanaApache Stratos: the PaaS from Apache - Lakmal Warusawithana
Apache Stratos: the PaaS from Apache - Lakmal WarusawithanaJAXLondon2014
 
Testing within an Agile Environment - Beyza Sakir and Chris Gollop
Testing within an Agile Environment - Beyza Sakir and Chris GollopTesting within an Agile Environment - Beyza Sakir and Chris Gollop
Testing within an Agile Environment - Beyza Sakir and Chris GollopJAXLondon2014
 
Agile considered Harmful - Nigel Runnels-Moss
Agile considered Harmful - Nigel Runnels-MossAgile considered Harmful - Nigel Runnels-Moss
Agile considered Harmful - Nigel Runnels-MossJAXLondon2014
 
Spocktacular Testing - Russel Winder
Spocktacular Testing - Russel WinderSpocktacular Testing - Russel Winder
Spocktacular Testing - Russel WinderJAXLondon2014
 
Hands on Data Grids - Stephen Milidge
Hands on Data Grids - Stephen MilidgeHands on Data Grids - Stephen Milidge
Hands on Data Grids - Stephen MilidgeJAXLondon2014
 
Why do we create Software - Roman Pichler
Why do we create Software - Roman PichlerWhy do we create Software - Roman Pichler
Why do we create Software - Roman PichlerJAXLondon2014
 
Performance and Predictability - Richard Warburton
Performance and Predictability - Richard WarburtonPerformance and Predictability - Richard Warburton
Performance and Predictability - Richard WarburtonJAXLondon2014
 
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...JAXLondon2014
 
The Economies of Scaling Software - Josh Long and Abdelmonaim Remani
The Economies of Scaling Software - Josh Long and Abdelmonaim RemaniThe Economies of Scaling Software - Josh Long and Abdelmonaim Remani
The Economies of Scaling Software - Josh Long and Abdelmonaim RemaniJAXLondon2014
 
How do you know your Solution will make an Impact? - Björn Brynjar Jonsson
How do you know your Solution will make an Impact? - Björn Brynjar JonssonHow do you know your Solution will make an Impact? - Björn Brynjar Jonsson
How do you know your Solution will make an Impact? - Björn Brynjar JonssonJAXLondon2014
 
The Full Stack Java Developer - Josh Long
The Full Stack Java Developer - Josh LongThe Full Stack Java Developer - Josh Long
The Full Stack Java Developer - Josh LongJAXLondon2014
 
Building effective Java applications for the Cloud: The DHARMA principles - D...
Building effective Java applications for the Cloud: The DHARMA principles - D...Building effective Java applications for the Cloud: The DHARMA principles - D...
Building effective Java applications for the Cloud: The DHARMA principles - D...JAXLondon2014
 
Building Microservices with Scala, functional domain models and Spring Boot -...
Building Microservices with Scala, functional domain models and Spring Boot -...Building Microservices with Scala, functional domain models and Spring Boot -...
Building Microservices with Scala, functional domain models and Spring Boot -...JAXLondon2014
 
Crafted Design - Sandro Mancuso
Crafted Design - Sandro MancusoCrafted Design - Sandro Mancuso
Crafted Design - Sandro MancusoJAXLondon2014
 
Open Source workflow automation with BPMN 2.0, Java and camunda - Bernd Rücker
Open Source workflow automation with BPMN 2.0, Java and camunda - Bernd RückerOpen Source workflow automation with BPMN 2.0, Java and camunda - Bernd Rücker
Open Source workflow automation with BPMN 2.0, Java and camunda - Bernd RückerJAXLondon2014
 
Enterprise Integration Agility - Jeremy Deane
Enterprise Integration Agility - Jeremy DeaneEnterprise Integration Agility - Jeremy Deane
Enterprise Integration Agility - Jeremy DeaneJAXLondon2014
 
Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...
Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...
Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...JAXLondon2014
 

Andere mochten auch (18)

API Management - a hands on workshop - Paul Fremantle
API Management - a hands on workshop - Paul FremantleAPI Management - a hands on workshop - Paul Fremantle
API Management - a hands on workshop - Paul Fremantle
 
Apache Stratos: the PaaS from Apache - Lakmal Warusawithana
Apache Stratos: the PaaS from Apache - Lakmal WarusawithanaApache Stratos: the PaaS from Apache - Lakmal Warusawithana
Apache Stratos: the PaaS from Apache - Lakmal Warusawithana
 
Testing within an Agile Environment - Beyza Sakir and Chris Gollop
Testing within an Agile Environment - Beyza Sakir and Chris GollopTesting within an Agile Environment - Beyza Sakir and Chris Gollop
Testing within an Agile Environment - Beyza Sakir and Chris Gollop
 
Agile considered Harmful - Nigel Runnels-Moss
Agile considered Harmful - Nigel Runnels-MossAgile considered Harmful - Nigel Runnels-Moss
Agile considered Harmful - Nigel Runnels-Moss
 
Spocktacular Testing - Russel Winder
Spocktacular Testing - Russel WinderSpocktacular Testing - Russel Winder
Spocktacular Testing - Russel Winder
 
Hands on Data Grids - Stephen Milidge
Hands on Data Grids - Stephen MilidgeHands on Data Grids - Stephen Milidge
Hands on Data Grids - Stephen Milidge
 
Why do we create Software - Roman Pichler
Why do we create Software - Roman PichlerWhy do we create Software - Roman Pichler
Why do we create Software - Roman Pichler
 
Performance and Predictability - Richard Warburton
Performance and Predictability - Richard WarburtonPerformance and Predictability - Richard Warburton
Performance and Predictability - Richard Warburton
 
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...
 
The Economies of Scaling Software - Josh Long and Abdelmonaim Remani
The Economies of Scaling Software - Josh Long and Abdelmonaim RemaniThe Economies of Scaling Software - Josh Long and Abdelmonaim Remani
The Economies of Scaling Software - Josh Long and Abdelmonaim Remani
 
How do you know your Solution will make an Impact? - Björn Brynjar Jonsson
How do you know your Solution will make an Impact? - Björn Brynjar JonssonHow do you know your Solution will make an Impact? - Björn Brynjar Jonsson
How do you know your Solution will make an Impact? - Björn Brynjar Jonsson
 
The Full Stack Java Developer - Josh Long
The Full Stack Java Developer - Josh LongThe Full Stack Java Developer - Josh Long
The Full Stack Java Developer - Josh Long
 
Building effective Java applications for the Cloud: The DHARMA principles - D...
Building effective Java applications for the Cloud: The DHARMA principles - D...Building effective Java applications for the Cloud: The DHARMA principles - D...
Building effective Java applications for the Cloud: The DHARMA principles - D...
 
Building Microservices with Scala, functional domain models and Spring Boot -...
Building Microservices with Scala, functional domain models and Spring Boot -...Building Microservices with Scala, functional domain models and Spring Boot -...
Building Microservices with Scala, functional domain models and Spring Boot -...
 
Crafted Design - Sandro Mancuso
Crafted Design - Sandro MancusoCrafted Design - Sandro Mancuso
Crafted Design - Sandro Mancuso
 
Open Source workflow automation with BPMN 2.0, Java and camunda - Bernd Rücker
Open Source workflow automation with BPMN 2.0, Java and camunda - Bernd RückerOpen Source workflow automation with BPMN 2.0, Java and camunda - Bernd Rücker
Open Source workflow automation with BPMN 2.0, Java and camunda - Bernd Rücker
 
Enterprise Integration Agility - Jeremy Deane
Enterprise Integration Agility - Jeremy DeaneEnterprise Integration Agility - Jeremy Deane
Enterprise Integration Agility - Jeremy Deane
 
Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...
Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...
Detecting Events on the Web in Real Time with Java, Kafka and ZooKeeper - Jam...
 

Ähnlich wie Introduction to Android Wear - Peter Friese

Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android WearPeter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android WearPeter Friese
 
Developing for android wear
Developing for android wearDeveloping for android wear
Developing for android wearThomas Oldervoll
 
Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Alfredo Morresi
 
Androidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてAndroidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてmoai kids
 
Android Location-based應用開發分享
Android Location-based應用開發分享Android Location-based應用開發分享
Android Location-based應用開發分享koji lin
 
Android Wear – IO Extended
Android Wear – IO ExtendedAndroid Wear – IO Extended
Android Wear – IO ExtendedDouglas Drumond
 
IPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curseIPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curseYonatan Levin
 
Ipc: aidl sexy, not a curse
Ipc: aidl sexy, not a curseIpc: aidl sexy, not a curse
Ipc: aidl sexy, not a curseYonatan Levin
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...mharkus
 
Session #8 adding magic to your app
Session #8  adding magic to your appSession #8  adding magic to your app
Session #8 adding magic to your appVitali Pekelis
 
Advancing the UI — Part 1: Look, Motion, and Gestures
Advancing the UI — Part 1: Look, Motion, and GesturesAdvancing the UI — Part 1: Look, Motion, and Gestures
Advancing the UI — Part 1: Look, Motion, and GesturesSamsung Developers
 
Writing Mirror API and Native Apps for Google Glass
Writing Mirror API and Native Apps for Google GlassWriting Mirror API and Native Apps for Google Glass
Writing Mirror API and Native Apps for Google GlassJean-Luc David
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeLaurence Svekis ✔
 

Ähnlich wie Introduction to Android Wear - Peter Friese (20)

Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Developing for android wear
Developing for android wearDeveloping for android wear
Developing for android wear
 
Android wear (coding)
Android wear (coding)Android wear (coding)
Android wear (coding)
 
Day 5
Day 5Day 5
Day 5
 
Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)Slightly Advanced Android Wear ;)
Slightly Advanced Android Wear ;)
 
Android Wear Development
Android Wear DevelopmentAndroid Wear Development
Android Wear Development
 
Androidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてAndroidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能について
 
Android For All The Things
Android For All The ThingsAndroid For All The Things
Android For All The Things
 
Practical
PracticalPractical
Practical
 
Android Location-based應用開發分享
Android Location-based應用開發分享Android Location-based應用開發分享
Android Location-based應用開發分享
 
Android Wear – IO Extended
Android Wear – IO ExtendedAndroid Wear – IO Extended
Android Wear – IO Extended
 
IPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curseIPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curse
 
Ipc: aidl sexy, not a curse
Ipc: aidl sexy, not a curseIpc: aidl sexy, not a curse
Ipc: aidl sexy, not a curse
 
Android wearpp
Android wearppAndroid wearpp
Android wearpp
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
 
Session #8 adding magic to your app
Session #8  adding magic to your appSession #8  adding magic to your app
Session #8 adding magic to your app
 
Advancing the UI — Part 1: Look, Motion, and Gestures
Advancing the UI — Part 1: Look, Motion, and GesturesAdvancing the UI — Part 1: Look, Motion, and Gestures
Advancing the UI — Part 1: Look, Motion, and Gestures
 
Writing Mirror API and Native Apps for Google Glass
Writing Mirror API and Native Apps for Google GlassWriting Mirror API and Native Apps for Google Glass
Writing Mirror API and Native Apps for Google Glass
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 

Mehr von JAXLondon2014

GridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
GridGain 6.0: Open Source In-Memory Computing Platform - Nikita IvanovGridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
GridGain 6.0: Open Source In-Memory Computing Platform - Nikita IvanovJAXLondon2014
 
Performance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
Performance Metrics for your Delivery Pipeline - Wolfgang GottesheimPerformance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
Performance Metrics for your Delivery Pipeline - Wolfgang GottesheimJAXLondon2014
 
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...JAXLondon2014
 
Conditional Logging Considered Harmful - Sean Reilly
Conditional Logging Considered Harmful - Sean ReillyConditional Logging Considered Harmful - Sean Reilly
Conditional Logging Considered Harmful - Sean ReillyJAXLondon2014
 
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim RemaniFinding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim RemaniJAXLondon2014
 
'Bootiful' Code with Spring Boot - Josh Long
'Bootiful' Code with Spring Boot - Josh Long'Bootiful' Code with Spring Boot - Josh Long
'Bootiful' Code with Spring Boot - Josh LongJAXLondon2014
 
Dataflow, the Forgotten Way - Russel Winder
Dataflow, the Forgotten Way - Russel WinderDataflow, the Forgotten Way - Russel Winder
Dataflow, the Forgotten Way - Russel WinderJAXLondon2014
 
Habits of Highly Effective Technical Teams - Martijn Verburg
Habits of Highly Effective Technical Teams - Martijn VerburgHabits of Highly Effective Technical Teams - Martijn Verburg
Habits of Highly Effective Technical Teams - Martijn VerburgJAXLondon2014
 
The Lazy Developer's Guide to Cloud Foundry - Holly Cummins
The Lazy Developer's Guide to Cloud Foundry - Holly CumminsThe Lazy Developer's Guide to Cloud Foundry - Holly Cummins
The Lazy Developer's Guide to Cloud Foundry - Holly CumminsJAXLondon2014
 
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...JAXLondon2014
 
Squeezing Performance of out of In-Memory Data Grids - Fuad Malikov
Squeezing Performance of out of In-Memory Data Grids - Fuad MalikovSqueezing Performance of out of In-Memory Data Grids - Fuad Malikov
Squeezing Performance of out of In-Memory Data Grids - Fuad MalikovJAXLondon2014
 
Server Side JavaScript on the Java Platform - David Delabassee
Server Side JavaScript on the Java Platform - David DelabasseeServer Side JavaScript on the Java Platform - David Delabassee
Server Side JavaScript on the Java Platform - David DelabasseeJAXLondon2014
 
Reflection Madness - Dr. Heinz Kabutz
Reflection Madness - Dr. Heinz KabutzReflection Madness - Dr. Heinz Kabutz
Reflection Madness - Dr. Heinz KabutzJAXLondon2014
 
Rapid Web Application Development with MongoDB and the JVM - Trisha Gee
Rapid Web Application Development with MongoDB and the JVM - Trisha GeeRapid Web Application Development with MongoDB and the JVM - Trisha Gee
Rapid Web Application Development with MongoDB and the JVM - Trisha GeeJAXLondon2014
 
Personal Retrospectives - Johannes Thönes
Personal Retrospectives - Johannes ThönesPersonal Retrospectives - Johannes Thönes
Personal Retrospectives - Johannes ThönesJAXLondon2014
 
Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...
Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...
Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...JAXLondon2014
 
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterLambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterJAXLondon2014
 
Introducing Language-Oriented Business Applications - Markus Voelter
Introducing Language-Oriented Business Applications - Markus VoelterIntroducing Language-Oriented Business Applications - Markus Voelter
Introducing Language-Oriented Business Applications - Markus VoelterJAXLondon2014
 
Hands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike CroftHands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike CroftJAXLondon2014
 

Mehr von JAXLondon2014 (19)

GridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
GridGain 6.0: Open Source In-Memory Computing Platform - Nikita IvanovGridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
GridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
 
Performance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
Performance Metrics for your Delivery Pipeline - Wolfgang GottesheimPerformance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
Performance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
 
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
 
Conditional Logging Considered Harmful - Sean Reilly
Conditional Logging Considered Harmful - Sean ReillyConditional Logging Considered Harmful - Sean Reilly
Conditional Logging Considered Harmful - Sean Reilly
 
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim RemaniFinding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
 
'Bootiful' Code with Spring Boot - Josh Long
'Bootiful' Code with Spring Boot - Josh Long'Bootiful' Code with Spring Boot - Josh Long
'Bootiful' Code with Spring Boot - Josh Long
 
Dataflow, the Forgotten Way - Russel Winder
Dataflow, the Forgotten Way - Russel WinderDataflow, the Forgotten Way - Russel Winder
Dataflow, the Forgotten Way - Russel Winder
 
Habits of Highly Effective Technical Teams - Martijn Verburg
Habits of Highly Effective Technical Teams - Martijn VerburgHabits of Highly Effective Technical Teams - Martijn Verburg
Habits of Highly Effective Technical Teams - Martijn Verburg
 
The Lazy Developer's Guide to Cloud Foundry - Holly Cummins
The Lazy Developer's Guide to Cloud Foundry - Holly CumminsThe Lazy Developer's Guide to Cloud Foundry - Holly Cummins
The Lazy Developer's Guide to Cloud Foundry - Holly Cummins
 
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
 
Squeezing Performance of out of In-Memory Data Grids - Fuad Malikov
Squeezing Performance of out of In-Memory Data Grids - Fuad MalikovSqueezing Performance of out of In-Memory Data Grids - Fuad Malikov
Squeezing Performance of out of In-Memory Data Grids - Fuad Malikov
 
Server Side JavaScript on the Java Platform - David Delabassee
Server Side JavaScript on the Java Platform - David DelabasseeServer Side JavaScript on the Java Platform - David Delabassee
Server Side JavaScript on the Java Platform - David Delabassee
 
Reflection Madness - Dr. Heinz Kabutz
Reflection Madness - Dr. Heinz KabutzReflection Madness - Dr. Heinz Kabutz
Reflection Madness - Dr. Heinz Kabutz
 
Rapid Web Application Development with MongoDB and the JVM - Trisha Gee
Rapid Web Application Development with MongoDB and the JVM - Trisha GeeRapid Web Application Development with MongoDB and the JVM - Trisha Gee
Rapid Web Application Development with MongoDB and the JVM - Trisha Gee
 
Personal Retrospectives - Johannes Thönes
Personal Retrospectives - Johannes ThönesPersonal Retrospectives - Johannes Thönes
Personal Retrospectives - Johannes Thönes
 
Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...
Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...
Moving to a DevOps mode - easy, hard or just plain terrifying? - Daniel Bryan...
 
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon RitterLambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
 
Introducing Language-Oriented Business Applications - Markus Voelter
Introducing Language-Oriented Business Applications - Markus VoelterIntroducing Language-Oriented Business Applications - Markus Voelter
Introducing Language-Oriented Business Applications - Markus Voelter
 
Hands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike CroftHands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike Croft
 

Kürzlich hochgeladen

SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, YardstickSaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, Yardsticksaastr
 
Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510Vipesco
 
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779Delhi Call girls
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaKayode Fayemi
 
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024eCommerce Institute
 
Report Writing Webinar Training
Report Writing Webinar TrainingReport Writing Webinar Training
Report Writing Webinar TrainingKylaCullinane
 
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara ServicesVVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara ServicesPooja Nehwal
 
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdfThe workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdfSenaatti-kiinteistöt
 
Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Chameera Dedduwage
 
ANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docxANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docxNikitaBankoti2
 
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort ServiceDelhi Call girls
 
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...Kayode Fayemi
 
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxChiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxraffaeleoman
 
George Lever - eCommerce Day Chile 2024
George Lever -  eCommerce Day Chile 2024George Lever -  eCommerce Day Chile 2024
George Lever - eCommerce Day Chile 2024eCommerce Institute
 
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...Sheetaleventcompany
 
Microsoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AIMicrosoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AITatiana Gurgel
 
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptxMohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptxmohammadalnahdi22
 
Air breathing and respiratory adaptations in diver animals
Air breathing and respiratory adaptations in diver animalsAir breathing and respiratory adaptations in diver animals
Air breathing and respiratory adaptations in diver animalsaqsarehman5055
 
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...Hasting Chen
 
Call Girl Number in Khar Mumbai📲 9892124323 💞 Full Night Enjoy
Call Girl Number in Khar Mumbai📲 9892124323 💞 Full Night EnjoyCall Girl Number in Khar Mumbai📲 9892124323 💞 Full Night Enjoy
Call Girl Number in Khar Mumbai📲 9892124323 💞 Full Night EnjoyPooja Nehwal
 

Kürzlich hochgeladen (20)

SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, YardstickSaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
 
Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510
 
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New Nigeria
 
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
 
Report Writing Webinar Training
Report Writing Webinar TrainingReport Writing Webinar Training
Report Writing Webinar Training
 
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara ServicesVVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
 
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdfThe workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
The workplace ecosystem of the future 24.4.2024 Fabritius_share ii.pdf
 
Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)
 
ANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docxANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docx
 
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 97 Noida Escorts >༒8448380779 Escort Service
 
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
 
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptxChiulli_Aurora_Oman_Raffaele_Beowulf.pptx
Chiulli_Aurora_Oman_Raffaele_Beowulf.pptx
 
George Lever - eCommerce Day Chile 2024
George Lever -  eCommerce Day Chile 2024George Lever -  eCommerce Day Chile 2024
George Lever - eCommerce Day Chile 2024
 
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
No Advance 8868886958 Chandigarh Call Girls , Indian Call Girls For Full Nigh...
 
Microsoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AIMicrosoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AI
 
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptxMohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptx
 
Air breathing and respiratory adaptations in diver animals
Air breathing and respiratory adaptations in diver animalsAir breathing and respiratory adaptations in diver animals
Air breathing and respiratory adaptations in diver animals
 
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
 
Call Girl Number in Khar Mumbai📲 9892124323 💞 Full Night Enjoy
Call Girl Number in Khar Mumbai📲 9892124323 💞 Full Night EnjoyCall Girl Number in Khar Mumbai📲 9892124323 💞 Full Night Enjoy
Call Girl Number in Khar Mumbai📲 9892124323 💞 Full Night Enjoy
 

Introduction to Android Wear - Peter Friese

  • 1.
  • 3.
  • 4.
  • 5. REAL LIFE GET PHONE LOST IN PHONE
  • 6.
  • 8. Design Principles • Launched automatically
  • 9. Design Principles • Launched automatically • Glanceable
  • 10. Design Principles • Launched automatically • Glanceable • Suggest and Demand
  • 11. Design Principles • Launched automatically • Glanceable • Suggest and Demand • Zero or low interaction
  • 13. Simple Notifications Look, ma - no work required!
  • 14. Simple Notifications sendNotification() Intent viewIntent = new Intent(context, DummyActivity.class); PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .setContentIntent(viewPendingIntent) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 15. Can we do better?
  • 16.
  • 18. BigPictureStyle sendNotification() Intent viewIntent = new Intent(context, DummyActivity.class); PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, 0); Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .setStyle( new NotificationCompat.BigPictureStyle() .bigPicture(BitmapFactory.decodeResource(context.getResources(), R.drawable.sanfrancisco)) .setBigContentTitle("Flight AW123 is ready to board.") .setSummaryText("Please proceed to gate C 17 to board. Have a nice flight!")) .setContentIntent(viewPendingIntent) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 20. Pages sendNotification() ArrayList<Notification> pages = new ArrayList<Notification>(); pages.add(new NotificationCompat.Builder(context) .setContentTitle("Your seat") .setContentText("17A") .extend(new NotificationCompat.WearableExtender() .setBackground(BitmapFactory.decodeResource(context.getResources(), R.drawable.a380_seat))) .build());
  • 21. Background Only Pages sendNotification() pages.add(new NotificationCompat.Builder(context) .extend(new NotificationCompat.WearableExtender() .setHintShowBackgroundOnly(true) .setBackground(BitmapFactory.decodeResource(context.getResources(), R.drawable.qrcode))) .build());
  • 22. Adding Pages to Notifications sendNotification() Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .setContentIntent(viewPendingIntent) .extend(new NotificationCompat.WearableExtender() .addPages(pages)) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 24. Voice Input sendNotification() // Feedback intent Intent replyIntent = new Intent(context, DummyActivity.class); PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0);
  • 25. Voice Input sendNotification() // Feedback intent Intent replyIntent = new Intent(context, DummyActivity.class); PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); String replyLabel = context.getResources().getString(R.string.reply_label); String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses);
  • 26. Voice Input sendNotification() // Feedback intent Intent replyIntent = new Intent(context, DummyActivity.class); PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); String replyLabel = context.getResources().getString(R.string.reply_label); String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses); RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .setChoices(cannedResponses) .build();
  • 27. Voice Input sendNotification() // Feedback intent Intent replyIntent = new Intent(context, DummyActivity.class); PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, 0); String replyLabel = context.getResources().getString(R.string.reply_label); String[] cannedResponses = context.getResources().getStringArray(R.array.canned_responses); RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .setChoices(cannedResponses) .build(); NotificationCompat.Action replyAction = new NotificationCompat.Action.Builder( R.drawable.chatbubble_working, replyLabel, replyPendingIntent) .addRemoteInput(remoteInput) .build();
  • 28. Sending a Voice Input Notification sendNotification() Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .extend(new NotificationCompat.WearableExtender() .addPages(pages) .addAction(replyAction)) .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(notificationId++, notification);
  • 29. Receiving Voice Input onCreate() Bundle remoteInputResults = RemoteInput.getResultsFromIntent(intent); if (remoteInputResults != null) { CharSequence utterance = remoteInputResults.getCharSequence(Constants.EXTRA_VOICE_REPLY); Toast.makeText(this, utterance, Toast.LENGTH_LONG).show(); }
  • 31. Actions sendNotification() Intent mapIntent = new Intent(Intent.ACTION_VIEW); Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); mapIntent.setData(geoUri); PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0);
  • 32. Actions sendNotification() Intent mapIntent = new Intent(Intent.ACTION_VIEW); Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); mapIntent.setData(geoUri); PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0); NotificationCompat.Action walkingDirectionsAction = new NotificationCompat.Action.Builder( R.drawable.ic_full_directions_walking, "Directions to gate", mapPendingIntent) .build();
  • 33. Actions sendNotification() Intent mapIntent = new Intent(Intent.ACTION_VIEW); Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode("London Heathrow")); mapIntent.setData(geoUri); PendingIntent mapPendingIntent = PendingIntent.getActivity(context, 0, mapIntent, 0); NotificationCompat.Action walkingDirectionsAction = new NotificationCompat.Action.Builder( R.drawable.ic_full_directions_walking, "Directions to gate", mapPendingIntent) .build(); ! Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setSmallIcon(R.drawable.plane) .setContentTitle(String.format("Flight AW123 is ready to board", notificationId)) .setContentText("Please proceed to gate C 17 to board. Have a nice flight!") .addAction(walkingDirectionsAction) .extend(new NotificationCompat.WearableExtender() .addPages(pages) .addAction(replyAction) .addAction(walkingDirectionsAction)) .build();
  • 34. Wearable apps Launching Using app-provided voice actions Using the start menu
  • 35. Launching AndroidManifest.xml <application android:icon="@drawable/greenlinelogo" android:label="@string/app_name" android:theme="@android:style/Theme.DeviceDefault" > <activity android:name="de.peterfriese.weartravel.MainActivity" android:label="@string/app_name_voice" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
  • 37. Layout - List activity_checkin.xml <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"> <FrameLayout android:id="@+id/frame_layout" android:layout_height="match_parent" android:layout_width="match_parent" app:layout_box="left|bottom|right"> <android.support.wearable.view.WearableListView android:id="@+id/checkin_list" android:layout_height="match_parent" android:layout_width="match_parent"> </android.support.wearable.view.WearableListView> </FrameLayout> </android.support.wearable.view.BoxInsetLayout>
  • 38. Layout - Item checkin_listview_item.xml <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.wearable.view.CircledImageView android:id="@+id/image" android:alpha="0.5" android:layout_height="52dp" android:layout_marginLeft="16dp" android:layout_width="52dp" app:circle_border_color="#FFFFFFFF" app:circle_border_width="2dp" app:circle_color="#00000000" /> <TextView android:id="@+id/text" android:alpha="0.5" android:fontFamily="sans-serif-condensed-light" android:gravity="center_vertical" android:layout_height="52dp" android:layout_marginLeft="72dp" android:layout_marginRight="16dp"
  • 39. <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" Layout - Item checkin_listview_item.xml xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.wearable.view.CircledImageView android:id="@+id/image" android:alpha="0.5" android:layout_height="52dp" android:layout_marginLeft="16dp" android:layout_width="52dp" app:circle_border_color="#FFFFFFFF" app:circle_border_width="2dp" app:circle_color="#00000000" /> <TextView android:id="@+id/text" android:alpha="0.5" android:fontFamily="sans-serif-condensed-light" android:gravity="center_vertical" android:layout_height="52dp" android:layout_marginLeft="72dp" android:layout_marginRight="16dp" android:layout_width="wrap_content" android:textColor="@color/white" android:textSize="14sp" /> </merge>
  • 40. MyViewItem CheckInActivity.java private final class MyItemView extends FrameLayout implements WearableListView.Item { final CircledImageView image; final TextView text; private float mScale; public MyItemView(Context context) { super(context); View.inflate(context, R.layout.checkin_listview_item, this); image = (CircledImageView) findViewById(R.id.image); text = (TextView) findViewById(R.id.text); } @Override public float getProximityMinValue() { return mDefaultCircleRadius; } @Override public float getProximityMaxValue() { return mSelectedCircleRadius; }
  • 41. private float mScale; public MyItemView(Context context) { MyViewItem super(context); View.inflate(context, R.layout.checkin_listview_item, this); image = (CircledImageView) findViewById(R.id.image); text = (TextView) findViewById(R.id.text); CheckInActivity.java } @Override public float getProximityMinValue() { return mDefaultCircleRadius; } @Override public float getProximityMaxValue() { return mSelectedCircleRadius; } @Override public float getCurrentProximityValue() { return mScale; } @Override public void setScalingAnimatorValue(float value) { mScale = value; image.setCircleRadius(mScale); image.setCircleRadiusPressed(mScale); } @Override
  • 42. @Override public float getProximityMaxValue() { MyViewItem return mSelectedCircleRadius; } @Override public float getCurrentProximityValue() { CheckInActivity.java return mScale; } @Override public void setScalingAnimatorValue(float value) { mScale = value; image.setCircleRadius(mScale); image.setCircleRadiusPressed(mScale); } @Override public void onScaleUpStart() { image.setAlpha(1f); text.setAlpha(1f); } @Override public void onScaleDownStart() { image.setAlpha(0.5f); text.setAlpha(0.5f); } }
  • 43. Adapter - Bind ViewHolder CheckInActivity.java public class MyListAdapter extends WearableListView.Adapter { @Override public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); } @Override public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { MyItemView myItemView = (MyItemView) viewHolder.itemView; TextView textView = (TextView) myItemView.findViewById(R.id.text); textView.setText(String.format("Seat %d", i)); Integer resourceId = R.drawable.ic_action_done; CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); imageView.setImageResource(resourceId); } @Override public int getItemCount() { return 17; }
  • 44. Adapter - Bind ViewHolder public class MyListAdapter extends WearableListView.Adapter { CheckInActivity.java @Override public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new WearableListView.ViewHolder(new MyItemView(CheckInActivity.this)); } @Override public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int i) { MyItemView myItemView = (MyItemView) viewHolder.itemView; TextView textView = (TextView) myItemView.findViewById(R.id.text); textView.setText(String.format("Seat %d", i)); Integer resourceId = R.drawable.ic_action_done; CircledImageView imageView = (CircledImageView) myItemView.findViewById(R.id.image); imageView.setImageResource(resourceId); } @Override public int getItemCount() { return 17; } }
  • 45. Activity CheckInActivity.java public class CheckInActivity extends Activity implements WearableListView.ClickListener { private WearableListView mListView; private MyListAdapter mAdapter; private float mDefaultCircleRadius; private float mSelectedCircleRadius; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_checkin); mDefaultCircleRadius = getResources().getDimension(R.dimen.default_settings_circle_radius); mSelectedCircleRadius = getResources().getDimension(R.dimen.selected_settings_circle_radius); mAdapter = new MyListAdapter(); mListView = (WearableListView) findViewById(R.id.checkin_list); mListView.setAdapter(mAdapter); mListView.setClickListener(CheckInActivity.this); }
  • 46. private float mDefaultCircleRadius; private float mSelectedCircleRadius; @Override protected void onCreate(Bundle savedInstanceState) { Activity super.onCreate(savedInstanceState); setContentView(R.layout.activity_checkin); mDefaultCircleRadius = CheckInActivity.java getResources().getDimension(R.dimen.default_settings_circle_radius); mSelectedCircleRadius = getResources().getDimension(R.dimen.selected_settings_circle_radius); mAdapter = new MyListAdapter(); mListView = (WearableListView) findViewById(R.id.checkin_list); mListView.setAdapter(mAdapter); mListView.setClickListener(CheckInActivity.this); } @Override public void onClick(WearableListView.ViewHolder viewHolder) { Toast.makeText(this, String.format("You selected item #%s”, viewHolder.getPosition()), Toast.LENGTH_SHORT).show(); } @Override public void onTopEmptyRegionClick() { Toast.makeText(this, "You tapped into the empty area above the list”, Toast.LENGTH_SHORT).show(); }
  • 47. Data Layer Performing a Check-In on Your Watch
  • 48. Transferring Assets sendDataToWearable() final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); Asset asset = Asset.createFromBytes(byteStream.toByteArray()); PutDataMapRequest dataMap = PutDataMapRequest.create(Constants.FLIGHT_PATH + "/" + Uri.encode("SFO")); dataMap.getDataMap().putString(Constants.EXTRA_FLIGHTNUMBER, "AC123"); dataMap.getDataMap().putString(Constants.EXTRA_GATE, "C 17"); dataMap.getDataMap().putAsset(Constants.EXTRA_DESTINATION, imageAssetDestination); PutDataRequest request = dataMap.asPutDataRequest(); // Send the data over DataApi.DataItemResult result = Wearable.DataApi.putDataItem(googleApiClient, request).await();
  • 49. Sending Messages sendDataToWearable() // If successful store the data path // Construct an array of all successfully sent data paths DataMap itemPathMap = new DataMap(); itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, result.getDataItem().getUri().toString()); // Convert to bytes to be send with the message byte[] dataMapBytes = itemPathMap.toByteArray();
  • 50. Sending Messages sendDataToWearable() // If successful store the data path // Construct an array of all successfully sent data paths DataMap itemPathMap = new DataMap(); itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, result.getDataItem().getUri().toString()); // Convert to bytes to be send with the message byte[] dataMapBytes = itemPathMap.toByteArray(); Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); while (itr.hasNext()) { // Notify all nodes to "start", providing the data paths of all // transmitted tourist attractions. What "start" does will be up // to the wearable. ! }
  • 51. Sending Messages sendDataToWearable() // If successful store the data path // Construct an array of all successfully sent data paths DataMap itemPathMap = new DataMap(); itemPathMap.putString(Constants.EXTRA_UPDATED_FLIGHTS, result.getDataItem().getUri().toString()); // Convert to bytes to be send with the message byte[] dataMapBytes = itemPathMap.toByteArray(); Iterator<String> itr = Utilities.getNodes(googleApiClient).iterator(); while (itr.hasNext()) { // Notify all nodes to "start", providing the data paths of all // transmitted tourist attractions. What "start" does will be up // to the wearable. Wearable.MessageApi.sendMessage(googleApiClient, itr.next(), Constants.START_PATH, dataMapBytes); }
  • 52. Receiving Data AndroidManifest.xml (wearable) <service android:name="de.peterfriese.weartravel.ListenerService"> <intent-filter> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service>
  • 53. Receiving Data ListenerService.java public class ListenerService extends WearableListenerService { @Override public void onDataChanged(DataEventBuffer dataEvents) { Log.d(TAG, "onDataChanged: " + dataEvents); final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents); for (DataEvent event : events) { if (event.getType() == DataEvent.TYPE_CHANGED) { // Not doing anything here but logging Uri uri = event.getDataItem().getUri(); DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); String title = dataMapItem.getDataMap().getString("extra_flightnumber"); Log.v(TAG, "Data changed: " + uri + ", " + title); } } } @Override public void onMessageReceived(MessageEvent messageEvent) { Log.v(TAG, "onMessageReceived: " + messageEvent);
  • 54. if (event.getType() == DataEvent.TYPE_CHANGED) { // Not doing anything here but logging Uri uri = event.getDataItem().getUri(); DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); String title = dataMapItem.getDataMap().getString("extra_flightnumber"); Log.v(TAG, "Data changed: " + uri + ", " + title); Receiving Data } ListenerService.} java } @Override public void onMessageReceived(MessageEvent messageEvent) { Log.v(TAG, "onMessageReceived: " + messageEvent); if (Constants.START_PATH.equals(messageEvent.getPath())) { DataMap dataMap = DataMap.fromByteArray(messageEvent.getData()); GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .build(); ConnectionResult connectionResult = googleApiClient.blockingConnect( Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); return; } String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS);
  • 55. ConnectionResult connectionResult = googleApiClient.blockingConnect( Constants.GOOGLE_API_CLIENT_TIMEOUT, TimeUnit.SECONDS); Receiving Data if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { Log.e(TAG, Constants.GOOGLE_API_CLIENT_ERROR_MSG); return; } String flightUri = dataMap.getString(Constants.EXTRA_UPDATED_FLIGHTS); Uri uri = Uri.parse(flightUri); DataApi.DataItemResult dataItemResult = ListenerService.java Wearable.DataApi.getDataItem(googleApiClient, uri).await(); DataItem dataItem = dataItemResult.getDataItem(); if (dataItem != null) { DataMap flightDataMap = DataMapItem.fromDataItem(dataItem).getDataMap(); String flightNumber = flightDataMap.getString(Constants.EXTRA_FLIGHTNUMBER); String gate = flightDataMap.getString(Constants.EXTRA_GATE); Bitmap destinationBitmap = Utilities.loadBitmapFromAsset( googleApiClient, flightDataMap.getAsset(Constants.EXTRA_DESTINATION)); sendNotification(flightNumber, gate, destinationBitmap); } googleApiClient.disconnect(); } }
  • 56. Demo
  • 57. Thank you! +PeterFriese @ #AndroidWear
  • 58. Q & A +PeterFriese @ #AndroidWear