• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.contacts.common.location;
2 
3 import android.app.IntentService;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.content.SharedPreferences;
7 import android.content.SharedPreferences.Editor;
8 import android.location.Address;
9 import android.location.Geocoder;
10 import android.location.Location;
11 import android.preference.PreferenceManager;
12 import android.util.Log;
13 
14 import java.io.IOException;
15 import java.util.List;
16 
17 /**
18  * Service used to perform asynchronous geocoding from within a broadcast receiver. Given a
19  * {@link Location}, convert it into a country code, and save it in shared preferences.
20  */
21 public class UpdateCountryService extends IntentService {
22     private static final String TAG = UpdateCountryService.class.getSimpleName();
23 
24     private static final String ACTION_UPDATE_COUNTRY = "saveCountry";
25 
26     private static final String KEY_INTENT_LOCATION = "location";
27 
UpdateCountryService()28     public UpdateCountryService() {
29         super(TAG);
30     }
31 
updateCountry(Context context, Location location)32     public static void updateCountry(Context context, Location location) {
33         final Intent serviceIntent = new Intent(context, UpdateCountryService.class);
34         serviceIntent.setAction(ACTION_UPDATE_COUNTRY);
35         serviceIntent.putExtra(UpdateCountryService.KEY_INTENT_LOCATION, location);
36         context.startService(serviceIntent);
37     }
38 
39     @Override
onHandleIntent(Intent intent)40     protected void onHandleIntent(Intent intent) {
41         if (intent == null) {
42             Log.d(TAG, "onHandleIntent: could not handle null intent");
43             return;
44         }
45         if (ACTION_UPDATE_COUNTRY.equals(intent.getAction())) {
46             final Location location = (Location) intent.getParcelableExtra(KEY_INTENT_LOCATION);
47             final String country = getCountryFromLocation(getApplicationContext(), location);
48 
49             if (country == null) {
50                 return;
51             }
52 
53             final SharedPreferences prefs =
54                     PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
55 
56             final Editor editor = prefs.edit();
57             editor.putLong(CountryDetector.KEY_PREFERENCE_TIME_UPDATED,
58                     System.currentTimeMillis());
59             editor.putString(CountryDetector.KEY_PREFERENCE_CURRENT_COUNTRY, country);
60             editor.commit();
61         }
62     }
63 
64     /**
65      * Given a {@link Location}, return a country code.
66      *
67      * @return the ISO 3166-1 two letter country code
68      */
getCountryFromLocation(Context context, Location location)69     private String getCountryFromLocation(Context context, Location location) {
70         final Geocoder geocoder = new Geocoder(context);
71         String country = null;
72         try {
73             final List<Address> addresses = geocoder.getFromLocation(
74                     location.getLatitude(), location.getLongitude(), 1);
75             if (addresses != null && addresses.size() > 0) {
76                 country = addresses.get(0).getCountryCode();
77             }
78         } catch (IOException e) {
79             Log.w(TAG, "Exception occurred when getting geocoded country from location");
80         }
81         return country;
82     }
83 }
84