Kick-Start Your Experience with Android Wear +MarioViviani Android GDE @mariuxtheone
Use Android Studio!Android Studio is optimized for Wear
http://goo.gl/ZSJH5O
GDE
WatchViewStub
<android.support.wearable.view.WatchViewStub
...
app:rectLayout="@layout/rect_activity_wear"
app:roundLayout="@layout/round_activity_wear"
...>
</android.support.wearable.view.WatchViewStub>
XML
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
mTextView = (TextView) stub.findViewById(R.id.text);
}
});
WearActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
mTextView = (TextView) stub.findViewById(R.id.text);
}
});
WearActivity.java
GDE
Google Play Services
Setup Google Play Services developer.android.com/google/play-services/setup.html
GDE
GoogleApiClient
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
GDE
Establish Connection
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
In Activity
GDE
Data Layer Interfaces
static interface DataListener {
void onDataChanged(DataEventBuffer dataEvents);
}
static interface MessageListener {
void onMessageReceived(MessageEvent messageEvent);
}
static interface NodeListener {
void onPeerConnected(Node node);
void onPeerDisconnected(Node node);
}
GDE
Add Listeners in onConnected() (Activity Only)
@Override
public void onConnected(Bundle bundle) {
Wearable.DataApi.addListener(mGoogleApiClient, this);
Wearable.MessageApi.addListener(mGoogleApiClient, this);
Wearable.NodeApi.addListener(mGoogleApiClient, this);
}
GDE
Sync Data using DataMap
PutDataMapRequest dataMap = PutDataMapRequest.create("/path");
dataMap.getDataMap().putString("/itemID", "Hello, World");
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult =
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
GDE
Sync Assets (Images)
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest dataMap = PutDataMapRequest.
create("/image");
dataMap.getDataMap()
.putAsset("profileImage", asset)
GDE
React to Data Sync
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_DELETED) {
...
} else if (event.getType() == DataEvent.TYPE_CHANGED) {
...
}
}
}
GDE
Retrieve the DataMap
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
...
for (DataEvent event : events) {
if (event.getType() == DataEvent.TYPE_CHANGED) {
DataMapItem dataMapItem =
DataMapItem.fromDataItem(event.getDataItem());
DataMap dataMap = dataMapItem.getDataMap();
String s = dataMap.getString("/itemID");
}
GDE
Send Message using MessageAPI
SendMessageResult result = Wearable.MessageApi.sendMessage(
mGoogleApiClient, node, "/path/startactivity", payload).await();
if (!result.getStatus().isSuccess()) {
Log.e(TAG, "ERROR: failed to send Message: " +
result.getStatus());
}
GDE
Get Connected Nodes
private Collection<String> getNodes() {
HashSet<String> results = new HashSet<String>();
NodeApi.GetConnectedNodesResult nodes =
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
for (Node node : nodes.getNodes()) {
results.add(node.getId());
}
return results;
}
GDE
Receiving Message
@Override
public void onMessageReceived(MessageEvent messageEvent) {
if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {
Intent startIntent = new Intent(this, MainActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startIntent);
}
}
GDE
ForegroundActivity onDataChanged()
onMessageReceived()
onPeerConnected()
onPeerDisconnected()
GoogleApiClient
GDE
WearModule
MobileModule
ForegroundActivity
ForegroundActivity
WearableListenerService
WearableListenerService
GDE
WearableListenerService
onDataChanged()
onMessageReceived()
onPeerConnected()
onPeerDisconnected()
GoogleApiClient
MobileSendMessageActivity extends Activity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build();
}
MobileSendMessageActivity.java
...
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
MobileSendMessageActivity.java
...
private static final String START_ACTIVITY_PATH = "/start-activity";
public void sendMessageButtonClicked(View v){
Collection<String> nodes = getNodes();
for (String node : nodes) {
SendMessageResult result = Wearable.MessageApi.sendMessage(
mGoogleApiClient, node, START_ACTIVITY_PATH , null).await();
if (!result.getStatus().isSuccess()) {...}
}
}
}
MobileSendMessageActivity.java
public class StartWearActivityService extends WearableListenerService {
...
@Override
public void onCreate() {
super.onCreate();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build();
mGoogleApiClient.connect();
}
...
StartWearActivityService.java
private static final String START_ACTIVITY_PATH = "/start-activity";
...
@Override
public void onMessageReceived(MessageEvent messageEvent) {
if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {
Intent startIntent = new Intent(this, WearActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startIntent);
}
}
}
StartWearActivityService.java
GDE
Add Service to Android Manifest
<service android:name=".StartWearActivityService">
<intent-filter>
<action
android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
</intent-filter>
</service>
Simplicity is the ultimate sophistication.Leonardo da Vinci
“
’’
TeleportData Sync and Messaging Libraryfor Android Wear
Githubgithub.com/Mariuxtheone/Teleport
Gradle - Mavencompile 'Teleport:teleportlib:0.1.3'
GDE
TeleportClient
TeleportClient mTeleportClient = new TeleportClient(this);
mTeleportClient.connect();
Set Up:
Send Message
mTeleportClient.sendMessage("startActivity", null);
Sync Data
mTeleportClient.syncInt("myInt", 12345)
GDE
TeleportService
setOnGetMessageTask(new TeleportService.OnGetMessageTask {
@Override
protected void onPostExecute(String path) {
if (path.equals("startActivity")){
Intent startIntent = new Intent(this, WearActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startIntent);
};}
Retrieve a Message
+MarioVivianiAndroid GDE
[email protected]@mariuxtheone
Thanks! Q&A
Githubgithub.com/Mariuxtheone
Feedbackbit.ly/wearcodemotion