style issues
This commit is contained in:
parent
8dd5bda3fc
commit
8505f67d68
10 changed files with 97 additions and 379 deletions
|
@ -7,7 +7,7 @@
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.STORAGE" />
|
<uses-permission android:name="android.permission.STORAGE" />
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
<application android:allowBackup="true" android:backupAgent="net.osmand.plus.OsmandBackupAgent"
|
<application android:allowBackup="true" android:backupAgent="net.osmand.plus.OsmandBackupAgent"
|
||||||
android:icon="@mipmap/icon" android:label="@string/app_name"
|
android:icon="@mipmap/icon" android:label="@string/app_name"
|
||||||
android:name="net.osmand.plus.OsmandApplication" android:configChanges="locale"
|
android:name="net.osmand.plus.OsmandApplication" android:configChanges="locale"
|
||||||
android:theme="@style/OsmandDarkTheme" android:restoreAnyVersion="true" android:largeHeap="true"
|
android:theme="@style/OsmandDarkTheme" android:restoreAnyVersion="true" android:largeHeap="true"
|
||||||
android:supportsRtl="true" android:usesCleartextTraffic="true">
|
android:supportsRtl="true" android:usesCleartextTraffic="true">
|
||||||
|
|
||||||
<meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIqF3tNGT66etVBn_vgzpfAY1wmIzKV1Ss6Ku-2A" />
|
<meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIqF3tNGT66etVBn_vgzpfAY1wmIzKV1Ss6Ku-2A" />
|
||||||
|
@ -66,7 +66,7 @@
|
||||||
<activity android:name="net.osmand.plus.activities.HelpActivity" />
|
<activity android:name="net.osmand.plus.activities.HelpActivity" />
|
||||||
<activity android:name="net.osmand.plus.activities.ExitActivity" />
|
<activity android:name="net.osmand.plus.activities.ExitActivity" />
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="net.osmand.plus.fileprovider"
|
android:authorities="net.osmand.plus.fileprovider"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
|
@ -952,7 +952,7 @@
|
||||||
|
|
||||||
<!-- keep android:process on a separate line !! -->
|
<!-- keep android:process on a separate line !! -->
|
||||||
<service
|
<service
|
||||||
android:process="net.osmand.plus"
|
android:process="net.osmand.plus"
|
||||||
android:label="@string/process_navigation_service"
|
android:label="@string/process_navigation_service"
|
||||||
android:name="net.osmand.plus.NavigationService"
|
android:name="net.osmand.plus.NavigationService"
|
||||||
android:foregroundServiceType="location"
|
android:foregroundServiceType="location"
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
body {
|
|
||||||
margin:0;
|
|
||||||
padding:20px;
|
|
||||||
max-width: 1250px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
|
|
||||||
.send-private-giveaway, .register-giveaway, .access-server-logs, .update-btc-report {
|
|
||||||
margin: 20px 0px;
|
|
||||||
border: 1px solid #e6e6e6;
|
|
||||||
width: 50%;
|
|
||||||
|
|
||||||
}
|
|
||||||
.wrapper {
|
|
||||||
list-style-type: none;
|
|
||||||
padding: 0;
|
|
||||||
border-radius: 3px;
|
|
||||||
|
|
||||||
}
|
|
||||||
.form-row {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding: 5px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-row > label {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
.form-row > input {
|
|
||||||
flex: 1;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
.form-row > button {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
th, td {
|
|
||||||
text-align: left;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
tr:nth-child(even){background-color: #f2f2f2}
|
|
||||||
tr:hover {background-color: #d5d5d5;}
|
|
||||||
|
|
||||||
th {
|
|
||||||
background-color: #4CAF50;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
.loader,
|
|
||||||
.loader:before,
|
|
||||||
.loader:after {
|
|
||||||
border-radius: 50%;
|
|
||||||
width: 2.5em;
|
|
||||||
height: 2.5em;
|
|
||||||
-webkit-animation-fill-mode: both;
|
|
||||||
animation-fill-mode: both;
|
|
||||||
-webkit-animation: load7 1.8s infinite ease-in-out;
|
|
||||||
animation: load7 1.8s infinite ease-in-out;
|
|
||||||
}
|
|
||||||
.loader {
|
|
||||||
color: #00ffff;
|
|
||||||
font-size: 10px;
|
|
||||||
margin: 25px auto;
|
|
||||||
position: relative;
|
|
||||||
text-indent: -9999em;
|
|
||||||
-webkit-transform: translateZ(0);
|
|
||||||
-ms-transform: translateZ(0);
|
|
||||||
transform: translateZ(0);
|
|
||||||
-webkit-animation-delay: -0.16s;
|
|
||||||
animation-delay: -0.16s;
|
|
||||||
}
|
|
||||||
.loader:before,
|
|
||||||
.loader:after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
.loader:before {
|
|
||||||
left: -3.5em;
|
|
||||||
-webkit-animation-delay: -0.32s;
|
|
||||||
animation-delay: -0.32s;
|
|
||||||
}
|
|
||||||
.loader:after {
|
|
||||||
left: 3.5em;
|
|
||||||
}
|
|
||||||
@-webkit-keyframes load7 {
|
|
||||||
0%,
|
|
||||||
80%,
|
|
||||||
100% {
|
|
||||||
box-shadow: 0 2.5em 0 -1.3em;
|
|
||||||
}
|
|
||||||
40% {
|
|
||||||
box-shadow: 0 2.5em 0 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@keyframes load7 {
|
|
||||||
0%,
|
|
||||||
80%,
|
|
||||||
100% {
|
|
||||||
box-shadow: 0 2.5em 0 -1.3em;
|
|
||||||
}
|
|
||||||
40% {
|
|
||||||
box-shadow: 0 2.5em 0 0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
var blogArticles = [
|
|
||||||
{title:'OsmAnd for iPhone is released', url:'blog.html?id=osmand-ios', id:'osmand-ios', gatag:'osmand_ios'},
|
|
||||||
{title:'Nautical charts', url:'blog.html?id=nautical-charts', id:'nautical-charts', gatag:'nautical_charts'},
|
|
||||||
{title:'OsmAnd DVR goes live', url:'blog.html?id=osmand-dvr-goes-live', id:'osmand-dvr-goes-live', gatag:'osmand_dvr_goes_live'},
|
|
||||||
{title:'OsmAnd 1.9', url:'blog.html?id=osmand-1-9-released', id:'osmand-1-9-released', gatag:'osmand_1_9'},
|
|
||||||
{title:'OsmAnd 1.8', url:'blog.html?id=osmand-1-8-released', id:'osmand-1-8-released', gatag:'osmand_1_8'},
|
|
||||||
{title:'OsmAnd 1.7', url:'blog.html?id=osmand-1-7-released', id:'osmand-1-7-released', gatag:'osmand_1_7'},
|
|
||||||
{title:'OsmAnd 1.6 Released', url:'blog.html?id=osmand-1-6-released', id:'osmand-1-6-released', gatag:'osmand_1_6'},
|
|
||||||
{title:'OsmAnd 1.5 Released', url:'blog.html?id=osmand-1-5-released', id:'osmand-1-5-released', gatag:'osmand_1_5'}
|
|
||||||
];
|
|
||||||
|
|
||||||
var webSiteUrl = "http://osmand.net";
|
|
||||||
|
|
||||||
$.urlParam = function(url, name){
|
|
||||||
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(url);
|
|
||||||
if (results==null){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return results[1] || 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function blog(container){
|
|
||||||
|
|
||||||
var getFullArticleUrl = function(articleObj){
|
|
||||||
return webSiteUrl + "/" + articleObj.url;
|
|
||||||
}
|
|
||||||
|
|
||||||
var fixTwitter =function (){
|
|
||||||
$('#___plusone_0 iframe').css('height', '21px');
|
|
||||||
}
|
|
||||||
|
|
||||||
var updateMetaTags = function(articleObj){
|
|
||||||
if (articleObj && articleObj != null){
|
|
||||||
var articleFullUrl = getFullArticleUrl(articleObj);
|
|
||||||
$('meta[property="og:title"]').attr('content', articleObj.title);
|
|
||||||
$('meta[property="og:url"]').attr('content', articleFullUrl);
|
|
||||||
$('meta[property="og:description"]').attr('content', articleObj.title);
|
|
||||||
|
|
||||||
$('link[rel="canonical"]').attr('href', articleFullUrl);
|
|
||||||
|
|
||||||
$('div.fb-like').attr('data-href', articleFullUrl);
|
|
||||||
$('.twitter-share-button').attr('data-url', articleFullUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var getArticleById = function(articleid){
|
|
||||||
for(var i=0; i < blogArticles.length;++i){
|
|
||||||
if (blogArticles[i].id === articleid){
|
|
||||||
return blogArticles[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var init = function(){
|
|
||||||
container.empty();
|
|
||||||
|
|
||||||
for(var i=0; i < blogArticles.length; ++i){
|
|
||||||
var link = blogArticles[i];
|
|
||||||
container.append('<li><a data-gatag="' +link.gatag+ '" data-index="' + link.index+ '" href="' + link.url + '">' + link.title + '</a></li>');
|
|
||||||
}
|
|
||||||
|
|
||||||
var articleid = $.urlParam(window.location.href, 'id');
|
|
||||||
if (!articleid || articleid == null){
|
|
||||||
articleid = blogArticles[0].id;
|
|
||||||
}
|
|
||||||
//hide share buttons
|
|
||||||
$('.share_buttons').css('display', 'none');
|
|
||||||
updateMetaTags(getArticleById(articleid));
|
|
||||||
var url = 'blog_articles' + '/' + articleid + ".html";
|
|
||||||
$( ".article" ).load(url, function( response, status, xhr) {
|
|
||||||
if ( status != "error" ) {
|
|
||||||
|
|
||||||
$('.share_buttons').css('display', 'block');
|
|
||||||
setTimeout(fixTwitter, 5000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
init();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
function applyPolStyles(){
|
|
||||||
|
|
||||||
if ($('.pds-box').length > 0){
|
|
||||||
$('.pds-box').css('border', 'none');
|
|
||||||
$('.pds-vote-button').css('float', 'left');
|
|
||||||
$('.pds-vote-button').css('background', 'none');
|
|
||||||
$('.pds-vote-button').css('background-color', '#FF8F00');
|
|
||||||
$('.pds-vote-button').css('color', '#fff');
|
|
||||||
$('.pds-vote-button').css('border', 'none');
|
|
||||||
$('.pds-vote-button').css('border-radius', '5px');
|
|
||||||
$('.pds-box-outer').css('padding', '0');
|
|
||||||
$('.pds-view-results').on('click', function(){
|
|
||||||
subscribeToReturnToPoll();
|
|
||||||
});
|
|
||||||
}else{
|
|
||||||
setTimeout(applyPolStyles, timeout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function subscribeToReturnToPoll(){
|
|
||||||
if ($('.pds-return-poll').length > 0){
|
|
||||||
$('.pds-return-poll').on('click', function(){applyStyleOnBackToPoll();});
|
|
||||||
applyPolStyles();
|
|
||||||
}else{
|
|
||||||
setTimeout(subscribeToReturnToPoll, timeout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function applyStyleOnBackToPoll(){
|
|
||||||
if ($('.pds-view-results').length >0){
|
|
||||||
applyPolStyles();
|
|
||||||
}else{
|
|
||||||
setTimeout(applyStyleOnBackToPoll, timeout);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,129 +0,0 @@
|
||||||
var images_android=[
|
|
||||||
"promo-1s.png",
|
|
||||||
"promo-2s.png",
|
|
||||||
"promo-3s.png",
|
|
||||||
"promo-4s.png",
|
|
||||||
"promo-5s.png",
|
|
||||||
"promo-6s.png",
|
|
||||||
"promo-7s.png",
|
|
||||||
"promo-8s.png",
|
|
||||||
"promo-9s.png",
|
|
||||||
"promo-10s.png",
|
|
||||||
"promo-11s.png",
|
|
||||||
"promo-12s.png"
|
|
||||||
];
|
|
||||||
|
|
||||||
var images_ios=[
|
|
||||||
"ios-1s.png",
|
|
||||||
"ios-2s.png",
|
|
||||||
"ios-3s.png",
|
|
||||||
"ios-4s.png",
|
|
||||||
"ios-5s.png"
|
|
||||||
];
|
|
||||||
|
|
||||||
function slider(container){
|
|
||||||
var $cnt = $(container);
|
|
||||||
var $img1 = $cnt.find("#screenshot1");
|
|
||||||
var $img2 =$cnt.find("#screenshot2");
|
|
||||||
var $img3 = $cnt.find("#screenshot3");
|
|
||||||
var $img4 = $cnt.find("#screenshot4");
|
|
||||||
var $leftarrow = $cnt.find(".arrow.left");
|
|
||||||
var $rightarrow = $cnt.find(".arrow.right");
|
|
||||||
var $btnleft = $cnt.find(".button.left");
|
|
||||||
var $btnright = $cnt.find(".button.right");
|
|
||||||
var currentPosition =0;
|
|
||||||
var count =4;
|
|
||||||
|
|
||||||
var images = images_android;
|
|
||||||
|
|
||||||
var init = function(){
|
|
||||||
updatePictures();
|
|
||||||
updateArrows();
|
|
||||||
$leftarrow.on('click', function(){
|
|
||||||
if (currentPosition > 0){
|
|
||||||
currentPosition-=count;
|
|
||||||
updatePictures();
|
|
||||||
updateArrows();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$rightarrow.on('click', function(){
|
|
||||||
if (currentPosition + count < images.length){
|
|
||||||
currentPosition+=count;
|
|
||||||
updatePictures();
|
|
||||||
updateArrows();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$btnleft.on('click', function(){
|
|
||||||
if (!$btnleft.hasClass("active")){
|
|
||||||
$btnleft.addClass("active");
|
|
||||||
$btnright.removeClass("active");
|
|
||||||
$btnright.addClass
|
|
||||||
images = images_android;
|
|
||||||
currentPosition = 0;
|
|
||||||
updatePictures();
|
|
||||||
updateArrows();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
$btnright.on('click', function(){
|
|
||||||
if (!$btnright.hasClass("active")){
|
|
||||||
$btnright.addClass("active");
|
|
||||||
$btnleft.removeClass("active");
|
|
||||||
images = images_ios;
|
|
||||||
currentPosition = 0;
|
|
||||||
updatePictures();
|
|
||||||
updateArrows();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var changePicture = function(img, index){
|
|
||||||
if (index < images.length){
|
|
||||||
img.attr("src", "images/" + images[index]);
|
|
||||||
}else{
|
|
||||||
img.attr("src", "images/empty.png");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var updatePictures = function(){
|
|
||||||
changePicture( $img1, currentPosition);
|
|
||||||
changePicture( $img2, currentPosition+1);
|
|
||||||
changePicture( $img3, currentPosition+2);
|
|
||||||
changePicture( $img4, currentPosition+3);
|
|
||||||
}
|
|
||||||
var updateArrows = function(){
|
|
||||||
if (currentPosition + count < images.length){
|
|
||||||
enableRightArrow();
|
|
||||||
}else{
|
|
||||||
disableRightArrow();
|
|
||||||
}
|
|
||||||
if (currentPosition== 0 ){
|
|
||||||
disableLeftArrow();
|
|
||||||
}else{
|
|
||||||
enableLeftArrow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var enableLeftArrow = function(){
|
|
||||||
$leftarrow.attr("src", "images/left_arrow_orange.png");
|
|
||||||
while ($leftarrow.hasClass("disabled")){
|
|
||||||
$leftarrow.removeClass("disabled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var disableLeftArrow = function(){
|
|
||||||
$leftarrow.attr("src", "images/left_arrow_grey.png");
|
|
||||||
$leftarrow.addClass("disabled");
|
|
||||||
}
|
|
||||||
var enableRightArrow = function(){
|
|
||||||
$rightarrow.attr("src", "images/right_arrow_orange.png");
|
|
||||||
while ($rightarrow.hasClass("disabled")){
|
|
||||||
$rightarrow.removeClass("disabled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var disableRightArrow = function(){
|
|
||||||
$rightarrow.attr("src", "images/right_arrow_grey.png");
|
|
||||||
$rightarrow.addClass("disabled");
|
|
||||||
}
|
|
||||||
init();
|
|
||||||
|
|
||||||
}
|
|
8
OsmAnd/src/net/osmand/plus/server/IMapOnImageDrawn.java
Normal file
8
OsmAnd/src/net/osmand/plus/server/IMapOnImageDrawn.java
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package net.osmand.plus.server;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
|
||||||
|
public interface IMapOnImageDrawn {
|
||||||
|
void onDraw(RotatedTileBox viewport, Bitmap bmp);
|
||||||
|
}
|
|
@ -1,10 +1,14 @@
|
||||||
package net.osmand.plus.server;
|
package net.osmand.plus.server;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import fi.iki.elonen.NanoHTTPD;
|
import fi.iki.elonen.NanoHTTPD;
|
||||||
import net.osmand.PlatformUtil;
|
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.server.endpoints.TileEndpoint;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -12,13 +16,14 @@ import java.io.InputStream;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class OsmAndHttpServer extends NanoHTTPD {
|
public class OsmAndHttpServer extends NanoHTTPD{
|
||||||
private static final String FOLDER_NAME = "server";
|
private static final String FOLDER_NAME = "server";
|
||||||
private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmAndHttpServer.class);
|
private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmAndHttpServer.class);
|
||||||
public static final int PORT = 24990;
|
public static final int PORT = 24990;
|
||||||
public static String HOSTNAME = "0.0.0.0";
|
public static String HOSTNAME = "0.0.0.0";
|
||||||
private final Map<String, ApiEndpoint> endpoints = new HashMap<>();
|
private final Map<String, ApiEndpoint> endpoints = new HashMap<>();
|
||||||
private OsmandApplication application;
|
private OsmandApplication application;
|
||||||
|
private MapActivity mapActivity;
|
||||||
|
|
||||||
public OsmAndHttpServer() throws IOException {
|
public OsmAndHttpServer() throws IOException {
|
||||||
super(HOSTNAME, PORT);
|
super(HOSTNAME, PORT);
|
||||||
|
@ -72,7 +77,7 @@ public class OsmAndHttpServer extends NanoHTTPD {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerEndpoints() {
|
private void registerEndpoints() {
|
||||||
register("/tile", new TileEndpoint(application));
|
register("/tile", new TileEndpoint(application,mapActivity));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(String path, ApiEndpoint endpoint) {
|
private void register(String path, ApiEndpoint endpoint) {
|
||||||
|
@ -95,6 +100,7 @@ public class OsmAndHttpServer extends NanoHTTPD {
|
||||||
is,
|
is,
|
||||||
is.available());
|
is.available());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
LOG.error(e);
|
||||||
return ErrorResponses.response404;
|
return ErrorResponses.response404;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,6 +117,17 @@ public class OsmAndHttpServer extends NanoHTTPD {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setActivity(FragmentActivity activity) {
|
||||||
|
if (activity instanceof MapActivity){
|
||||||
|
this.mapActivity = (MapActivity)activity;
|
||||||
|
}
|
||||||
|
for (String endpoint : endpoints.keySet()){
|
||||||
|
if (endpoints.get(endpoint) instanceof TileEndpoint){
|
||||||
|
((TileEndpoint) endpoints.get(endpoint)).setMapActivity(mapActivity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class ErrorResponses {
|
public static class ErrorResponses {
|
||||||
public static NanoHTTPD.Response response404 =
|
public static NanoHTTPD.Response response404 =
|
||||||
newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND,
|
newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND,
|
||||||
|
|
|
@ -12,15 +12,18 @@ 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 net.osmand.PlatformUtil;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.base.BaseOsmAndFragment;
|
import net.osmand.plus.base.BaseOsmAndFragment;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import static android.content.Context.WIFI_SERVICE;
|
import static android.content.Context.WIFI_SERVICE;
|
||||||
|
|
||||||
public class ServerFragment extends BaseOsmAndFragment {
|
public class ServerFragment extends BaseOsmAndFragment {
|
||||||
|
private final static Log LOG = PlatformUtil.getLog(ServerFragment.class);
|
||||||
private boolean initialized = false;
|
private boolean initialized = false;
|
||||||
private OsmAndHttpServer server;
|
private OsmAndHttpServer server;
|
||||||
private View view;
|
private View view;
|
||||||
|
@ -85,13 +88,14 @@ public class ServerFragment extends BaseOsmAndFragment {
|
||||||
try {
|
try {
|
||||||
server = new OsmAndHttpServer();
|
server = new OsmAndHttpServer();
|
||||||
server.setApplication((OsmandApplication) getMyApplication());
|
server.setApplication((OsmandApplication) getMyApplication());
|
||||||
|
server.setActivity(this.getActivity());
|
||||||
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) {
|
||||||
Toast.makeText(requireContext(),
|
Toast.makeText(requireContext(),
|
||||||
e.getLocalizedMessage(),
|
e.getLocalizedMessage(),
|
||||||
Toast.LENGTH_SHORT).show();
|
Toast.LENGTH_SHORT).show();
|
||||||
e.printStackTrace();
|
LOG.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,19 @@
|
||||||
package net.osmand.plus.server.endpoints;
|
package net.osmand.plus.server.endpoints;
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.util.Log;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import fi.iki.elonen.NanoHTTPD;
|
import fi.iki.elonen.NanoHTTPD;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.RotatedTileBox;
|
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.render.MapRenderRepositories;
|
import net.osmand.plus.render.MapRenderRepositories;
|
||||||
import net.osmand.plus.resources.AsyncLoadingThread;
|
import net.osmand.plus.resources.AsyncLoadingThread;
|
||||||
import net.osmand.plus.server.ApiEndpoint;
|
import net.osmand.plus.server.ApiEndpoint;
|
||||||
|
import net.osmand.plus.server.IMapOnImageDrawn;
|
||||||
import net.osmand.plus.server.OsmAndHttpServer;
|
import net.osmand.plus.server.OsmAndHttpServer;
|
||||||
|
import net.osmand.plus.server.ServerFragment;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
@ -20,21 +24,33 @@ import java.util.Scanner;
|
||||||
|
|
||||||
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
|
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
|
||||||
|
|
||||||
public class TileEndpoint implements ApiEndpoint {
|
public class TileEndpoint implements ApiEndpoint, IMapOnImageDrawn {
|
||||||
private static final int RENDER_WAIT_THRESHOLD = 5000;
|
private static final int RENDER_WAIT_THRESHOLD = 5000;
|
||||||
private static final Object lock = new Object();
|
private static final Object lock = new Object();
|
||||||
private static final int TILE_SIZE_PX = 512;
|
private static final int TILE_SIZE_PX = 512;
|
||||||
|
private static final Log LOG = PlatformUtil.getLog(TileEndpoint.class);
|
||||||
Map<RotatedTileBox, Bitmap> hashMap = new HashMap<>();
|
Map<RotatedTileBox, Bitmap> hashMap = new HashMap<>();
|
||||||
Map<RotatedTileBox, Bitmap> map = Collections.synchronizedMap(hashMap);
|
Map<RotatedTileBox, Bitmap> map = Collections.synchronizedMap(hashMap);
|
||||||
OsmandApplication application;
|
OsmandApplication application;
|
||||||
|
private RotatedTileBox viewPort;
|
||||||
|
private Bitmap resultBitmap;
|
||||||
|
private MapActivity mapActivity;
|
||||||
|
|
||||||
public TileEndpoint(OsmandApplication application) {
|
@Override
|
||||||
|
public void onDraw(RotatedTileBox viewport, Bitmap bmp) {
|
||||||
|
map.put(viewport, bmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TileEndpoint(OsmandApplication application, MapActivity mapActivity) {
|
||||||
this.application = application;
|
this.application = application;
|
||||||
|
this.mapActivity = mapActivity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NanoHTTPD.Response process(NanoHTTPD.IHTTPSession session) {
|
public NanoHTTPD.Response process(NanoHTTPD.IHTTPSession session) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
|
this.mapActivity.getMapView().setOnImageDrawnListener(this);
|
||||||
|
RotatedTileBox tileBoxCopy = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
|
||||||
int zoom;
|
int zoom;
|
||||||
double lat;
|
double lat;
|
||||||
double lon;
|
double lon;
|
||||||
|
@ -52,6 +68,7 @@ public class TileEndpoint implements ApiEndpoint {
|
||||||
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
|
||||||
byte[] byteArray = stream.toByteArray();
|
byte[] byteArray = stream.toByteArray();
|
||||||
ByteArrayInputStream str = new ByteArrayInputStream(byteArray);
|
ByteArrayInputStream str = new ByteArrayInputStream(byteArray);
|
||||||
|
mapActivity.getMapView().setCurrentViewport(tileBoxCopy);
|
||||||
return newFixedLengthResponse(
|
return newFixedLengthResponse(
|
||||||
NanoHTTPD.Response.Status.OK,
|
NanoHTTPD.Response.Status.OK,
|
||||||
"image/png",
|
"image/png",
|
||||||
|
@ -65,25 +82,42 @@ public class TileEndpoint implements ApiEndpoint {
|
||||||
this.application = application;
|
this.application = application;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMapActivity(MapActivity mapActivity) {
|
||||||
|
this.mapActivity = mapActivity;
|
||||||
|
}
|
||||||
|
|
||||||
private Bitmap requestTile(double lat, double lon, int zoom) {
|
private Bitmap requestTile(double lat, double lon, int zoom) {
|
||||||
final RotatedTileBox rotatedTileBox = new RotatedTileBox.RotatedTileBoxBuilder()
|
final RotatedTileBox rotatedTileBox = new RotatedTileBox.RotatedTileBoxBuilder()
|
||||||
.setLocation(lat, lon)
|
.setLocation(lat, lon)
|
||||||
.setZoom(zoom)
|
.setZoom(zoom)
|
||||||
.setPixelDimensions(TILE_SIZE_PX, TILE_SIZE_PX, 0.5f, 0.5f).build();
|
.setPixelDimensions(TILE_SIZE_PX, TILE_SIZE_PX, 0.5f, 0.5f).build();
|
||||||
final MapRenderRepositories renderer = application.getResourceManager().getRenderer();
|
final MapRenderRepositories renderer = application.getResourceManager().getRenderer();
|
||||||
application.getResourceManager().updateRendererMap(rotatedTileBox, new AsyncLoadingThread.OnMapLoadedListener() {
|
mapActivity.getMapView().setCurrentViewport(rotatedTileBox);
|
||||||
@Override
|
// application.getResourceManager().updateRendererMap(rotatedTileBox, new AsyncLoadingThread.OnMapLoadedListener() {
|
||||||
public void onMapLoaded(boolean interrupted) {
|
// @Override
|
||||||
map.put(rotatedTileBox, renderer.getBitmap());
|
// public void onMapLoaded(boolean interrupted) {
|
||||||
}
|
// map.put(rotatedTileBox, renderer.getBitmap());
|
||||||
});
|
// }
|
||||||
Bitmap bmp;
|
// });
|
||||||
|
Bitmap bmp = null;
|
||||||
int sleepTime = 500;
|
int sleepTime = 500;
|
||||||
|
int timeout = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// while ((viewPort == null && !rotatedTileBox.equals(viewPort)) || timeout < 5000) {
|
||||||
|
// Thread.sleep(100);
|
||||||
|
// timeout += 100;
|
||||||
|
// }
|
||||||
|
// return resultBitmap;
|
||||||
|
// } catch (InterruptedException e) {
|
||||||
|
// LOG.error(e);
|
||||||
|
// }
|
||||||
while ((bmp = map.get(rotatedTileBox)) == null) {
|
while ((bmp = map.get(rotatedTileBox)) == null) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(sleepTime);
|
Thread.sleep(sleepTime);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
LOG.error(e);
|
||||||
}
|
}
|
||||||
sleepTime += 500;
|
sleepTime += 500;
|
||||||
if (sleepTime > RENDER_WAIT_THRESHOLD) {
|
if (sleepTime > RENDER_WAIT_THRESHOLD) {
|
||||||
|
|
|
@ -46,6 +46,8 @@ import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.helpers.TwoFingerTapDetector;
|
import net.osmand.plus.helpers.TwoFingerTapDetector;
|
||||||
|
import net.osmand.plus.server.IMapOnImageDrawn;
|
||||||
|
import net.osmand.plus.server.endpoints.TileEndpoint;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.views.MultiTouchSupport.MultiTouchZoomListener;
|
import net.osmand.plus.views.MultiTouchSupport.MultiTouchZoomListener;
|
||||||
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
|
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
|
||||||
|
@ -77,6 +79,7 @@ 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;
|
||||||
|
private IMapOnImageDrawn mapOnImageDrawnListener;
|
||||||
|
|
||||||
private class CanvasColors {
|
private class CanvasColors {
|
||||||
int colorDay = MAP_DEFAULT_COLOR;
|
int colorDay = MAP_DEFAULT_COLOR;
|
||||||
|
@ -86,7 +89,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
private class FPSMeasurement {
|
private class FPSMeasurement {
|
||||||
int fpsMeasureCount = 0;
|
int fpsMeasureCount = 0;
|
||||||
int fpsMeasureMs = 0;
|
int fpsMeasureMs = 0;
|
||||||
long fpsFirstMeasurement = 0;
|
long fpsFirstMeasurement = 0 ;
|
||||||
float fps;
|
float fps;
|
||||||
|
|
||||||
void calculateFPS(long start, long end) {
|
void calculateFPS(long start, long end) {
|
||||||
|
@ -341,6 +344,10 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
return application;
|
return application;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOnImageDrawnListener(IMapOnImageDrawn iMapOnImageDrawn) {
|
||||||
|
this.mapOnImageDrawnListener = iMapOnImageDrawn;
|
||||||
|
}
|
||||||
|
|
||||||
// ///////////////////////// NON UI PART (could be extracted in common) /////////////////////////////
|
// ///////////////////////// NON UI PART (could be extracted in common) /////////////////////////////
|
||||||
public LatLon getFirstTouchPointLatLon() {
|
public LatLon getFirstTouchPointLatLon() {
|
||||||
return firstTouchPointLatLon;
|
return firstTouchPointLatLon;
|
||||||
|
@ -574,6 +581,9 @@ 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);
|
||||||
|
if (mapOnImageDrawnListener != null){
|
||||||
|
mapOnImageDrawnListener.onDraw(currentViewport,bufferBitmap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
canvas.rotate(-rot, currentViewport.getCenterPixelX(), currentViewport.getCenterPixelY());
|
canvas.rotate(-rot, currentViewport.getCenterPixelX(), currentViewport.getCenterPixelY());
|
||||||
}
|
}
|
||||||
|
@ -869,6 +879,11 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
return currentViewport;
|
return currentViewport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setCurrentViewport(RotatedTileBox viewport) {
|
||||||
|
currentViewport = viewport;
|
||||||
|
refreshMap();
|
||||||
|
}
|
||||||
|
|
||||||
public float getDensity() {
|
public float getDensity() {
|
||||||
return currentViewport.getDensity();
|
return currentViewport.getDensity();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue