1 /* 2 * Copyright 2015 Google Inc. All rights reserved. 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.xyztouristattractions.service; 18 19 import android.app.Notification; 20 import android.app.PendingIntent; 21 import android.content.Intent; 22 import android.graphics.Bitmap; 23 import android.net.Uri; 24 import android.support.v4.app.NotificationCompat; 25 import android.support.v4.app.NotificationManagerCompat; 26 import android.util.Log; 27 28 import com.example.android.xyztouristattractions.R; 29 import com.example.android.xyztouristattractions.common.Constants; 30 import com.example.android.xyztouristattractions.common.Utils; 31 import com.example.android.xyztouristattractions.ui.AttractionsActivity; 32 import com.google.android.gms.common.ConnectionResult; 33 import com.google.android.gms.common.api.GoogleApiClient; 34 import com.google.android.gms.wearable.DataEvent; 35 import com.google.android.gms.wearable.DataEventBuffer; 36 import com.google.android.gms.wearable.DataMap; 37 import com.google.android.gms.wearable.DataMapItem; 38 import com.google.android.gms.wearable.MessageEvent; 39 import com.google.android.gms.wearable.Wearable; 40 import com.google.android.gms.wearable.WearableListenerService; 41 42 import java.util.ArrayList; 43 import java.util.concurrent.TimeUnit; 44 45 /** 46 * A Wear listener service, used to receive inbound messages from 47 * other devices. 48 */ 49 public class ListenerService extends WearableListenerService { 50 private static final String TAG = ListenerService.class.getSimpleName(); 51 52 @Override 53 public void onDataChanged(DataEventBuffer dataEvents) { 54 Log.d(TAG, "onDataChanged: " + dataEvents); 55 56 for (DataEvent event : dataEvents) { 57 if (event.getType() == DataEvent.TYPE_CHANGED 58 && event.getDataItem() != null 59 && Constants.ATTRACTION_PATH.equals(event.getDataItem().getUri().getPath())) { 60 61 DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); 62 ArrayList<DataMap> attractionsData = 63 dataMapItem.getDataMap().getDataMapArrayList(Constants.EXTRA_ATTRACTIONS); 64 showNotification(dataMapItem.getUri(), attractionsData); 65 } 66 } 67 } 68 69 @Override 70 public void onMessageReceived(MessageEvent messageEvent) { 71 Log.v(TAG, "onMessageReceived: " + messageEvent); 72 73 if (Constants.CLEAR_NOTIFICATIONS_PATH.equals(messageEvent.getPath())) { 74 // Clear the local notification 75 UtilityService.clearNotification(this); 76 } 77 } 78 79 private void showNotification(Uri attractionsUri, ArrayList<DataMap> attractions) { 80 GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 81 .addApi(Wearable.API) 82 .build(); 83 84 ConnectionResult connectionResult = googleApiClient.blockingConnect( 85 Constants.GOOGLE_API_CLIENT_TIMEOUT_S, TimeUnit.SECONDS); 86 87 if (!connectionResult.isSuccess() || !googleApiClient.isConnected()) { 88 Log.e(TAG, String.format(Constants.GOOGLE_API_CLIENT_ERROR_MSG, 89 connectionResult.getErrorCode())); 90 return; 91 } 92 93 Intent intent = new Intent(this, AttractionsActivity.class); 94 // Pass through the data Uri as an extra 95 intent.putExtra(Constants.EXTRA_ATTRACTIONS_URI, attractionsUri); 96 PendingIntent pendingIntent = 97 PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 98 99 int count = attractions.size(); 100 101 DataMap attraction = attractions.get(0); 102 103 Bitmap bitmap = Utils.loadBitmapFromAsset( 104 googleApiClient, attraction.getAsset(Constants.EXTRA_IMAGE)); 105 106 PendingIntent deletePendingIntent = PendingIntent.getService( 107 this, 0, UtilityService.getClearRemoteNotificationsIntent(this), 0); 108 109 Notification notification = new NotificationCompat.Builder(this) 110 .setContentText(getResources().getQuantityString( 111 R.plurals.attractions_found, count, count)) 112 .setSmallIcon(R.mipmap.ic_launcher) 113 .setDeleteIntent(deletePendingIntent) 114 .addAction(new NotificationCompat.Action.Builder(R.drawable.ic_full_explore, 115 getString(R.string.action_explore), 116 pendingIntent).build()) 117 .extend(new NotificationCompat.WearableExtender() 118 .setBackground(bitmap) 119 ) 120 .build(); 121 122 NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); 123 notificationManager.notify(Constants.WEAR_NOTIFICATION_ID, notification); 124 125 googleApiClient.disconnect(); 126 } 127 } 128