diff options
author | Jeremy Walker <jewalker@google.com> | 2018-06-19 14:07:57 -0700 |
---|---|---|
committer | Jeremy Walker <jewalker@google.com> | 2018-06-21 16:35:46 -0700 |
commit | 06252b0ffb825aae676dfc6a57bb53b6a60a67a9 (patch) | |
tree | a0aa0a2e6c931c288741fd358cc55d722bc0edfd /wearable/wear/RuntimePermissionsWear | |
parent | 8bd2d438399dd6a7090d5513536f004c2594ebe5 (diff) | |
download | android-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')
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> |