techday: kick start your experience with android wear - mario viviani

58
Kick-Start Your Experience with Android Wear +MarioViviani Android GDE @mariuxtheone

Upload: codemotion

Post on 19-Jul-2015

200 views

Category:

Technology


0 download

TRANSCRIPT

Kick-Start Your Experiencewith Android Wear

+MarioVivianiAndroid GDE@mariuxtheone

Mario VivianiFounder & CEO Mariux AppsAndroid GDE

Photo source info here

ANDROIDEVERYWHERE

ANDROIDEVERYWEAR

Project Setup

Use Android Studio!Android Studio is optimized for Wear

http://goo.gl/ZSJH5O

Android Wear Project Wizard

Android Wear Project Wizard

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

Project Structure

GDE

MobileModule

WearModule?

Establish Connection

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

MobileModule

WearModule

GoogleApiClient

GoogleApiClient

GDE

MobileModule

WearModule

GoogleApiClient

GoogleApiClient

Send & Receive Data

GDE

Message

DataItem

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

DataItem / Message

PathString “/path/to/item”

Payload Byte[ ] <=100KB

GDE

MobileModule

WearModule

DataItem DataItem

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

MobileModule

WearModule

Message Message

Message Message

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);

}

}

Handling Data Layer Events - App Structure

GDE

MobileModule

WearModule

GDE

WearModule

MobileModule

ForegroundActivity

ForegroundActivity

GDE

ForegroundActivity onDataChanged()

onMessageReceived()

onPeerConnected()

onPeerDisconnected()

GoogleApiClient

GDE

WearModule

MobileModule

ForegroundActivity

ForegroundActivity

GDE

WearModule

MobileModule

ForegroundActivity

ForegroundActivity

WearableListenerService

WearableListenerService

GDE

WearableListenerService

onDataChanged()

onMessageReceived()

onPeerConnected()

onPeerDisconnected()

GoogleApiClient

Example

GDE

WearModule

MobileModule

ForegroundActivity

ForegroundActivity

WearableListenerService

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>

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

Photo source info here

+MarioVivianiAndroid GDE

[email protected]@mariuxtheone

Thanks! Q&A

Githubgithub.com/Mariuxtheone