upload android base code part7
This commit is contained in:
parent
4e516ec6ed
commit
841ae54672
25229 changed files with 1709508 additions and 0 deletions
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2014 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.android.wearable.datalayer" >
|
||||
|
||||
<uses-sdk android:minSdkVersion="20"
|
||||
android:targetSdkVersion="25" />
|
||||
|
||||
<uses-feature android:name="android.hardware.type.watch" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@android:style/Theme.DeviceDefault">
|
||||
|
||||
<meta-data
|
||||
android:name="com.google.android.wearable.standalone"
|
||||
android:value="false" />
|
||||
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.version"
|
||||
android:value="@integer/google_play_services_version" />
|
||||
|
||||
<service
|
||||
android:name=".DataLayerListenerService" >
|
||||
<intent-filter>
|
||||
<!-- listeners receive events that match the action and data filters -->
|
||||
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
|
||||
<data android:scheme="wear" android:host="*" android:pathPrefix="/count"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
|
||||
<data android:scheme="wear" android:host="*" android:pathPrefix="/start-activity"/>
|
||||
</intent-filter>
|
||||
</service>
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="com.example.android.wearable.datalayer.EXAMPLE"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
After Width: | Height: | Size: 6.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
|
||||
<corners android:radius="20dp"/>
|
||||
<padding android:left="10dp" android:right="10dp" android:top="5dp" android:bottom="5dp"/>
|
||||
<solid android:color="@color/black"/>
|
||||
</shape>
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/photo"
|
||||
android:scaleType="centerCrop"
|
||||
android:src="@drawable/photo_placeholder"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent" />
|
||||
</LinearLayout>
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:background="@color/black">
|
||||
|
||||
<ListView
|
||||
android:id="@+id/dataItem_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:transcriptMode="alwaysScroll"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/intro"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:textSize="20sp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:gravity="center"
|
||||
android:fontFamily="sans-serif-condensed-light"
|
||||
android:text="@string/intro" />
|
||||
</RelativeLayout>
|
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="1dp"
|
||||
android:id="@+id/center"
|
||||
android:visibility="invisible"
|
||||
android:layout_centerVertical="true" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/capability_2_btn"
|
||||
android:text="@string/capability_2_notification"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_above="@id/center"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:textSize="12sp"
|
||||
android:onClick="onClicked" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/capabilities_1_and_2_btn"
|
||||
android:text="@string/capabilities_1_and_2_notification"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/center"
|
||||
android:textSize="10sp"
|
||||
android:layout_alignEnd="@+id/capability_2_btn"
|
||||
android:layout_alignStart="@+id/capability_2_btn"
|
||||
android:onClick="onClicked" />
|
||||
|
||||
</RelativeLayout>
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2014 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/white">
|
||||
|
||||
<android.support.wearable.view.GridViewPager
|
||||
android:id="@+id/pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<android.support.wearable.view.DotsPageIndicator
|
||||
android:id="@+id/page_indicator"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:padding="5dp"
|
||||
android:background="@drawable/rounded_background">
|
||||
</android.support.wearable.view.DotsPageIndicator>
|
||||
|
||||
</RelativeLayout>
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<dimen name="dots_spacing">15dp</dimen>
|
||||
</resources>
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2014 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="app_name">Data Layer Sample Wearable App</string>
|
||||
<string name="intro">Waiting for data to arrive\u2026</string>
|
||||
<string name="capability_2_notification">Capability 2</string>
|
||||
<string name="capabilities_1_and_2_notification">Capabilities 1 and 2</string>
|
||||
<string name="no_device">No device provides the requested capabilities</string>
|
||||
<string name="connected_nodes">Nodes: %1$s</string>
|
||||
</resources>
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<string-array name="android_wear_capabilities" translatable="false">
|
||||
<!-- declaring the provided capabilities -->
|
||||
<item>capability_1</item>
|
||||
</string-array>
|
||||
</resources>
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.wearable.datalayer;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import com.google.android.gms.common.ConnectionResult;
|
||||
import com.google.android.gms.common.api.GoogleApiClient;
|
||||
import com.google.android.gms.wearable.DataEvent;
|
||||
import com.google.android.gms.wearable.DataEventBuffer;
|
||||
import com.google.android.gms.wearable.MessageEvent;
|
||||
import com.google.android.gms.wearable.Wearable;
|
||||
import com.google.android.gms.wearable.WearableListenerService;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Listens to DataItems and Messages from the local node.
|
||||
*/
|
||||
public class DataLayerListenerService extends WearableListenerService {
|
||||
|
||||
private static final String TAG = "DataLayerService";
|
||||
|
||||
private static final String START_ACTIVITY_PATH = "/start-activity";
|
||||
private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received";
|
||||
public static final String COUNT_PATH = "/count";
|
||||
public static final String IMAGE_PATH = "/image";
|
||||
public static final String IMAGE_KEY = "photo";
|
||||
GoogleApiClient mGoogleApiClient;
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
mGoogleApiClient = new GoogleApiClient.Builder(this)
|
||||
.addApi(Wearable.API)
|
||||
.build();
|
||||
mGoogleApiClient.connect();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataChanged(DataEventBuffer dataEvents) {
|
||||
LOGD(TAG, "onDataChanged: " + dataEvents);
|
||||
if (!mGoogleApiClient.isConnected() || !mGoogleApiClient.isConnecting()) {
|
||||
ConnectionResult connectionResult = mGoogleApiClient
|
||||
.blockingConnect(30, TimeUnit.SECONDS);
|
||||
if (!connectionResult.isSuccess()) {
|
||||
Log.e(TAG, "DataLayerListenerService failed to connect to GoogleApiClient, "
|
||||
+ "error code: " + connectionResult.getErrorCode());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Loop through the events and send a message back to the node that created the data item.
|
||||
for (DataEvent event : dataEvents) {
|
||||
Uri uri = event.getDataItem().getUri();
|
||||
String path = uri.getPath();
|
||||
if (COUNT_PATH.equals(path)) {
|
||||
// Get the node id of the node that created the data item from the host portion of
|
||||
// the uri.
|
||||
String nodeId = uri.getHost();
|
||||
// Set the data of the message to be the bytes of the Uri.
|
||||
byte[] payload = uri.toString().getBytes();
|
||||
|
||||
// Send the rpc
|
||||
Wearable.MessageApi.sendMessage(mGoogleApiClient, nodeId, DATA_ITEM_RECEIVED_PATH,
|
||||
payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageReceived(MessageEvent messageEvent) {
|
||||
LOGD(TAG, "onMessageReceived: " + messageEvent);
|
||||
|
||||
// Check to see if the message is to start an activity
|
||||
if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {
|
||||
Intent startIntent = new Intent(this, MainActivity.class);
|
||||
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(startIntent);
|
||||
}
|
||||
}
|
||||
|
||||
public static void LOGD(final String tag, String message) {
|
||||
if (Log.isLoggable(tag, Log.DEBUG)) {
|
||||
Log.d(tag, message);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,346 @@
|
|||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.wearable.datalayer;
|
||||
|
||||
import static com.example.android.wearable.datalayer.DataLayerListenerService.LOGD;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Fragment;
|
||||
import android.app.FragmentManager;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.support.wearable.view.DotsPageIndicator;
|
||||
import android.support.wearable.view.FragmentGridPagerAdapter;
|
||||
import android.support.wearable.view.GridViewPager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.example.android.wearable.datalayer.fragments.AssetFragment;
|
||||
import com.example.android.wearable.datalayer.fragments.DataFragment;
|
||||
import com.example.android.wearable.datalayer.fragments.DiscoveryFragment;
|
||||
import com.google.android.gms.common.ConnectionResult;
|
||||
import com.google.android.gms.common.api.GoogleApiClient;
|
||||
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
|
||||
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
|
||||
import com.google.android.gms.common.api.PendingResult;
|
||||
import com.google.android.gms.common.api.ResultCallback;
|
||||
import com.google.android.gms.wearable.Asset;
|
||||
import com.google.android.gms.wearable.CapabilityApi;
|
||||
import com.google.android.gms.wearable.CapabilityInfo;
|
||||
import com.google.android.gms.wearable.DataApi;
|
||||
import com.google.android.gms.wearable.DataEvent;
|
||||
import com.google.android.gms.wearable.DataEventBuffer;
|
||||
import com.google.android.gms.wearable.DataMapItem;
|
||||
import com.google.android.gms.wearable.MessageApi;
|
||||
import com.google.android.gms.wearable.MessageEvent;
|
||||
import com.google.android.gms.wearable.Node;
|
||||
import com.google.android.gms.wearable.Wearable;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* The main activity with a view pager, containing three pages:<p/>
|
||||
* <ul>
|
||||
* <li>
|
||||
* Page 1: shows a list of DataItems received from the phone application
|
||||
* </li>
|
||||
* <li>
|
||||
* Page 2: shows the photo that is sent from the phone application
|
||||
* </li>
|
||||
* <li>
|
||||
* Page 3: includes two buttons to show the connected phone and watch devices
|
||||
* </li>
|
||||
* </ul>
|
||||
*/
|
||||
public class MainActivity extends Activity implements
|
||||
ConnectionCallbacks,
|
||||
OnConnectionFailedListener,
|
||||
DataApi.DataListener,
|
||||
MessageApi.MessageListener,
|
||||
CapabilityApi.CapabilityListener {
|
||||
|
||||
private static final String TAG = "MainActivity";
|
||||
private static final String CAPABILITY_1_NAME = "capability_1";
|
||||
private static final String CAPABILITY_2_NAME = "capability_2";
|
||||
|
||||
private GoogleApiClient mGoogleApiClient;
|
||||
private GridViewPager mPager;
|
||||
private DataFragment mDataFragment;
|
||||
private AssetFragment mAssetFragment;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.main_activity);
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
setupViews();
|
||||
mGoogleApiClient = new GoogleApiClient.Builder(this)
|
||||
.addApi(Wearable.API)
|
||||
.addConnectionCallbacks(this)
|
||||
.addOnConnectionFailedListener(this)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
mGoogleApiClient.connect();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
if ((mGoogleApiClient != null) && mGoogleApiClient.isConnected()) {
|
||||
Wearable.DataApi.removeListener(mGoogleApiClient, this);
|
||||
Wearable.MessageApi.removeListener(mGoogleApiClient, this);
|
||||
Wearable.CapabilityApi.removeListener(mGoogleApiClient, this);
|
||||
mGoogleApiClient.disconnect();
|
||||
}
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnected(Bundle connectionHint) {
|
||||
LOGD(TAG, "onConnected(): Successfully connected to Google API client");
|
||||
Wearable.DataApi.addListener(mGoogleApiClient, this);
|
||||
Wearable.MessageApi.addListener(mGoogleApiClient, this);
|
||||
Wearable.CapabilityApi.addListener(
|
||||
mGoogleApiClient, this, Uri.parse("wear://"), CapabilityApi.FILTER_REACHABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionSuspended(int cause) {
|
||||
LOGD(TAG, "onConnectionSuspended(): Connection to Google API client was suspended");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionFailed(ConnectionResult result) {
|
||||
Log.e(TAG, "onConnectionFailed(): Failed to connect, with result: " + result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataChanged(DataEventBuffer dataEvents) {
|
||||
LOGD(TAG, "onDataChanged(): " + dataEvents);
|
||||
|
||||
for (DataEvent event : dataEvents) {
|
||||
if (event.getType() == DataEvent.TYPE_CHANGED) {
|
||||
String path = event.getDataItem().getUri().getPath();
|
||||
if (DataLayerListenerService.IMAGE_PATH.equals(path)) {
|
||||
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
|
||||
Asset photoAsset = dataMapItem.getDataMap()
|
||||
.getAsset(DataLayerListenerService.IMAGE_KEY);
|
||||
// Loads image on background thread.
|
||||
new LoadBitmapAsyncTask().execute(photoAsset);
|
||||
|
||||
} else if (DataLayerListenerService.COUNT_PATH.equals(path)) {
|
||||
LOGD(TAG, "Data Changed for COUNT_PATH");
|
||||
mDataFragment.appendItem("DataItem Changed", event.getDataItem().toString());
|
||||
} else {
|
||||
LOGD(TAG, "Unrecognized path: " + path);
|
||||
}
|
||||
|
||||
} else if (event.getType() == DataEvent.TYPE_DELETED) {
|
||||
mDataFragment.appendItem("DataItem Deleted", event.getDataItem().toString());
|
||||
} else {
|
||||
mDataFragment.appendItem("Unknown data event type", "Type = " + event.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onClicked(View view) {
|
||||
switch (view.getId()) {
|
||||
case R.id.capability_2_btn:
|
||||
showNodes(CAPABILITY_2_NAME);
|
||||
break;
|
||||
case R.id.capabilities_1_and_2_btn:
|
||||
showNodes(CAPABILITY_1_NAME, CAPABILITY_2_NAME);
|
||||
break;
|
||||
default:
|
||||
Log.e(TAG, "Unknown click event registered");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the connected nodes that provide at least one of the given capabilities
|
||||
*/
|
||||
private void showNodes(final String... capabilityNames) {
|
||||
|
||||
PendingResult<CapabilityApi.GetAllCapabilitiesResult> pendingCapabilityResult =
|
||||
Wearable.CapabilityApi.getAllCapabilities(
|
||||
mGoogleApiClient,
|
||||
CapabilityApi.FILTER_REACHABLE);
|
||||
|
||||
pendingCapabilityResult.setResultCallback(
|
||||
new ResultCallback<CapabilityApi.GetAllCapabilitiesResult>() {
|
||||
@Override
|
||||
public void onResult(
|
||||
CapabilityApi.GetAllCapabilitiesResult getAllCapabilitiesResult) {
|
||||
|
||||
if (!getAllCapabilitiesResult.getStatus().isSuccess()) {
|
||||
Log.e(TAG, "Failed to get capabilities");
|
||||
return;
|
||||
}
|
||||
|
||||
Map<String, CapabilityInfo> capabilitiesMap =
|
||||
getAllCapabilitiesResult.getAllCapabilities();
|
||||
Set<Node> nodes = new HashSet<>();
|
||||
|
||||
if (capabilitiesMap.isEmpty()) {
|
||||
showDiscoveredNodes(nodes);
|
||||
return;
|
||||
}
|
||||
for (String capabilityName : capabilityNames) {
|
||||
CapabilityInfo capabilityInfo = capabilitiesMap.get(capabilityName);
|
||||
if (capabilityInfo != null) {
|
||||
nodes.addAll(capabilityInfo.getNodes());
|
||||
}
|
||||
}
|
||||
showDiscoveredNodes(nodes);
|
||||
}
|
||||
|
||||
private void showDiscoveredNodes(Set<Node> nodes) {
|
||||
List<String> nodesList = new ArrayList<>();
|
||||
for (Node node : nodes) {
|
||||
nodesList.add(node.getDisplayName());
|
||||
}
|
||||
LOGD(TAG, "Connected Nodes: " + (nodesList.isEmpty()
|
||||
? "No connected device was found for the given capabilities"
|
||||
: TextUtils.join(",", nodesList)));
|
||||
String msg;
|
||||
if (!nodesList.isEmpty()) {
|
||||
msg = getString(R.string.connected_nodes,
|
||||
TextUtils.join(", ", nodesList));
|
||||
} else {
|
||||
msg = getString(R.string.no_device);
|
||||
}
|
||||
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageReceived(MessageEvent event) {
|
||||
LOGD(TAG, "onMessageReceived: " + event);
|
||||
mDataFragment.appendItem("Message", event.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCapabilityChanged(CapabilityInfo capabilityInfo) {
|
||||
LOGD(TAG, "onCapabilityChanged: " + capabilityInfo);
|
||||
mDataFragment.appendItem("onCapabilityChanged", capabilityInfo.toString());
|
||||
}
|
||||
|
||||
private void setupViews() {
|
||||
mPager = (GridViewPager) findViewById(R.id.pager);
|
||||
mPager.setOffscreenPageCount(2);
|
||||
DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator);
|
||||
dotsPageIndicator.setDotSpacing((int) getResources().getDimension(R.dimen.dots_spacing));
|
||||
dotsPageIndicator.setPager(mPager);
|
||||
mDataFragment = new DataFragment();
|
||||
mAssetFragment = new AssetFragment();
|
||||
DiscoveryFragment discoveryFragment = new DiscoveryFragment();
|
||||
List<Fragment> pages = new ArrayList<>();
|
||||
pages.add(mDataFragment);
|
||||
pages.add(mAssetFragment);
|
||||
pages.add(discoveryFragment);
|
||||
final MyPagerAdapter adapter = new MyPagerAdapter(getFragmentManager(), pages);
|
||||
mPager.setAdapter(adapter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Switches to the page {@code index}. The first page has index 0.
|
||||
*/
|
||||
private void moveToPage(int index) {
|
||||
mPager.setCurrentItem(0, index, true);
|
||||
}
|
||||
|
||||
private class MyPagerAdapter extends FragmentGridPagerAdapter {
|
||||
|
||||
private List<Fragment> mFragments;
|
||||
|
||||
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
|
||||
super(fm);
|
||||
mFragments = fragments;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount(int row) {
|
||||
return mFragments == null ? 0 : mFragments.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fragment getFragment(int row, int column) {
|
||||
return mFragments.get(column);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Extracts {@link android.graphics.Bitmap} data from the
|
||||
* {@link com.google.android.gms.wearable.Asset}
|
||||
*/
|
||||
private class LoadBitmapAsyncTask extends AsyncTask<Asset, Void, Bitmap> {
|
||||
|
||||
@Override
|
||||
protected Bitmap doInBackground(Asset... params) {
|
||||
|
||||
if (params.length > 0) {
|
||||
|
||||
Asset asset = params[0];
|
||||
|
||||
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
|
||||
mGoogleApiClient, asset).await().getInputStream();
|
||||
|
||||
if (assetInputStream == null) {
|
||||
Log.w(TAG, "Requested an unknown Asset.");
|
||||
return null;
|
||||
}
|
||||
return BitmapFactory.decodeStream(assetInputStream);
|
||||
|
||||
} else {
|
||||
Log.e(TAG, "Asset must be non-null");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Bitmap bitmap) {
|
||||
|
||||
if (bitmap != null) {
|
||||
LOGD(TAG, "Setting background image on second page..");
|
||||
moveToPage(1);
|
||||
mAssetFragment.setBackgroundImage(bitmap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.wearable.datalayer.fragments;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.example.android.wearable.datalayer.R;
|
||||
|
||||
/**
|
||||
* A simple fragment that shows a (photo) asset received from the phone.
|
||||
*/
|
||||
public class AssetFragment extends Fragment {
|
||||
|
||||
private ImageView mPhoto;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.asset_fragment, container, false);
|
||||
mPhoto = (ImageView) view.findViewById(R.id.photo);
|
||||
return view;
|
||||
}
|
||||
|
||||
public void setBackgroundImage(Bitmap bitmap) {
|
||||
mPhoto.setImageBitmap(bitmap);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.wearable.datalayer.fragments;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.example.android.wearable.datalayer.R;
|
||||
|
||||
/**
|
||||
* A fragment that shows a list of DataItems received from the phone
|
||||
*/
|
||||
public class DataFragment extends Fragment {
|
||||
|
||||
private DataItemAdapter mDataItemListAdapter;
|
||||
private TextView mIntroText;
|
||||
private boolean mInitialized;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.data_fragment, container, false);
|
||||
ListView dataItemList = (ListView) view.findViewById(R.id.dataItem_list);
|
||||
mIntroText = (TextView) view.findViewById(R.id.intro);
|
||||
mDataItemListAdapter = new DataItemAdapter(getActivity(),
|
||||
android.R.layout.simple_list_item_1);
|
||||
dataItemList.setAdapter(mDataItemListAdapter);
|
||||
mInitialized = true;
|
||||
return view;
|
||||
}
|
||||
|
||||
public void appendItem(String title, String text) {
|
||||
if (!mInitialized) {
|
||||
return;
|
||||
}
|
||||
mIntroText.setVisibility(View.INVISIBLE);
|
||||
mDataItemListAdapter.add(new Event(title, text));
|
||||
}
|
||||
|
||||
private static class DataItemAdapter extends ArrayAdapter<Event> {
|
||||
|
||||
private final Context mContext;
|
||||
|
||||
public DataItemAdapter(Context context, int unusedResource) {
|
||||
super(context, unusedResource);
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
ViewHolder holder;
|
||||
if (convertView == null) {
|
||||
holder = new ViewHolder();
|
||||
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
|
||||
Context.LAYOUT_INFLATER_SERVICE);
|
||||
convertView = inflater.inflate(android.R.layout.two_line_list_item, null);
|
||||
convertView.setTag(holder);
|
||||
holder.text1 = (TextView) convertView.findViewById(android.R.id.text1);
|
||||
holder.text2 = (TextView) convertView.findViewById(android.R.id.text2);
|
||||
} else {
|
||||
holder = (ViewHolder) convertView.getTag();
|
||||
}
|
||||
Event event = getItem(position);
|
||||
holder.text1.setText(event.title);
|
||||
holder.text2.setText(event.text);
|
||||
return convertView;
|
||||
}
|
||||
|
||||
private class ViewHolder {
|
||||
|
||||
TextView text1;
|
||||
TextView text2;
|
||||
}
|
||||
}
|
||||
|
||||
private class Event {
|
||||
|
||||
String title;
|
||||
String text;
|
||||
|
||||
public Event(String title, String text) {
|
||||
this.title = title;
|
||||
this.text = text;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.wearable.datalayer.fragments;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.example.android.wearable.datalayer.R;
|
||||
|
||||
/**
|
||||
* A simple fragment with two buttons to show connected phones and watches
|
||||
*/
|
||||
public class DiscoveryFragment extends Fragment {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.discovery_fragment, container, false);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue