forked from organicmaps/organicmaps-tmp
[yota] refactoring to simpler code.
This commit is contained in:
parent
34072f92b6
commit
e9111ca501
3 changed files with 84 additions and 168 deletions
|
@ -27,13 +27,8 @@ public class LocationRequester implements Handler.Callback
|
|||
protected Handler mDelayedEventsHandler;
|
||||
|
||||
// Location
|
||||
private long mMinDistance = 0;
|
||||
private long mMinTime = 0;
|
||||
private boolean mIsListening = false;
|
||||
private boolean mCancelIfNotFound = true;
|
||||
private boolean mIsRegistered = false;
|
||||
private BatteryLevel mBatteryLevel;
|
||||
|
||||
private final Set<String> mProviders = new HashSet<String>();
|
||||
private final Set<LocationListener> mListeners = new HashSet<LocationListener>();
|
||||
private Location mLocation;
|
||||
private final static long MAX_TIME_FOR_SUBSCRIPTION_FIX = 15*60*1000;
|
||||
|
@ -49,7 +44,6 @@ public class LocationRequester implements Handler.Callback
|
|||
private PendingIntent mPassiveLocationIntent;
|
||||
|
||||
private final static String ACTION_LOCATION = ".location_request_action";
|
||||
private final static IntentFilter LOCATION_FILTER = new IntentFilter(ACTION_LOCATION);
|
||||
private final static String KEY_SOURCE = ".location_source";
|
||||
private final static String EXTRA_IS_GPS = ".is_gps";
|
||||
private final static String EXTRA_IS_NETWORK = ".is_network";
|
||||
|
@ -75,8 +69,7 @@ public class LocationRequester implements Handler.Callback
|
|||
{
|
||||
listener.onLocationChanged(l);
|
||||
mLocation = l;
|
||||
if (mCancelIfNotFound)
|
||||
postRequestCancelation(MAX_TIME_FOR_SUBSCRIPTION_FIX);
|
||||
postRequestCancelation(MAX_TIME_FOR_SUBSCRIPTION_FIX);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,24 +79,23 @@ public class LocationRequester implements Handler.Callback
|
|||
}
|
||||
};
|
||||
|
||||
private boolean canListenToLocation()
|
||||
{
|
||||
return mBatteryLevel != BatteryLevel.CRITICAL;
|
||||
}
|
||||
|
||||
private final BroadcastReceiver mBatteryReciever = new BroadcastReceiver() {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
if (mIsListening)
|
||||
{
|
||||
final BatteryLevel newLevel = BatteryHelper.getBatteryLevelRange(mContext);
|
||||
Log.d(TAG, "Got battery update");
|
||||
mBatteryLevel = BatteryHelper.getBatteryLevelRange(mContext);
|
||||
Log.d(TAG, "Got battery update, level: " + mBatteryLevel);
|
||||
|
||||
if (newLevel != mBatteryLevel)
|
||||
{
|
||||
mBatteryLevel = newLevel;
|
||||
stopListening();
|
||||
setUpProviders();
|
||||
startListening();
|
||||
Log.d(TAG, "Changed providers list due to battery level update.");
|
||||
}
|
||||
if (!canListenToLocation())
|
||||
{
|
||||
stopListening();
|
||||
Log.d(TAG, "Stopped updated due to battery level update.");
|
||||
}
|
||||
}
|
||||
}; // receivers
|
||||
|
@ -115,8 +107,6 @@ public class LocationRequester implements Handler.Callback
|
|||
mDelayedEventsHandler = new Handler(this);
|
||||
|
||||
createPendingIntents();
|
||||
setUpProviders();
|
||||
|
||||
mBatteryLevel = BatteryHelper.getBatteryLevelRange(mContext);
|
||||
}
|
||||
|
||||
|
@ -143,64 +133,70 @@ public class LocationRequester implements Handler.Callback
|
|||
if (LocationManager.PASSIVE_PROVIDER.equals(provider))
|
||||
return mPassiveLocationIntent;
|
||||
|
||||
throw new IllegalArgumentException("WTF is " + provider + "?");
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setUpProviders()
|
||||
public void startListening(long time, boolean isSingle)
|
||||
{
|
||||
final float batteryLevel = BatteryHelper.getBatteryLevel(mContext);
|
||||
stopListening();
|
||||
|
||||
// GPS is expensive http://stackoverflow.com/a/4927117
|
||||
if (batteryLevel > BatteryHelper.BATTERY_LEVEL_LOW)
|
||||
mProviders.add(LocationManager.GPS_PROVIDER);
|
||||
if (!canListenToLocation())
|
||||
return;
|
||||
|
||||
if (batteryLevel > BatteryHelper.BATTERY_LEVEL_CRITICAL)
|
||||
mProviders.add(LocationManager.NETWORK_PROVIDER);
|
||||
|
||||
// passive provider is "free"
|
||||
mProviders.add(LocationManager.PASSIVE_PROVIDER);
|
||||
|
||||
Log.d(TAG, "Set up providers: " + mProviders + " at battery level: " + batteryLevel);
|
||||
}
|
||||
|
||||
public void startListening()
|
||||
{
|
||||
for (final String provider: mProviders)
|
||||
for (final String provider: mLocationManager.getProviders(true))
|
||||
{
|
||||
if (mLocationManager.isProviderEnabled(provider))
|
||||
final PendingIntent pi = getIntentForProvider(provider);
|
||||
if (pi == null)
|
||||
continue;
|
||||
|
||||
if (isSingle)
|
||||
{
|
||||
mLocationManager
|
||||
.requestLocationUpdates(provider, mMinTime, mMinDistance, getIntentForProvider(provider));
|
||||
Log.d(TAG, "Registered provider: " + provider);
|
||||
mLocationManager.requestSingleUpdate(provider, pi);
|
||||
postRequestCancelation(time);
|
||||
}
|
||||
else
|
||||
Log.d(TAG, "Provider disabled: " + provider);
|
||||
{
|
||||
mLocationManager.requestLocationUpdates(provider, time, 0, pi);
|
||||
postRequestCancelation(MAX_TIME_FOR_SUBSCRIPTION_FIX);
|
||||
}
|
||||
|
||||
Log.d(TAG, "Registered provider: " + provider);
|
||||
}
|
||||
|
||||
mContext.registerReceiver(mLocationReciever, LOCATION_FILTER);
|
||||
mContext.registerReceiver(mBatteryReciever, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||
mIsListening = true;
|
||||
|
||||
if (mCancelIfNotFound)
|
||||
postRequestCancelation(MAX_TIME_FOR_SUBSCRIPTION_FIX);
|
||||
}
|
||||
|
||||
public void stopListening()
|
||||
{
|
||||
for (final String provider : mProviders)
|
||||
for (final String provider : mLocationManager.getAllProviders())
|
||||
{
|
||||
mLocationManager.removeUpdates(getIntentForProvider(provider));
|
||||
Log.d(TAG, "Stopped listening to: " + provider);
|
||||
final PendingIntent pi = getIntentForProvider(provider);
|
||||
if (pi != null)
|
||||
{
|
||||
mLocationManager.removeUpdates(pi);
|
||||
Log.d(TAG, "Stopped listening to: " + provider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mIsListening)
|
||||
public void unregister()
|
||||
{
|
||||
if (mIsRegistered)
|
||||
{
|
||||
mContext.unregisterReceiver(mLocationReciever);
|
||||
mContext.unregisterReceiver(mBatteryReciever);
|
||||
mIsListening = false;
|
||||
|
||||
mIsRegistered = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void register()
|
||||
{
|
||||
mContext.registerReceiver(mLocationReciever, new IntentFilter(ACTION_LOCATION));
|
||||
mContext.registerReceiver(mBatteryReciever, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||
|
||||
mIsRegistered = true;
|
||||
}
|
||||
|
||||
private static final int TWO_MINUTES = 1000 * 60 * 2;
|
||||
|
||||
/** Checks whether two providers are the same */
|
||||
|
@ -273,41 +269,19 @@ public class LocationRequester implements Handler.Callback
|
|||
public Location getLastKnownLocation()
|
||||
{
|
||||
Location res = null;
|
||||
for (final String provider : mProviders)
|
||||
for (final String provider : mLocationManager.getProviders(true))
|
||||
{
|
||||
if (mLocationManager.isProviderEnabled(provider))
|
||||
{
|
||||
final Location l = mLocationManager.getLastKnownLocation(provider);
|
||||
if (isFirstOneBetterLocation(l, res))
|
||||
res = l;
|
||||
}
|
||||
final Location l = mLocationManager.getLastKnownLocation(provider);
|
||||
if (isFirstOneBetterLocation(l, res))
|
||||
res = l;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public void requestSingleUpdate(long delayMillis)
|
||||
{
|
||||
if (mProviders.size() > 0)
|
||||
{
|
||||
for (final String provider : mProviders)
|
||||
{
|
||||
if (mLocationManager.isProviderEnabled(provider))
|
||||
mLocationManager.requestSingleUpdate(provider, getIntentForProvider(provider));
|
||||
}
|
||||
|
||||
if (delayMillis > 0)
|
||||
postRequestCancelation(delayMillis);
|
||||
}
|
||||
Log.d(TAG, "Send single update request");
|
||||
}
|
||||
|
||||
private void postRequestCancelation(long delayMillis)
|
||||
{
|
||||
// remove old message
|
||||
mDelayedEventsHandler.removeMessages(WHAT_LOCATION_REQUEST_CANCELATION);
|
||||
|
||||
final Message msg =mDelayedEventsHandler.obtainMessage(WHAT_LOCATION_REQUEST_CANCELATION);
|
||||
// send new
|
||||
final Message msg = mDelayedEventsHandler.obtainMessage(WHAT_LOCATION_REQUEST_CANCELATION);
|
||||
mDelayedEventsHandler.sendMessageDelayed(msg, delayMillis);
|
||||
|
||||
Log.d(TAG, "Postponed cancelation in: " + delayMillis + " ms");
|
||||
|
@ -340,24 +314,6 @@ public class LocationRequester implements Handler.Callback
|
|||
}
|
||||
}
|
||||
|
||||
public void setMinDistance(long minDistance)
|
||||
{
|
||||
mMinDistance = minDistance;
|
||||
}
|
||||
|
||||
public void setMinTime(long minTime)
|
||||
{
|
||||
mMinTime = minTime;
|
||||
}
|
||||
|
||||
public void setCancelIfNotFound(boolean doCancel)
|
||||
{
|
||||
mCancelIfNotFound = doCancel;
|
||||
|
||||
if (!doCancel)
|
||||
mDelayedEventsHandler.removeMessages(WHAT_LOCATION_REQUEST_CANCELATION);
|
||||
}
|
||||
|
||||
public void setLocation(Location location)
|
||||
{
|
||||
mLocation = location;
|
||||
|
|
|
@ -14,7 +14,6 @@ import android.location.LocationListener;
|
|||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.Handler;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
@ -76,27 +75,6 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
protected MapDataProvider mMapDataProvider;
|
||||
private LocationRequester mLocationRequester;
|
||||
|
||||
private final Runnable mInvalidateDrawable = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
draw();
|
||||
}
|
||||
};
|
||||
|
||||
private final Runnable mRequestLocation = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
requestLocationUpdateImpl();
|
||||
}
|
||||
};
|
||||
|
||||
private final Handler mDeduplicateHandler = new Handler();
|
||||
private final static long REDRAW_MIN_INTERVAL = 333;
|
||||
|
||||
private static final String EXTRA_POINT = "point";
|
||||
|
||||
@Override
|
||||
|
@ -145,16 +123,17 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
protected void onBSPause()
|
||||
{
|
||||
super.onBSPause();
|
||||
mLocationRequester.stopListening();
|
||||
|
||||
mDeduplicateHandler.removeCallbacks(mInvalidateDrawable);
|
||||
mDeduplicateHandler.removeCallbacks(mRequestLocation);
|
||||
mLocationRequester.stopListening();
|
||||
mLocationRequester.unregister();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBSResume()
|
||||
{
|
||||
super.onBSResume();
|
||||
|
||||
mLocationRequester.register();
|
||||
requestLocationUpdate();
|
||||
|
||||
updateData();
|
||||
|
@ -268,8 +247,7 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
|
||||
public void invalidate()
|
||||
{
|
||||
mDeduplicateHandler.removeCallbacks(mInvalidateDrawable);
|
||||
mDeduplicateHandler.postDelayed(mInvalidateDrawable, REDRAW_MIN_INTERVAL);
|
||||
draw();
|
||||
}
|
||||
|
||||
private boolean zoomIn()
|
||||
|
@ -299,12 +277,6 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
}
|
||||
|
||||
private void requestLocationUpdate()
|
||||
{
|
||||
mDeduplicateHandler.removeCallbacks(mRequestLocation);
|
||||
mDeduplicateHandler.postDelayed(mRequestLocation, 300);
|
||||
}
|
||||
|
||||
private void requestLocationUpdateImpl()
|
||||
{
|
||||
final String updateIntervalStr = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
.getString(getString(R.string.pref_loc_update), YopmePreference.LOCATION_UPDATE_DEFAULT);
|
||||
|
@ -316,15 +288,9 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
|
||||
// then listen to updates
|
||||
if (updateInterval == -1)
|
||||
mLocationRequester.requestSingleUpdate(60*1000);
|
||||
mLocationRequester.startListening(60*1000, true);
|
||||
else
|
||||
{
|
||||
// according to the manual, minDistance doesn't save battery life
|
||||
mLocationRequester.setMinDistance(0);
|
||||
mLocationRequester.setMinTime(updateInterval * 1000);
|
||||
mLocationRequester.setUpProviders();
|
||||
mLocationRequester.startListening();
|
||||
}
|
||||
mLocationRequester.startListening(updateInterval*1000, false);
|
||||
}
|
||||
|
||||
private void showWaitMessage(CharSequence msg)
|
||||
|
@ -343,29 +309,23 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
{
|
||||
df.setRoundingMode(RoundingMode.DOWN);
|
||||
}
|
||||
private void setDistance(double distance)
|
||||
private void setDistance(float distance)
|
||||
{
|
||||
if (distance < 0)
|
||||
mPoiDist.setVisibility(View.GONE);
|
||||
else
|
||||
String suffix = "m";
|
||||
double div = 1;
|
||||
df.setMaximumFractionDigits(0);
|
||||
|
||||
if (distance >= 1000)
|
||||
{
|
||||
String suffix = "m";
|
||||
double div = 1;
|
||||
df.setMaximumFractionDigits(0);
|
||||
suffix = "km";
|
||||
div = 1000;
|
||||
|
||||
if (distance >= 1000)
|
||||
{
|
||||
suffix = "km";
|
||||
div = 1000;
|
||||
|
||||
// set fraction digits only in [1..10) kilometers range
|
||||
if (distance < 10000)
|
||||
df.setMaximumFractionDigits(2);
|
||||
}
|
||||
|
||||
mPoiDist.setText(df.format(distance/div) + suffix);
|
||||
mPoiDist.setVisibility(View.VISIBLE);
|
||||
// set fraction digits only in [1..10) kilometers range
|
||||
if (distance < 10000)
|
||||
df.setMaximumFractionDigits(2);
|
||||
}
|
||||
|
||||
mPoiDist.setText(df.format(distance/div) + suffix);
|
||||
}
|
||||
|
||||
public void updateData()
|
||||
|
@ -417,11 +377,13 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
else
|
||||
hideWaitMessage();
|
||||
|
||||
if (mMode == Mode.POI)
|
||||
if (mPoint != null && mMode == Mode.POI)
|
||||
{
|
||||
mPoiText.setText(mPoint.getName());
|
||||
mPoiInfo.setVisibility(TextUtils.isEmpty(mPoint.getName()) ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
else
|
||||
mPoiInfo.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
|
||||
|
@ -432,7 +394,8 @@ public class BackscreenActivity extends BSActivity implements LocationListener
|
|||
final Location poiLoc = new Location("");
|
||||
poiLoc.setLatitude(mPoint.getLat());
|
||||
poiLoc.setLongitude(mPoint.getLon());
|
||||
setDistance(poiLoc.distanceTo(mLocation));
|
||||
final float dist = poiLoc.distanceTo(mLocation);
|
||||
setDistance(dist);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -618,10 +618,7 @@ public class MWMActivity extends NvEventQueueActivity implements LocationService
|
|||
if (locState.hasPosition() && locState.isCentered())
|
||||
Yota.showLocation(getApplicationContext(), zoom);
|
||||
else
|
||||
{
|
||||
final String coord = String.format(Locale.US, "%.4f, %.4f", latLon[0], latLon[1]);
|
||||
Yota.showPoi(getApplicationContext(), latLon[0], latLon[1], zoom, coord, locState.hasPosition());
|
||||
}
|
||||
Yota.showPoi(getApplicationContext(), latLon[0], latLon[1], zoom, "", locState.hasPosition());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue