Java tutorial
/* * Copyright 2015 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.asalfo.wiulgi.service; import android.app.IntentService; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.location.Location; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.asalfo.wiulgi.util.Constants; import com.asalfo.wiulgi.util.Utils; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.gcm.TaskParams; import com.google.android.gms.location.FusedLocationProviderApi; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import com.google.android.gms.maps.model.LatLng; import java.util.concurrent.TimeUnit; import static com.google.android.gms.location.LocationServices.FusedLocationApi; /** * A utility IntentService, used for a variety of asynchronous background * operations that do not necessarily need to be tied to a UI. */ public class UtilityService extends IntentService { private static final String TAG = UtilityService.class.getSimpleName(); private static final String ACTION_LOCATION_UPDATED = "location_updated"; private static final String ACTION_REQUEST_LOCATION = "request_location"; private static final String ACTION_RECOMMENDATIONS = "request_recommendations"; public UtilityService() { super(TAG); } @NonNull public static IntentFilter getLocationUpdatedIntentFilter() { return new IntentFilter(UtilityService.ACTION_LOCATION_UPDATED); } public static void requestLocation(@NonNull Context context) { Intent intent = new Intent(context, UtilityService.class); intent.setAction(UtilityService.ACTION_REQUEST_LOCATION); context.startService(intent); } public static void requestRecommendation(@NonNull Context context) { Intent intent = new Intent(context, UtilityService.class); intent.putExtra(Constants.TAG, Constants.INIT); intent.setAction(UtilityService.ACTION_RECOMMENDATIONS); context.startService(intent); } @Override protected void onHandleIntent(@Nullable Intent intent) { String action = intent != null ? intent.getAction() : null; if (ACTION_REQUEST_LOCATION.equals(action)) { requestLocationInternal(); } else if (ACTION_LOCATION_UPDATED.equals(action)) { locationUpdated(intent); } else if (ACTION_RECOMMENDATIONS.equals(action)) { RecommendationTaskService recommendationTaskService = new RecommendationTaskService(this); recommendationTaskService.onRunTask(new TaskParams(intent.getStringExtra(Constants.TAG), new Bundle())); } } /** * Called when a location update is requested */ private void requestLocationInternal() { Log.v(TAG, ACTION_REQUEST_LOCATION); if (!Utils.checkFineLocationPermission(this)) { return; } GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this).addApi(LocationServices.API).build(); // It's OK to use blockingConnect() here as we are running in an // IntentService that executes work on a separate (background) thread. ConnectionResult connectionResult = googleApiClient.blockingConnect(Constants.GOOGLE_API_CLIENT_TIMEOUT_S, TimeUnit.SECONDS); if (connectionResult.isSuccess() && googleApiClient.isConnected()) { Intent locationUpdatedIntent = new Intent(this, UtilityService.class); locationUpdatedIntent.setAction(ACTION_LOCATION_UPDATED); // Send last known location out first if available Location location = FusedLocationApi.getLastLocation(googleApiClient); if (location != null) { Intent lastLocationIntent = new Intent(locationUpdatedIntent); lastLocationIntent.putExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED, location); startService(lastLocationIntent); } // Request new location LocationRequest mLocationRequest = new LocationRequest() .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); FusedLocationApi.requestLocationUpdates(googleApiClient, mLocationRequest, PendingIntent.getService(this, 0, locationUpdatedIntent, 0)); googleApiClient.disconnect(); } else { Log.e(TAG, String.format(Constants.GOOGLE_API_CLIENT_ERROR_MSG, connectionResult.getErrorCode())); } } /** * Called when the location has been updated */ private void locationUpdated(@NonNull Intent intent) { Log.v(TAG, ACTION_LOCATION_UPDATED); // Extra new location Location location = intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED); if (location != null) { LatLng latLngLocation = new LatLng(location.getLatitude(), location.getLongitude()); // Store in a local preference as well Utils.storeLocation(this, latLngLocation); // Send a local broadcast so if an Activity is open it can respond // to the updated location LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } } private void syncRecommendations(Intent intent) { } }