/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.wearable.geofencing; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.wearable.DataApi; import com.google.android.gms.wearable.Wearable; import android.app.IntentService; import android.app.NotificationManager; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.wearable.activity.ConfirmationActivity; import android.util.Log; import java.util.concurrent.TimeUnit; import static com.example.android.wearable.geofencing.Constants.ACTION_CHECK_IN; import static com.example.android.wearable.geofencing.Constants.ACTION_DELETE_DATA_ITEM; import static com.example.android.wearable.geofencing.Constants.CONNECTION_TIME_OUT_MS; import static com.example.android.wearable.geofencing.Constants.NOTIFICATION_ID; import static com.example.android.wearable.geofencing.Constants.TAG; /** * Handles "Check In" action on the location-based notification. Also deletes orphan DataItems * when a notification is dismissed from the wearable. */ public class CheckInAndDeleteDataItemsService extends IntentService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private GoogleApiClient mGoogleApiClient; public CheckInAndDeleteDataItemsService() { super(CheckInAndDeleteDataItemsService.class.getSimpleName()); } @Override public void onCreate() { super.onCreate(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); } @Override protected void onHandleIntent(Intent intent) { if (ACTION_CHECK_IN.equals(intent.getAction())) { // In a real app, code for checking in would go here. For this sample, we will simply // display a success animation. startConfirmationActivity(ConfirmationActivity.SUCCESS_ANIMATION, getString(R.string.check_in_success)); // Dismiss the check-in notification. ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).cancel(NOTIFICATION_ID); } else if (!ACTION_DELETE_DATA_ITEM.equals(intent.getAction())) { // The only possible actions should be checking in or dismissing the notification // (which causes an intent with ACTION_DELETE_DATA_ITEM). Log.e(TAG, "Unrecognized action: " + intent.getAction()); return; } // Regardless of the action, delete the DataItem (we are only be handling intents // if the notification is dismissed or if the user has chosen to check in, either of which // would be completed at this point). mGoogleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); Uri dataItemUri = intent.getData(); if (mGoogleApiClient.isConnected()) { DataApi.DeleteDataItemsResult result = Wearable.DataApi .deleteDataItems(mGoogleApiClient, dataItemUri).await(); if (!result.getStatus().isSuccess()) { Log.e(TAG, "CheckInAndDeleteDataItemsService.onHandleIntent: " + "Failed to delete dataItem: " + dataItemUri); } else if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "Successfully deleted data item: " + dataItemUri); } } else { Log.e(TAG, "Failed to delete data item: " + dataItemUri + " - Client disconnected from Google Play Services"); } mGoogleApiClient.disconnect(); } /** * Helper method to create confirmation animations on the wearable. * @param animationType Defined by constants in ConfirmationActivity. * @param message The message to display with the animation. */ private void startConfirmationActivity(int animationType, String message) { Intent confirmationActivity = new Intent(this, ConfirmationActivity.class) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION) .putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE, animationType) .putExtra(ConfirmationActivity.EXTRA_MESSAGE, message); startActivity(confirmationActivity); } @Override public void onConnected(Bundle connectionHint) { } @Override public void onConnectionSuspended(int cause) { } @Override public void onConnectionFailed(ConnectionResult result) { } }