From 150e769709a7d331100d154be0647667715f8f72 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 7 Sep 2020 17:30:27 +0300 Subject: [PATCH] refactoring --- OsmAnd/assets/server/css/site.css | 3322 +++++++++++++++++ OsmAnd/assets/server/index.html | 28 +- .../net/osmand/plus/server/ApiEndpoint.java | 10 - .../osmand/plus/server/IMapOnImageDrawn.java | 8 - .../osmand/plus/server/OsmAndHttpServer.java | 36 +- .../osmand/plus/server/ServerFragment.java | 10 +- .../plus/server/endpoints/TileEndpoint.java | 86 +- .../osmand/plus/views/OsmandMapTileView.java | 10 +- 8 files changed, 3388 insertions(+), 122 deletions(-) create mode 100644 OsmAnd/assets/server/css/site.css delete mode 100644 OsmAnd/src/net/osmand/plus/server/ApiEndpoint.java delete mode 100644 OsmAnd/src/net/osmand/plus/server/IMapOnImageDrawn.java diff --git a/OsmAnd/assets/server/css/site.css b/OsmAnd/assets/server/css/site.css new file mode 100644 index 0000000000..a2a8ad5390 --- /dev/null +++ b/OsmAnd/assets/server/css/site.css @@ -0,0 +1,3322 @@ +@font-face { + font-family: 'Roboto Regular'; + src: url('/fonts/Roboto-Regular-webfont.eot'); + src: url('/fonts/Roboto-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('/fonts/Roboto-Regular-webfont.woff') format('woff'), + url('/fonts/Roboto-Regular-webfont.ttf') format('truetype'), + url('/fonts/Roboto-Regular-webfont.svg#robotoregular') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Roboto Bold'; + src: url('/fonts/Roboto-Bold-webfont.eot'); + src: url('/fonts/Roboto-Bold-webfont.eot?#iefix') format('embedded-opentype'), + url('/fonts/Roboto-Bold-webfont.woff') format('woff'), + url('/fonts/Roboto-Bold-webfont.ttf') format('truetype'), + url('/fonts/Roboto-Bold-webfont.svg#robotobold') format('svg'); + font-family: 'Roboto Bold'; + font-style: normal; + +} +* { + box-sizing: border-box; +} +html, body { + height: 100%; +} +body { + font-family: 'Roboto Regular', Arial, Helvetica, sans-serif; + font-size:1.1em; + line-height:1.5em; + margin:0; + padding:0; +} +ul li { + margin:0; + padding:0; +} +h1, h2 { + -webkit-margin-before:0; + -webkit-margin-after:0; + margin-top:0; + margin-bottom:0; + font-weight:400; + font-size:3em; + letter-spacing:.06em; + padding-top:25px; + padding-bottom:25px; + line-height:1em; +} + +b { + font-family: 'Roboto Bold'; +} + +xmp, pre { + white-space:pre-wrap; +} +a::-moz-focus-inner { + border: 0; +} +.tech-oh { + overflow: hidden; +} +.maincontainer { + width: 100%; + height: auto; + background-color: #fff; + transition: transform .5s; +} +.maincontainer.menu-open { + position: fixed; + -webkit-transform: translate(-300px, 0); + transform: translate(-300px, 0); + transition: transform .5s; +} + +.main { + position: relative; + min-height: 100%; + margin: 0 auto; +} +.downloads .question { + padding: 20px; + border: 1px solid #ddd; + margin-bottom: 20px; +} +.downloads .subtitle { + position: relative; + padding-bottom: 15px; + margin-bottom: 20px; + border-bottom: 4px solid #fb0; +} +.downloads .version-link { + text-decoration: none; +} +.downloads .version-num { + color: #000; + font-size: 34px; + font-family: 'Roboto Bold'; +} +.downloads .date-stamp { + display: block; + color: #999; + font-size: 14px; + font-weight: normal; +} +.downloads .download-btn { + position: absolute; + top: 0; + right: 0; + padding: 5px 15px; + background: #ff8f00; + color: #fff; + font-size: 14px; + font-family: 'Roboto Bold'; + text-decoration: none; +} +.downloads ul { + list-style-type: disc; +} + +.header { + position: relative; + color: #fff; +} +.header-map { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + background: #ededed url('/images/header_image.jpg') center center no-repeat; + background-size: cover; +} + +.shadowline { + position: relative; + z-index: 15; + width:100%; + height:100px; + background:rgba(21, 29, 45, 0.77); +} + +.menu-wrapper { + position: relative; + width: 100%; + height: 100%; + max-width: 1170px; + margin: 0 auto; +} +.menu-wrapper a { + outline: none; +} + +.headertitle { + position:absolute; + bottom:-15px; + left:20%; + right:20%; + background:#fff; + border:2px solid; + border-radius:15px; +} +.headerlogo-link { + display: inline-block; + vertical-align: middle; + padding: 10px 40px 5px; +} +.headerlogo { + width: 176px; + height: 77px; + background: url('/images/logo.png') center center no-repeat; + background-size: 100%; +} +.header-caption { + position: relative; + z-index: 10; + max-width: 1195px; + margin: 0 auto; +} +.headertext { + margin: 169px 0 109px; + padding: 0 40px; + font-size:50px; + line-height:1.6em; + font-family: 'Roboto Bold'; + letter-spacing:.06em; + text-transform: uppercase; + text-shadow: 0 0 3px #333; +} +.headertext.new-year, +.headertext.black-friday { + position: relative; +} +.headertext.new-year:before, +.headertext.black-friday:before { + content: ''; + position: absolute; + top: -20px; + left: 700px; + width: 305px; + height: 195px; + background-size: 100%; +} +.headertext.black-friday:before { + background: url('/images/banner_discount.png') no-repeat center center; +} +.headertext.new-year:before { + background: url('/images/banner_new_year.png') no-repeat center center; +} +.menu { + position: absolute; + top: 50%; + right: -182px; + margin-top: -12px; + font-family: Verdana, Arial; + font-family: 'Roboto Bold'; + letter-spacing: .06em; + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + text-transform: uppercase; +} +.menu-hamburger { + display: none; + position: absolute; + top: 30px; + right: 30px; + padding: 20px; + background: url('/images/main-sprite.png') no-repeat -260px -60px; + cursor: pointer; +} +.menu .mobile-sign { + display: none; + padding-bottom: 35px; + margin-bottom: 10px; + color: #667580; + border-bottom: 1px solid; +} +.menu { + font-size: 0; +} +.menu li { + display: inline-block; + vertical-align: middle; + font-size: 18px; + letter-spacing: 1.05px; + padding-right:55px; +} +.menu li.mobile-only { + display: none; +} +.menu a:hover { + color: #ff8f00; +} + +.menu .activeitem a { + color: #ff8f00; +} + +.header .badges { + padding-bottom: 180px; +} +.badges { + padding: 0 40px; +} +.badges a { + display: inline-block; + vertical-align: middle; + margin-right: 10px; +} +.badges img { + height:45px; + border:none; +} +.header .blogbutton { + position:absolute; + top:30%; + right:12%; + height:280px; + width:280px; + background-color:#ff8f00; + color:#fff; + text-align:center; + font-family: 'Roboto Bold'; + max-width:20%; + overflow:hidden; + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; +} + +.badges li.survey { + float:none; + padding-left:0; + line-height:120px; + clear:left; +} + +.badges .surveylink { + background-color:#ff8f00; + color:#fff; + border-radius:5px; + text-decoration:none; + padding:10px 20px; +} + +.header .five { + font-size:120pt; + line-height:130pt; +} + +.header .years { + font-size:28pt; + letter-spacing:.15em; +} + +.header .joinus { + font-size:14pt; + padding-top:17px; + text-decoration:underline; + letter-spacing:.3em; +} + +.simpleheader { + color: #fff; + background: url('/images/header_image.jpg') center top no-repeat; + background-size: cover; +} + +.simpleheader .headertext { + padding: 100px 40px 20px; + margin: 0; +} + +.custom_build_it { + position: relative; + min-height: 730px; + color: #fff; + background: url('/images/build_it_banner.jpg') center bottom no-repeat; + background-size: cover; +} + +.api_header_holder { + position: absolute; + bottom: 0; + left: 50%; + width: 100%; + max-width: 1270px; + -webkit-transform: translate(-44%, 0); + -moz-transform: translate(-44%, 0); + transform: translate(-44%, 0); +} + +.api_header_holder .header_img { + position: absolute; + left: 0; + bottom: 0; + width: 320px; + height: 520px; + background: url('/images/nexus_on_banner.png') 0 0 no-repeat; +} + +.api_header_holder .headertext { + margin: 0 0 185px 350px; + font-size: 80px; + font-weight: 400; + line-height: 1.2; + text-transform: none; +} +.api_main .acticlestitles { + max-width: 330px; +} +.api_main .article { + padding-right: 0; +} +.api-section { + padding-right: 20px; +} +.api_main .list-header { + font-family: 'Roboto Bold'; +} +.api_main .list { + margin-bottom: 30px; +} +.api_main .list li { + font-size: 0.9em; + position: relative; + padding-left: 16px; +} +.api_main .list li:before { + content: ''; + position: absolute; + top: 11px; + left: 0; + width: 3px; + height: 3px; + border-radius: 50%; + background: #ccc; +} +.api_main .highlighted-box { + padding: 20px 40px; + background: #f2f2f2; + border-radius: 5px; +} +.api_main .highlighted-box.sidebar-merge { + border-radius: 5px 0 0 5px; + margin-bottom: 65px; +} +.api_main .github-link { + display: inline-block; + vertical-align: middle; +} +.api_main .github-link:before { + content: ''; + display: inline-block; + vertical-align: middle; + width: 25px; + height: 25px; + margin-right: 10px; + background: url('/images/github-link-ico.jpg') no-repeat 0 0; +} +.sidebar-holder.api-demo { + border-radius: 0 5px 5px 0; +} +.sidebar-holder { + position: absolute; + width: 100%; +} +.sidebar-holder.api-sample { + border-radius: 5px; +} +.api-demo, +.api-sample { + background: #f2f2f2; + padding-bottom: 30px; +} +.api_main .api-demo h2, +.api_main .api-sample h2 { + font-size: 0.9em; + font-family: 'Roboto Bold'; + font-family: 'Roboto Bold'; + letter-spacing: 8px; + text-align: center; + text-transform: uppercase; +} +.api-demo .img-preview, +.api-sample .img-preview { + position: relative; + max-width: 285px; + height: 335px; + margin: 0 22px; +} +.api-demo .img-preview { + background: url('/images/api_phone_demo.png') no-repeat center top; + background-size: 100%; +} +.api-sample .img-preview { + background: url('/images/api_phone_sample.png') no-repeat center top; + background-size: 100%; +} +.api-demo .img-preview:before, +.api-sample .img-preview:before { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 80px; + background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(242,242,242,1) 100%); + background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(242,242,242,1) 100%); + background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(242,242,242,1) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#f2f2f2',GradientType=0 ); +} +.api-download-btn { + display: block; + width: 170px; + height: 50px; + margin: 30px auto 0; +} +.google-play-demo { + background: url('/images/en-play-badge.png') no-repeat center center; + background-size: 100%; +} +.download-sample { + padding: 12px 0; + background: #f80; + border-radius: 5px; + color: #fff; + font-family: 'Roboto Bold'; + text-align: center; + text-transform: uppercase; + text-decoration: none; +} +.sidebar-merge .api-demo, +.sidebar-merge .api-sample { + display: none; +} +.specialevent +{ + position:relative; + background:#fff; + height:650px; +} + +.specialeventwrap +{ + width:900px; + position:absolute; + left:50%; + margin-top:-60px; +} + +.specialeventcontent +{ + position:relative; + left:-50%; + border-radius:15px; + background:#fff; +} + +.specialeventtext +{ + width:85%; + padding-top:20px; + overflow:hidden; + line-height:1.6em; + font-size:18px; + margin:0 auto; +} + +.specialeventtext p,.specialeventtext ul +{ + padding-bottom:10px; +} + +.specialeventtext .beforelist +{ + padding-bottom:0; + margin-bottom:5px; +} + +.specialeventtext.hidden +{ + color:#fff; + padding-bottom:60px; + width:900px; +} + +.specialevent .headertitletext +{ + letter-spacing:0; + font-family: 'Roboto Bold'; +} + +.headertitletext { + text-align:center; + color:#000; + line-height:1.6em; + font-size:22px; + padding:3px 0; +} + +.featurestitle { + padding:25px 40px; + text-align:center; +} + +.featurestitle p { + margin: 0; + color:#c1c1c1; + font-size:1.2em; +} + +.featurestitle h2 { + color:#ffa516; +} + +.featurescontainer { + position: relative; + max-width: 1100px; + margin: 50px auto; + font-size: 0; + text-align: center; +} + +.featureblock { + display: inline-block; + vertical-align: top; + width: 50%; + max-width: 520px; + min-height: 550px; + margin-top: 15px; + padding: 0 20px 30px; + font-size: 18px; + text-align: left; +} + + +.featureblocktitle { + position: relative; + min-height: 100px; + border-bottom: 6px solid #ff8f00; + margin-bottom: 40px; +} + + +.featureblocktitle h2 { + position: absolute; + top: 50%; + left: 0; + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + max-width: 480px; + padding: 0 0 0 70px; + margin: 0; + font-size: 40px; + line-height: 1; +} +.featureblocktitle.feature-opensource h2 { + line-height: 1; +} +.featureblocktitle h2 .subheader { + display: block; + color: #737373; + font-size: 18px; +} +.featureblocktitle:before { + content: ''; + position: absolute; + top: 15px; + left: 0; + width: 60px; + height: 60px; + margin-right: 15px; + background: url('/images/main-sprite.png') no-repeat 0 0; +} +.featureblocktitle.feature-map:before { + background-position: -80px 0; +} +.featureblocktitle.feature-bike:before { + background-position: -160px 0; +} +.featureblocktitle.feature-opensource:before { + background-position: -240px 0; +} + +.featureblocktitle .warning { + color:#ff8f00; + font-size:.6em; + letter-spacing:0; +} + + + +.mapexample { + background: #fff; + position: relative; + padding-top: 20px; + padding-bottom: 20px; +} + +.mapcontainer { + position: relative; + background: url('/images/cycling-default.png') center center no-repeat; + height: 450px; + background-size: cover; + margin: 0 auto 40px; +} + +.selectbox { + position: absolute; + top: 20px; + right: 15%; + width: 157px; + padding:15px; + border-radius:5px; + background-color: #fff; +} +.selectbox .selecttitle { + padding: 19px 5px 6px; + color: #2196F3; + font-size: 14px; + font-family: 'Roboto Bold'; +} +.selectbox .selecttitle.first { + padding-top:2px; +} +.selectbox ul { + padding-left:0; + margin:0; +} +.selectbox ul li { + line-height:1.2em; + font-size:.6em; +} +.selectbox input { + padding-top:5px; + cursor:pointer; +} +.selectbox label { + cursor:pointer; +} + +.screenshots { + background: #fff; + position: relative; + overflow: hidden; + padding: 20px 40px 100px; +} + +.arrow +{ + cursor:pointer; + position:absolute; + top:50%; +} +.images.ios { + display: none; +} +.screenshots .screenshot { + padding: 0 15px; +} +.screenshot-preview-holder { + display: none; + z-index: 100; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + min-height: 100%; + background: rgba(255, 255, 255, .8); +} +.screenshot.in-preview { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.sliderheader { + position: relative; +} +.sliderheader h2 { + padding-bottom: 50px; +} +.sliderheader .switch { + position: absolute; + top: 25px; + right: 15px; + font-size: 0; + color: #fff; + text-align: center; + cursor: pointer; +} +.sliderheader .switch .button { + display: inline-block; + vertical-align: middle; + width: 105px; + padding: 15px; + background: #d4d4d4; + font-size: 18px; + text-align: center; +} +.switch .button:first-child { + border-radius: 8px 0 0 8px; +} +.switch .button:last-child { + border-radius: 0 8px 8px 0; +} + +.sliderheader .switch .button.active { + background-color:#ff8f00; +} +.slick-arrow { + position: absolute; + top: 50%; + width: 40px; + height: 55px; + border: 0 none; + font-size: 0; +} +.slick-arrow::-moz-focus-inner { + border: 0; +} +.slick-arrow:focus { + outline:0; +} +.slick-arrow.slick-prev { + left: -50px; + background: url('/images/main-sprite.png') no-repeat -80px -100px; +} +.slick-arrow.slick-next { + right: -50px; + background: url('/images/main-sprite.png') no-repeat -120px -100px; +} +.blogcontainerwrap { + background: #fff; + line-height: 1.7em; +} +.blogcontainer { + max-width: 1100px; + overflow: hidden; + padding-bottom: 20px; + margin: 0 auto; + font-size: 0; +} +.blogcontainer > div { + display: inline-block; + vertical-align: top; + width: 50%; + font-size: 18px; + padding: 0 40px; +} +.blogcontainer > div:first-child { + padding-right: 20px; +} +.blogcontainer > div:last-child { + padding-left: 150px; +} +.blogitem h3 +{ + font-size:1.2em; + color:#76B6F6; + font-weight:400; + margin:0; +} + +.blogitem p +{ + margin-top:5px; +} + +.blogitem .readmore +{ + text-align:left; + display:inline-block; + margin-bottom:40px; +} + +.blogitem .date +{ + float:right; + color:#9A9A9A; +} + +.imageholder +{ + text-align:center; + margin:10px; +} + +.imageholder img +{ + border:1px solid #ddd; + max-width:300px; + padding:10px; +} + +.articles .textlist +{ + margin-bottom:50px; +} + +.pds-box.osmand +{ + border-radius:0; +} + +.footer { + position: relative; + background-color: #292f33; +} +.footercontent { + padding: 25px 40px; + font-size: 0; +} + +.logoblock { + display: inline-block; + vertical-align: top; + width: 40%; + font-size: 18px; +} + +.menublock { + display: inline-block; + vertical-align: top; + width: 60%; + font-size: 18px; +} +.menublock .footerlinks { + display: inline-block; + vertical-align: top; + width: 48%; + max-width: 285px; + margin-right: 15px; + text-align: left; +} + +.footerlogo { + display: block; + width:200px; + height:77px; + background:url('/images/logo.png') center -10px no-repeat; + background-size: 100%; +} + +.footer .contactus { + display: inline-block; + padding: 15px 20px 15px 15px; + margin-top: 7px; + margin-right: 15px; + border: 1px solid #394247; + border-radius: 3px; + color: #fff; + font-size: 15px; + text-decoration: none; + outline: none; +} + +.footer .contactus:before { + content: ''; + display: inline-block; + vertical-align: baseline; + width: 20px; + height: 20px; + margin-right: 20px; + margin-bottom: -2px; + background: url('/images/main-sprite.png') no-repeat -160px -57px; +} + +.footerlinkstitle { + border-bottom: 1px solid #2f4445; + color: #698d8f; + font-size: .7em; + font-family: 'Roboto Bold'; + text-transform: uppercase; +} + +.footer ul { + padding-left: 0; + padding-bottom: 40px; + list-style-type: none; + font-size: .8em; +} + +.footer ul li { + line-height: 1.8em; +} + +.article-menu-wrapper { + position: relative; + z-index: 1000; + display: inline-block; + vertical-align: top; + width: 30%; + padding-top: 1em; + font-size: 18px; +} +.modal-menu-button { + display: none; + position: absolute; + z-index: 10; + top: 0; + right: 10px; + width: 40px; + height: 40px; + background: url('/images/main-sprite.png') no-repeat -40px -100px; + cursor: pointer; + transition: transform .5s; +} +.modal-menu-button.active { + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); + transition: transform .5s; +} +.article { + display: inline-block; + vertical-align: top; + width: 70%; + padding-right: 20px; + margin-top: 1em; + font-size: 18px; +} +.article h3 { + font-family: 'Roboto Bold'; + letter-spacing: 0.05em; + padding-top: 20px; + color: #333333; +} +.article h1, .article h2 { + letter-spacing: 0.04em; +} +.article p { + line-height: 1.7em; +} +.article a { + color: #454ade; +} +.article ul, article li { + margin:0; + padding:0; + padding-top: 15px; + padding-left:15px; + list-style-type:disc; + list-style-position: inside; +} + +.article > iframe { + max-width: 100%; +} +.article-menu { + background: #fff; +} +.articlelinklist { + font-size: 16px; +} +.articlelinklist a, +.articlelinklist a:visited { + color: #454ade; +} +.articlelinklist a:hover { + color: #ff8f00; +} +.articlelinklist a:before { + content: ''; + display: inline-block; + vertical-align: middle; + width: 3px; + height: 3px; + margin-right: 10px; + border-radius: 50%; + background: #b8b9de; +} + +.articles { + padding: 0 20px 40px; +} +.articlescontainer { + position: relative; + max-width: 1100px; + margin: 0 auto; + font-size: 0; +} +.acticlestitles { + max-width: 300px; + padding: 20px; + border:1px solid #e6e6e6; +} + +.acticlestitles h2 { + padding: 0 0 22px; + border-bottom: 4px solid #f80; + font-size:1.2em; + font-family: 'Roboto Bold'; + letter-spacing:.2em; + font-variant: small-caps; +} +.acticlestitles h2:not(:first-child) { + padding-top: 15px; +} + +.acticlestitles ul li { + padding: 10px 0 10px 10px; + border-bottom: 1px solid #e6e7ec; +} + +.acticlestitles ul li.last { + padding-bottom:0; +} + +.textlist { + padding-left: 30px; + list-style-type: disc; +} + +.textlist li { + padding-top: 10px; +} + +.article h1, +.article h2 { + font-size:34px; +} + +.article img { + max-width: 100%; +} + +.article .rightimage { + max-width: 450px; +} + +.article .centeredimageblog { + margin: 30px auto 0; + text-align: center; +} + + +.article .centeredimageblog img { + max-width: 300px; + padding: 10px; + margin-top: 10px; + margin-right: 10px; + margin-bottom: 20px; + border: 1px solid #ccc; +} + +.article .centeredimageblog.wide img { + width: auto; + height: 300px; +} + +.article .imageblog img { + max-width: 100%; + padding: 10px; + margin-top: 10px; + margin-right: 10px; + margin-bottom: 20px; +} + +/* Add style for new image block in blog */ +.article .blogimageblock { + margin: 30px auto 0; + text-align: center; + border-radius: 6px; + background-color: #fafafa; + border: 1px solid #e6e6e6; +} + +.article .blogimageblock img { + max-width: 300px; + padding: 10px; + margin-top: 20px; + margin-right: 10px; + margin-bottom: 20px; +} + + +.article .noborder img { + padding: 0; + border: none; +} + +.article .leftimage { + max-width: 200px; + padding: 10px; + border: 1px solid #ccc; +} + +.social_network_button { + display: inline-block; + vertical-align: middle; + line-height: 1em; +} + +.share_buttons .gplus { + max-width: 86px; +} + +.share_buttons { + max-width: 300px; + margin: 0 auto 21px; +} + +.fb +{ + padding:2px; +} + +.fb-like +{ + width:80px; +} + +.fb-like span,.fb-like iframe +{ + width:80px!important; + height:21px!important; +} + +.discount +{ + background:url(images/discount-badge.png) center top no-repeat; + background-size:contain; + position:absolute; + top:35%; + right:15%; + width:200px; + height:200px; +} + +.dvrlogo +{ + background:url(images/ic_dvr_mainicon.png) left top no-repeat; + background-size:contain; + width:80px; + height:80px; + margin:0 auto; +} + +.nearlogotext +{ + vertical-align:top; + display:inline-block; + padding:15px; +} + +.appstorebadge img +{ + width:100px; + display:block; + margin:0 auto; +} + +#map +{ + position:absolute; + top:65px; + bottom:50px; + width:100%; +} + + + +.whatyousay { + background: #ededed; + position: relative; + padding: 20px 40px; +} +.whatyousaycontainer .badgescontainer { + width: 100%; + max-width: 1100px; + margin: 20px auto; + text-align:center; + font-size: 0; +} +.whatyousayblock { + display: inline-block; + vertical-align: top; + width: 48.5%; + padding: 0 1%; + margin-bottom: 30px; + font-size: 18px; + text-align: left; +} +.whatyousaymessage { + position: relative; + max-width: 460px; + padding: 20px; + margin: 0 auto; + background-color: #fff; + border-radius: 7px; + box-shadow: 2px 2px 5px #cac8c3; + font-style: italic; + line-height: 1.5em; +} +.whatyousaymessage::before { + content: ''; + position: absolute; + left: 30px; + bottom: -20px; + width: 0; + height: 0; + border: 10px solid transparent; + border-top-color: #cac8c3; +} +.whatyousaymessage::after { + content: ''; + position: absolute; + left: 28px; + bottom: -21px; + width: 0; + height: 0; + border: 12px solid transparent; + border-top-color: #fff; +} +.whatyousayblock .signature { + max-width: 460px; + padding-left:10px; + margin: 20px auto 0; +} +.whatyousayblock .signature .source { + color:#9e9e9e; + font-size:.9em; + margin-top: 5px; +} +.mapexampleheader,.giveawayheader h2 { + padding: 25px 40px; +} + +.pluginscontainer .readmore { + color:#adadad; + text-decoration:none; + border-bottom:1px solid #d6d6d6; +} + +.pluginscontainer .readmore a { + color:#adadad; + text-decoration:none; +} + +.featurecontainer { + padding: 7px; + border: 1px solid #ededed; +} + +.featurecontainer.sub { + padding: 0; + margin-top: -1px; + font-size: 0; +} +.featurecontainer.sub:nth-child(2n+1) { + margin-bottom: 20px; +} + +.featurecontainer.last +{ + margin-top:30px; + margin-bottom:30px; +} + +.feature { + position:relative; + min-height:410px; +} + +.feature.firstusage { + background-image:url('/images/features/first_usage.jpg'); +} + +.feature.navigation { + background-image:url('/images/features/nav_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.feature.profnavigation { + background-image:url('/images/features/prof_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.feature.subscription { + background-image:url('/images/features/ol_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.measure-distance { + background-image:url('/images/features/distance_3.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.ruler { + background-image:url('/images/features/rul_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.quickaction { + background-image:url('/images/features/qa_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.tracker { + background-image:url('/images/features/features_osmand_tracker.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.favorites { + background-image:url('/images/features/fav_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + } +.feature.markers { + background-image:url('/images/features/markers.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.mapillary { + background-image:url('/images/features/mapillary.png'); + } +.feature.travel { + background-image:url('/images/features/travel.png'); +} + +.feature .description { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + max-width: 430px; + background-color: rgba(255,143,0,.9); + color: #fff; +} + +.feature .descriptioncontent { + position: relative; + padding: 40px; +} + +.feature h2 { + padding: 40px; + font-size: 34px; +} + +.feature .description p { + margin: 0 0 100px; + padding: 0 40px; +} + +.feature .readmore { + position: absolute; + left: 40px; + bottom: 40px; + border-bottom: 1px solid #fff; + color: #fff; + text-decoration: none; +} + +.subfeature { + display: inline-block; + vertical-align: top; + width: 50%; + font-size: 17px; +} +.subfeature:first-child { + border-right: 1px solid #ededed; +} + +.subfeaturecontent +{ + padding:25px 25px 25px 75px; +} + +.subfeature .subfeatureheader { + position: relative; + color: #619cd4; + font-size: 30px; + line-height: 1.2; +} + +.subfeature .text { + height: 110px; + overflow: hidden; + margin-bottom: 10px; + padding: 10px 20px 0 0; +} +.subfeature .text.lesslines { + height: 95px; +} + +.plugin { + position: relative; + display: inline-block; + vertical-align: top; + width: 48.5%; + min-height: 340px; + padding: 30px; + margin-bottom: 30px; + border: 1px solid #ededed; +} +.plugin:nth-child(even) { + margin-right: 2%; +} + +.plugin .pluginpicture { + height: 230px; + border:1px solid #ededed; + background-position: center center; + background-size: cover; +} + +.plugin h2 { + padding-bottom: 10px; + color: #5473ff; + font-size: 28px; + line-height: 40px; + letter-spacing: 0; +} + +.plugin .plugintext { + height: 100px; + margin-bottom: 60px; + overflow: hidden; +} + +.plugin .buttonscontainer { + position: absolute; + left: 30px; + right: 30px; + bottom: 30px; +} +.plugin .buttons { + font-size: 14px; +} + +.plugin .buttons .pricetype { + display: inline-block; + vertical-align: middle; + background-color:#ededed; + color:#9a9a9a; + font-family: 'Roboto Bold'; + padding:10px 15px; + margin-right: -6px; +} + +.plugin .buttons .readmore { + position: absolute; + top: 10px; + right: 0; + margin-top: 0; +} + +.plugin .buttons .getbutton { + display: inline-block; + vertical-align: middle; + padding: 10px 15px; + margin-right: 20px; + background-color: #7acc2e; +} + +.plugin .buttons .getbutton a { + color:#fff; + font-family: 'Roboto Bold'; + text-decoration:none; +} + +.plugin .buttons .getbutton a:visited { + color: #fff; + text-decoration: none; +} + +.featuresheader { + position: relative; + margin: 30px auto; + text-align: center; + overflow: hidden; +} +.featuresheader:before { + content: ''; + position: absolute; + z-index: 0; + top: 50%; + left: 0; + width: 100%; + height: 4px; + margin-top: -2px; + background: #ffba00; +} + +.featuresheader .featuresheadertext { + position: relative; + z-index: 1; + display: inline-block; + padding: 0 19px; + background: #fff; + font-family: 'Roboto Bold'; + letter-spacing: .3em; +} + +.plugin .onlinemaps { + background-image: url('/images/features/online_maps_main.png'); +} + +.plugin .contourlines { + background-image: url('/images/features/contour_lines_main.png'); +} + +.plugin .triprecordingtool { + background-image: url('/images/features/trip_recording_tool_main.png'); +} + +.plugin .skimaps { + background-image: url('/images/features/ski_maps_main.png'); +} + +.plugin .nauticalcharts { + background-image: url('/images/features/nautical_charts_main.png'); +} + +.plugin .audiovideo { + background-image: url('/images/features/audio_video_note_main.png'); +} + +.plugin .osmediting { + background-image: url('/images/features/osm_editing_main.png'); +} + +.plugin .measure-distance { + background-image: url('/images/features/distance_3.png'); +} + +.plugin .planningtool { + background-image: url('/images/features/planning_tool_main.png'); +} + +.plugin .parking { + background-image: url('/images/features/parking_main.png'); +} + +.plugin .development { + background-image: url('/images/features/development_main.png'); +} + +.subfeature .subfeatureheader:before { + content: ''; + position: absolute; + top: 0; + left: -50px; + width: 30px; + height: 30px; + background:url('/images/main-sprite.png') no-repeat 0 0; +} +.subfeature .install .subfeatureheader:before { + background-position: -5px -66px; +} +.subfeature .viewmap .subfeatureheader:before { + background-position: -45px -66px; +} +.subfeature .plantrip .subfeatureheader:before { + background-position: -85px -66px; +} + +.subfeature .search .subfeatureheader:before { + background-position: -125px -66px; +} + +.code { + font-style:italic; +} + +.list li { + padding-bottom:10px; + color:#000; +} + +.subtitle, +.subtitle h2 { + font-size:1.3em; + margin-top:10px; + font-family: 'Roboto Bold'; +} +.subtitle.mobile-subtitle { + display: none; +} + +.blocksubtitle { + margin-top: 10px; + margin-bottom: 15px; + font-size: 1.2em; + font-family: 'Roboto Bold'; +} + +.blocksubsubtitle { + margin-top: 10px; + font-size: 1.1em; + font-family: 'Roboto Bold'; +} + +.content { + padding:5px 15px 15px; +} + +.content ul { + padding-left:20px; +} + +.help h1 { + font-size:41px; + letter-spacing:.03em; + margin-top:20px; + margin-bottom:10px; +} + +.contributorsbanner { + width:100%; +} + +.about h3 +{ + margin-top:90px; +} + +.versions .version +{ + border:1px solid #e6e6e6; + padding:20px; +} + +.mainlist li +{ + border-bottom:1px solid #F3F3F3; + padding:15px; +} + +h1.sub +{ + background-color:#536DFE; + margin-top:0; +} + +h1.sub small +{ + display:block; + font-weight:400; + margin-top:5px; +} + +.toc .list li { + color: #d2d2d2; +} + +.toc .subtitle { + margin-bottom: 10px; + font-weight:400; +} + +.download { + width:24px; + height:24px; + padding-left:15px; + vertical-align:bottom; +} + +.imgcontainer +{ + margin:20px 30px; +} + +.legendcontainer +{ + margin:0; +} + +.clear +{ + clear:both; +} + +.disabled +{ + cursor:default; +} + +.osmlive h1 +{ + margin-top:30px; +} + +.osmlive h3 +{ + margin-top:50px; +} + +.osmlive .submenucontainer +{ + height:70px; + width:100%; + background-color:#ff8f00; + color:#fff; + overflow:hidden; +} + +.osmlive .submenu +{ + width:1100px; + padding-top:23px; + letter-spacing:.2em; + font-size:1em; + margin:0 auto; +} + +.osmlive .submenu li +{ + float:left; + padding-right:40px; +} + +.osmlive .tabcontent +{ + width:100%; + background-color:#fff; +} + +.osmlive .article ul +{ + list-style-type:disc; + padding-left:25px; +} + +.osmlive .article ul li +{ + padding-bottom:15px; +} + +.osmlive .formcontainer +{ + width:100%; + margin-top:30px; +} + +.osmlive .formcontainer .column +{ + background-color:#ededed; + width:470px; + padding:30px; +} + +.osmlive .formcontainer .column.left +{ + float:left; +} + +.osmlive input +{ + height:50px; + width:465px; + border:1px solid #d6d6d6; + font-size:1.1em; + padding-left:45px; + margin:5px 0; +} + +.osmlive .info +{ + color:#adadad; +} + +.osmlive .row +{ + margin-bottom:35px; + position:relative; +} + +.osmlive .column h3 +{ + margin-top:0; + margin-bottom:30px; +} + +.osmlive .textbox i +{ + position:absolute; + top:22px; + left:15px; + color:#9a9a9a; +} + +.osmlive .btn +{ + height:45px; + width:130px; + font-size:18px; + color:#fff; + font-family: 'Roboto Bold'; + border:none; + background-color:#619CD4; + border-radius:5px; + cursor:pointer; +} + +.osmlive form +{ + margin-bottom:0; +} + +.osmlive p +{ + line-height:2em; +} + +.osmlive .column p +{ + line-height:1.4em; + margin-top:5px; +} + +.osmlive .column h4 +{ + margin-bottom:0; + margin-top:40px; +} + +.osmlive .address +{ + background-color:#ff8f00; + color:#fff; + border-radius:5px; + width:440px; + margin-bottom:20px; + padding:10px 15px; +} + +.osmlive .googleplay +{ + height:50px; +} + +ul,.mainlist +{ + list-style-type:none; + margin:0; + padding:0; +} + +a,a:visited +{ + color:#454ade; +} + +.menu a,.footer .contactus a,.footer ul a +{ + color:#fff; + text-decoration:none; +} + +.badges li.first,.screenshots .first,.noleftpadding +{ + padding-left:0; +} + +.simpleheader .headercontent,.simpleheader .shadowlinecontent,.mapexampleheader,.giveawayheader,.footercontent { + max-width: 1100px; + margin: 0 auto; +} + +.simpleheader .shadowline,.screenshots .images,.sliderheader,.article .textandimagecontainer,.plugin .buttons,.osmlive .textbox +{ + position:relative; +} + +.specialeventtext .signature,.about .surname,.definition +{ + font-family: 'Roboto Bold'; +} + +.specialeventlist,.features .categorydescription +{ + list-style-type:disc; + padding-left:25px; + line-height:1.7em; +} + +.specialeventlist li,.features .categorydescription li,.mainlist li.last +{ + border-bottom:none; +} + +.slider,.whatyousaycontainer +{ + position:relative; + max-width:1100px; + margin:0 auto; +} + +.blogitem h3 a,.blogitem h3 a:visited,.acticlestitles ul a,.list li a +{ + text-decoration:none; +} + +.blogitem .readmore a,.articles .date +{ + color:#9A9A9A; +} + +.share_buttons .twitter,.share_buttons .fb +{ + width:100px; +} + +.plugin.odd,.osmlive .formcontainer .column.right +{ + float:right; +} + +.legend,.osmlive .article +{ + width:100%; +} + +.dvr-features { + position: relative; + overflow: hidden; + background: #fff; + padding-bottom: 80px; + padding-top: 40px; +} +.dvr-features h2 { + text-align: center; + color: rgb(255, 143, 0) +} +.dvr-featurescontent { + max-width: 1180px; + padding: 0 40px; + margin: 0 auto; + font-size: 0; +} +.dvr-features .column { + display: inline-block; + vertical-align: top; + width: 45%; +} +.dvr-features .column:first-of-type { + margin-right: 10%; +} +.dvr-features ul li { + border-bottom: 1px solid #efefef; + height: 50px; + font-size: 18px; +} +.dvr-features ul li:last-child { + border-bottom: none; +} +.dvr-features .column div { + height: 50px; + display: table; +} +.dvr-features span { + display: table-cell; + vertical-align: middle; +} +.dvr-features .column div:before { + content: ''; + width: 30px; + height: 30px; + display: inline-block; + margin: 10px 10px 0 0; + background: url('/images/main-sprite.png') no-repeat; +} +.dvr-features .column .ipad-supported:before { + background-position: -205px -165px; +} +.dvr-features .column .webserver:before { + background-position: -5px -247px; +} +.dvr-features .column .carmode:before { + background-position: -5px -165px; +} +.dvr-features .column .portrait-landscape:before { + background-position: -85px -205px; +} +.dvr-features .column .gpx:before { + background-position: -85px -165px; +} +.dvr-features .column .help:before { + background-position: -125px -165px; +} +.dvr-features .column .videogallery:before { + background-position: -285px -205px; +} +.dvr-features .column .favorites:before { + background-position: -45px -165px; +} +.dvr-features .column .photo:before { + background-position: -45px -205px; +} +.dvr-features .column .ios7:before { + background-position: -165px -165px; +} +.dvr-features .column .location-reading:before { + background-position: -245px -165px; +} +.dvr-features .column .password-protection:before { + background-position: -5px -205px; +} +.dvr-features .column .power-saving:before { + background-position: -125px -205px; +} +.dvr-features .column .recover-video-recording:before { + background-position: -165px -205px; +} +.dvr-features .column .simple-interface:before { + background-position: -205px -205px; +} +.dvr-features .column .subtitles:before { + background-position: -245px -205px; +} +.dvr-features .column .speedlimit:before { + background-position: -45px -245px; +} +.dvr-features .column .map-providers:before { + background-position: -285px -165px; +} + + +/**********************slider**************************/ +.slideswrapper { + position: relative; + padding: 50px 0; +} +.slides { + position: relative; + z-index: 1; + max-width: 440px; + margin: 0 auto; +} +.wrapper-image { + position: absolute; + z-index: 0; + top: 30px; + left: 50%; + margin-left: -308px; +} +.wrapper-image img{ + width: 616px; +} +.slick-dots { + position: absolute; + bottom: -50px; + width: 100%; + text-align: center; +} +.slick-dots li { + display: inline-block; + vertical-align: middle; + width: 9px; + height: 9px; + border-radius: 50%; + background: #aeaeae; + margin-right: 5px; +} +.slick-dots li.slick-active { + background: #ff8f00; +} +.slick-dots li button { + display: none; +} + +@media screen and (max-width: 1550px) { + .menu { + right: 0; + } + .headertext { + margin: 100px 0 70px; + } +} +@media screen and (max-width: 1420px) { + .api_header_holder { + -webkit-transform: translate(-50%, 0); + -moz-transform: translate(-50%, 0); + transform: translate(-50%, 0); + } +} +@media screen and (max-width: 1300px) { + .api_header_holder { + max-width: 870px; + } + .api_header_holder .header_img { + display: none; + } + .api_header_holder .headertext { + margin: 0 0 220px 0; + } +} +@media screen and (max-width: 1200px) { + .screenshots .screenshot { + padding: 0 2px; + } + .slick-arrow { + top: auto; + bottom: -60px; + } + .slick-arrow.slick-prev { + left: 20px; + } + .slick-arrow.slick-next { + right: 20px; + } + +} +@media screen and (min-width: 1100px) { + .featureblock:nth-child(2n) { + margin-left: 30px; + } + .featureblock:nth-child(2n-1) { + margin-right: 30px; + } +} +@media screen and (max-width: 1100px) { + .featureblock { + width: 100%; + max-width: 800px; + min-height: auto; + padding: 0 40px 30px; + } + .selectbox { + right: 20px; + width: 100%; + max-width: 450px; + padding: 15px; + } + .selectbox:after { + content: ''; + position: absolute; + top: 30px; + right: 20px; + width: 20px; + height: 20px; + background: url('/images/main-sprite.png') no-repeat -160px -80px; + transition: all .5s; + } + .selectbox.active:after { + transition: all .5s; + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); + } + .selectbox .selecttitle { + padding: 0; + color: #9e9e9e; + font-size: 13px; + font-weight: 400; + } + .selectbox .selecttitle.first { + padding-top: 0; + } + .selectbox .selecttitle:not(.first) { + display: none; + } + .selectbox .selecttitle .selected-map { + margin: 0; + color: #000; + font-size: 18px; + font-family: 'Roboto Bold'; + text-transform: uppercase; + } + .selectbox ul { + display: none; + padding-left:0; + margin:0; + } + .selectbox.active ul { + display: block; + } + .selectbox input { + padding-top:0px; + } + .theme-selector { + position: absolute; + right: 20px; + bottom: 5px; + } + ul.theme-selector li { + padding: 10px; + font-size: 14px; + } + .map-selector input, + .theme-selector input { + display: none; + } + .theme-selector label.active { + border-bottom: 1px dashed #ff8f00; + } + .map-selector { + padding-top: 25px; + } + ul.map-selector li { + margin-bottom: 15px; + font-size: 16px; + text-transform: uppercase; + } + ul.map-selector li:last-child { + margin-bottom: 0; + } + .logoblock { + width: 100%; + margin-bottom: 40px; + } + .logoblock:after { + content: ''; + display: table; + float: none; + clear: both; + } + .menublock { + width: 100%; + } + .menublock .footerlinks { + max-width: none; + } + .footerlogo { + float: left; + } + .footer .contactus { + float: right; + } + .subfeature .subfeatureheader { + font-size: 28px; + } + .dvr-features ul li { + font-size: 16px; + height: auto; + padding: 3px 0; + } + .headertext.black-friday:before { + left: auto; + right: 20px; + width: 240px; + } +} +.tab-content { + position: relative; +} +.loading { + display: none; + position: absolute; + top: 0; + left: 50%; + width: 60px; + height: 60px; + margin-left: -30px; + background: url('/images/spinner.gif') no-repeat center center; +} +.loading.active { + display: block; +} +@media screen and (max-width: 1075px) { + .menu-hamburger, + .menu .mobile-sign { + display: block; + } + .menu { + display: none; + top: 0; + right: 0; + width: 100%; + max-width: 300px; + height: 100vh; + padding: 20px 40px 0; + margin-top: 0; + background: #292f33; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); + transition: all .5s; + overflow-x: hidden; + overflow-y: scroll; + } + .menu.active { + display: block; + } + .menu li { + display: block; + padding-top: 18px; + padding-bottom: 18px; + font-weight: 400; + } + .menu li.mobile-only { + display: block; + } + .custom_build_it { + min-height: 570px; + } + .api_header_holder { + max-width: 715px; + } + .api_header_holder .headertext { + margin: 0 0 170px 0; + font-size: 64px; + } + .api_main .api-demo h2, + .api_main .api-sample h2 { + letter-spacing: 5px; + } +} +@media screen and (max-width: 900px) { + .sliderheader h2, + .whatyousaycontainer h2, + .mapexampleheader h2, + .giveawayheader h2, + .blogcontainer h2 { + font-size: 30px; + } + .sliderheader .switch .button { + width: 75px; + padding: 10px; + background: #d4d4d4; + font-size: 14px; + } + .whatyousayblock { + width: 100%; + } + .blogcontainer > div { + width: 100%; + max-width: 800px; + } + .blogcontainer > div:first-child { + padding-right: 40px; + } + .blogcontainer > div:last-child { + padding-left: 40px; + } + /* CSS to restyle poll on main. Look at all those importants! */ + .blogcontainer .PDS_Poll .pds-box { + width: auto !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-vote-button { + display: inline-block; + vertical-align: middle; + float: none !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-links { + display: inline-block !important; + vertical-align: middle; + padding: 3px 25px !important; + margin-left: 10px; + background: #ff6d00; + border-radius: 5px; + line-height: 25px; + font-family: "Lucida Grande", Verdana, Arial; + } + .pds-view-results { + color: #fff !important; + text-decoration: none !important; + } + .pds-answer-group .pds-answer-input { + float: none !important; + display: inline-block !important; + vertical-align: middle; + } + .pds-answer-group .pds-input-label { + float: none !important; + display: inline-block !important; + vertical-align: middle; + width: auto !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-links .pds-pd-link { + display: none !important; + } + .social-widgets { + display: none; + } + .article-menu-wrapper { + position: absolute; + top: -80px; + right: 0; + width: auto; + } + .sidebar-holder { + display: none; + } + .sidebar-merge .api-demo, + .sidebar-merge .api-sample { + display: block; + } + .api-section.sidebar-merge { + padding-right: 0; + } + .api-demo .img-preview, + .api-sample .img-preview { + margin: 0 auto; + } + .article-menu { + display: none; + } + .acticlestitles { + max-width: 350px; + } + .modal-menu-button { + display: block; + } + .article { + width: 100%; + padding-right: 0; + } + .toc { + display: none; + } + .subtitle.mobile-subtitle { + display: block; + padding-bottom: 10px; + border-bottom: 4px solid #ffbb00; + } + .question { + border-bottom: 1px solid #e6e7ec; + font-size: 12px; + } + .question .subtitle { + position: relative; + margin: 0; + padding: 10px 0 10px 30px; + color: #454ade; + font-weight: normal; + } + .question .subtitle:before { + content: ''; + position: absolute; + top: 14px; + left: 0; + width: 20px; + height: 20px; + background: url('/images/main-sprite.png') no-repeat -180px -62px; + } + .question.active .subtitle:before { + background-position: -200px -62px; + } + .question .content { + display: none; + padding-left: 30px; + font-size: 15px; + } + h3.help { + font-size: 15px; + } + h3.help a { + color: #454ade; + } + .downloads .question .subtitle { + border-bottom: 0 none; + padding: 10px 0 0px 30px + } + .map .content { + padding: 0; + } + .custom_build_it { + min-height: 470px; + } + .api_header_holder { + max-width: 580px; + } + .api_header_holder .headertext { + margin: 0 0 130px 0; + font-size: 50px; + } + .headertext.black-friday:before { + top: -100px; + } +} +@media screen and (max-width: 800px) { + .subfeature { + width: 100%; + } + .subfeature:first-child { + border-right: 0 none; + border-bottom: 1px solid #ededed; + } + .plugin { + width: 100%; + } + .plugin:nth-child(even) { + margin-right: 0; + } + .headertext.black-friday:before { + top: -130px; + width: 150px; + } +} +@media screen and (max-width: 650px) { + .headertext { + font-size: 30px; + margin: 100px 0 50px; + } + .header .badges { + padding-bottom: 80px; + } + .menu li { + padding-top: 10px; + padding-bottom: 10px; + font-size: 13px; + } + .menublock .footerlinks { + width: 45%; + margin-right: 1%; + } + .article-menu-wrapper { + top: -67px; + } + .wrapper-image { + display: none; + } + .dvr-features .column { + width: 100%; + margin-right: 0; + } +} +@media screen and (max-width: 580px) { + .custom_build_it { + min-height: 370px; + } + .api_header_holder { + max-width: 580px; + } + .api_header_holder .headertext { + margin: 0 0 95px 0; + font-size: 40px; + } +} +@media screen and (max-width: 550px) { + .headerlogo { + width: 120px; + } + .menu li { + padding-right: 35px; + } + .featurestitle h2 { + font-size: 2em; + } + .featureblocktitle:before { + top: 25px; + width: 40px; + height: 40px; + background: url('/images/main-sprite.png') no-repeat 0 0; + background-size: 205px; + } + .featureblocktitle.feature-map:before { + background-position: -51px 0; + } + .featureblocktitle.feature-bike:before { + background-position: -102px 0; + } + .featureblocktitle.feature-opensource:before { + background-position: -153px 0; + } + .featureblocktitle h2 { + font-size: 24px; + } + .screenshots { + padding: 20px 0 100px; + } + .sliderheader { + padding: 0 40px; + } + .feature .description h2 { + font-size: 22px; + font-family: 'Roboto Bold'; + } + .subfeature .subfeatureheader { + font-size: 24px; + font-family: 'Roboto Bold'; + } + .dvr-featurescontent { + padding: 0 20px; + } +} +@media screen and (max-width: 500px) { + .selectbox { + left: 20px; + width: auto; + } + .custom_build_it { + min-height: 300px; + } + .api_header_holder .headertext { + margin: 0 0 65px 0; + font-size: 32px; + } + .headertext.black-friday { + margin: 120px 0 30px; + } + .headertext.black-friday:before { + top: -150px; + left: 50%; + margin-left: -75px; + } +} +@media screen and (max-width: 470px) { + .sliderheader h2 { + padding-bottom: 10px; + } + .sliderheader .switch { + position: static; + padding-bottom: 20px; + text-align: left; + } + .footerlogo { + float: none; + } + .footer .contactus { + float: none; + } + .menublock .footerlinks { + width: 100%; + margin-right: 0; + } +} +@media screen and (max-width: 450px) { + .plugin .buttons .readmore { + border-bottom: 0 none; + text-align: center; + text-decoration: underline; + } + .custom_build_it { + min-height: 290px; + } + .api_header_holder .headertext { + font-size: 27px; + } +} +@media screen and (max-width: 360px) { + .menu-hamburger { + right: 10px; + } + .headertext { + padding: 0 20px; + font-size: 24px; + } + .badges { + padding: 0 20px; + } + .featurestitle { + padding: 25px 20px; + } + .featureblock { + padding: 0 20px; + } + .sliderheader { + padding: 0; + } + .sliderheader h2, + .sliderheader .switch { + padding-left: 40px; + } + .screenshots { + padding: 20px 0 50px; + } + .blogcontainer > div { + padding: 0 20px; + } + .blogcontainer > div:first-child { + padding-right: 20px; + } + .blogcontainer > div:last-child { + padding-left: 20px; + } + .question .content { + padding-left: 0; + } + .api_header_holder .headertext { + font-size: 24px; + } + .api-demo .img-preview, + .api-sample .img-preview { + height: 235px; + } +} +@media screen and (max-width: 320px) { + .menu-hamburger.in-menu { + right: -270px; + } +} +@media screen and (orientation: landscape) { + .menu { + + } +} + +/***************go page ****************************/ +.gocontainer +{ + height:100%; +} + +.gocontainer .goheader +{ + border-bottom:1px solid #ccc; + width:100%; + -webkit-box-shadow:2px 2px 5px #CAC8C3; + -moz-box-shadow:2px 2px 5px #CAC8C3; + box-shadow:2px 2px 5px #CAC8C3; + position:absolute; + top:0; + height:63px; +} + +.gocontainer .goheader img +{ + height:100%; + padding:3px 7px 5px 12px; +} + +.gocontainer .coordinatescontainer +{ + width:auto; + float:right; + padding-top:6px; + padding-right:12px; +} + +.gocontainer .coordinatescontainer div +{ + position:relative; + +} + +.gocontainer .coordinatescontainer .title +{ + font-size:13px; + color:#9A9A9A; + position:absolute; + bottom:-1px; + left:-28px; +} + +.gocontainer .coordinatescontainer .coordinate +{ + font-family: 'Roboto Bold'; + color:#000; + padding-left:5px; + font-size:15px; + line-height:25px; +} + +.gocontainer .gofooter +{ + position:absolute; + bottom:0; + width:100%; + background-color:#43464D; + -webkit-box-shadow:2px -2px 5px #CAC8C3; + -moz-box-shadow:2px -2px 5px #CAC8C3; + box-shadow:2px -2px 5px #CAC8C3; + height:50px; + overflow:hidden; +} + +.gocontainer .gobadges +{ + width:100%; + max-width: 360px; + margin: 0 auto; + margin-top:4px; +} + +.gocontainer .badgecontainer +{ + float:left; + width:35%; + height:50px; +} + +.gocontainer .gobadges .badgecontainer img +{ + max-height:100%; + max-width:100%; + padding:6px; +} + +.gocontainer .gobadges .google img +{ + padding:0; + height:44.58px; +} + +.gocontainer .gobadges .apple img +{ + height:41.51px; + margin-top:1px; +} + +.gocontainer .gobadges .amazon +{ + width:30%; +} + +.gocontainer .gobadges .amazon img +{ + height:42.58px; +} + +.gocontainer .overlay +{ + width:100%; + height:100%; + background-color:rgba(200, 200, 200, 0.7); + z-index:1000; + position:absolute; +} + +.gocontainer .popup +{ + z-index:1001; + background-color:#fff; + position:absolute; + width:80%; + top:10%; + overflow:hidden; + text-align:center; + padding:7%; + border-radius: 15px; + left:10%; + max-height:90%; +} + +.gocontainer .popup .logo +{ + height:50px; + background:url("images/logo-grey.png") no-repeat; + background-size:contain; + background-position:center; + margin-bottom:5%; + +} +.gocontainer .popup h1 +{ + font-size:21px; + letter-spacing:0.07em; + font-family:verdana; + text-transform:uppercase; + border-top:1px solid #ccc; + font-weight:bold; + padding-bottom:5px; + padding-top:40px; +} + +.gocontainer .popup p +{ + font-size:18px; + color:#9A9A9A; + font-style:italic; +} + +.gocontainer .popup .button +{ + width:100%; + height:45px; + line-height:45px; + overflow:hidden; + color:#fff; + display:inline-block; + margin-bottom:7px; + border-radius: 5px; + text-decoration:none; +} + + /* The Modal (background) */ + .modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: rgb(0,0,0); /* Fallback color */ + background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ + -webkit-animation-name: fadeIn; /* Fade in the background */ + -webkit-animation-duration: 0.4s; + animation-name: fadeIn; + animation-duration: 0.4s + } + + /* Modal Content */ + .modal-content { + position: fixed; + bottom: 0; + background-color: #fefefe; + width: 100%; + -webkit-animation-name: slideIn; + -webkit-animation-duration: 0.4s; + animation-name: slideIn; + animation-duration: 0.4s + } + + /* The Close Button */ + .close-params { + margin-top: 25px; + color: white; + float: right; + font-size: 28px; + font-family: 'Roboto Bold'; + } + + .close-params:hover, + .close-params:focus { + color: #000; + text-decoration: none; + cursor: pointer; + } + + .modal-header { + padding: 2px 16px; + background-color: #ff8f00; + color: white; + } + + .modal-body {padding: 2px 16px;} + + /* Add Animation */ + @-webkit-keyframes slideIn { + from {bottom: -300px; opacity: 0} + to {bottom: 0; opacity: 1} + } + + @keyframes slideIn { + from {bottom: -300px; opacity: 0} + to {bottom: 0; opacity: 1} + } + + @-webkit-keyframes fadeIn { + from {opacity: 0} + to {opacity: 1} + } + + @keyframes fadeIn { + from {opacity: 0} + to {opacity: 1} + } +.gocontainer .popup .yes +{ + background-color:rgb(255, 143, 0); +} + +.gocontainer .popup .no +{ + background-color:rgb(123, 161, 50); +} + +.gocontainer .popup .cancel +{ + border:1px solid #ccc; + background-color:#fff; + color:#000; + margin-bottom:0; +} +@media (orientation:landscape) +{ + .gocontainer .popup + { + padding:4%; + } + .gocontainer .popup .logo + { + display:none; + } + .gocontainer .popup h1 + { + padding-top:0; + border-top:none; + } +} + +.quote { + font-size: 1.8em; + font-family: 'Roboto Bold'; + color: #212121; + line-height: 1.3em; + letter-spacing: 0.02em; +} + +/*.gocontainer .popup .buttons +{ + width:80%; + position:absolute; + bottom:5%; + left:10%; +}*/ + + +.giveaway { + position: relative; + border: 1px solid #e6e6e6; + /* margin: 25px 150px; */ + margin: 0 auto; + max-width: 1100px; + font-size: 18px; + display:flex; + flex-direction:row; + flex-wrap:wrap; + justify-content: space-between; + align-items: stretch; + align-content: flex-start; +} + +.giveaway-picture { + flex-grow:1; + flex-basis:50%; + background-image:url("/images/giveaway_image.jpg"); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.giveaway-message { + flex-grow:1; + flex-basis:50%; +} + +.giveaway img { + max-width: 100%; + max-height: 100%; +} + +.giveaway-form { + background-color: #f2f2f2; + padding: 24px 30px; +} + +.giveaway-form-subtitle { + font-weight:bold; + margin-bottom: 8px; + margin-top:24px; + letter-spacing:1.2px; +} + +.first-subtitle{ + margin-top:0; +} + +.giveaway-form-devices { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + align-content: flex-start; +} + +.giveaway-form-device{ + flex-grow:1; + flex-basis: 50%; + display: flex; + flex-direction:row; + flex-wrap:nowrap; + justify-content: flex-start; + align-items: center; +} + +.giveaway-form-user{ + display:flex; + flex-direction:row; + flex-wrap:wrap; + justify-content: space-between; + align-items:center; + align-content:center; +} + +.giveaway-submit { + flex-basis: 100px; + flex-grow:0; + background: #575bde; + color: #fff; + font-weight: bold; + font-size: 16px; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + border: 1px solid #3d42bf; + border-radius: 2px; + height:36px; + cursor: pointer; +} + +.giveaway-submit-disabled { + background: #666; +} + +.giveaway-submit-success { + background: green; +} + +#register_giveaway_success, #register_giveaway_failed { + margin-top: 8px; + font-weight: 400; +} + + +.giveaway-email { + flex-grow:1; + margin-right:24px; + font-size:16px; + line-height:36px; + height:34px; + padding:0 8px; + outline: none; +} + +@media (max-width: 1100px) { + .giveaway { + margin: 0 auto; + } +} + +@media (max-width: 768px) { +.giveaway-picture { + order:1; + flex-basis:100%; + height:180px; + } + + .giveaway-message { + order:2; + } +} + + +.giveaway-content { + padding: 0px 30px 30px 30px; +} + +.giveaway h4 { + font-size: 20px; + line-height: 0px; + padding-top: 14px; + letter-spacing: 0.04em; +} + + + + +/* Clear floats after the columns */ +.giveaway:after { + content: ""; + display: table; + clear: both; +} + +.giveaway a { + display: inline-block; + letter-spacing:1.2px; + text-decoration: none; +} + +.giveaway a:hover { + text-decoration: :underline; +} + +.form-control { + margin: 0; + height: 42px; + display: block; + width: 95%; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 2px; +} + +.dropbtn { + padding: 5px; + cursor: pointer; + color: #4C51D9; + width: 67px; + padding-left: 14px; + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; +} +.dropdown-content { + display: none; + position: absolute; + background-color: #FFFFFF; + width: 178px; + border-radius: 6px 0px 6px 6px; + padding: 5px 0; + right: 23px; +} +.show_dropdown{ + display: block; +} +.showed_dropdown{ + border-radius: 6px 6px 0 0; +} +.lang_switcher{ + width: 50px; + padding-right: 90px!important; +} +.dropbtn::after { + background: rgba(0, 0, 0, 0) url("/images/arrow-down.png") no-repeat scroll center center; + content: ""; + height: 16px; + position: absolute; + right: 35px; + top: 10px; + width: 10px; +} +.dropdown-content a { + padding: 14px; + text-decoration: none; + display: block; + font-family: Roboto Regular; + font-style: normal; + font-weight: normal; + line-height: normal; + font-size: 16px; + letter-spacing: 0.03em; + text-transform: none; + color: #000000; +} +.dropdown-content a:hover{ + background: #F0F0F0; + color: #4C51D9; + cursor: pointer; +} +.dropdown-content a.current{ + background: #FF8800; + color: #FFFFFF; +} +@media screen and (max-width: 1075px) { + .menu li.desktop-only { + display: none; + } + .dropbtn::after { + right: 206px; + top: 138px; + } + .dropdown-content{ + right: 82px; + border-radius: 0px 6px 6px 6px; + } +} + +@media screen and (max-width: 650px) { + + .dropbtn::after { + right: 206px; + top: 124px; + } +} diff --git a/OsmAnd/assets/server/index.html b/OsmAnd/assets/server/index.html index 8837fdbcd2..851f53446b 100644 --- a/OsmAnd/assets/server/index.html +++ b/OsmAnd/assets/server/index.html @@ -10,18 +10,12 @@ OsmAnd - Offline Mobile Maps and Navigation - - - - + - @@ -80,22 +74,8 @@
-
-
LAT
-
LON
-
-
- -
\ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/server/ApiEndpoint.java b/OsmAnd/src/net/osmand/plus/server/ApiEndpoint.java deleted file mode 100644 index a37e2cfafc..0000000000 --- a/OsmAnd/src/net/osmand/plus/server/ApiEndpoint.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.osmand.plus.server; - -import fi.iki.elonen.NanoHTTPD; -import net.osmand.plus.activities.MapActivity; - -public interface ApiEndpoint { - NanoHTTPD.Response process(NanoHTTPD.IHTTPSession session); - - void setMapActivity(MapActivity mapActivity); -} diff --git a/OsmAnd/src/net/osmand/plus/server/IMapOnImageDrawn.java b/OsmAnd/src/net/osmand/plus/server/IMapOnImageDrawn.java deleted file mode 100644 index 573723a5c6..0000000000 --- a/OsmAnd/src/net/osmand/plus/server/IMapOnImageDrawn.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.osmand.plus.server; - -import android.graphics.Bitmap; -import net.osmand.data.RotatedTileBox; - -public interface IMapOnImageDrawn { - void onDraw(RotatedTileBox viewport, Bitmap bmp); -} diff --git a/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java b/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java index 69d831bb32..31d0bc12b6 100644 --- a/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java +++ b/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java @@ -15,29 +15,17 @@ import java.util.Map; public class OsmAndHttpServer extends NanoHTTPD { private static final String FOLDER_NAME = "server"; private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(OsmAndHttpServer.class); - public static final int PORT = 24990; - public static String HOSTNAME = "0.0.0.0"; private final Map endpoints = new HashMap<>(); - private OsmandApplication application; private MapActivity mapActivity; - public OsmAndHttpServer(MapActivity mapActivity) throws IOException { - super(HOSTNAME, PORT); - setMapActivity(mapActivity); - start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); - registerEndpoints(); + public OsmAndHttpServer(String hostname, int port) { + super(hostname, port); } - public OsmandApplication getApplication() { - return application; - } - - public void setMapActivity(MapActivity mapActivity) { - this.application = mapActivity.getMyApplication(); + public void start(MapActivity mapActivity) throws IOException { this.mapActivity = mapActivity; - for (String s : endpoints.keySet()) { - endpoints.get(s).setMapActivity(mapActivity); - } + registerEndpoints(); + start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); } @Override @@ -78,16 +66,16 @@ public class OsmAndHttpServer extends NanoHTTPD { } private void register(String path, ApiEndpoint endpoint) { - endpoint.setMapActivity(mapActivity); endpoints.put(path, endpoint); } private NanoHTTPD.Response getStatic(String uri) { InputStream is; String mimeType = parseMimeType(uri); - if (application != null) { + OsmandApplication app = mapActivity.getMyApplication(); + if (app != null) { try { - is = application.getAssets().open(FOLDER_NAME + uri); + is = app.getAssets().open(FOLDER_NAME + uri); if (is.available() == 0) { return ErrorResponses.response404; } @@ -114,6 +102,14 @@ public class OsmAndHttpServer extends NanoHTTPD { return type; } + public String getUrl() { + return "http://" + getHostname() + ":" + getListeningPort(); + } + + public interface ApiEndpoint { + NanoHTTPD.Response process(NanoHTTPD.IHTTPSession session); + } + public static class ErrorResponses { public static NanoHTTPD.Response response404 = newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND, diff --git a/OsmAnd/src/net/osmand/plus/server/ServerFragment.java b/OsmAnd/src/net/osmand/plus/server/ServerFragment.java index bae8ebffa6..5917a11562 100644 --- a/OsmAnd/src/net/osmand/plus/server/ServerFragment.java +++ b/OsmAnd/src/net/osmand/plus/server/ServerFragment.java @@ -12,8 +12,8 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import fi.iki.elonen.NanoHTTPD; import net.osmand.PlatformUtil; -import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.BaseOsmAndFragment; @@ -25,6 +25,7 @@ import static android.content.Context.WIFI_SERVICE; public class ServerFragment extends BaseOsmAndFragment { private final static Log LOG = PlatformUtil.getLog(ServerFragment.class); + private final int port = 24990; private boolean initialized = false; private OsmAndHttpServer server; private View view; @@ -85,11 +86,12 @@ public class ServerFragment extends BaseOsmAndFragment { private void initServer() { final int THREAD_ID = 10000; TrafficStats.setThreadStatsTag(THREAD_ID); - OsmAndHttpServer.HOSTNAME = getDeviceAddress(); + String hostname = getDeviceAddress(); try { - server = new OsmAndHttpServer((MapActivity) getActivity()); + server = new OsmAndHttpServer(hostname, port); + server.start((MapActivity) getActivity()); initialized = true; - updateTextView("Server started at: http://" + getDeviceAddress() + ":" + OsmAndHttpServer.PORT); + updateTextView("Server started at: " + server.getUrl()); } catch (IOException e) { Toast.makeText(requireContext(), e.getLocalizedMessage(), diff --git a/OsmAnd/src/net/osmand/plus/server/endpoints/TileEndpoint.java b/OsmAnd/src/net/osmand/plus/server/endpoints/TileEndpoint.java index 19c853efba..c3251247e4 100644 --- a/OsmAnd/src/net/osmand/plus/server/endpoints/TileEndpoint.java +++ b/OsmAnd/src/net/osmand/plus/server/endpoints/TileEndpoint.java @@ -4,96 +4,78 @@ import android.graphics.Bitmap; import fi.iki.elonen.NanoHTTPD; import net.osmand.PlatformUtil; import net.osmand.data.RotatedTileBox; -import net.osmand.plus.OsmandApplication; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.render.MapRenderRepositories; -import net.osmand.plus.server.ApiEndpoint; -import net.osmand.plus.server.IMapOnImageDrawn; import net.osmand.plus.server.OsmAndHttpServer; +import net.osmand.plus.views.OsmandMapTileView; 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 static fi.iki.elonen.NanoHTTPD.SOCKET_READ_TIMEOUT; import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse; -public class TileEndpoint implements ApiEndpoint, IMapOnImageDrawn { - private static final Object lock = new Object(); +public class TileEndpoint implements OsmAndHttpServer.ApiEndpoint, OsmandMapTileView.IMapOnImageDrawn { private static final int TILE_SIZE_PX = 512; + private static final int TIMEOUT_STEP = 500; private static final Log LOG = PlatformUtil.getLog(TileEndpoint.class); - Map hashMap = new HashMap<>(); - Map map = Collections.synchronizedMap(hashMap); - OsmandApplication application; - private RotatedTileBox viewPort; + private RotatedTileBox resultBmpViewport; private Bitmap resultBitmap; private MapActivity mapActivity; public TileEndpoint(MapActivity mapActivity) { - setMapActivity(mapActivity); - } - - @Override - public void setMapActivity(MapActivity mapActivity) { this.mapActivity = mapActivity; - this.application = mapActivity.getMyApplication(); } @Override public void onDraw(RotatedTileBox viewport, Bitmap bmp) { - map.put(viewport, bmp); - this.viewPort = viewport; + this.resultBmpViewport = viewport; this.resultBitmap = bmp; } @Override public NanoHTTPD.Response process(NanoHTTPD.IHTTPSession session) { - synchronized (lock) { - this.mapActivity.getMapView().setOnImageDrawnListener(this); - RotatedTileBox tileBoxCopy = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); - 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(); - Bitmap bitmap = requestTile(lat, lon, zoom); - if (bitmap == null) { - return OsmAndHttpServer.ErrorResponses.response500; - } - //stream also needs to be synchronized - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); - byte[] byteArray = stream.toByteArray(); - ByteArrayInputStream str = new ByteArrayInputStream(byteArray); - mapActivity.getMapView().setCurrentViewport(tileBoxCopy); - return newFixedLengthResponse( - NanoHTTPD.Response.Status.OK, - "image/png", - str, - str.available()); + this.mapActivity.getMapView().setOnImageDrawnListener(this); + RotatedTileBox tileBoxCopy = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); + Scanner s = new Scanner(session.getUri()).useDelimiter("/"); + //reading path + s.next(); + int zoom = s.nextInt(); + double lat = s.nextDouble(); + double lon = s.nextDouble(); + Bitmap bitmap = requestTile(lat, lon, zoom); + if (bitmap == null) { + return OsmAndHttpServer.ErrorResponses.response500; } + //stream also needs to be synchronized + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); + byte[] byteArray = stream.toByteArray(); + ByteArrayInputStream str = new ByteArrayInputStream(byteArray); + mapActivity.getMapView().setCurrentViewport(tileBoxCopy); + this.mapActivity.getMapView().setOnImageDrawnListener(null); + return newFixedLengthResponse( + NanoHTTPD.Response.Status.OK, + "image/png", + str, + str.available()); } - private Bitmap requestTile(double lat, double lon, int zoom) { + private synchronized Bitmap requestTile(double lat, double lon, int zoom) { final RotatedTileBox rotatedTileBox = new RotatedTileBox.RotatedTileBoxBuilder() .setLocation(lat, lon) .setZoom(zoom) .setPixelDimensions(TILE_SIZE_PX, TILE_SIZE_PX, 0.5f, 0.5f).build(); - final MapRenderRepositories renderer = application.getResourceManager().getRenderer(); mapActivity.getMapView().setCurrentViewport(rotatedTileBox); Bitmap bmp = null; int timeout = 0; try { - while ((viewPort == null && !rotatedTileBox.equals(viewPort)) || timeout < 5000) { - Thread.sleep(100); - timeout += 100; + while (!rotatedTileBox.equals(resultBmpViewport) && timeout < SOCKET_READ_TIMEOUT) { + Thread.sleep(TIMEOUT_STEP); + timeout += TIMEOUT_STEP; } + resultBmpViewport = null; return resultBitmap; } catch (InterruptedException e) { LOG.error(e); diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 16742389be..0df9bcb74f 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -46,8 +46,6 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; 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.views.MultiTouchSupport.MultiTouchZoomListener; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; @@ -89,7 +87,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { private class FPSMeasurement { int fpsMeasureCount = 0; int fpsMeasureMs = 0; - long fpsFirstMeasurement = 0 ; + long fpsFirstMeasurement = 0; float fps; void calculateFPS(long start, long end) { @@ -108,6 +106,10 @@ public class OsmandMapTileView implements IMapDownloaderCallback { protected static final int emptyTileDivisor = 16; + public interface IMapOnImageDrawn { + void onDraw(RotatedTileBox viewport, Bitmap bmp); + } + public interface OnTrackBallListener { public boolean onTrackBallEvent(MotionEvent e); } @@ -582,7 +584,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { RectF rct = new RectF(x1, y1, x2, y2); canvas.drawBitmap(bufferBitmap, null, rct, paintImg); if (mapOnImageDrawnListener != null){ - mapOnImageDrawnListener.onDraw(currentViewport,bufferBitmap); + mapOnImageDrawnListener.onDraw(bufferImgLoc,bufferBitmap); } } canvas.rotate(-rot, currentViewport.getCenterPixelX(), currentViewport.getCenterPixelY());