diff options
-rw-r--r-- | core/java/android/app/SearchDialog.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index 1ff5665..aaaf7bf 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -33,6 +33,11 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; +import android.location.Criteria; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.LocationProvider; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; @@ -145,6 +150,15 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS private final WeakHashMap<String, Drawable> mOutsideDrawablesCache = new WeakHashMap<String, Drawable>(); + // Objects we keep around for requesting location updates when the dialog is started + // (and canceling them when the dialog is stopped). We don't actually make use of the + // updates ourselves here, so the LocationListener is just a dummy which doesn't do + // anything. We only do this here so that other suggest providers which wish to provide + // location-based suggestions are more likely to get a good fresh location. + private LocationManager mLocationManager; + private LocationProvider mLocationProvider; + private LocationListener mDummyLocationListener; + /** * Constructor - fires it up and makes it look like the search UI. * @@ -221,6 +235,37 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); + + mLocationManager = + (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); + + if (mLocationManager != null) { + Criteria criteria = new Criteria(); + criteria.setAccuracy(Criteria.ACCURACY_COARSE); + + String providerName = mLocationManager.getBestProvider(criteria, true); + + if (providerName != null) { + mLocationProvider = mLocationManager.getProvider(providerName); + } + + // Just a dumb listener that doesn't do anything - requesting location updates here + // is only intended to give location-based suggestion providers the best chance + // of getting a good fresh location. + mDummyLocationListener = new LocationListener() { + public void onLocationChanged(Location location) { + } + + public void onProviderDisabled(String provider) { + } + + public void onProviderEnabled(String provider) { + } + + public void onStatusChanged(String provider, int status, Bundle extras) { + } + }; + } } /** @@ -363,6 +408,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // receive broadcasts getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter); getContext().registerReceiver(mBroadcastReceiver, mPackageFilter); + + startLocationUpdates(); } /** @@ -375,6 +422,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS public void onStop() { super.onStop(); + stopLocationUpdates(); + // TODO: Removing the listeners means that they never get called, since // Dialog.dismissDialog() calls onStop() before sendDismissMessage(). setOnCancelListener(null); @@ -399,6 +448,25 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } /** + * Asks the LocationManager for location updates so that it goes and gets a fresh location + * if needed. + */ + private void startLocationUpdates() { + if (mLocationManager != null && mLocationProvider != null) { + mLocationManager.requestLocationUpdates(mLocationProvider.getName(), + 0, 0, mDummyLocationListener, getContext().getMainLooper()); + } + + } + + /** + * Makes sure to stop listening for location updates to save battery. + */ + private void stopLocationUpdates() { + mLocationManager.removeUpdates(mDummyLocationListener); + } + + /** * Sets the search dialog to the 'working' state, which shows a working spinner in the * right hand size of the text field. * |