1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.wearable.agendadata;
18 
19 import android.app.IntentService;
20 import android.content.Intent;
21 import android.net.Uri;
22 import android.os.Bundle;
23 import android.support.wearable.activity.ConfirmationActivity;
24 import android.util.Log;
25 
26 import static com.example.android.wearable.agendadata.Constants.TAG;
27 import static com.example.android.wearable.agendadata.Constants.EXTRA_SILENT;
28 
29 import com.google.android.gms.common.ConnectionResult;
30 import com.google.android.gms.common.api.GoogleApiClient;
31 import com.google.android.gms.wearable.DataApi;
32 import com.google.android.gms.wearable.Wearable;
33 
34 import java.util.concurrent.TimeUnit;
35 
36 /**
37  * Handles "Delete" button on calendar event card.
38  */
39 public class DeleteService extends IntentService implements GoogleApiClient.ConnectionCallbacks,
40         GoogleApiClient.OnConnectionFailedListener {
41 
42     /* Timeout for making a connection to GoogleApiClient (in milliseconds) */
43     private static final long TIME_OUT = 100;
44 
45     private GoogleApiClient mGoogleApiClient;
46 
DeleteService()47     public DeleteService() {
48         super(DeleteService.class.getSimpleName());
49     }
50 
51     @Override
onCreate()52     public void onCreate() {
53         super.onCreate();
54         mGoogleApiClient = new GoogleApiClient.Builder(this)
55                 .addApi(Wearable.API)
56                 .addConnectionCallbacks(this)
57                 .addOnConnectionFailedListener(this)
58                 .build();
59     }
60 
61     @Override
onHandleIntent(Intent intent)62     protected void onHandleIntent(Intent intent) {
63         mGoogleApiClient.blockingConnect(TIME_OUT, TimeUnit.MILLISECONDS);
64         Uri dataItemUri = intent.getData();
65         if (Log.isLoggable(TAG, Log.VERBOSE)) {
66             Log.v(TAG, "DeleteService.onHandleIntent=" + dataItemUri);
67         }
68         if (mGoogleApiClient.isConnected()) {
69             DataApi.DeleteDataItemsResult result = Wearable.DataApi
70                     .deleteDataItems(mGoogleApiClient, dataItemUri).await();
71             if (result.getStatus().isSuccess() && !intent.getBooleanExtra(EXTRA_SILENT, false)) {
72                 // Show the success animation on the watch unless Silent extra is true.
73                 startConfirmationActivity(ConfirmationActivity.SUCCESS_ANIMATION,
74                                           getString(R.string.delete_successful));
75             } else {
76                 if (Log.isLoggable(TAG, Log.VERBOSE)) {
77                     Log.v(TAG, "DeleteService.onHandleIntent: Failed to delete dataItem:"
78                             + dataItemUri);
79                 }
80                 // Show the failure animation on the watch unless Silent extra is true.
81                 if (!intent.getBooleanExtra(EXTRA_SILENT, false)) {
82                     startConfirmationActivity(ConfirmationActivity.FAILURE_ANIMATION,
83                                               getString(R.string.delete_unsuccessful));
84                 }
85             }
86         } else {
87             Log.e(TAG, "Failed to delete data item: " + dataItemUri
88                     + " - Client disconnected from Google Play Services");
89             // Show the failure animation on the watch unless Silent extra is true.
90             if (!intent.getBooleanExtra(EXTRA_SILENT, false)) {
91                 startConfirmationActivity(ConfirmationActivity.FAILURE_ANIMATION,
92                         getString(R.string.delete_unsuccessful));
93             }
94         }
95         mGoogleApiClient.disconnect();
96     }
97 
startConfirmationActivity(int animationType, String message)98     private void startConfirmationActivity(int animationType, String message) {
99         Intent confirmationActivity = new Intent(this, ConfirmationActivity.class)
100                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION)
101                 .putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE, animationType)
102                 .putExtra(ConfirmationActivity.EXTRA_MESSAGE, message);
103         startActivity(confirmationActivity);
104     }
105 
106     @Override
onConnected(Bundle connectionHint)107     public void onConnected(Bundle connectionHint) {
108         if (Log.isLoggable(TAG, Log.DEBUG)) {
109             Log.d(TAG, "onConnected: " + connectionHint);
110         }
111     }
112 
113     @Override
onConnectionSuspended(int cause)114     public void onConnectionSuspended(int cause) {
115         if (Log.isLoggable(TAG, Log.DEBUG)) {
116             Log.d(TAG, "onConnectionSuspended: " + cause);
117         }
118     }
119 
120     @Override
onConnectionFailed(ConnectionResult result)121     public void onConnectionFailed(ConnectionResult result) {
122         if (Log.isLoggable(TAG, Log.DEBUG)) {
123             Log.d(TAG, "onConnectionFailed: " + result);
124         }
125     }
126 
127 }
128