Merge change 2170 into donut
* changes: Trigger the LocationManager whenever the SearchDialog is shown (and stop when the SearchDialog is stopped). This way we get a network-based location quickly so that by the time any location- based suggestion provider wants to do suggestions, it's likely to have a good fresh location.
This commit is contained in:
@@ -33,6 +33,11 @@ import android.content.res.Resources;
|
|||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.drawable.AnimationDrawable;
|
import android.graphics.drawable.AnimationDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
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.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
@@ -145,6 +150,15 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
|
|||||||
private final WeakHashMap<String, Drawable> mOutsideDrawablesCache =
|
private final WeakHashMap<String, Drawable> mOutsideDrawablesCache =
|
||||||
new WeakHashMap<String, Drawable>();
|
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.
|
* 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);
|
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
|
||||||
|
|
||||||
mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
|
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
|
// receive broadcasts
|
||||||
getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter);
|
getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter);
|
||||||
getContext().registerReceiver(mBroadcastReceiver, mPackageFilter);
|
getContext().registerReceiver(mBroadcastReceiver, mPackageFilter);
|
||||||
|
|
||||||
|
startLocationUpdates();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -375,6 +422,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
|
|||||||
public void onStop() {
|
public void onStop() {
|
||||||
super.onStop();
|
super.onStop();
|
||||||
|
|
||||||
|
stopLocationUpdates();
|
||||||
|
|
||||||
// TODO: Removing the listeners means that they never get called, since
|
// TODO: Removing the listeners means that they never get called, since
|
||||||
// Dialog.dismissDialog() calls onStop() before sendDismissMessage().
|
// Dialog.dismissDialog() calls onStop() before sendDismissMessage().
|
||||||
setOnCancelListener(null);
|
setOnCancelListener(null);
|
||||||
@@ -398,6 +447,25 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
|
|||||||
mPreviousComponents = null;
|
mPreviousComponents = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
* Sets the search dialog to the 'working' state, which shows a working spinner in the
|
||||||
* right hand size of the text field.
|
* right hand size of the text field.
|
||||||
|
|||||||
Reference in New Issue
Block a user