diff options
Diffstat (limited to 'wearable')
4 files changed, 189 insertions, 239 deletions
diff --git a/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java b/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java index ca86d7a3..b7f9f8b7 100644 --- a/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java +++ b/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java @@ -19,13 +19,13 @@ package com.example.android.wearable.datalayer; import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.content.IntentSender; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; +import android.support.annotation.WorkerThread; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -36,23 +36,19 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; -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.ResultCallback; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; import com.google.android.gms.wearable.Asset; -import com.google.android.gms.wearable.CapabilityApi; +import com.google.android.gms.wearable.CapabilityClient; import com.google.android.gms.wearable.CapabilityInfo; -import com.google.android.gms.wearable.DataApi; -import com.google.android.gms.wearable.DataApi.DataItemResult; +import com.google.android.gms.wearable.DataClient; import com.google.android.gms.wearable.DataEvent; import com.google.android.gms.wearable.DataEventBuffer; -import com.google.android.gms.wearable.MessageApi; -import com.google.android.gms.wearable.MessageApi.SendMessageResult; +import com.google.android.gms.wearable.DataItem; +import com.google.android.gms.wearable.MessageClient; import com.google.android.gms.wearable.MessageEvent; import com.google.android.gms.wearable.Node; -import com.google.android.gms.wearable.NodeApi; import com.google.android.gms.wearable.PutDataMapRequest; import com.google.android.gms.wearable.PutDataRequest; import com.google.android.gms.wearable.Wearable; @@ -62,6 +58,8 @@ import java.io.IOException; import java.util.Collection; import java.util.Date; import java.util.HashSet; +import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -73,17 +71,12 @@ import java.util.concurrent.TimeUnit; * to the paired wearable. */ public class MainActivity extends Activity implements - CapabilityApi.CapabilityListener, - MessageApi.MessageListener, - DataApi.DataListener, - ConnectionCallbacks, - OnConnectionFailedListener { + DataClient.OnDataChangedListener, + MessageClient.OnMessageReceivedListener, + CapabilityClient.OnCapabilityChangedListener { private static final String TAG = "MainActivity"; - //Request code for launching the Intent to resolve Google Play services errors. - private static final int REQUEST_RESOLVE_ERROR = 1000; - private static final int REQUEST_IMAGE_CAPTURE = 1; private static final String START_ACTIVITY_PATH = "/start-activity"; @@ -92,8 +85,6 @@ public class MainActivity extends Activity implements private static final String IMAGE_KEY = "photo"; private static final String COUNT_KEY = "count"; - private GoogleApiClient mGoogleApiClient; - private boolean mResolvingError = false; private boolean mCameraSupported = false; private ListView mDataItemList; @@ -112,6 +103,7 @@ public class MainActivity extends Activity implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LOGD(TAG, "onCreate"); + mCameraSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); setContentView(R.layout.main_activity); setupViews(); @@ -121,20 +113,6 @@ public class MainActivity extends Activity implements mDataItemList.setAdapter(mDataItemListAdapter); mGeneratorExecutor = new ScheduledThreadPoolExecutor(1); - - mGoogleApiClient = new GoogleApiClient.Builder(this) - .addApi(Wearable.API) - .addConnectionCallbacks(this) - .addOnConnectionFailedListener(this) - .build(); - } - - @Override - protected void onStart() { - super.onStart(); - if (!mResolvingError) { - mGoogleApiClient.connect(); - } } @Override @@ -142,23 +120,27 @@ public class MainActivity extends Activity implements super.onResume(); mDataItemGeneratorFuture = mGeneratorExecutor.scheduleWithFixedDelay( new DataItemGenerator(), 1, 5, TimeUnit.SECONDS); + + mStartActivityBtn.setEnabled(true); + mSendPhotoBtn.setEnabled(mCameraSupported); + + // Instantiates clients without member variables, as clients are inexpensive to create and + // won't lose their listeners. (They are cached and shared between GoogleApi instances.) + Wearable.getDataClient(this).addListener(this); + Wearable.getMessageClient(this).addListener(this); + Wearable.getCapabilityClient(this) + .addListener( + this, Uri.parse("wear://"), CapabilityClient.FILTER_REACHABLE); } @Override public void onPause() { super.onPause(); mDataItemGeneratorFuture.cancel(true /* mayInterruptIfRunning */); - } - @Override - protected void onStop() { - if (!mResolvingError && (mGoogleApiClient != null) && (mGoogleApiClient.isConnected())) { - Wearable.DataApi.removeListener(mGoogleApiClient, this); - Wearable.MessageApi.removeListener(mGoogleApiClient, this); - Wearable.CapabilityApi.removeListener(mGoogleApiClient, this); - mGoogleApiClient.disconnect(); - } - super.onStop(); + Wearable.getDataClient(this).removeListener(this); + Wearable.getMessageClient(this).removeListener(this); + Wearable.getCapabilityClient(this).removeListener(this); } @Override @@ -171,49 +153,6 @@ public class MainActivity extends Activity implements } @Override - public void onConnected(Bundle connectionHint) { - LOGD(TAG, "Google API Client was connected"); - mResolvingError = false; - mStartActivityBtn.setEnabled(true); - mSendPhotoBtn.setEnabled(mCameraSupported); - 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, "Connection to Google API client was suspended"); - mStartActivityBtn.setEnabled(false); - mSendPhotoBtn.setEnabled(false); - } - - @Override - public void onConnectionFailed(ConnectionResult result) { - if (!mResolvingError) { - - if (result.hasResolution()) { - try { - mResolvingError = true; - result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR); - } catch (IntentSender.SendIntentException e) { - // There was an error with the resolution intent. Try again. - mGoogleApiClient.connect(); - } - } else { - Log.e(TAG, "Connection to Google API client has failed"); - mResolvingError = false; - mStartActivityBtn.setEnabled(false); - mSendPhotoBtn.setEnabled(false); - Wearable.DataApi.removeListener(mGoogleApiClient, this); - Wearable.MessageApi.removeListener(mGoogleApiClient, this); - Wearable.CapabilityApi.removeListener(mGoogleApiClient, this); - } - } - } - - @Override public void onDataChanged(DataEventBuffer dataEvents) { LOGD(TAG, "onDataChanged: " + dataEvents); @@ -258,7 +197,7 @@ public class MainActivity extends Activity implements } public void onSendPhotoClick(View view) { - if (null != mImageBitmap && mGoogleApiClient.isConnected()) { + if (null != mImageBitmap) { sendPhoto(toAsset(mImageBitmap)); } } @@ -274,19 +213,24 @@ public class MainActivity extends Activity implements new StartWearableActivityTask().execute(); } + @WorkerThread private void sendStartActivityMessage(String node) { - Wearable.MessageApi.sendMessage( - mGoogleApiClient, node, START_ACTIVITY_PATH, new byte[0]).setResultCallback( - new ResultCallback<SendMessageResult>() { - @Override - public void onResult(SendMessageResult sendMessageResult) { - if (!sendMessageResult.getStatus().isSuccess()) { - Log.e(TAG, "Failed to send message with status code: " - + sendMessageResult.getStatus().getStatusCode()); - } - } - } - ); + + Task<Integer> sendMessageTask = + Wearable.getMessageClient(this).sendMessage(node, START_ACTIVITY_PATH, new byte[0]); + + try { + // Block on a task and get the result synchronously (because this is on a background + // thread). + Integer result = Tasks.await(sendMessageTask); + LOGD(TAG, "Message sent: " + result); + + } catch (ExecutionException exception) { + Log.e(TAG, "Task failed: " + exception); + + } catch (InterruptedException exception) { + Log.e(TAG, "Interrupt occurred: " + exception); + } } /** @@ -333,23 +277,38 @@ public class MainActivity extends Activity implements PutDataRequest request = dataMap.asPutDataRequest(); request.setUrgent(); - Wearable.DataApi.putDataItem(mGoogleApiClient, request) - .setResultCallback(new ResultCallback<DataItemResult>() { - @Override - public void onResult(DataItemResult dataItemResult) { - LOGD(TAG, "Sending image was successful: " + dataItemResult.getStatus() - .isSuccess()); - } - }); + Task<DataItem> dataItemTask = Wearable.getDataClient(this).putDataItem(request); + + dataItemTask.addOnSuccessListener(new OnSuccessListener<DataItem>() { + @Override + public void onSuccess(DataItem dataItem) { + LOGD(TAG, "Sending image was successful: " + dataItem); + } + }); } + @WorkerThread private Collection<String> getNodes() { HashSet<String> results = new HashSet<>(); - NodeApi.GetConnectedNodesResult nodes = - Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); - for (Node node : nodes.getNodes()) { - results.add(node.getId()); + Task<List<Node>> nodeListTask = + Wearable.getNodeClient(getApplicationContext()).getConnectedNodes(); + + try { + // Block on a task and get the result synchronously (because this is on a background + // thread). + List<Node> nodes = Tasks.await(nodeListTask); + + for (Node node : nodes) { + results.add(node.getId()); + + } + + } catch (ExecutionException exception) { + Log.e(TAG, "Task failed: " + exception); + + } catch (InterruptedException exception) { + Log.e(TAG, "Interrupt occurred: " + exception); } return results; @@ -441,19 +400,23 @@ public class MainActivity extends Activity implements request.setUrgent(); LOGD(TAG, "Generating DataItem: " + request); - if (!mGoogleApiClient.isConnected()) { - return; + + Task<DataItem> dataItemTask = + Wearable.getDataClient(getApplicationContext()).putDataItem(request); + + try { + // Block on a task and get the result synchronously (because this is on a background + // thread). + DataItem dataItem = Tasks.await(dataItemTask); + + LOGD(TAG, "DataItem saved: " + dataItem); + + } catch (ExecutionException exception) { + Log.e(TAG, "Task failed: " + exception); + + } catch (InterruptedException exception) { + Log.e(TAG, "Interrupt occurred: " + exception); } - Wearable.DataApi.putDataItem(mGoogleApiClient, request) - .setResultCallback(new ResultCallback<DataItemResult>() { - @Override - public void onResult(DataItemResult dataItemResult) { - if (!dataItemResult.getStatus().isSuccess()) { - Log.e(TAG, "ERROR: failed to putDataItem, status code: " - + dataItemResult.getStatus().getStatusCode()); - } - } - }); } } }
\ No newline at end of file diff --git a/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java b/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java index 402912f4..feec09c5 100644 --- a/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java +++ b/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java @@ -38,20 +38,17 @@ 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.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; import com.google.android.gms.wearable.Asset; -import com.google.android.gms.wearable.CapabilityApi; +import com.google.android.gms.wearable.CapabilityClient; import com.google.android.gms.wearable.CapabilityInfo; -import com.google.android.gms.wearable.DataApi; +import com.google.android.gms.wearable.DataClient; 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.MessageClient; import com.google.android.gms.wearable.MessageEvent; import com.google.android.gms.wearable.Node; import com.google.android.gms.wearable.Wearable; @@ -62,6 +59,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutionException; /** * The main activity with a view pager, containing three pages:<p/> @@ -78,17 +76,14 @@ import java.util.Set; * </ul> */ public class MainActivity extends Activity implements - ConnectionCallbacks, - OnConnectionFailedListener, - DataApi.DataListener, - MessageApi.MessageListener, - CapabilityApi.CapabilityListener { + DataClient.OnDataChangedListener, + MessageClient.OnMessageReceivedListener, + CapabilityClient.OnCapabilityChangedListener { 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; @@ -99,48 +94,28 @@ public class MainActivity extends Activity implements 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(); + + // Instantiates clients without member variables, as clients are inexpensive to create and + // won't lose their listeners. (They are cached and shared between GoogleApi instances.) + Wearable.getDataClient(this).addListener(this); + Wearable.getMessageClient(this).addListener(this); + Wearable.getCapabilityClient(this) + .addListener( + this, Uri.parse("wear://"), CapabilityClient.FILTER_REACHABLE); } @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); + Wearable.getDataClient(this).removeListener(this); + Wearable.getMessageClient(this).removeListener(this); + Wearable.getCapabilityClient(this).removeListener(this); } @Override @@ -185,64 +160,6 @@ public class MainActivity extends Activity implements } } - /** - * 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); @@ -255,6 +172,53 @@ public class MainActivity extends Activity implements mDataFragment.appendItem("onCapabilityChanged", capabilityInfo.toString()); } + /** + * Find the connected nodes that provide at least one of the given capabilities + */ + private void showNodes(final String... capabilityNames) { + + Task<Map<String, CapabilityInfo>> capabilitiesTask = + Wearable.getCapabilityClient(this) + .getAllCapabilities(CapabilityClient.FILTER_REACHABLE); + + capabilitiesTask.addOnSuccessListener(new OnSuccessListener<Map<String, CapabilityInfo>>() { + @Override + public void onSuccess(Map<String, CapabilityInfo> capabilityInfoMap) { + Set<Node> nodes = new HashSet<>(); + + if (capabilityInfoMap.isEmpty()) { + showDiscoveredNodes(nodes); + return; + } + for (String capabilityName : capabilityNames) { + CapabilityInfo capabilityInfo = capabilityInfoMap.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(); + } + private void setupViews() { mPager = (GridViewPager) findViewById(R.id.pager); mPager.setOffscreenPageCount(2); @@ -318,14 +282,35 @@ public class MainActivity extends Activity implements Asset asset = params[0]; - InputStream assetInputStream = Wearable.DataApi.getFdForAsset( - mGoogleApiClient, asset).await().getInputStream(); + Task<DataClient.GetFdForAssetResponse> getFdForAssetResponseTask = + Wearable.getDataClient(getApplicationContext()).getFdForAsset(asset); + + try { + // Block on a task and get the result synchronously. This is generally done + // when executing a task inside a separately managed background thread. Doing + // this on the main (UI) thread can cause your application to become + // unresponsive. + DataClient.GetFdForAssetResponse getFdForAssetResponse = + Tasks.await(getFdForAssetResponseTask); + + InputStream assetInputStream = getFdForAssetResponse.getInputStream(); + + if (assetInputStream != null) { + return BitmapFactory.decodeStream(assetInputStream); + + } else { + Log.w(TAG, "Requested an unknown Asset."); + return null; + } + + } catch (ExecutionException exception) { + Log.e(TAG, "Failed retrieving asset, Task failed: " + exception); + return null; - if (assetInputStream == null) { - Log.w(TAG, "Requested an unknown Asset."); + } catch (InterruptedException exception) { + Log.e(TAG, "Failed retrieving asset, interrupt occurred: " + exception); return null; } - return BitmapFactory.decodeStream(assetInputStream); } else { Log.e(TAG, "Asset must be non-null"); diff --git a/wearable/wear/DataLayer/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/DataLayer/gradle/wrapper/gradle-wrapper.properties index f6f95d8b..0bb8ef1b 100644 --- a/wearable/wear/DataLayer/gradle/wrapper/gradle-wrapper.properties +++ b/wearable/wear/DataLayer/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Apr 12 16:28:18 PDT 2016 +#Mon Nov 20 15:43:26 PST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
\ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/wearable/wear/DataLayer/template-params.xml b/wearable/wear/DataLayer/template-params.xml index beeb26a1..24f5be28 100644 --- a/wearable/wear/DataLayer/template-params.xml +++ b/wearable/wear/DataLayer/template-params.xml @@ -20,8 +20,10 @@ <package>com.example.android.wearable.datalayer</package> <minSdk>18</minSdk> - <targetSdkVersion>25</targetSdkVersion> - <targetSdkVersionWear>25</targetSdkVersionWear> + <targetSdkVersion>27</targetSdkVersion> + <targetSdkVersionWear>26</targetSdkVersionWear> + + <multiDexEnabled>true</multiDexEnabled> <wearable> <has_handheld_app>true</has_handheld_app> |