diff --git a/samples/browseable/AgendaData/Application/src/com.example.android.wearable.agendadata/CalendarQueryService.java b/samples/browseable/AgendaData/Application/src/com.example.android.wearable.agendadata/CalendarQueryService.java index c39a5ed1b..9d65b7e01 100644 --- a/samples/browseable/AgendaData/Application/src/com.example.android.wearable.agendadata/CalendarQueryService.java +++ b/samples/browseable/AgendaData/Application/src/com.example.android.wearable.agendadata/CalendarQueryService.java @@ -250,6 +250,11 @@ public class CalendarQueryService extends IntentService public PutDataMapRequest toPutDataMapRequest(){ final PutDataMapRequest putDataMapRequest = PutDataMapRequest.create( makeDataItemPath(eventId, begin)); + /* In most cases (as in this one), you don't need your DataItem appear instantly. By + default, delivery of normal DataItems to the Wear network might be delayed in order to + improve battery life for user devices. However, if you can't tolerate a delay in the + sync of your DataItems, you can mark them as urgent via setUrgent(). + */ DataMap data = putDataMapRequest.getDataMap(); data.putString(DATA_ITEM_URI, putDataMapRequest.getUri().toString()); data.putLong(ID, id); diff --git a/samples/browseable/Camera2Basic/src/com.example.android.camera2basic/Camera2BasicFragment.java b/samples/browseable/Camera2Basic/src/com.example.android.camera2basic/Camera2BasicFragment.java index c2b99bc4f..747d8d83b 100644 --- a/samples/browseable/Camera2Basic/src/com.example.android.camera2basic/Camera2BasicFragment.java +++ b/samples/browseable/Camera2Basic/src/com.example.android.camera2basic/Camera2BasicFragment.java @@ -48,6 +48,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.support.annotation.NonNull; import android.support.v13.app.FragmentCompat; +import android.support.v4.content.ContextCompat; import android.util.Log; import android.util.Size; import android.util.SparseIntArray; @@ -269,6 +270,11 @@ public class Camera2BasicFragment extends Fragment */ private Semaphore mCameraOpenCloseLock = new Semaphore(1); + /** + * Whether the current camera device supports Flash or not. + */ + private boolean mFlashSupported; + /** * A {@link CameraCaptureSession.CaptureCallback} that handles events related to JPEG capture. */ @@ -568,6 +574,10 @@ public class Camera2BasicFragment extends Fragment mPreviewSize.getHeight(), mPreviewSize.getWidth()); } + // Check if the flash is supported. + Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); + mFlashSupported = available == null ? false : available; + mCameraId = cameraId; return; } @@ -585,7 +595,7 @@ public class Camera2BasicFragment extends Fragment * Opens the camera specified by {@link Camera2BasicFragment#mCameraId}. */ private void openCamera(int width, int height) { - if (getActivity().checkSelfPermission(Manifest.permission.CAMERA) + if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestCameraPermission(); return; @@ -691,8 +701,7 @@ public class Camera2BasicFragment extends Fragment mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); // Flash is automatically enabled when necessary. - mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, - CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); + setAutoFlash(mPreviewRequestBuilder); // Finally, we start displaying the camera preview. mPreviewRequest = mPreviewRequestBuilder.build(); @@ -808,8 +817,7 @@ public class Camera2BasicFragment extends Fragment // Use the same AE and AF modes as the preview. captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); - captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, - CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); + setAutoFlash(captureBuilder); // Orientation int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); @@ -844,8 +852,7 @@ public class Camera2BasicFragment extends Fragment // Reset the auto-focus trigger mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); - mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, - CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); + setAutoFlash(mPreviewRequestBuilder); mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); // After this, the camera will go back to the normal state of preview. @@ -877,6 +884,13 @@ public class Camera2BasicFragment extends Fragment } } + private void setAutoFlash(CaptureRequest.Builder requestBuilder) { + if (mFlashSupported) { + requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, + CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); + } + } + /** * Saves a JPEG {@link Image} into the specified {@link File}. */ diff --git a/samples/browseable/DataLayer/Application/src/com.example.android.wearable.datalayer/MainActivity.java b/samples/browseable/DataLayer/Application/src/com.example.android.wearable.datalayer/MainActivity.java index 1c67c0e03..e559db683 100644 --- a/samples/browseable/DataLayer/Application/src/com.example.android.wearable.datalayer/MainActivity.java +++ b/samples/browseable/DataLayer/Application/src/com.example.android.wearable.datalayer/MainActivity.java @@ -381,7 +381,9 @@ public class MainActivity extends Activity implements DataApi.DataListener, public void run() { PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(COUNT_PATH); putDataMapRequest.getDataMap().putInt(COUNT_KEY, count++); + putDataMapRequest.setUrgent(); PutDataRequest request = putDataMapRequest.asPutDataRequest(); + request.setUrgent(); LOGD(TAG, "Generating DataItem: " + request); if (!mGoogleApiClient.isConnected()) { @@ -442,6 +444,8 @@ public class MainActivity extends Activity implements DataApi.DataListener, dataMap.getDataMap().putAsset(IMAGE_KEY, asset); dataMap.getDataMap().putLong("time", new Date().getTime()); PutDataRequest request = dataMap.asPutDataRequest(); + request.setUrgent(); + Wearable.DataApi.putDataItem(mGoogleApiClient, request) .setResultCallback(new ResultCallback() { @Override diff --git a/samples/browseable/DisplayingBitmaps/res/layout/image_detail_fragment.xml b/samples/browseable/DisplayingBitmaps/res/layout/image_detail_fragment.xml index 97ac520cc..d8bd2f705 100644 --- a/samples/browseable/DisplayingBitmaps/res/layout/image_detail_fragment.xml +++ b/samples/browseable/DisplayingBitmaps/res/layout/image_detail_fragment.xml @@ -20,6 +20,7 @@ android:layout_height="fill_parent" > { private Object mData; private final WeakReference imageViewReference; + private final OnImageLoadedListener mOnImageLoadedListener; public BitmapWorkerTask(Object data, ImageView imageView) { mData = data; imageViewReference = new WeakReference(imageView); + mOnImageLoadedListener = null; + } + + public BitmapWorkerTask(Object data, ImageView imageView, OnImageLoadedListener listener) { + mData = data; + imageViewReference = new WeakReference(imageView); + mOnImageLoadedListener = listener; } /** @@ -318,6 +345,7 @@ public abstract class ImageWorker { @Override protected void onPostExecute(BitmapDrawable value) { //BEGIN_INCLUDE(complete_background_work) + boolean success = false; // if cancel was called on this task or the "exit early" flag is set then we're done if (isCancelled() || mExitTasksEarly) { value = null; @@ -328,8 +356,12 @@ public abstract class ImageWorker { if (BuildConfig.DEBUG) { Log.d(TAG, "onPostExecute - setting bitmap"); } + success = true; setImageDrawable(imageView, value); } + if (mOnImageLoadedListener != null) { + mOnImageLoadedListener.onImageLoaded(success); + } //END_INCLUDE(complete_background_work) } @@ -357,6 +389,19 @@ public abstract class ImageWorker { } } + /** + * Interface definition for callback on image loaded successfully. + */ + public interface OnImageLoadedListener { + + /** + * Called once the image has been loaded. + * @param success True if the image was loaded successfully, false if + * there was an error. + */ + void onImageLoaded(boolean success); + } + /** * A custom Drawable that will be attached to the imageView while the work is in progress. * Contains a reference to the actual worker task, so that it can be stopped if a new binding is diff --git a/samples/browseable/FindMyPhone/Wearable/src/com.example.android.wearable.findphone/FindPhoneService.java b/samples/browseable/FindMyPhone/Wearable/src/com.example.android.wearable.findphone/FindPhoneService.java index c6c6d67b5..a51a9b20e 100644 --- a/samples/browseable/FindMyPhone/Wearable/src/com.example.android.wearable.findphone/FindPhoneService.java +++ b/samples/browseable/FindMyPhone/Wearable/src/com.example.android.wearable.findphone/FindPhoneService.java @@ -100,6 +100,7 @@ public class FindPhoneService extends IntentService implements GoogleApiClient.C // when it receives the change. PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(PATH_SOUND_ALARM); putDataMapRequest.getDataMap().putBoolean(FIELD_ALARM_ON, alarmOn); + putDataMapRequest.setUrgent(); Wearable.DataApi.putDataItem(mGoogleApiClient, putDataMapRequest.asPutDataRequest()) .await(); } else { diff --git a/samples/browseable/Geofencing/Application/src/com.example.android.wearable.geofencing/GeofenceTransitionsIntentService.java b/samples/browseable/Geofencing/Application/src/com.example.android.wearable.geofencing/GeofenceTransitionsIntentService.java index 53117e3a0..e3f61392b 100644 --- a/samples/browseable/Geofencing/Application/src/com.example.android.wearable.geofencing/GeofenceTransitionsIntentService.java +++ b/samples/browseable/Geofencing/Application/src/com.example.android.wearable.geofencing/GeofenceTransitionsIntentService.java @@ -89,6 +89,7 @@ public class GeofenceTransitionsIntentService extends IntentService final PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(GEOFENCE_DATA_ITEM_PATH); putDataMapRequest.getDataMap().putString(KEY_GEOFENCE_ID, triggeredGeoFenceId); + putDataMapRequest.setUrgent(); if (mGoogleApiClient.isConnected()) { Wearable.DataApi.putDataItem( mGoogleApiClient, putDataMapRequest.asPutDataRequest()).await(); diff --git a/samples/browseable/Quiz/Application/src/com.example.android.wearable.quiz/MainActivity.java b/samples/browseable/Quiz/Application/src/com.example.android.wearable.quiz/MainActivity.java index de8eb7450..d1e2d739b 100644 --- a/samples/browseable/Quiz/Application/src/com.example.android.wearable.quiz/MainActivity.java +++ b/samples/browseable/Quiz/Application/src/com.example.android.wearable.quiz/MainActivity.java @@ -248,7 +248,9 @@ public class MainActivity extends Activity implements DataApi.DataListener, dataMap.putInt(QUESTION_INDEX, questionIndex); dataMap.putStringArray(ANSWERS, answers); dataMap.putInt(CORRECT_ANSWER_INDEX, correctAnswerIndex); - return request.asPutDataRequest(); + PutDataRequest putDataRequest = request.asPutDataRequest(); + putDataRequest.setUrgent(); + return putDataRequest; } } @@ -496,7 +498,10 @@ public class MainActivity extends Activity implements DataApi.DataListener, dataMap.putBoolean(QUESTION_WAS_DELETED, false); if (!mHasQuestionBeenAsked && dataMap.getInt(QUESTION_INDEX) == 0) { // Ask the first question now. - Wearable.DataApi.putDataItem(mGoogleApiClient, request.asPutDataRequest()); + PutDataRequest putDataRequest = request.asPutDataRequest(); + // Set to high priority in case it isn't already. + putDataRequest.setUrgent(); + Wearable.DataApi.putDataItem(mGoogleApiClient, putDataRequest); setHasQuestionBeenAsked(true); } else { // Enqueue future questions. diff --git a/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/DeleteQuestionService.java b/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/DeleteQuestionService.java index 353903cda..d71541100 100644 --- a/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/DeleteQuestionService.java +++ b/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/DeleteQuestionService.java @@ -76,6 +76,7 @@ public class DeleteQuestionService extends IntentService DataMap dataMap = putDataMapRequest.getDataMap(); dataMap.putBoolean(QUESTION_WAS_DELETED, true); PutDataRequest request = putDataMapRequest.asPutDataRequest(); + request.setUrgent(); Wearable.DataApi.putDataItem(mGoogleApiClient, request).await(); mGoogleApiClient.disconnect(); } diff --git a/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/UpdateQuestionService.java b/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/UpdateQuestionService.java index 7b8f730c9..50425b03b 100644 --- a/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/UpdateQuestionService.java +++ b/samples/browseable/Quiz/Wearable/src/com.example.android.wearable.quiz/UpdateQuestionService.java @@ -88,6 +88,7 @@ public class UpdateQuestionService extends IntentService dataMap.putBoolean(CHOSEN_ANSWER_CORRECT, chosenAnswerCorrect); dataMap.putBoolean(QUESTION_WAS_ANSWERED, true); PutDataRequest request = putDataMapRequest.asPutDataRequest(); + request.setUrgent(); Wearable.DataApi.putDataItem(mGoogleApiClient, request).await(); // Remove this question notification. diff --git a/samples/browseable/RuntimePermissionsWear/Application/AndroidManifest.xml b/samples/browseable/RuntimePermissionsWear/Application/AndroidManifest.xml new file mode 100644 index 000000000..861cad3b4 --- /dev/null +++ b/samples/browseable/RuntimePermissionsWear/Application/AndroidManifest.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_file_folder.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_file_folder.png new file mode 100644 index 000000000..8fb69a5a2 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_file_folder.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_hardware_watch.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_hardware_watch.png new file mode 100644 index 000000000..e05cb6ac1 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_hardware_watch.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_permission_approved.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_permission_approved.png new file mode 100644 index 000000000..79893302c Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_permission_approved.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_permission_denied.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_permission_denied.png new file mode 100644 index 000000000..814bb6359 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/ic_permission_denied.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/tile.9.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/tile.9.png new file mode 100644 index 000000000..135862883 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-hdpi/tile.9.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_file_folder.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_file_folder.png new file mode 100644 index 000000000..ef11a064a Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_file_folder.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_hardware_watch.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_hardware_watch.png new file mode 100644 index 000000000..5f5900ee3 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_hardware_watch.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_permission_approved.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_permission_approved.png new file mode 100644 index 000000000..1e63d37c0 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_permission_approved.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_permission_denied.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_permission_denied.png new file mode 100644 index 000000000..45a0d8750 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-mdpi/ic_permission_denied.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_file_folder.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_file_folder.png new file mode 100644 index 000000000..687710301 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_file_folder.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_hardware_watch.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_hardware_watch.png new file mode 100644 index 000000000..7c6773c04 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_hardware_watch.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_permission_approved.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_permission_approved.png new file mode 100644 index 000000000..24d1efbcc Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_permission_approved.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_permission_denied.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_permission_denied.png new file mode 100644 index 000000000..17f093d88 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xhdpi/ic_permission_denied.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_file_folder.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_file_folder.png new file mode 100644 index 000000000..3f2db91bc Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_file_folder.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_hardware_watch.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_hardware_watch.png new file mode 100644 index 000000000..e8a5f7403 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_hardware_watch.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_permission_approved.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_permission_approved.png new file mode 100644 index 000000000..f29c5a341 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_permission_approved.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_permission_denied.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_permission_denied.png new file mode 100644 index 000000000..52b0671f6 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxhdpi/ic_permission_denied.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_file_folder.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_file_folder.png new file mode 100644 index 000000000..de3c50f1c Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_file_folder.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_hardware_watch.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_hardware_watch.png new file mode 100644 index 000000000..8daad4fd9 Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_hardware_watch.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_permission_approved.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_permission_approved.png new file mode 100644 index 000000000..ec642b50d Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_permission_approved.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_permission_denied.png b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_permission_denied.png new file mode 100644 index 000000000..35d6c4fab Binary files /dev/null and b/samples/browseable/RuntimePermissionsWear/Application/res/drawable-xxxhdpi/ic_permission_denied.png differ diff --git a/samples/browseable/RuntimePermissionsWear/Application/res/layout/activity_main.xml b/samples/browseable/RuntimePermissionsWear/Application/res/layout/activity_main.xml new file mode 100644 index 000000000..d35cb0c4f --- /dev/null +++ b/samples/browseable/RuntimePermissionsWear/Application/res/layout/activity_main.xml @@ -0,0 +1,58 @@ + + + + + + + +