code cleanup
This commit is contained in:
parent
71c895c81e
commit
1f8dbb7694
7 changed files with 157 additions and 295 deletions
|
@ -71,57 +71,6 @@ public class RotatedTileBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
RotatedTileBox tileBox = (RotatedTileBox) o;
|
|
||||||
return this.compare(tileBox.lat, lat) &&
|
|
||||||
this.compare(tileBox.lon, lon) &&
|
|
||||||
this.compare(tileBox.rotate, rotate) &&
|
|
||||||
this.compare(tileBox.density, density) &&
|
|
||||||
zoom == tileBox.zoom &&
|
|
||||||
this.compare(tileBox.mapDensity, mapDensity) &&
|
|
||||||
this.compare(tileBox.zoomAnimation, zoomAnimation) &&
|
|
||||||
this.compare(tileBox.zoomFloatPart, zoomFloatPart) &&
|
|
||||||
cx == tileBox.cx &&
|
|
||||||
cy == tileBox.cy &&
|
|
||||||
pixWidth == tileBox.pixWidth &&
|
|
||||||
pixHeight == tileBox.pixHeight &&
|
|
||||||
this.compare(tileBox.zoomFactor, zoomFactor) &&
|
|
||||||
this.compare(tileBox.rotateCos, rotateCos) &&
|
|
||||||
this.compare(tileBox.rotateSin, rotateSin) &&
|
|
||||||
this.compare(tileBox.oxTile, oxTile) &&
|
|
||||||
this.compare(tileBox.oyTile, oyTile);
|
|
||||||
}
|
|
||||||
|
|
||||||
private double E = 0.0001;
|
|
||||||
|
|
||||||
private boolean compare(float lon, float lon1) {
|
|
||||||
return Math.abs(lon1-lon) < E;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean compare(double lon, double lon1) {
|
|
||||||
return Math.abs(lon1-lon) < E;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = 1 + (int)lat +
|
|
||||||
3* (int)(lon*1/E) +
|
|
||||||
5* (int)(rotate*1/E) +
|
|
||||||
7* (int)(density*1/E) +
|
|
||||||
11* zoom +
|
|
||||||
13* (int)(mapDensity*1/E) +
|
|
||||||
17* (int)(zoomAnimation*1/E) +
|
|
||||||
19* (int)(zoomFloatPart*1/E) +
|
|
||||||
23* cx +
|
|
||||||
29* cy +
|
|
||||||
31* pixWidth +
|
|
||||||
37* pixHeight;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void calculateDerivedFields() {
|
public void calculateDerivedFields() {
|
||||||
zoomFactor = Math.pow(2, zoomAnimation + zoomFloatPart) * 256 * mapDensity;
|
zoomFactor = Math.pow(2, zoomAnimation + zoomFloatPart) * 256 * mapDensity;
|
||||||
double rad = Math.toRadians(this.rotate);
|
double rad = Math.toRadians(this.rotate);
|
||||||
|
|
|
@ -5,11 +5,7 @@ import android.app.Activity;
|
||||||
import android.app.AlarmManager;
|
import android.app.AlarmManager;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.*;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
@ -18,18 +14,10 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.Gravity;
|
import android.view.*;
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.view.ViewStub;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
@ -44,41 +32,22 @@ import androidx.fragment.app.FragmentManager.BackStackEntry;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback;
|
import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback;
|
||||||
|
import net.osmand.*;
|
||||||
import net.osmand.AndroidUtils;
|
|
||||||
import net.osmand.GPXUtilities.GPXFile;
|
import net.osmand.GPXUtilities.GPXFile;
|
||||||
import net.osmand.Location;
|
|
||||||
import net.osmand.PlatformUtil;
|
|
||||||
import net.osmand.SecondSplashScreenFragment;
|
|
||||||
import net.osmand.StateChangedListener;
|
|
||||||
import net.osmand.ValueHolder;
|
|
||||||
import net.osmand.access.MapAccessibilityActions;
|
import net.osmand.access.MapAccessibilityActions;
|
||||||
import net.osmand.aidl.AidlMapPointWrapper;
|
import net.osmand.aidl.AidlMapPointWrapper;
|
||||||
import net.osmand.aidl.OsmandAidlApi.AMapPointUpdateListener;
|
import net.osmand.aidl.OsmandAidlApi.AMapPointUpdateListener;
|
||||||
import net.osmand.core.android.AtlasMapRendererView;
|
import net.osmand.core.android.AtlasMapRendererView;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.*;
|
||||||
import net.osmand.data.PointDescription;
|
|
||||||
import net.osmand.data.QuadPoint;
|
|
||||||
import net.osmand.data.QuadRect;
|
|
||||||
import net.osmand.data.RotatedTileBox;
|
|
||||||
import net.osmand.map.MapTileDownloader.DownloadRequest;
|
import net.osmand.map.MapTileDownloader.DownloadRequest;
|
||||||
import net.osmand.map.MapTileDownloader.IMapDownloaderCallback;
|
import net.osmand.map.MapTileDownloader.IMapDownloaderCallback;
|
||||||
import net.osmand.plus.AppInitializer;
|
import net.osmand.plus.*;
|
||||||
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
||||||
import net.osmand.plus.AppInitializer.InitEvents;
|
import net.osmand.plus.AppInitializer.InitEvents;
|
||||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
||||||
import net.osmand.plus.HuaweiDrmHelper;
|
|
||||||
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
||||||
import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener;
|
import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener;
|
||||||
import net.osmand.plus.OnDismissDialogFragmentListener;
|
|
||||||
import net.osmand.plus.OsmAndConstants;
|
|
||||||
import net.osmand.plus.OsmAndLocationSimulation;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
|
||||||
import net.osmand.plus.OsmandPlugin;
|
|
||||||
import net.osmand.plus.R;
|
|
||||||
import net.osmand.plus.TargetPointsHelper;
|
|
||||||
import net.osmand.plus.TargetPointsHelper.TargetPoint;
|
import net.osmand.plus.TargetPointsHelper.TargetPoint;
|
||||||
import net.osmand.plus.Version;
|
|
||||||
import net.osmand.plus.activities.search.SearchActivity;
|
import net.osmand.plus.activities.search.SearchActivity;
|
||||||
import net.osmand.plus.base.BaseOsmAndFragment;
|
import net.osmand.plus.base.BaseOsmAndFragment;
|
||||||
import net.osmand.plus.base.ContextMenuFragment;
|
import net.osmand.plus.base.ContextMenuFragment;
|
||||||
|
@ -87,24 +56,14 @@ import net.osmand.plus.base.MapViewTrackingUtilities;
|
||||||
import net.osmand.plus.chooseplan.OsmLiveCancelledDialog;
|
import net.osmand.plus.chooseplan.OsmLiveCancelledDialog;
|
||||||
import net.osmand.plus.dashboard.DashboardOnMap;
|
import net.osmand.plus.dashboard.DashboardOnMap;
|
||||||
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
|
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
|
||||||
import net.osmand.plus.dialogs.CrashBottomSheetDialogFragment;
|
import net.osmand.plus.dialogs.*;
|
||||||
import net.osmand.plus.dialogs.ImportGpxBottomSheetDialogFragment;
|
|
||||||
import net.osmand.plus.dialogs.RateUsBottomSheetDialogFragment;
|
|
||||||
import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment;
|
|
||||||
import net.osmand.plus.dialogs.WhatsNewDialogFragment;
|
|
||||||
import net.osmand.plus.dialogs.XMasDialogFragment;
|
|
||||||
import net.osmand.plus.download.DownloadActivity;
|
import net.osmand.plus.download.DownloadActivity;
|
||||||
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
|
||||||
import net.osmand.plus.download.ui.DataStoragePlaceDialogFragment;
|
import net.osmand.plus.download.ui.DataStoragePlaceDialogFragment;
|
||||||
import net.osmand.plus.firstusage.FirstUsageWelcomeFragment;
|
import net.osmand.plus.firstusage.FirstUsageWelcomeFragment;
|
||||||
import net.osmand.plus.firstusage.FirstUsageWizardFragment;
|
import net.osmand.plus.firstusage.FirstUsageWizardFragment;
|
||||||
import net.osmand.plus.helpers.AndroidUiHelper;
|
import net.osmand.plus.helpers.*;
|
||||||
import net.osmand.plus.helpers.DiscountHelper;
|
|
||||||
import net.osmand.plus.helpers.ImportHelper;
|
|
||||||
import net.osmand.plus.helpers.IntentHelper;
|
|
||||||
import net.osmand.plus.helpers.LockHelper;
|
|
||||||
import net.osmand.plus.helpers.LockHelper.LockUIAdapter;
|
import net.osmand.plus.helpers.LockHelper.LockUIAdapter;
|
||||||
import net.osmand.plus.helpers.ScrollHelper;
|
|
||||||
import net.osmand.plus.helpers.ScrollHelper.OnScrollEventListener;
|
import net.osmand.plus.helpers.ScrollHelper.OnScrollEventListener;
|
||||||
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment;
|
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment;
|
||||||
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||||
|
@ -118,11 +77,7 @@ import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu;
|
||||||
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
|
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
|
||||||
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
|
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
|
||||||
import net.osmand.plus.mapmarkers.PlanRouteFragment;
|
import net.osmand.plus.mapmarkers.PlanRouteFragment;
|
||||||
import net.osmand.plus.measurementtool.GpxApproximationFragment;
|
import net.osmand.plus.measurementtool.*;
|
||||||
import net.osmand.plus.measurementtool.GpxData;
|
|
||||||
import net.osmand.plus.measurementtool.MeasurementEditingContext;
|
|
||||||
import net.osmand.plus.measurementtool.MeasurementToolFragment;
|
|
||||||
import net.osmand.plus.measurementtool.SnapTrackWarningBottomSheet;
|
|
||||||
import net.osmand.plus.quickaction.QuickActionListFragment;
|
import net.osmand.plus.quickaction.QuickActionListFragment;
|
||||||
import net.osmand.plus.render.RendererRegistry;
|
import net.osmand.plus.render.RendererRegistry;
|
||||||
import net.osmand.plus.resources.ResourceManager;
|
import net.osmand.plus.resources.ResourceManager;
|
||||||
|
@ -136,25 +91,14 @@ import net.osmand.plus.routing.TransportRoutingHelper.TransportRouteCalculationP
|
||||||
import net.osmand.plus.search.QuickSearchDialogFragment;
|
import net.osmand.plus.search.QuickSearchDialogFragment;
|
||||||
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
|
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
|
||||||
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
|
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
|
||||||
import net.osmand.plus.server.ApiRouter;
|
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
|
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
|
import net.osmand.plus.settings.fragments.*;
|
||||||
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
|
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
|
||||||
import net.osmand.plus.settings.fragments.ConfigureMenuItemsFragment;
|
|
||||||
import net.osmand.plus.settings.fragments.ConfigureProfileFragment;
|
|
||||||
import net.osmand.plus.settings.fragments.DataStorageFragment;
|
|
||||||
import net.osmand.plus.settings.fragments.ImportCompleteFragment;
|
|
||||||
import net.osmand.plus.settings.fragments.ImportSettingsFragment;
|
|
||||||
import net.osmand.plus.settings.fragments.ProfileAppearanceFragment;
|
|
||||||
import net.osmand.plus.track.TrackAppearanceFragment;
|
import net.osmand.plus.track.TrackAppearanceFragment;
|
||||||
import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
|
import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
|
||||||
import net.osmand.plus.views.AnimateDraggingMapThread;
|
import net.osmand.plus.views.*;
|
||||||
import net.osmand.plus.views.OsmAndMapLayersView;
|
|
||||||
import net.osmand.plus.views.OsmAndMapSurfaceView;
|
|
||||||
import net.osmand.plus.views.OsmandMapLayer;
|
|
||||||
import net.osmand.plus.views.OsmandMapTileView;
|
|
||||||
import net.osmand.plus.views.OsmandMapTileView.OnDrawMapListener;
|
import net.osmand.plus.views.OsmandMapTileView.OnDrawMapListener;
|
||||||
import net.osmand.plus.views.corenative.NativeCoreContext;
|
import net.osmand.plus.views.corenative.NativeCoreContext;
|
||||||
import net.osmand.plus.views.layers.MapControlsLayer;
|
import net.osmand.plus.views.layers.MapControlsLayer;
|
||||||
|
@ -165,16 +109,10 @@ import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControll
|
||||||
import net.osmand.render.RenderingRulesStorage;
|
import net.osmand.render.RenderingRulesStorage;
|
||||||
import net.osmand.router.GeneralRouter;
|
import net.osmand.router.GeneralRouter;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
@ -310,7 +248,6 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
||||||
int h = dm.heightPixels - statusBarHeight;
|
int h = dm.heightPixels - statusBarHeight;
|
||||||
|
|
||||||
mapView = new OsmandMapTileView(this, w, h);
|
mapView = new OsmandMapTileView(this, w, h);
|
||||||
ApiRouter.mapActivity = this;
|
|
||||||
if (app.getAppInitializer().checkAppVersionChanged() && WhatsNewDialogFragment.SHOW) {
|
if (app.getAppInitializer().checkAppVersionChanged() && WhatsNewDialogFragment.SHOW) {
|
||||||
SecondSplashScreenFragment.SHOW = false;
|
SecondSplashScreenFragment.SHOW = false;
|
||||||
WhatsNewDialogFragment.SHOW = false;
|
WhatsNewDialogFragment.SHOW = false;
|
||||||
|
|
|
@ -73,7 +73,7 @@ public class ServerActivity extends AppCompatActivity {
|
||||||
OsmAndHttpServer.HOSTNAME = getDeviceAddress();
|
OsmAndHttpServer.HOSTNAME = getDeviceAddress();
|
||||||
try {
|
try {
|
||||||
server = new OsmAndHttpServer();
|
server = new OsmAndHttpServer();
|
||||||
server.setAndroidApplication((OsmandApplication)this.getApplication());
|
server.setAndroidApplication((OsmandApplication) this.getApplication());
|
||||||
initialized = true;
|
initialized = true;
|
||||||
updateTextView("Server started at: http://" + getDeviceAddress() + ":" + OsmAndHttpServer.PORT);
|
updateTextView("Server started at: http://" + getDeviceAddress() + ":" + OsmAndHttpServer.PORT);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -91,11 +91,12 @@ public class ServerActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deInitServer() {
|
private void deInitServer() {
|
||||||
if (server != null){
|
if (server != null) {
|
||||||
server.closeAllConnections();
|
server.closeAllConnections();
|
||||||
server.stop();
|
server.stop();
|
||||||
}
|
}
|
||||||
initialized = false;
|
initialized = false;
|
||||||
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,128 +1,45 @@
|
||||||
package net.osmand.plus.server;
|
package net.osmand.plus.server;
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
import com.google.gson.Gson;
|
|
||||||
import fi.iki.elonen.NanoHTTPD;
|
import fi.iki.elonen.NanoHTTPD;
|
||||||
import net.osmand.data.FavouritePoint;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.RotatedTileBox;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.server.endpoints.TileEndpoint;
|
||||||
import net.osmand.plus.views.OsmandMapLayer;
|
|
||||||
import net.osmand.plus.views.OsmandMapTileView;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
import java.util.concurrent.*;
|
import java.util.Map;
|
||||||
|
|
||||||
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
|
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
|
||||||
|
|
||||||
public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
public class ApiRouter {
|
||||||
private OsmandApplication androidContext;
|
private OsmandApplication application;
|
||||||
|
|
||||||
public OsmandApplication getAndroidContext() {
|
|
||||||
return androidContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String FOLDER_NAME = "server";
|
private final String FOLDER_NAME = "server";
|
||||||
private Gson gson = new Gson();
|
private final Map<String, ApiEndpoint> endpoints = new HashMap<>();
|
||||||
private Map<String, ApiEndpoint> endpoints = new HashMap<>();
|
private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(ApiRouter.class);
|
||||||
//change to weakreference
|
|
||||||
public static MapActivity mapActivity;
|
|
||||||
|
|
||||||
public ApiRouter() {
|
public ApiRouter() {
|
||||||
initRoutes();
|
initRoutes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OsmandApplication getApplication() {
|
||||||
|
return application;
|
||||||
|
}
|
||||||
|
|
||||||
|
final TileEndpoint tileEndpoint = new TileEndpoint(application);
|
||||||
|
|
||||||
private void initRoutes() {
|
private void initRoutes() {
|
||||||
ApiEndpoint favorites = new ApiEndpoint();
|
endpoints.put(tileEndpoint.uri, tileEndpoint);
|
||||||
favorites.uri = "/favorites";
|
|
||||||
favorites.apiCall = new ApiEndpoint.ApiCall() {
|
|
||||||
@Override
|
|
||||||
public NanoHTTPD.Response call(NanoHTTPD.IHTTPSession session) {
|
|
||||||
return newFixedLengthResponse(getFavoritesJson());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
endpoints.put(favorites.uri, favorites);
|
|
||||||
|
|
||||||
final ApiEndpoint tile = new ApiEndpoint();
|
|
||||||
tile.uri = "/tile";
|
|
||||||
tile.apiCall = new ApiEndpoint.ApiCall() {
|
|
||||||
@Override
|
|
||||||
public NanoHTTPD.Response call(NanoHTTPD.IHTTPSession session) {
|
|
||||||
try {
|
|
||||||
return tileApiCall(session);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return ErrorResponses.response500;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
endpoints.put(tile.uri, tile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(3);
|
public void setApplication(OsmandApplication application) {
|
||||||
|
this.application = application;
|
||||||
Map<RotatedTileBox, Bitmap> hashMap = new HashMap<>();
|
tileEndpoint.setApplication(application);
|
||||||
Map<RotatedTileBox, Bitmap> map = Collections.synchronizedMap(hashMap);
|
|
||||||
|
|
||||||
private synchronized NanoHTTPD.Response tileApiCall(NanoHTTPD.IHTTPSession session) {
|
|
||||||
int zoom = 0;
|
|
||||||
double lat = 0;//50.901430;
|
|
||||||
double lon = 0;//34.801775;
|
|
||||||
try {
|
|
||||||
String fullUri = session.getUri().replace("/tile/", "");
|
|
||||||
Scanner s = new Scanner(fullUri).useDelimiter("/");
|
|
||||||
zoom = s.nextInt();
|
|
||||||
lat = s.nextDouble();
|
|
||||||
lon = s.nextDouble();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return ErrorResponses.response500;
|
|
||||||
}
|
|
||||||
mapActivity.getMapView().setMapImageDrawListener(this);
|
|
||||||
Future<Pair<RotatedTileBox, Bitmap>> future;
|
|
||||||
final RotatedTileBox rotatedTileBox = new RotatedTileBox.RotatedTileBoxBuilder()
|
|
||||||
.setLocation(lat, lon)
|
|
||||||
.setZoom(zoom)
|
|
||||||
.setPixelDimensions(512, 512, 0.5f, 0.5f).build();
|
|
||||||
future = executor.submit(new Callable<Pair<RotatedTileBox, Bitmap>>() {
|
|
||||||
@Override
|
|
||||||
public Pair<RotatedTileBox, Bitmap> call() throws Exception {
|
|
||||||
Bitmap bmp;
|
|
||||||
while ((bmp = map.get(rotatedTileBox)) == null) {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
}
|
|
||||||
return Pair.create(rotatedTileBox, bmp);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mapActivity.getMapView().setCurrentRotatedTileBox(rotatedTileBox);
|
|
||||||
try {
|
|
||||||
Pair<RotatedTileBox, Bitmap> pair = future.get();
|
|
||||||
Bitmap bitmap = pair.second;// mapActivity.getMapView().currentCanvas;
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
|
|
||||||
byte[] byteArray = stream.toByteArray();
|
|
||||||
ByteArrayInputStream str = new ByteArrayInputStream(byteArray);
|
|
||||||
return newFixedLengthResponse(
|
|
||||||
NanoHTTPD.Response.Status.OK,
|
|
||||||
"image/png",
|
|
||||||
str,
|
|
||||||
str.available());
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return ErrorResponses.response500;
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return ErrorResponses.response500;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAndroidContext(OsmandApplication androidContext) {
|
|
||||||
this.androidContext = androidContext;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public NanoHTTPD.Response route(NanoHTTPD.IHTTPSession session) {
|
public NanoHTTPD.Response route(NanoHTTPD.IHTTPSession session) {
|
||||||
|
@ -144,9 +61,9 @@ public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
||||||
|
|
||||||
private NanoHTTPD.Response routeApi(NanoHTTPD.IHTTPSession session) {
|
private NanoHTTPD.Response routeApi(NanoHTTPD.IHTTPSession session) {
|
||||||
String uri = session.getUri();
|
String uri = session.getUri();
|
||||||
//TODO rewrite
|
int pathEnd = uri.indexOf("/", 1);
|
||||||
if (uri.contains("tile")) {
|
if (pathEnd != -1) {
|
||||||
return endpoints.get("/tile").apiCall.call(session);
|
uri = uri.substring(0, pathEnd);
|
||||||
}
|
}
|
||||||
ApiEndpoint endpoint = endpoints.get(uri);
|
ApiEndpoint endpoint = endpoints.get(uri);
|
||||||
if (endpoint != null) {
|
if (endpoint != null) {
|
||||||
|
@ -157,8 +74,11 @@ public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
||||||
|
|
||||||
private boolean isApiUrl(String uri) {
|
private boolean isApiUrl(String uri) {
|
||||||
for (String endpoint : endpoints.keySet()) {
|
for (String endpoint : endpoints.keySet()) {
|
||||||
//TODO rewrite contains
|
int stringLength = endpoint.length();
|
||||||
if (endpoint.equals(uri) || uri.contains("tile")) return true;
|
if (uri.startsWith(endpoint) &&
|
||||||
|
(uri.length() == endpoint.length() || uri.charAt(stringLength) == '/')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -175,11 +95,11 @@ public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public NanoHTTPD.Response getStatic(String uri) {
|
public NanoHTTPD.Response getStatic(String uri) {
|
||||||
InputStream is = null;
|
InputStream is;
|
||||||
String mimeType = parseMimeType(uri);
|
String mimeType = parseMimeType(uri);
|
||||||
if (androidContext != null) {
|
if (application != null) {
|
||||||
try {
|
try {
|
||||||
is = androidContext.getAssets().open(FOLDER_NAME + uri);
|
is = application.getAssets().open(FOLDER_NAME + uri);
|
||||||
if (is.available() == 0) {
|
if (is.available() == 0) {
|
||||||
return ErrorResponses.response404;
|
return ErrorResponses.response404;
|
||||||
}
|
}
|
||||||
|
@ -208,7 +128,7 @@ public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
||||||
private String readHTMLFromFile(String filename) {
|
private String readHTMLFromFile(String filename) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
try {
|
try {
|
||||||
InputStream is = androidContext.getAssets().open(FOLDER_NAME + filename);
|
InputStream is = application.getAssets().open(FOLDER_NAME + filename);
|
||||||
BufferedReader br = new BufferedReader(new InputStreamReader(is,
|
BufferedReader br = new BufferedReader(new InputStreamReader(is,
|
||||||
Charset.forName("UTF-8")));
|
Charset.forName("UTF-8")));
|
||||||
String str;
|
String str;
|
||||||
|
@ -217,7 +137,7 @@ public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
LOG.error("IOException", e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
@ -225,41 +145,18 @@ public class ApiRouter implements OsmandMapTileView.IMapImageDrawListener {
|
||||||
|
|
||||||
public String getHtmlPage(String name) {
|
public String getHtmlPage(String name) {
|
||||||
String responseText = "";
|
String responseText = "";
|
||||||
if (androidContext != null) {
|
if (application != null) {
|
||||||
responseText = readHTMLFromFile(name);
|
responseText = readHTMLFromFile(name);
|
||||||
}
|
}
|
||||||
if (responseText == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return responseText;
|
return responseText;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getFavoritesJson() {
|
public static class ErrorResponses {
|
||||||
List<FavouritePoint> points = androidContext.getFavorites().getFavouritePoints();
|
public static NanoHTTPD.Response response404 =
|
||||||
StringBuilder text = new StringBuilder();
|
|
||||||
for (FavouritePoint p : points) {
|
|
||||||
String json = jsonFromFavorite(p);
|
|
||||||
text.append(json);
|
|
||||||
text.append(",");
|
|
||||||
}
|
|
||||||
return "[" + text.substring(0, text.length() - 1) + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
private String jsonFromFavorite(FavouritePoint favouritePoint) {
|
|
||||||
return gson.toJson(favouritePoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDraw(RotatedTileBox viewport, Bitmap bmp) {
|
|
||||||
this.map.put(viewport, bmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static class ErrorResponses {
|
|
||||||
static NanoHTTPD.Response response404 =
|
|
||||||
newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND,
|
newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND,
|
||||||
NanoHTTPD.MIME_PLAINTEXT, "404 Not Found");
|
NanoHTTPD.MIME_PLAINTEXT, "404 Not Found");
|
||||||
|
|
||||||
static NanoHTTPD.Response response500 =
|
public static NanoHTTPD.Response response500 =
|
||||||
newFixedLengthResponse(NanoHTTPD.Response.Status.INTERNAL_ERROR,
|
newFixedLengthResponse(NanoHTTPD.Response.Status.INTERNAL_ERROR,
|
||||||
NanoHTTPD.MIME_PLAINTEXT, "500 Internal Server Error");
|
NanoHTTPD.MIME_PLAINTEXT, "500 Internal Server Error");
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package net.osmand.plus.server;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
|
||||||
import fi.iki.elonen.NanoHTTPD;
|
import fi.iki.elonen.NanoHTTPD;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
|
||||||
|
|
||||||
public class ServerSessionHandler {
|
public class ServerSessionHandler {
|
||||||
private OsmandApplication androidApplication;
|
private OsmandApplication androidApplication;
|
||||||
|
@ -16,12 +15,7 @@ public class ServerSessionHandler {
|
||||||
|
|
||||||
public void setAndroidApplication(OsmandApplication androidApplication) {
|
public void setAndroidApplication(OsmandApplication androidApplication) {
|
||||||
this.androidApplication = androidApplication;
|
this.androidApplication = androidApplication;
|
||||||
router.setAndroidContext(androidApplication);
|
router.setApplication(androidApplication);
|
||||||
}
|
|
||||||
|
|
||||||
public void setMapActivity(MapActivity activity) {
|
|
||||||
//todo
|
|
||||||
router.mapActivity = activity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public NanoHTTPD.Response handle(NanoHTTPD.IHTTPSession session) {
|
public NanoHTTPD.Response handle(NanoHTTPD.IHTTPSession session) {
|
||||||
|
|
103
OsmAnd/src/net/osmand/plus/server/endpoints/TileEndpoint.java
Normal file
103
OsmAnd/src/net/osmand/plus/server/endpoints/TileEndpoint.java
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
package net.osmand.plus.server.endpoints;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.util.Pair;
|
||||||
|
import fi.iki.elonen.NanoHTTPD;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.render.MapRenderRepositories;
|
||||||
|
import net.osmand.plus.resources.AsyncLoadingThread;
|
||||||
|
import net.osmand.plus.server.ApiEndpoint;
|
||||||
|
import net.osmand.plus.server.ApiRouter;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
|
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
|
||||||
|
|
||||||
|
public class TileEndpoint extends ApiEndpoint {
|
||||||
|
ExecutorService executor = Executors.newFixedThreadPool(3);
|
||||||
|
Map<RotatedTileBox, Bitmap> hashMap = new HashMap<>();
|
||||||
|
Map<RotatedTileBox, Bitmap> map = Collections.synchronizedMap(hashMap);
|
||||||
|
OsmandApplication application;
|
||||||
|
private static final Log LOG = PlatformUtil.getLog(TileEndpoint.class);
|
||||||
|
|
||||||
|
public TileEndpoint(OsmandApplication application) {
|
||||||
|
this.application = application;
|
||||||
|
this.uri = "/tile";
|
||||||
|
this.apiCall = new ApiEndpoint.ApiCall() {
|
||||||
|
@Override
|
||||||
|
public NanoHTTPD.Response call(NanoHTTPD.IHTTPSession session) {
|
||||||
|
try {
|
||||||
|
return tileApiCall(session);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error("Exception", e);
|
||||||
|
}
|
||||||
|
return ApiRouter.ErrorResponses.response500;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized NanoHTTPD.Response tileApiCall(NanoHTTPD.IHTTPSession session) {
|
||||||
|
int zoom;
|
||||||
|
double lat;
|
||||||
|
double lon;
|
||||||
|
String fullUri = session.getUri().replace("/tile/", "");
|
||||||
|
Scanner s = new Scanner(fullUri).useDelimiter("/");
|
||||||
|
zoom = s.nextInt();
|
||||||
|
lat = s.nextDouble();
|
||||||
|
lon = s.nextDouble();
|
||||||
|
Future<Pair<RotatedTileBox, Bitmap>> future;
|
||||||
|
final RotatedTileBox rotatedTileBox = new RotatedTileBox.RotatedTileBoxBuilder()
|
||||||
|
.setLocation(lat, lon)
|
||||||
|
.setZoom(zoom)
|
||||||
|
.setPixelDimensions(512, 512, 0.5f, 0.5f).build();
|
||||||
|
final MapRenderRepositories renderer = application.getResourceManager().getRenderer();
|
||||||
|
future = executor.submit(new Callable<Pair<RotatedTileBox, Bitmap>>() {
|
||||||
|
@Override
|
||||||
|
public Pair<RotatedTileBox, Bitmap> call() throws Exception {
|
||||||
|
Bitmap bmp;
|
||||||
|
while ((bmp = map.get(rotatedTileBox)) == null) {
|
||||||
|
Thread.sleep(500);
|
||||||
|
}
|
||||||
|
return Pair.create(rotatedTileBox, bmp);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
application.getResourceManager().updateRendererMap(rotatedTileBox, new AsyncLoadingThread.OnMapLoadedListener() {
|
||||||
|
@Override
|
||||||
|
public void onMapLoaded(boolean interrupted) {
|
||||||
|
map.put(rotatedTileBox, renderer.getBitmap());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
Pair<RotatedTileBox, Bitmap> pair = future.get();
|
||||||
|
Bitmap bitmap = pair.second;
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
|
||||||
|
byte[] byteArray = stream.toByteArray();
|
||||||
|
ByteArrayInputStream str = new ByteArrayInputStream(byteArray);
|
||||||
|
return newFixedLengthResponse(
|
||||||
|
NanoHTTPD.Response.Status.OK,
|
||||||
|
"image/png",
|
||||||
|
str,
|
||||||
|
str.available());
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
LOG.error("Execution exception", e);
|
||||||
|
return ApiRouter.ErrorResponses.response500;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.error("Interrupted exception", e);
|
||||||
|
return ApiRouter.ErrorResponses.response500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApplication(OsmandApplication application) {
|
||||||
|
this.application = application;
|
||||||
|
}
|
||||||
|
}
|
|
@ -77,7 +77,6 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
protected OsmandSettings settings = null;
|
protected OsmandSettings settings = null;
|
||||||
private CanvasColors canvasColors = null;
|
private CanvasColors canvasColors = null;
|
||||||
private Boolean nightMode = null;
|
private Boolean nightMode = null;
|
||||||
public Bitmap currentCanvas = null;
|
|
||||||
|
|
||||||
private class CanvasColors {
|
private class CanvasColors {
|
||||||
int colorDay = MAP_DEFAULT_COLOR;
|
int colorDay = MAP_DEFAULT_COLOR;
|
||||||
|
@ -121,10 +120,6 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
public void onDrawOverMap();
|
public void onDrawOverMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IMapImageDrawListener {
|
|
||||||
public void onDraw(RotatedTileBox viewport,Bitmap bmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static final Log LOG = PlatformUtil.getLog(OsmandMapTileView.class);
|
protected static final Log LOG = PlatformUtil.getLog(OsmandMapTileView.class);
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,8 +143,6 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
|
|
||||||
private OnTrackBallListener trackBallDelegate;
|
private OnTrackBallListener trackBallDelegate;
|
||||||
|
|
||||||
private IMapImageDrawListener iMapImageDrawListener;
|
|
||||||
|
|
||||||
private AccessibilityActionsProvider accessibilityActions;
|
private AccessibilityActionsProvider accessibilityActions;
|
||||||
|
|
||||||
private List<OsmandMapLayer> layers = new ArrayList<>();
|
private List<OsmandMapLayer> layers = new ArrayList<>();
|
||||||
|
@ -372,14 +365,6 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
return wasZoomInMultiTouch;
|
return wasZoomInMultiTouch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMapImageDrawListener getMapImageDrawListener() {
|
|
||||||
return iMapImageDrawListener;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMapImageDrawListener(IMapImageDrawListener iMapImageDrawListener) {
|
|
||||||
this.iMapImageDrawListener = iMapImageDrawListener;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean mapGestureAllowed(OsmandMapLayer.MapGestureType type) {
|
public boolean mapGestureAllowed(OsmandMapLayer.MapGestureType type) {
|
||||||
for (OsmandMapLayer layer : layers) {
|
for (OsmandMapLayer layer : layers) {
|
||||||
if (!layer.isMapGestureAllowed(type)) {
|
if (!layer.isMapGestureAllowed(type)) {
|
||||||
|
@ -588,7 +573,6 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
if (!bufferBitmap.isRecycled()) {
|
if (!bufferBitmap.isRecycled()) {
|
||||||
RectF rct = new RectF(x1, y1, x2, y2);
|
RectF rct = new RectF(x1, y1, x2, y2);
|
||||||
canvas.drawBitmap(bufferBitmap, null, rct, paintImg);
|
canvas.drawBitmap(bufferBitmap, null, rct, paintImg);
|
||||||
currentCanvas = bufferBitmap;
|
|
||||||
}
|
}
|
||||||
canvas.rotate(-rot, currentViewport.getCenterPixelX(), currentViewport.getCenterPixelY());
|
canvas.rotate(-rot, currentViewport.getCenterPixelX(), currentViewport.getCenterPixelY());
|
||||||
}
|
}
|
||||||
|
@ -629,9 +613,6 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
}
|
}
|
||||||
long end = SystemClock.elapsedRealtime();
|
long end = SystemClock.elapsedRealtime();
|
||||||
additional.calculateFPS(start, end);
|
additional.calculateFPS(start, end);
|
||||||
if (iMapImageDrawListener != null){
|
|
||||||
iMapImageDrawListener.onDraw(tileBox,bufferBitmap);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void refreshMapInternal(DrawSettings drawSettings) {
|
public void refreshMapInternal(DrawSettings drawSettings) {
|
||||||
|
|
Loading…
Reference in a new issue