/* * Copyright (C) 2014 Google Inc. All Rights Reserved. * * 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.speedtracker.db; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.wearable.DataApi; import com.google.android.gms.wearable.DataEvent; import com.google.android.gms.wearable.DataEventBuffer; import com.google.android.gms.wearable.DataMap; import com.google.android.gms.wearable.DataMapItem; import com.google.android.gms.wearable.Wearable; import com.google.android.gms.wearable.WearableListenerService; import android.net.Uri; import android.os.Bundle; import android.util.Log; import com.example.android.wearable.speedtracker.LocationDataManager; import com.example.android.wearable.speedtracker.PhoneApplication; import com.example.android.wearable.speedtracker.common.Constants; import com.example.android.wearable.speedtracker.common.LocationEntry; import java.util.Calendar; import java.util.HashSet; import java.util.Set; /** * A {@link com.google.android.gms.wearable.WearableListenerService} that is responsible for * reading location data that gets added to the Data Layer storage. */ public class UpdateService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback { private static final String TAG = "UpdateService"; private LocationDataManager mDataManager; private GoogleApiClient mGoogleApiClient; private final Set mToBeDeletedUris = new HashSet(); public static final String ACTION_NOTIFY = "com.example.android.wearable.speedtracker.Message"; public static final String EXTRA_ENTRY = "entry"; public static final String EXTRA_LOG = "log"; @Override public void onCreate() { super.onCreate(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); mGoogleApiClient.connect(); mDataManager = ((PhoneApplication) getApplicationContext()).getDataManager(); } @Override public void onDataChanged(DataEventBuffer dataEvents) { for (DataEvent dataEvent : dataEvents) { if (dataEvent.getType() == DataEvent.TYPE_CHANGED) { Uri dataItemUri = dataEvent.getDataItem().getUri(); if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "Received a data item with uri: " + dataItemUri.getPath()); } if (dataItemUri.getPath().startsWith(Constants.PATH)) { DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()) .getDataMap(); double longitude = dataMap.getDouble(Constants.KEY_LONGITUDE); double latitude = dataMap.getDouble(Constants.KEY_LATITUDE); long time = dataMap.getLong(Constants.KEY_TIME); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); mDataManager.addPoint( new LocationEntry(calendar, latitude, longitude)); if (mGoogleApiClient.isConnected()) { Wearable.DataApi.deleteDataItems( mGoogleApiClient, dataItemUri).setResultCallback(this); } else { synchronized (mToBeDeletedUris) { mToBeDeletedUris.add(dataItemUri); } } } } } } @Override // ConnectionCallbacks public void onConnected(Bundle bundle) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "onConnected(): api client is connected now"); } synchronized (mToBeDeletedUris) { if (!mToBeDeletedUris.isEmpty()) { for (Uri dataItemUri : mToBeDeletedUris) { Wearable.DataApi.deleteDataItems( mGoogleApiClient, dataItemUri).setResultCallback(this); } } } } @Override // ConnectionCallbacks public void onConnectionSuspended(int i) { } @Override // OnConnectionFailedListener public void onConnectionFailed(ConnectionResult connectionResult) { Log.e(TAG, "Failed to connect to the Google API client"); } @Override // ResultCallback public void onResult(DataApi.DeleteDataItemsResult deleteDataItemsResult) { if (!deleteDataItemsResult.getStatus().isSuccess()) { Log.e(TAG, "Failed to delete a dataItem, status code: " + deleteDataItemsResult.getStatus() .getStatusCode() + deleteDataItemsResult.getStatus() .getStatusMessage()); } } }