Fix location/direction update for context menu
This commit is contained in:
parent
1da1b25cbf
commit
897ed3107c
4 changed files with 88 additions and 40 deletions
|
@ -16,7 +16,9 @@ import net.osmand.plus.OsmandSettings;
|
|||
import net.osmand.plus.OsmandSettings.AutoZoomMap;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper.TargetPoint;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.dashboard.DashboardOnMap;
|
||||
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.plus.routing.RoutingHelper.IRouteInformationListener;
|
||||
import net.osmand.plus.views.AnimateDraggingMapThread;
|
||||
|
@ -32,6 +34,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
|||
private boolean sensorRegistered = false;
|
||||
private OsmandMapTileView mapView;
|
||||
private DashboardOnMap dashboard;
|
||||
private MapContextMenu contextMenu;
|
||||
private OsmandSettings settings;
|
||||
private OsmandApplication app;
|
||||
private boolean isMapLinkedToLocation = true;
|
||||
|
@ -85,12 +88,19 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
|||
if(dashboard != null) {
|
||||
dashboard.updateCompassValue(val);
|
||||
}
|
||||
if(contextMenu != null) {
|
||||
contextMenu.updateCompassValue(val);
|
||||
}
|
||||
}
|
||||
|
||||
public void setDashboard(DashboardOnMap dashboard) {
|
||||
this.dashboard = dashboard;
|
||||
}
|
||||
|
||||
public void setContextMenu(MapContextMenu contextMenu) {
|
||||
this.contextMenu = contextMenu;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLocation(Location location) {
|
||||
showViewAngle = false;
|
||||
|
@ -134,6 +144,9 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
|||
if(dashboard != null) {
|
||||
dashboard.updateMyLocation(location);
|
||||
}
|
||||
if(contextMenu != null) {
|
||||
contextMenu.updateMyLocation(location);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSmallSpeedForCompass(Location location) {
|
||||
|
@ -170,8 +183,9 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
|
|||
}
|
||||
|
||||
private void registerUnregisterSensor(net.osmand.Location location) {
|
||||
|
||||
int currentMapRotation = settings.ROTATE_MAP.get();
|
||||
boolean registerCompassListener = (showViewAngle && location != null)
|
||||
boolean registerCompassListener = ((showViewAngle || contextMenu != null) && location != null)
|
||||
|| (currentMapRotation == OsmandSettings.ROTATE_MAP_COMPASS && !routePlanningMode);
|
||||
// show point view only if gps enabled
|
||||
if(sensorRegistered != registerCompassListener) {
|
||||
|
|
|
@ -15,6 +15,7 @@ import net.osmand.plus.mapcontextmenu.MenuController.TitleProgressController;
|
|||
import net.osmand.plus.mapcontextmenu.other.ShareMenu;
|
||||
import net.osmand.plus.views.ContextMenuLayer;
|
||||
import net.osmand.plus.views.OsmandMapLayer;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
public class MapContextMenu extends MenuTitleController {
|
||||
|
||||
|
@ -29,6 +30,10 @@ public class MapContextMenu extends MenuTitleController {
|
|||
private LatLon mapCenter;
|
||||
private int mapPosition = 0;
|
||||
|
||||
private LatLon myLocation;
|
||||
private Float heading;
|
||||
private boolean inLocationUpdate = false;
|
||||
|
||||
private int favActionIconId;
|
||||
|
||||
@Override
|
||||
|
@ -97,6 +102,11 @@ public class MapContextMenu extends MenuTitleController {
|
|||
}
|
||||
|
||||
public boolean init(LatLon latLon, PointDescription pointDescription, Object object, boolean update) {
|
||||
|
||||
if (myLocation == null) {
|
||||
myLocation = getMapActivity().getMyApplication().getSettings().getLastKnownMapLocation();
|
||||
}
|
||||
|
||||
if (!update && isVisible()) {
|
||||
if (this.object == null || !this.object.equals(object)) {
|
||||
hide();
|
||||
|
@ -408,4 +418,50 @@ public class MapContextMenu extends MenuTitleController {
|
|||
menuController.updateData();
|
||||
}
|
||||
}
|
||||
|
||||
public LatLon getMyLocation() {
|
||||
return myLocation;
|
||||
}
|
||||
|
||||
public Float getHeading() {
|
||||
return heading;
|
||||
}
|
||||
|
||||
public void updateMyLocation(net.osmand.Location location) {
|
||||
if (location != null) {
|
||||
myLocation = new LatLon(location.getLatitude(), location.getLongitude());
|
||||
updateLocation(false, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateCompassValue(float value) {
|
||||
// 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction)
|
||||
// on non-compass devices
|
||||
float lastHeading = heading != null ? heading : 99;
|
||||
heading = value;
|
||||
if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) {
|
||||
updateLocation(false, false, true);
|
||||
} else {
|
||||
heading = lastHeading;
|
||||
}
|
||||
}
|
||||
|
||||
public void updateLocation(final boolean centerChanged, final boolean locationChanged,
|
||||
final boolean compassChanged) {
|
||||
if (inLocationUpdate) {
|
||||
return;
|
||||
}
|
||||
inLocationUpdate = true;
|
||||
mapActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
inLocationUpdate = false;
|
||||
MapContextMenuFragment menuFragment = findMenuFragment();
|
||||
if (menuFragment != null) {
|
||||
menuFragment.updateLocation(centerChanged, locationChanged, compassChanged);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -29,13 +29,10 @@ import android.widget.LinearLayout;
|
|||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.QuadPoint;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.plus.IconsCache;
|
||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
|
||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
|
@ -46,15 +43,13 @@ import net.osmand.plus.mapcontextmenu.MenuController.TitleButtonController;
|
|||
import net.osmand.plus.mapcontextmenu.MenuController.TitleProgressController;
|
||||
import net.osmand.plus.views.AnimateDraggingMapThread;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
|
||||
import static net.osmand.plus.mapcontextmenu.MenuBuilder.SHADOW_HEIGHT_BOTTOM_DP;
|
||||
import static net.osmand.plus.mapcontextmenu.MenuBuilder.SHADOW_HEIGHT_TOP_DP;
|
||||
|
||||
|
||||
public class MapContextMenuFragment extends Fragment implements DownloadEvents, OsmAndLocationListener, OsmAndCompassListener {
|
||||
|
||||
public class MapContextMenuFragment extends Fragment implements DownloadEvents {
|
||||
public static final String TAG = "MapContextMenuFragment";
|
||||
|
||||
public static final float FAB_PADDING_TOP_DP = 4f;
|
||||
|
@ -89,8 +84,6 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents,
|
|||
private int origMarkerY;
|
||||
private boolean customMapCenter;
|
||||
|
||||
private LatLon location;
|
||||
private Float heading;
|
||||
private int screenOrientation;
|
||||
|
||||
private class SingleTapConfirm implements OnGestureListener {
|
||||
|
@ -564,18 +557,13 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents,
|
|||
super.onResume();
|
||||
screenOrientation = DashLocationFragment.getScreenOrientation(getActivity());
|
||||
if (menu.displayDistanceDirection()) {
|
||||
if (location == null) {
|
||||
location = getMyApplication().getSettings().getLastKnownMapLocation();
|
||||
}
|
||||
getMyApplication().getLocationProvider().addLocationListener(this);
|
||||
getMyApplication().getLocationProvider().addCompassListener(this);
|
||||
getMapActivity().getMapViewTrackingUtilities().setContextMenu(menu);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
getMyApplication().getLocationProvider().removeLocationListener(this);
|
||||
getMyApplication().getLocationProvider().removeCompassListener(this);
|
||||
getMapActivity().getMapViewTrackingUtilities().setContextMenu(null);
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
|
@ -691,8 +679,12 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents,
|
|||
private void updateDistanceDirection() {
|
||||
TextView distanceText = (TextView) view.findViewById(R.id.distance);
|
||||
ImageView direction = (ImageView) view.findViewById(R.id.direction);
|
||||
boolean mapLinked = getMapActivity().getMapViewTrackingUtilities().isMapLinkedToLocation() && location != null;
|
||||
DashLocationFragment.updateLocationView(!mapLinked, location, heading, direction, distanceText,
|
||||
|
||||
boolean mapLinked = getMapActivity().getMapViewTrackingUtilities().isMapLinkedToLocation() && menu.getMyLocation() != null;
|
||||
float myHeading = menu.getHeading() == null ? 0f : menu.getHeading();
|
||||
float h = !mapLinked ? -getMapActivity().getMapRotate() : myHeading;
|
||||
|
||||
DashLocationFragment.updateLocationView(!mapLinked, menu.getMyLocation(), h, direction, distanceText,
|
||||
menu.getLatLon().getLatitude(), menu.getLatLon().getLongitude(), screenOrientation, getMyApplication(), getActivity());
|
||||
}
|
||||
|
||||
|
@ -917,25 +909,12 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents,
|
|||
return dm.heightPixels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLocation(Location location) {
|
||||
if (location != null) {
|
||||
this.location = new LatLon(location.getLatitude(), location.getLongitude());
|
||||
updateDistanceDirection();
|
||||
public void updateLocation(boolean centerChanged, boolean locationChanged, boolean compassChanged) {
|
||||
boolean mapLinkedToLocation = getMapActivity().getMapViewTrackingUtilities().isMapLinkedToLocation();
|
||||
if (compassChanged && !mapLinkedToLocation) {
|
||||
return;
|
||||
}
|
||||
; }
|
||||
|
||||
@Override
|
||||
public void updateCompassValue(float value) {
|
||||
// 99 in next line used to one-time initalize arrows (with reference vs. fixed-north direction) on non-compass
|
||||
// devices
|
||||
float lastHeading = heading != null ? heading : 99;
|
||||
heading = value;
|
||||
if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) {
|
||||
updateDistanceDirection();
|
||||
} else {
|
||||
heading = lastHeading;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -59,8 +59,7 @@ public abstract class MenuTitleController {
|
|||
return typeStr;
|
||||
} else {
|
||||
if (Algorithms.isEmpty(streetStr)) {
|
||||
return "";//PointDescription.getLocationName(getMapActivity(),
|
||||
//getLatLon().getLatitude(), getLatLon().getLongitude(), true).replaceAll("\n", "");
|
||||
return typeStr;
|
||||
} else {
|
||||
return streetStr;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue