aboutsummaryrefslogtreecommitdiff
path: root/wearable/wear/RuntimePermissionsWear
diff options
context:
space:
mode:
authorJeremy Walker <jewalker@google.com>2018-06-19 14:07:57 -0700
committerJeremy Walker <jewalker@google.com>2018-06-21 16:35:46 -0700
commit06252b0ffb825aae676dfc6a57bb53b6a60a67a9 (patch)
treea0aa0a2e6c931c288741fd358cc55d722bc0edfd /wearable/wear/RuntimePermissionsWear
parent8bd2d438399dd6a7090d5513536f004c2594ebe5 (diff)
downloadandroid-06252b0ffb825aae676dfc6a57bb53b6a60a67a9.tar.gz
Update data api / always on in Jumping Jack and Runtime Permissions
sample. Bug: 4368433 Test: Manual tests. Change-Id: Ic201d06535019300fed2d12a8decc60801ff9365
Diffstat (limited to 'wearable/wear/RuntimePermissionsWear')
-rw-r--r--wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestPhoneService.java43
-rw-r--r--wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/MainPhoneActivity.java170
-rw-r--r--wearable/wear/RuntimePermissionsWear/Shared/build.gradle2
-rw-r--r--wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestWearService.java105
-rw-r--r--wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/MainWearActivity.java166
-rw-r--r--wearable/wear/RuntimePermissionsWear/template-params.xml6
6 files changed, 193 insertions, 299 deletions
diff --git a/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestPhoneService.java b/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestPhoneService.java
index 4cad2fa1..2c036cdc 100644
--- a/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestPhoneService.java
+++ b/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestPhoneService.java
@@ -25,16 +25,14 @@ import android.util.Log;
import com.example.android.wearable.runtimepermissions.common.Constants;
-import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.api.PendingResult;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
import com.google.android.gms.wearable.DataMap;
-import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.Wearable;
import com.google.android.gms.wearable.WearableListenerService;
import java.io.File;
-import java.util.concurrent.TimeUnit;
/**
* Handles all incoming requests for phone data (and permissions) from wear devices.
@@ -140,31 +138,26 @@ public class IncomingRequestPhoneService extends WearableListenerService {
private void sendMessage(String nodeId, DataMap dataMap) {
Log.d(TAG, "sendMessage() Node: " + nodeId);
- GoogleApiClient client = new GoogleApiClient.Builder(this)
- .addApi(Wearable.API)
- .build();
- client.blockingConnect(Constants.CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
-
- PendingResult<MessageApi.SendMessageResult> pendingMessageResult =
- Wearable.MessageApi.sendMessage(
- client,
+ // Clients are inexpensive to create, so in this case we aren't creating member variables.
+ // (They are cached and shared between GoogleApi instances.)
+ Task<Integer> sendMessageTask =
+ Wearable.getMessageClient(
+ getApplicationContext()).sendMessage(
nodeId,
Constants.MESSAGE_PATH_WEAR,
dataMap.toByteArray());
- MessageApi.SendMessageResult sendMessageResult =
- pendingMessageResult.await(
- Constants.CONNECTION_TIME_OUT_MS,
- TimeUnit.MILLISECONDS);
-
- if (!sendMessageResult.getStatus().isSuccess()) {
- Log.d(TAG, "Sending message failed, status: "
- + sendMessageResult.getStatus());
- } else {
- Log.d(TAG, "Message sent successfully");
- }
- client.disconnect();
+ sendMessageTask.addOnCompleteListener(new OnCompleteListener<Integer>() {
+ @Override
+ public void onComplete(Task<Integer> task) {
+ if (task.isSuccessful()) {
+ Log.d(TAG, "Message sent successfully");
+ } else {
+ Log.d(TAG, "Message failed.");
+ }
+ }
+ });
}
private boolean isExternalStorageReadable() {
@@ -173,4 +166,4 @@ public class IncomingRequestPhoneService extends WearableListenerService {
return Environment.MEDIA_MOUNTED.equals(state)
|| Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}
-} \ No newline at end of file
+}
diff --git a/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/MainPhoneActivity.java b/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/MainPhoneActivity.java
index 196b03bd..d2c3ea1d 100644
--- a/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/MainPhoneActivity.java
+++ b/wearable/wear/RuntimePermissionsWear/Application/src/main/java/com/example/android/wearable/runtimepermissions/MainPhoneActivity.java
@@ -32,21 +32,18 @@ import android.widget.TextView;
import com.example.android.wearable.runtimepermissions.common.Constants;
-import com.google.android.gms.common.ConnectionResult;
-import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.api.PendingResult;
-import com.google.android.gms.common.api.ResultCallback;
-import com.google.android.gms.wearable.CapabilityApi;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.android.gms.wearable.CapabilityClient;
import com.google.android.gms.wearable.CapabilityInfo;
import com.google.android.gms.wearable.DataMap;
-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;
import java.io.File;
import java.util.Set;
-import java.util.concurrent.TimeUnit;
/**
* Displays data that requires runtime permissions both locally (READ_EXTERNAL_STORAGE) and
@@ -60,11 +57,9 @@ import java.util.concurrent.TimeUnit;
* in app experience.
*/
public class MainPhoneActivity extends AppCompatActivity implements
- GoogleApiClient.ConnectionCallbacks,
- GoogleApiClient.OnConnectionFailedListener,
- CapabilityApi.CapabilityListener,
- MessageApi.MessageListener,
- ResultCallback<MessageApi.SendMessageResult> {
+ CapabilityClient.OnCapabilityChangedListener,
+ MessageClient.OnMessageReceivedListener,
+ OnCompleteListener<Integer> {
private static final String TAG = "MainPhoneActivity";
@@ -88,8 +83,6 @@ public class MainPhoneActivity extends AppCompatActivity implements
private Set<Node> mWearNodeIds;
- private GoogleApiClient mGoogleApiClient;
-
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
@@ -107,19 +100,11 @@ public class MainPhoneActivity extends AppCompatActivity implements
mWearRequestingPhoneStoragePermission =
getIntent().getBooleanExtra(EXTRA_PROMPT_PERMISSION_FROM_WEAR, false);
- mPhoneStoragePermissionButton =
- (Button) findViewById(R.id.phoneStoragePermissionButton);
-
- mWearBodySensorsPermissionButton =
- (Button) findViewById(R.id.wearBodySensorsPermissionButton);
+ mPhoneStoragePermissionButton = findViewById(R.id.phoneStoragePermissionButton);
- mOutputTextView = (TextView) findViewById(R.id.output);
+ mWearBodySensorsPermissionButton = findViewById(R.id.wearBodySensorsPermissionButton);
- mGoogleApiClient = new GoogleApiClient.Builder(this)
- .addApi(Wearable.API)
- .addConnectionCallbacks(this)
- .addOnConnectionFailedListener(this)
- .build();
+ mOutputTextView = findViewById(R.id.output);
}
public void onClickWearBodySensors(View view) {
@@ -147,14 +132,9 @@ public class MainPhoneActivity extends AppCompatActivity implements
protected void onPause() {
Log.d(TAG, "onPause()");
super.onPause();
- if ((mGoogleApiClient != null) && (mGoogleApiClient.isConnected())) {
- Wearable.CapabilityApi.removeCapabilityListener(
- mGoogleApiClient,
- this,
- Constants.CAPABILITY_WEAR_APP);
- Wearable.MessageApi.removeListener(mGoogleApiClient, this);
- mGoogleApiClient.disconnect();
- }
+
+ Wearable.getMessageClient(this).removeListener(this);
+ Wearable.getCapabilityClient(this).removeListener(this);
}
@Override
@@ -174,9 +154,51 @@ public class MainPhoneActivity extends AppCompatActivity implements
R.drawable.ic_permission_approved, 0, 0, 0);
}
- if (mGoogleApiClient != null) {
- mGoogleApiClient.connect();
- }
+ // Clients are inexpensive to create, so in this case we aren't creating member variables.
+ // (They are cached and shared between GoogleApi instances.)
+ Wearable.getMessageClient(this).addListener(this);
+ Wearable.getCapabilityClient(this).addListener(
+ this, Constants.CAPABILITY_WEAR_APP);
+
+ // Initial check of capabilities to find the phone.
+ Task<CapabilityInfo> capabilityInfoTask = Wearable.getCapabilityClient(this)
+ .getCapability(Constants.CAPABILITY_WEAR_APP, CapabilityClient.FILTER_REACHABLE);
+
+ capabilityInfoTask.addOnCompleteListener(new OnCompleteListener<CapabilityInfo>() {
+ @Override
+ public void onComplete(Task<CapabilityInfo> task) {
+
+ if (task.isSuccessful()) {
+ Log.d(TAG, "Capability request succeeded.");
+ CapabilityInfo capabilityInfo = task.getResult();
+ String capabilityName = capabilityInfo.getName();
+
+ boolean wearSupportsSampleApp =
+ capabilityName.equals(Constants.CAPABILITY_WEAR_APP);
+
+ if (wearSupportsSampleApp) {
+ mWearNodeIds = capabilityInfo.getNodes();
+
+ /*
+ * Upon getting all wear nodes, we now need to check if the original
+ * request to launch this activity (and PhonePermissionRequestActivity) was
+ * initiated by a wear device. If it was, we need to send back the
+ * permission results (data or rejection of permission) to the wear device.
+ *
+ * Also, note we set variable to false, this enables the user to continue
+ * changing permissions without sending updates to the wear every time.
+ */
+ if (mWearRequestingPhoneStoragePermission) {
+ mWearRequestingPhoneStoragePermission = false;
+ sendWearPermissionResults();
+ }
+ }
+
+ } else {
+ Log.d(TAG, "Capability request failed to return any results.");
+ }
+ }
+ });
}
@Override
@@ -195,66 +217,6 @@ public class MainPhoneActivity extends AppCompatActivity implements
}
}
- @Override
- public void onConnected(Bundle bundle) {
- Log.d(TAG, "onConnected()");
-
- // Set up listeners for capability and message changes.
- Wearable.CapabilityApi.addCapabilityListener(
- mGoogleApiClient,
- this,
- Constants.CAPABILITY_WEAR_APP);
- Wearable.MessageApi.addListener(mGoogleApiClient, this);
-
- // Initial check of capabilities to find the wear nodes.
- PendingResult<CapabilityApi.GetCapabilityResult> pendingResult =
- Wearable.CapabilityApi.getCapability(
- mGoogleApiClient,
- Constants.CAPABILITY_WEAR_APP,
- CapabilityApi.FILTER_REACHABLE);
-
- pendingResult.setResultCallback(new ResultCallback<CapabilityApi.GetCapabilityResult>() {
- @Override
- public void onResult(CapabilityApi.GetCapabilityResult getCapabilityResult) {
-
- CapabilityInfo capabilityInfo = getCapabilityResult.getCapability();
- String capabilityName = capabilityInfo.getName();
-
- boolean wearSupportsSampleApp =
- capabilityName.equals(Constants.CAPABILITY_WEAR_APP);
-
- if (wearSupportsSampleApp) {
- mWearNodeIds = capabilityInfo.getNodes();
-
- /*
- * Upon getting all wear nodes, we now need to check if the original request to
- * launch this activity (and PhonePermissionRequestActivity) was initiated by
- * a wear device. If it was, we need to send back the permission results (data
- * or rejection of permission) to the wear device.
- *
- * Also, note we set variable to false, this enables the user to continue
- * changing permissions without sending updates to the wear every time.
- */
- if (mWearRequestingPhoneStoragePermission) {
- mWearRequestingPhoneStoragePermission = false;
- sendWearPermissionResults();
- }
- }
- }
- });
- }
-
- @Override
- public void onConnectionSuspended(int i) {
- Log.d(TAG, "onConnectionSuspended(): connection to location client suspended");
- }
-
- @Override
- public void onConnectionFailed(ConnectionResult connectionResult) {
- Log.e(TAG, "onConnectionFailed(): connection to location client failed");
- }
-
-
public void onCapabilityChanged(CapabilityInfo capabilityInfo) {
Log.d(TAG, "onCapabilityChanged(): " + capabilityInfo);
@@ -310,9 +272,9 @@ public class MainPhoneActivity extends AppCompatActivity implements
}
@Override
- public void onResult(MessageApi.SendMessageResult sendMessageResult) {
- if (!sendMessageResult.getStatus().isSuccess()) {
- Log.d(TAG, "Sending message failed, onResult: " + sendMessageResult);
+ public void onComplete(Task<Integer> task) {
+ if (!task.isSuccessful()) {
+ Log.d(TAG, "Sending message failed, onComplete.");
updateWearButtonOnUiThread();
logToUi("Sending message failed.");
@@ -325,19 +287,17 @@ public class MainPhoneActivity extends AppCompatActivity implements
Log.d(TAG, "sendMessage(): " + mWearNodeIds);
if ((mWearNodeIds != null) && (!mWearNodeIds.isEmpty())) {
-
- PendingResult<MessageApi.SendMessageResult> pendingResult;
+
+ Task<Integer> sendMessageTask;
for (Node node : mWearNodeIds) {
- pendingResult = Wearable.MessageApi.sendMessage(
- mGoogleApiClient,
+ sendMessageTask = Wearable.getMessageClient(this).sendMessage(
node.getId(),
Constants.MESSAGE_PATH_WEAR,
dataMap.toByteArray());
- pendingResult.setResultCallback(this, Constants.CONNECTION_TIME_OUT_MS,
- TimeUnit.SECONDS);
+ sendMessageTask.addOnCompleteListener(this);
}
} else {
// Unable to retrieve node with proper capability
diff --git a/wearable/wear/RuntimePermissionsWear/Shared/build.gradle b/wearable/wear/RuntimePermissionsWear/Shared/build.gradle
index 95588db2..bf02c2cb 100644
--- a/wearable/wear/RuntimePermissionsWear/Shared/build.gradle
+++ b/wearable/wear/RuntimePermissionsWear/Shared/build.gradle
@@ -6,7 +6,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.0.1'
+ classpath 'com.android.tools.build:gradle:3.1.3'
}
}
diff --git a/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestWearService.java b/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestWearService.java
index 5dc24677..408b4702 100644
--- a/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestWearService.java
+++ b/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/IncomingRequestWearService.java
@@ -26,13 +26,11 @@ import android.util.Log;
import com.example.android.wearable.runtimepermissions.common.Constants;
-import com.google.android.gms.common.ConnectionResult;
-import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.api.PendingResult;
-import com.google.android.gms.wearable.CapabilityApi;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.android.gms.wearable.CapabilityClient;
import com.google.android.gms.wearable.CapabilityInfo;
import com.google.android.gms.wearable.DataMap;
-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;
@@ -40,7 +38,6 @@ import com.google.android.gms.wearable.WearableListenerService;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.TimeUnit;
/**
* Handles all incoming requests for wear data (and permissions) from phone devices.
@@ -129,60 +126,52 @@ public class IncomingRequestWearService extends WearableListenerService {
}
}
- private void sendMessage(DataMap dataMap) {
+ private void sendMessage(final DataMap dataMap) {
Log.d(TAG, "sendMessage(): " + dataMap);
- GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
- .addApi(Wearable.API)
- .build();
- ConnectionResult connectionResult =
- googleApiClient.blockingConnect(
- Constants.CONNECTION_TIME_OUT_MS,
- TimeUnit.MILLISECONDS);
-
- if (!connectionResult.isSuccess()) {
- Log.d(TAG, "Google API Client failed to connect.");
- return;
- }
-
- PendingResult<CapabilityApi.GetCapabilityResult> pendingCapabilityResult =
- Wearable.CapabilityApi.getCapability(
- googleApiClient,
- Constants.CAPABILITY_PHONE_APP,
- CapabilityApi.FILTER_REACHABLE);
-
- CapabilityApi.GetCapabilityResult getCapabilityResult =
- pendingCapabilityResult.await(
- Constants.CONNECTION_TIME_OUT_MS,
- TimeUnit.MILLISECONDS);
-
- if (!getCapabilityResult.getStatus().isSuccess()) {
- Log.d(TAG, "CapabilityApi failed to return any results.");
- googleApiClient.disconnect();
- return;
- }
-
- CapabilityInfo capabilityInfo = getCapabilityResult.getCapability();
- String phoneNodeId = pickBestNodeId(capabilityInfo.getNodes());
-
- PendingResult<MessageApi.SendMessageResult> pendingMessageResult =
- Wearable.MessageApi.sendMessage(
- googleApiClient,
- phoneNodeId,
- Constants.MESSAGE_PATH_PHONE,
- dataMap.toByteArray());
-
- MessageApi.SendMessageResult sendMessageResult =
- pendingMessageResult.await(Constants.CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
-
- if (!sendMessageResult.getStatus().isSuccess()) {
- Log.d(TAG, "Sending message failed, onResult: " + sendMessageResult.getStatus());
- } else {
- Log.d(TAG, "Message sent successfully");
- }
-
- googleApiClient.disconnect();
+ // Initial check of capabilities to find the phone.
+ Task<CapabilityInfo> capabilityInfoTask = Wearable.getCapabilityClient(this)
+ .getCapability(Constants.CAPABILITY_PHONE_APP, CapabilityClient.FILTER_REACHABLE);
+
+ capabilityInfoTask.addOnCompleteListener(new OnCompleteListener<CapabilityInfo>() {
+ @Override
+ public void onComplete(Task<CapabilityInfo> task) {
+
+ if (task.isSuccessful()) {
+ Log.d(TAG, "Capability request succeeded.");
+
+ CapabilityInfo capabilityInfo = task.getResult();
+ String phoneNodeId = pickBestNodeId(capabilityInfo.getNodes());
+
+ if (phoneNodeId != null) {
+ // Instantiates clients without member variables, as clients are inexpensive to
+ // create. (They are cached and shared between GoogleApi instances.)
+ Task<Integer> sendMessageTask =
+ Wearable.getMessageClient(
+ getApplicationContext()).sendMessage(
+ phoneNodeId,
+ Constants.MESSAGE_PATH_PHONE,
+ dataMap.toByteArray());
+
+ sendMessageTask.addOnCompleteListener(new OnCompleteListener<Integer>() {
+ @Override
+ public void onComplete(Task<Integer> task) {
+ if (task.isSuccessful()) {
+ Log.d(TAG, "Message sent successfully");
+ } else {
+ Log.d(TAG, "Message failed.");
+ }
+ }
+ });
+ } else {
+ Log.d(TAG, "No phone node available.");
+ }
+ } else {
+ Log.d(TAG, "Capability request failed to return any results.");
+ }
+ }
+ });
}
/*
@@ -206,4 +195,4 @@ public class IncomingRequestWearService extends WearableListenerService {
}
return bestNodeId;
}
-} \ No newline at end of file
+}
diff --git a/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/MainWearActivity.java b/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/MainWearActivity.java
index 95a152b2..685f200d 100644
--- a/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/MainWearActivity.java
+++ b/wearable/wear/RuntimePermissionsWear/Wearable/src/main/java/com/example/android/wearable/runtimepermissions/MainWearActivity.java
@@ -17,16 +17,15 @@
package com.example.android.wearable.runtimepermissions;
import android.Manifest;
-import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Looper;
-import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
-import android.support.wear.ambient.AmbientMode;
+import android.support.v4.app.FragmentActivity;
+import android.support.wear.ambient.AmbientModeSupport;
import android.util.Log;
import android.view.View;
import android.widget.Button;
@@ -34,21 +33,18 @@ import android.widget.TextView;
import com.example.android.wearable.runtimepermissions.common.Constants;
-import com.google.android.gms.common.ConnectionResult;
-import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.api.PendingResult;
-import com.google.android.gms.common.api.ResultCallback;
-import com.google.android.gms.wearable.CapabilityApi;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.android.gms.wearable.CapabilityClient;
import com.google.android.gms.wearable.CapabilityInfo;
import com.google.android.gms.wearable.DataMap;
-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;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.TimeUnit;
/**
* Displays data that requires runtime permissions both locally (BODY_SENSORS) and remotely on
@@ -59,12 +55,10 @@ import java.util.concurrent.TimeUnit;
* this Activity also sends back the results of the permission request to the phone device (and
* the sensor data if approved).
*/
-public class MainWearActivity extends Activity implements
- AmbientMode.AmbientCallbackProvider,
- GoogleApiClient.ConnectionCallbacks,
- GoogleApiClient.OnConnectionFailedListener,
- CapabilityApi.CapabilityListener,
- MessageApi.MessageListener,
+public class MainWearActivity extends FragmentActivity
+ implements AmbientModeSupport.AmbientCallbackProvider,
+ CapabilityClient.OnCapabilityChangedListener,
+ MessageClient.OnMessageReceivedListener,
ActivityCompat.OnRequestPermissionsResultCallback {
private static final String TAG = "MainWearActivity";
@@ -82,7 +76,7 @@ public class MainWearActivity extends Activity implements
* Ambient mode controller attached to this display. Used by the Activity to see if it is in
* ambient mode.
*/
- private AmbientMode.AmbientController mAmbientController;
+ private AmbientModeSupport.AmbientController mAmbientController;
private boolean mWearBodySensorsPermissionApproved;
private boolean mPhoneStoragePermissionApproved;
@@ -95,8 +89,6 @@ public class MainWearActivity extends Activity implements
private String mPhoneNodeId;
- private GoogleApiClient mGoogleApiClient;
-
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
@@ -111,34 +103,26 @@ public class MainWearActivity extends Activity implements
setContentView(R.layout.activity_main);
// Enables Ambient mode.
- mAmbientController = AmbientMode.attachAmbientSupport(this);
+ mAmbientController = AmbientModeSupport.attach(this);
// Checks if phone app requested wear permission (permission request opens later if true).
mPhoneRequestingWearSensorPermission =
getIntent().getBooleanExtra(EXTRA_PROMPT_PERMISSION_FROM_PHONE, false);
- mWearBodySensorsPermissionButton =
- (Button) findViewById(R.id.wear_body_sensors_permission_button);
+ mWearBodySensorsPermissionButton = findViewById(R.id.wear_body_sensors_permission_button);
if (mWearBodySensorsPermissionApproved) {
mWearBodySensorsPermissionButton.setCompoundDrawablesWithIntrinsicBounds(
R.drawable.ic_permission_approved, 0, 0, 0);
}
- mPhoneStoragePermissionButton = (Button) findViewById(R.id.phone_storage_permission_button);
+ mPhoneStoragePermissionButton = findViewById(R.id.phone_storage_permission_button);
- mOutputTextView = (TextView) findViewById(R.id.output);
+ mOutputTextView = findViewById(R.id.output);
if (mPhoneRequestingWearSensorPermission) {
launchPermissionDialogForPhone();
}
-
-
- mGoogleApiClient = new GoogleApiClient.Builder(this)
- .addApi(Wearable.API)
- .addConnectionCallbacks(this)
- .addOnConnectionFailedListener(this)
- .build();
}
public void onClickWearBodySensors(View view) {
@@ -175,23 +159,42 @@ public class MainWearActivity extends Activity implements
protected void onPause() {
Log.d(TAG, "onPause()");
super.onPause();
- if ((mGoogleApiClient != null) && mGoogleApiClient.isConnected()) {
- Wearable.CapabilityApi.removeCapabilityListener(
- mGoogleApiClient,
- this,
- Constants.CAPABILITY_PHONE_APP);
- Wearable.MessageApi.removeListener(mGoogleApiClient, this);
- mGoogleApiClient.disconnect();
- }
+
+ Wearable.getMessageClient(this).removeListener(this);
+ Wearable.getCapabilityClient(this).removeListener(this);
}
+
@Override
protected void onResume() {
Log.d(TAG, "onResume()");
super.onResume();
- if (mGoogleApiClient != null) {
- 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.getMessageClient(this).addListener(this);
+ Wearable.getCapabilityClient(this).addListener(
+ this, Constants.CAPABILITY_PHONE_APP);
+
+ // Initial check of capabilities to find the phone.
+ Task<CapabilityInfo> capabilityInfoTask = Wearable.getCapabilityClient(this)
+ .getCapability(Constants.CAPABILITY_PHONE_APP, CapabilityClient.FILTER_REACHABLE);
+
+ capabilityInfoTask.addOnCompleteListener(new OnCompleteListener<CapabilityInfo>() {
+ @Override
+ public void onComplete(Task<CapabilityInfo> task) {
+
+ if (task.isSuccessful()) {
+ Log.d(TAG, "Capability request succeeded.");
+
+ CapabilityInfo capabilityInfo = task.getResult();
+ mPhoneNodeId = pickBestNodeId(capabilityInfo.getNodes());
+
+ } else {
+ Log.d(TAG, "Capability request failed to return any results.");
+ }
+ }
+ });
// Enables app to handle 23+ (M+) style permissions.
mWearBodySensorsPermissionApproved =
@@ -218,51 +221,6 @@ public class MainWearActivity extends Activity implements
}
}
-
- @Override
- public void onConnected(Bundle bundle) {
- Log.d(TAG, "onConnected()");
-
- // Set up listeners for capability and message changes.
- Wearable.CapabilityApi.addCapabilityListener(
- mGoogleApiClient,
- this,
- Constants.CAPABILITY_PHONE_APP);
- Wearable.MessageApi.addListener(mGoogleApiClient, this);
-
- // Initial check of capabilities to find the phone.
- PendingResult<CapabilityApi.GetCapabilityResult> pendingResult =
- Wearable.CapabilityApi.getCapability(
- mGoogleApiClient,
- Constants.CAPABILITY_PHONE_APP,
- CapabilityApi.FILTER_REACHABLE);
-
- pendingResult.setResultCallback(new ResultCallback<CapabilityApi.GetCapabilityResult>() {
- @Override
- public void onResult(CapabilityApi.GetCapabilityResult getCapabilityResult) {
-
- if (getCapabilityResult.getStatus().isSuccess()) {
- CapabilityInfo capabilityInfo = getCapabilityResult.getCapability();
- mPhoneNodeId = pickBestNodeId(capabilityInfo.getNodes());
-
- } else {
- Log.d(TAG, "Failed CapabilityApi result: "
- + getCapabilityResult.getStatus());
- }
- }
- });
- }
-
- @Override
- public void onConnectionSuspended(int i) {
- Log.d(TAG, "onConnectionSuspended(): connection to location client suspended");
- }
-
- @Override
- public void onConnectionFailed(ConnectionResult connectionResult) {
- Log.e(TAG, "onConnectionFailed(): connection to location client failed");
- }
-
public void onCapabilityChanged(CapabilityInfo capabilityInfo) {
Log.d(TAG, "onCapabilityChanged(): " + capabilityInfo);
@@ -274,7 +232,7 @@ public class MainWearActivity extends Activity implements
*/
@Override
public void onRequestPermissionsResult(
- int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ int requestCode, String[] permissions, int[] grantResults) {
String permissionResult = "Request code: " + requestCode + ", Permissions: " + permissions
+ ", Results: " + grantResults;
@@ -377,27 +335,21 @@ public class MainWearActivity extends Activity implements
Log.d(TAG, "sendMessage(): " + mPhoneNodeId);
if (mPhoneNodeId != null) {
+ // Clients are inexpensive to create, so in this case we aren't creating member variables.
+ // (They are cached and shared between GoogleApi instances.)
+ Task<Integer> sendMessageTask = Wearable.getMessageClient(this)
+ .sendMessage(mPhoneNodeId, Constants.MESSAGE_PATH_PHONE, dataMap.toByteArray());
- PendingResult<MessageApi.SendMessageResult> pendingResult =
- Wearable.MessageApi.sendMessage(
- mGoogleApiClient,
- mPhoneNodeId,
- Constants.MESSAGE_PATH_PHONE,
- dataMap.toByteArray());
-
- pendingResult.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
+ sendMessageTask.addOnCompleteListener(new OnCompleteListener<Integer>() {
@Override
- public void onResult(MessageApi.SendMessageResult sendMessageResult) {
-
- if (!sendMessageResult.getStatus().isSuccess()) {
- updatePhoneButtonOnUiThread();
- logToUi("Sending message failed.");
-
+ public void onComplete(Task<Integer> task) {
+ if (task.isSuccessful()) {
+ Log.d(TAG, "Message sent successfully");
} else {
- Log.d(TAG, "Message sent successfully.");
+ Log.d(TAG, "Message failed.");
}
}
- }, Constants.CONNECTION_TIME_OUT_MS, TimeUnit.SECONDS);
+ });
} else {
// Unable to retrieve node with proper capability
@@ -485,11 +437,11 @@ public class MainWearActivity extends Activity implements
}
@Override
- public AmbientMode.AmbientCallback getAmbientCallback() {
+ public AmbientModeSupport.AmbientCallback getAmbientCallback() {
return new MyAmbientCallback();
}
- private class MyAmbientCallback extends AmbientMode.AmbientCallback {
+ private class MyAmbientCallback extends AmbientModeSupport.AmbientCallback {
/** Prepares the UI for ambient mode. */
@Override
public void onEnterAmbient(Bundle ambientDetails) {
@@ -568,4 +520,4 @@ public class MainWearActivity extends Activity implements
});
}
}
-} \ No newline at end of file
+}
diff --git a/wearable/wear/RuntimePermissionsWear/template-params.xml b/wearable/wear/RuntimePermissionsWear/template-params.xml
index 0a1863c7..df3850e4 100644
--- a/wearable/wear/RuntimePermissionsWear/template-params.xml
+++ b/wearable/wear/RuntimePermissionsWear/template-params.xml
@@ -32,10 +32,10 @@
<has_handheld_app>true</has_handheld_app>
</wearable>
- <dependency>com.android.support:appcompat-v7:27.1,0</dependency>
- <dependency>com.android.support:design:27.1.0</dependency>
+ <dependency>com.android.support:appcompat-v7:27.1.1</dependency>
+ <dependency>com.android.support:design:27.1.1</dependency>
- <dependency_wearable>com.android.support:wear:27.1.0</dependency_wearable>
+ <dependency_wearable>com.android.support:wear:27.1.1</dependency_wearable>
<strings>
<intro>