Revert "Draft: simple web server added"
This commit is contained in:
parent
fe36f0e8d4
commit
0310eb92f6
42 changed files with 0 additions and 34937 deletions
|
@ -408,7 +408,6 @@
|
|||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<activity android:name=".activities.ServerActivity" android:label="@string/shared_string_settings" android:configChanges="keyboardHidden|orientation" />
|
||||
<activity android:name="net.osmand.plus.activities.SettingsActivity" android:label="@string/shared_string_settings" android:configChanges="keyboardHidden|orientation" />
|
||||
<activity android:name="net.osmand.plus.activities.SettingsGeneralActivity" android:configChanges="keyboardHidden|orientation" />
|
||||
<activity android:name="net.osmand.plus.activities.SettingsNavigationActivity" android:configChanges="keyboardHidden|orientation" />
|
||||
|
|
|
@ -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,606 +0,0 @@
|
|||
::-webkit-input-placeholder {color:#000;}
|
||||
::-moz-placeholder {color:#000;}
|
||||
:-moz-placeholder {color:#000;}
|
||||
:-ms-input-placeholder {color:#000;}
|
||||
h2, h3 {
|
||||
font-size: 20px;
|
||||
}
|
||||
.nav-holder {
|
||||
padding: 0 20px;
|
||||
background: #ff8e01;
|
||||
}
|
||||
.navigation {
|
||||
max-width: 1100px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.navigation li {
|
||||
margin-right: 30px;
|
||||
}
|
||||
.navigation a {
|
||||
display: block;
|
||||
padding: 30px 0;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
border-bottom: 4px solid #ff8e01;
|
||||
outline: none;
|
||||
}
|
||||
.navigation a:hover {
|
||||
color: #fff;
|
||||
}
|
||||
.navigation li {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.navigation li.active a,
|
||||
.navigation li.active a:focus,
|
||||
.navigation li.active a:hover {
|
||||
color: #fff;
|
||||
border-bottom: 4px solid #4464ad;
|
||||
}
|
||||
#month-selection {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
#region-selection {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.infobox {
|
||||
font-size: 16px;
|
||||
line-height: 150%;
|
||||
}
|
||||
.infobox h2 {
|
||||
font-size: 33px;
|
||||
}
|
||||
.infobox h3 {
|
||||
margin-top: 35px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.infobox ul {
|
||||
list-style-type: disc;
|
||||
list-style-position: inside;
|
||||
}
|
||||
.report-period-group {
|
||||
padding: 20px;
|
||||
background: #f2f2f2;
|
||||
}
|
||||
.report-period-group.supporters {
|
||||
float: left;
|
||||
width: 30%;
|
||||
height: 120px;
|
||||
}
|
||||
.supporters-total {
|
||||
float: right;
|
||||
width: 70%;
|
||||
height: 120px;
|
||||
border: 1px solid #ddd;
|
||||
border-left: 0 none;
|
||||
}
|
||||
.supporters-total-holder:after {
|
||||
content: '';
|
||||
display: table;
|
||||
clear: both;
|
||||
float: none;
|
||||
}
|
||||
.report-group {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
.report-group.period {
|
||||
width: 100%;
|
||||
max-width: 250px;
|
||||
margin-right: 40px;
|
||||
}
|
||||
.supporters .report-group.period {
|
||||
margin-right: 0;
|
||||
}
|
||||
.report-group.region {
|
||||
width: 100%;
|
||||
max-width: 420px;
|
||||
}
|
||||
.styled-select {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 42px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.styled-select:before {
|
||||
z-index: 0;
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('../images/main-sprite.png') no-repeat;
|
||||
}
|
||||
.styled-select:after {
|
||||
z-index: 0;
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 12px;
|
||||
right: 10px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('../images/main-sprite.png') no-repeat -200px -80px;
|
||||
}
|
||||
.report-group.period .styled-select:before {
|
||||
background-position: -251px -110px;
|
||||
}
|
||||
.report-group.region .styled-select:before {
|
||||
background-position: -290px -110px;
|
||||
}
|
||||
.report-group.round .styled-select:before {
|
||||
background-position: -290px -110px;
|
||||
}
|
||||
|
||||
.styled-select select {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
display: block;
|
||||
width: 110%;
|
||||
height: 42px;
|
||||
padding: 10px 45px 10px 35px;
|
||||
border: 0 none;
|
||||
border-radius: 0;
|
||||
background: transparent;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
select {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
select:-moz-focusring {
|
||||
color: transparent;
|
||||
text-shadow: 0 0 0 #000;
|
||||
}
|
||||
.report-total-div {
|
||||
border: 1px solid #e6e6e6;
|
||||
border-top: 0 none;
|
||||
}
|
||||
.overview-body {
|
||||
padding: 15px 15px 0;
|
||||
}
|
||||
.overview-hint {
|
||||
font-weight: bold;
|
||||
margin: 5px 0 20px;
|
||||
}
|
||||
.overview-hint span {
|
||||
color: #484dde;
|
||||
}
|
||||
.overview {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding-left: 50px;
|
||||
margin-right: 80px;
|
||||
margin-bottom: 20px;
|
||||
text-align: left;
|
||||
}
|
||||
.overview:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
.overview:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: url('../images/main-sprite.png') no-repeat;
|
||||
}
|
||||
.overview-changes:before {
|
||||
background-position: -0px -280px;
|
||||
}
|
||||
.overview-users:before {
|
||||
background-position: -40px -280px;
|
||||
}
|
||||
.overview-region:before {
|
||||
background-position: -80px -280px;
|
||||
}
|
||||
.overview-active_supporters:before {
|
||||
background-position: -40px -280px;
|
||||
}
|
||||
.overview-register_supporters:before {
|
||||
background-position: -120px -280px;
|
||||
}
|
||||
.overview-btc:before {
|
||||
background-position: -160px -280px;
|
||||
}
|
||||
.overview-total_weight:before {
|
||||
background-position: -200px -280px;
|
||||
}
|
||||
.overview p {
|
||||
margin: 0;
|
||||
margin-bottom: -10px;
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
line-height: 1.2;
|
||||
}
|
||||
.overview span {
|
||||
color: #999;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
#report-ranking,
|
||||
#users-ranking,
|
||||
#support-country-table-header,
|
||||
#support-table-header,
|
||||
#recipients-table-header {
|
||||
margin-top: 50px;
|
||||
font-size: 20px;
|
||||
}
|
||||
#report-ranking span {
|
||||
display: block;
|
||||
font-size: 13px;
|
||||
font-weight: normal;
|
||||
color: #999;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.table {
|
||||
font-size: 14px;
|
||||
}
|
||||
.table thead span {
|
||||
display: block;
|
||||
color: #999;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.table tbody tr td {
|
||||
padding: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.table-bordered > thead > tr > td,
|
||||
.table-bordered > thead > tr > th {
|
||||
vertical-align: middle;
|
||||
border-bottom-color: #ff8f00;
|
||||
font-weight: normal;
|
||||
}
|
||||
.table-controls.hidden {
|
||||
display: none;
|
||||
}
|
||||
.table-controls {
|
||||
position: relative;
|
||||
padding-right: 185px;
|
||||
}
|
||||
.tc.search {
|
||||
position: relative;
|
||||
}
|
||||
.tc.search:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 12px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('../images/main-sprite.png') no-repeat -300px -80px;
|
||||
}
|
||||
.tc.search input {
|
||||
max-width: 350px;
|
||||
height: 42px;
|
||||
padding-left: 40px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.tc.entries {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
max-width: 180px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.tc.entries .styled-select {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 80px;
|
||||
}
|
||||
.tc.entries .styled-select:before {
|
||||
content: none;
|
||||
}
|
||||
.tc.entries label {
|
||||
display: block;
|
||||
text-align: right;
|
||||
}
|
||||
.tc.entries select {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 125%;
|
||||
padding: 10px 0 10px 10px;
|
||||
}
|
||||
.sorting_desc,
|
||||
.sorting_asc,
|
||||
.sorting {
|
||||
position: relative;
|
||||
}
|
||||
.sorting_desc:after,
|
||||
.sorting_asc:after {
|
||||
content: '' !important;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 0;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('../images/main-sprite.png') no-repeat;
|
||||
transform: translate(0, -50%);
|
||||
}
|
||||
.sorting_asc:after {
|
||||
background-position: -160px -140px;
|
||||
}
|
||||
.sorting_desc:after {
|
||||
background-position: -200px -140px;
|
||||
}
|
||||
.sorting:after {
|
||||
content: '' !important;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 0;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('../images/main-sprite.png') no-repeat -180px -140px;
|
||||
transform: translate(0, -50%);
|
||||
}
|
||||
.pagination > .active > a,
|
||||
.pagination > .active > a:focus,
|
||||
.pagination > .active > a:hover,
|
||||
.pagination > .active > span,
|
||||
.pagination > .active > span:focus,
|
||||
.pagination > .active > span:hover {
|
||||
background-color: #ff8f00;
|
||||
border-color: #ff8f00;
|
||||
}
|
||||
.pagination > li > a,
|
||||
.pagination > li > span {
|
||||
color: #000;
|
||||
}
|
||||
.pagination > li > a:hover,
|
||||
.pagination > li > span:hover {
|
||||
background-color: rgba(255, 143, 0, 0.5);
|
||||
border-color: #ff8f00;
|
||||
color: #fff;
|
||||
}
|
||||
.registration {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
width: 49%;
|
||||
min-height: 420px;
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-right: 1%;
|
||||
background: #f2f2f2;
|
||||
}
|
||||
.registration.contributor-registration {
|
||||
margin-right: 0;
|
||||
}
|
||||
.registration h4 {
|
||||
margin-top: 0;
|
||||
font-size: 20px;
|
||||
}
|
||||
.recipient-registration label {
|
||||
margin-top: 10px;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.recipient-registration .form-control {
|
||||
margin: 0;
|
||||
border-radius: 2px;
|
||||
height: 42px;
|
||||
padding-left: 40px;
|
||||
}
|
||||
.recipient-registration .input-holder {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#agree_osm_live {
|
||||
margin-left: 5px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
.agree_osm_live_label {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
margin-left: 7px;
|
||||
margin-bottom: 15px;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
}
|
||||
|
||||
.recipient-registration .input-holder:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 12px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('../images/main-sprite.png') no-repeat;
|
||||
}
|
||||
.recipient-registration .input-holder.input-user:before {
|
||||
background-position: -180px -80px;
|
||||
}
|
||||
.recipient-registration .input-holder.input-pass:before {
|
||||
height: 21px;
|
||||
background-position: -172px -109px;
|
||||
}
|
||||
.recipient-registration .input-holder.input-bitcoin:before {
|
||||
background-position: -210px -110px;
|
||||
}
|
||||
.recipient-registration .input-hint {
|
||||
color: #999;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.recipient-registration .btn,
|
||||
.recipient-registration .btn:active {
|
||||
background: #575bde;
|
||||
border: 1px solid #3d42bf;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
}
|
||||
.registration-badges img {
|
||||
border: none;
|
||||
height: 45px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.contributor-registration p {
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.contributor-registration .btc-address {
|
||||
padding: 15px 10px;
|
||||
margin-bottom: 10px;
|
||||
background: #ff8f00;
|
||||
border-radius: 2px;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
#recipients-info-div {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.maincontainer {
|
||||
background-color: white;
|
||||
}
|
||||
.full-width-banner {
|
||||
width: 100%;
|
||||
margin: 20px auto;
|
||||
}
|
||||
.full-width-banner img {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.vlabel {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.form-control {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.tab-content {
|
||||
margin-top: 25px;
|
||||
}
|
||||
.container {
|
||||
max-width: 1135px;
|
||||
margin: 10px auto 50px;
|
||||
}
|
||||
#recipients-table td:nth-child(7) {
|
||||
word-break: break-all;
|
||||
padding: 8px 5px !important;
|
||||
}
|
||||
@media screen and (max-width: 1200px) {
|
||||
.nav-holder .navigation{
|
||||
max-width: 940px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 991px) {
|
||||
.nav-holder .navigation{
|
||||
max-width: 720px;
|
||||
}
|
||||
.report-group.period {
|
||||
max-width: 420px;
|
||||
margin-right: 0;
|
||||
}
|
||||
.supporters-total .overview {
|
||||
margin-right: 20px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 770px) {
|
||||
.report-period-group.supporters {
|
||||
float: none;
|
||||
width: 100%;
|
||||
height: 120px;
|
||||
}
|
||||
.supporters-total {
|
||||
float: none;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
border: 1px solid #ddd;
|
||||
border-top: 0 none;
|
||||
}
|
||||
.supporters-total:after {
|
||||
content: '';
|
||||
display: table;
|
||||
clear: both;
|
||||
float: none;
|
||||
}
|
||||
.registration {
|
||||
width: 100%;
|
||||
min-height: auto;
|
||||
margin-right: 0;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 650px) {
|
||||
#recipients-table th:nth-child(4),
|
||||
#recipients-table td:nth-child(4),
|
||||
#recipients-table th:nth-child(3),
|
||||
#recipients-table td:nth-child(3) {
|
||||
display: none;
|
||||
}
|
||||
.navigation li a,
|
||||
.navigation li.active a,
|
||||
.navigation li.active a:focus,
|
||||
.navigation li.active a:hover {
|
||||
border-bottom: 0 none;
|
||||
padding: 15px 0;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 550px) {
|
||||
.table {
|
||||
font-size: 13px;
|
||||
}
|
||||
.table thead {
|
||||
font-size: 11px;
|
||||
}
|
||||
.table thead span {
|
||||
text-transform: lowercase;
|
||||
}
|
||||
.table th,
|
||||
.table td {
|
||||
padding: 8px 2px !important;
|
||||
vertical-align: middle !important;
|
||||
font-weight: normal !important;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
.table th.sorting_asc:before,
|
||||
.table th.sorting_desc:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
margin-left: -2px;
|
||||
border: 4px solid transparent;
|
||||
}
|
||||
.table th.sorting_asc:before {
|
||||
bottom: 1px;
|
||||
border-top-color: #ff8f00;
|
||||
}
|
||||
.table th.sorting_desc:before {
|
||||
top: 1px;
|
||||
border-bottom-color: #ff8f00;
|
||||
}
|
||||
.table th:after {
|
||||
content: none !important;
|
||||
}
|
||||
.table-controls {
|
||||
padding-right: 145px;
|
||||
}
|
||||
.tc.entries {
|
||||
font-size: 12px;
|
||||
}
|
||||
.tc.entries span {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 30%;
|
||||
text-align: center;
|
||||
}
|
||||
.contributor-registration .btc-address {
|
||||
word-break: break-all;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,117 +0,0 @@
|
|||
/* Slider */
|
||||
.slick-slider
|
||||
{
|
||||
position: relative;
|
||||
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-khtml-user-select: none;
|
||||
-ms-touch-action: pan-y;
|
||||
touch-action: pan-y;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
|
||||
.slick-list
|
||||
{
|
||||
position: relative;
|
||||
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.slick-list:focus
|
||||
{
|
||||
outline: none;
|
||||
}
|
||||
.slick-list.dragging
|
||||
{
|
||||
cursor: pointer;
|
||||
cursor: hand;
|
||||
}
|
||||
|
||||
.slick-slider .slick-track,
|
||||
.slick-slider .slick-list
|
||||
{
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
-moz-transform: translate3d(0, 0, 0);
|
||||
-ms-transform: translate3d(0, 0, 0);
|
||||
-o-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
|
||||
.slick-track
|
||||
{
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
|
||||
display: block;
|
||||
}
|
||||
.slick-track:before,
|
||||
.slick-track:after
|
||||
{
|
||||
display: table;
|
||||
|
||||
content: '';
|
||||
}
|
||||
.slick-track:after
|
||||
{
|
||||
clear: both;
|
||||
}
|
||||
.slick-loading .slick-track
|
||||
{
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.slick-slide
|
||||
{
|
||||
display: none;
|
||||
float: left;
|
||||
|
||||
height: 100%;
|
||||
min-height: 1px;
|
||||
}
|
||||
[dir='rtl'] .slick-slide
|
||||
{
|
||||
float: right;
|
||||
}
|
||||
.slick-slide img
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
.slick-slide.slick-loading img
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
.slick-slide.dragging img
|
||||
{
|
||||
pointer-events: none;
|
||||
}
|
||||
.slick-initialized .slick-slide
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
.slick-loading .slick-slide
|
||||
{
|
||||
visibility: hidden;
|
||||
}
|
||||
.slick-vertical .slick-slide
|
||||
{
|
||||
display: block;
|
||||
|
||||
height: auto;
|
||||
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
.slick-arrow.slick-hidden {
|
||||
display: none;
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
/* Slider */
|
||||
|
||||
.slick-slider {
|
||||
position: relative;
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
-ms-touch-action: pan-y;
|
||||
touch-action: pan-y;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
.slick-list {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
&.dragging {
|
||||
cursor: pointer;
|
||||
cursor: hand;
|
||||
}
|
||||
}
|
||||
.slick-slider .slick-track,
|
||||
.slick-slider .slick-list {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
-moz-transform: translate3d(0, 0, 0);
|
||||
-ms-transform: translate3d(0, 0, 0);
|
||||
-o-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
|
||||
.slick-track {
|
||||
position: relative;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
content: "";
|
||||
display: table;
|
||||
}
|
||||
|
||||
&:after {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.slick-loading & {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
.slick-slide {
|
||||
float: left;
|
||||
height: 100%;
|
||||
min-height: 1px;
|
||||
[dir="rtl"] & {
|
||||
float: right;
|
||||
}
|
||||
img {
|
||||
display: block;
|
||||
}
|
||||
&.slick-loading img {
|
||||
display: none;
|
||||
}
|
||||
|
||||
display: none;
|
||||
|
||||
&.dragging img {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.slick-initialized & {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.slick-loading & {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.slick-vertical & {
|
||||
display: block;
|
||||
height: auto;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
}
|
||||
.slick-arrow.slick-hidden {
|
||||
display: none;
|
||||
}
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,43 +0,0 @@
|
|||
@font-family: 'Roboto Regular';
|
||||
@text-color: #000;
|
||||
@oposite-text-color: #fff;
|
||||
@header-color: #536dfe;
|
||||
@read-more-color: #adadad;
|
||||
@brand-orange: #ff8f00;
|
||||
@opacity-orange-overlay: 0.9;
|
||||
@separator-bg: #ffbb00;
|
||||
|
||||
@badge-free: #f3f3f3;
|
||||
@badge-free-text: #737373;
|
||||
@badge-paid: #62c452;
|
||||
@badge-paid-text: #fff;
|
||||
|
||||
@footer-bg: #292f33;
|
||||
@footer-text-color: #fff;
|
||||
@footer-header-color: #698d8f;
|
||||
@footer-header-underline-color: #2f4445;
|
||||
@footer-copyright-color: #525e66;
|
||||
@footer-font-family: Arial;
|
||||
@footer-contact-btn-border: #394247;
|
||||
|
||||
@index-app-features-header: #ffa516;
|
||||
@index-app-features-subheader: #c1c1c1;
|
||||
@index-banner-btn-bg: #ffa516;
|
||||
@index-header-color: #000;
|
||||
@index-subheader-color: #737373;
|
||||
@index-slider-btn-active: #ffa516;
|
||||
@index-slider-btn-passive: #d4d4d4;
|
||||
@index-recomendations-username: #212121;
|
||||
@index-recomendations-service: #9e9e9e;
|
||||
@index-news-link-color: #266ce0;
|
||||
@index-news-read-more-link: #adadad;
|
||||
@index-news-timestamp: #adadad;
|
||||
@index-poll-btn-bg: #ff8f00;
|
||||
@index-poll-result-btn-bg: #ff6c00;
|
||||
@index-poll-radio-btn-active: #ff8f00;
|
||||
@index-poll-radio-btn-border: #bbb;
|
||||
|
||||
@blog-article-header: #536dfe;
|
||||
|
||||
@help-question-link: #454ade;
|
||||
@help-question-border: #e6e7ec;
|
|
@ -1,2 +0,0 @@
|
|||
/***********************EMPTY USED BY HELP inlining but already defined in site.css
|
||||
*********************************************/
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
Before Width: | Height: | Size: 574 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load diff
Before Width: | Height: | Size: 584 KiB |
Binary file not shown.
Binary file not shown.
|
@ -1,98 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="cache-control" content="max-age=0"/>
|
||||
<meta http-equiv="cache-control" content="no-cache"/>
|
||||
<meta http-equiv="expires" content="0"/>
|
||||
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT"/>
|
||||
<meta http-equiv="pragma" content="no-cache"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>OsmAnd - Offline Mobile Maps and Navigation</title>
|
||||
<link rel="stylesheet" type="text/css" href="/css/site.css?v=4"/>
|
||||
<!-- <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" /> -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.1.0/dist/leaflet.css"/>
|
||||
<script src="https://unpkg.com/leaflet@1.1.0/dist/leaflet.js"></script>
|
||||
<script type="text/javascript" src="/scripts/jquery-3.1.0.min.js"></script>
|
||||
<!--
|
||||
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
|
||||
-->
|
||||
|
||||
<script type="text/javascript" src="/scripts/js.cookie.js"></script>
|
||||
<script type="text/javascript" src="/scripts/go.js?v=5"></script>
|
||||
|
||||
<script>
|
||||
function getMarkerContent(feature) {
|
||||
var p = feature.properties;
|
||||
var popupContent = p.title;
|
||||
if(p.opr_id) {
|
||||
popupContent += " (" + p.opr_id+") ";
|
||||
}
|
||||
if(p.tags) {
|
||||
for (var t in p.tags) {
|
||||
popupContent += "<br>" + t + " " + p.tags[t];
|
||||
}
|
||||
}
|
||||
if(p.opr_id) {
|
||||
popupContent += "<br><a href=\'/api/admin?view=objects&browse=type&type=opr.place&subtype=id&key=" +
|
||||
p.opr_id + "\'>OpenPlaceReviews</a>";
|
||||
}
|
||||
if(p.osm_id) {
|
||||
popupContent += "<br><a href=\'https://www.openstreetmap.org/" +
|
||||
p.osm_type + "/" + p.osm_id + "\'>OpenStreetMap</a>";
|
||||
}
|
||||
return popupContent;
|
||||
}
|
||||
|
||||
function markerClick(e){
|
||||
|
||||
}
|
||||
|
||||
function setupMarkers(){
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: "/favorites",
|
||||
async: false,
|
||||
contentType: "application/json",
|
||||
dataType: 'json',
|
||||
complete: function(r) {
|
||||
var points = JSON.parse(r.responseText);
|
||||
points.forEach(e => {
|
||||
window.goMap.map.addPopupMarker(e,markerClick);
|
||||
});
|
||||
},
|
||||
error: function(e) {
|
||||
alert("Error happened while getting favourite points "+e.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$( document ).ready(function() {
|
||||
setupMarkers();
|
||||
});
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="gocontainer" id="gocontainer">
|
||||
<div class="goheader">
|
||||
<a href="/"><img src="/images/logo-grey.png" class="logo"/></a>
|
||||
<div class="coordinatescontainer">
|
||||
<div><span class="title">LAT</span><span class="coordinate latitude"></span></div>
|
||||
<div><span class="title">LON</span><span class="coordinate longitude"></span></div>
|
||||
</div>
|
||||
<div class="clear:both;"></div>
|
||||
</div>
|
||||
<div id="map"></div>
|
||||
<div class="overlay" style="display:none;"></div>
|
||||
<div class="popup" style="display:none;">
|
||||
<div class="logo"></div>
|
||||
<h1>Did you know</h1>
|
||||
<p>OsmAnd has an iOS application</p>
|
||||
<a class="button yes" href="javascript:void(0);">Yep, I've already got it</a>
|
||||
<a class="button no" href="javascript::void(0);">Nope, but I'd love to try it</a>
|
||||
<a class="button cancel" href="javascript:void(0);">Leave me alone</a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Binary file not shown.
Before Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 4.4 KiB |
|
@ -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,268 +0,0 @@
|
|||
var requestUtils={
|
||||
'getParamValue':function(paramName){
|
||||
let value= (location.search.split(paramName + '=')[1]||'').split('&')[0];
|
||||
if (value && value.length > 0){
|
||||
return value;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'isIOS':function(){
|
||||
return /(iPad|iPhone|iPod)/g.test( navigator.userAgent );
|
||||
},
|
||||
'redirect':function(newUrl){
|
||||
document.location = newUrl;
|
||||
}
|
||||
};
|
||||
|
||||
var goMap = {
|
||||
'config':{
|
||||
'containerid': 'gocontainer',
|
||||
'defaults':{
|
||||
'lat':50.27,
|
||||
'lon':30.30,
|
||||
'zoom':13
|
||||
}
|
||||
},
|
||||
'utils':{
|
||||
'getPointFromUrl':function(){
|
||||
let point = {};
|
||||
point.lat = requestUtils.getParamValue('lat');
|
||||
point.lon = requestUtils.getParamValue('lon');
|
||||
point.zoom = requestUtils.getParamValue('z');
|
||||
return point;
|
||||
},
|
||||
'isPointComplete':function(point){
|
||||
if (!point.lat || !point.lon){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
'extendPoint':function(initialPoint, newPoint){
|
||||
let point={};
|
||||
point.lat=newPoint.lat;
|
||||
if (!point.lat || point.lat == null){
|
||||
point.lat = initialPoint.lat;
|
||||
}
|
||||
point.lon=newPoint.lon;
|
||||
if (!point.lon || point.lon == null){
|
||||
point.lon = initialPoint.lon;
|
||||
}
|
||||
point.zoom=newPoint.zoom;
|
||||
if (!point.zoom || point.zoom == null){
|
||||
point.zoom = initialPoint.zoom;
|
||||
}
|
||||
return point;
|
||||
}
|
||||
},
|
||||
'init': function(config){
|
||||
if (config && typeof (config) == 'object') {
|
||||
$.extend(goMap.config, config);
|
||||
}
|
||||
goMap.$container = $('#' + goMap.config.containerid);
|
||||
goMap.$footer = goMap.$container.find('.gofooter');
|
||||
goMap.$latitude = goMap.$container.find('.latitude');
|
||||
goMap.$longitude = goMap.$container.find('.longitude');
|
||||
|
||||
let inputPoint = goMap.utils.getPointFromUrl();
|
||||
goMap.point = goMap.utils.extendPoint(goMap.config.defaults, inputPoint);
|
||||
goMap.refreshCoordinates();
|
||||
|
||||
goMap.map =$.mapwidget();
|
||||
goMap.map.showPoint(goMap.point);
|
||||
|
||||
let inputComplete = goMap.utils.isPointComplete(inputPoint);
|
||||
if (inputComplete){
|
||||
goMap.map.addMarker(goMap.point);
|
||||
}
|
||||
goMap.point = goMap.utils.getPointFromUrl();
|
||||
},
|
||||
'refreshCoordinates':function(){
|
||||
goMap.$latitude.text(goMap.point.lat);
|
||||
goMap.$longitude.text(goMap.point.lon);
|
||||
}
|
||||
};
|
||||
|
||||
function toColor(num) {
|
||||
num >>>= 0;
|
||||
var b = num & 0xFF,
|
||||
g = (num & 0xFF00) >>> 8,
|
||||
r = (num & 0xFF0000) >>> 16,
|
||||
a = ( (num & 0xFF000000) >>> 24 ) / 255 ;
|
||||
return "rgba(" + [r, g, b, a].join(",") + ")";
|
||||
}
|
||||
|
||||
(function($) {
|
||||
$.mapwidget = function(config) {
|
||||
var loc = goMap.point.lat + '/' + goMap.point.lon;
|
||||
var lparams = '?mlat='+goMap.point.lat + '&mlon=' + goMap.point.lon;
|
||||
var mapobj={
|
||||
config: $.extend({
|
||||
'mapid':'map',
|
||||
'maxzoom':20,
|
||||
'maxnativezoom':19,
|
||||
'sourceurl':'https://tile.osmand.net/hd/{z}/{x}/{y}.png',
|
||||
'attribution':'© <a href="https://www.openstreetmap.org/'+lparams+'#map=15/'+loc+'">OpenStreetMap</a> contributors'
|
||||
}, config),
|
||||
init:function(){
|
||||
mapobj.map = L.map(mapobj.config.mapid);
|
||||
L.tileLayer(mapobj.config.sourceurl, {
|
||||
attribution: mapobj.config.attribution,
|
||||
maxZoom: mapobj.config.maxzoom,
|
||||
maxNativeZoom: mapobj.config.maxnativezoom
|
||||
}).addTo(mapobj.map);
|
||||
},
|
||||
showPoint:function(point){
|
||||
mapobj.map.setView([point.lat, point.lon], point.zoom);
|
||||
},
|
||||
addMarker:function(point){
|
||||
L.marker([point.lat, point.lon]).addTo(mapobj.map);
|
||||
},
|
||||
addPopupMarker:function(favorite,onClickEvent){
|
||||
window.point = favorite;
|
||||
var point = {};
|
||||
point.lat = favorite.latitude;
|
||||
point.lon = favorite.longitude;
|
||||
var popup = L.popup().setContent(
|
||||
"name: <b>" + favorite.name + "</b><br/>" +
|
||||
"address: <i>" + favorite.address + "</i><br/>"
|
||||
+ "category: " + favorite.category);
|
||||
L.marker([point.lat, point.lon])
|
||||
.bindPopup(popup)
|
||||
.addTo(mapobj.map)
|
||||
.on('click', function(e) {
|
||||
onClickEvent(e);
|
||||
});
|
||||
}
|
||||
};
|
||||
mapobj.init();
|
||||
return {
|
||||
showPoint: mapobj.showPoint,
|
||||
addMarker: mapobj.addMarker,
|
||||
addPopupMarker: mapobj.addPopupMarker
|
||||
};
|
||||
};
|
||||
})(jQuery);
|
||||
|
||||
(function($) {
|
||||
$.timer=function(config){
|
||||
var timerobj={
|
||||
config: $.extend({
|
||||
'timeoutInMs':300,
|
||||
'maxActionDelayInMs':2000,
|
||||
'action':function(){},
|
||||
'actionparams':null
|
||||
}, config),
|
||||
init:function(){
|
||||
timerobj.timer = null;
|
||||
timerobj.startDate = null;
|
||||
},
|
||||
start:function(){
|
||||
timerobj.cancel();
|
||||
timerobj.startDate = new Date();
|
||||
timerobj.timer=setTimeout(timerobj.onTimer, timerobj.config.timeoutInMs);
|
||||
},
|
||||
cancel:function(){
|
||||
if (timerobj.timer != null){
|
||||
clearTimeout(timerobj.timer);
|
||||
timerobj.timer = null;
|
||||
timerobj.startDate = null;
|
||||
}
|
||||
},
|
||||
onTimer:function(){
|
||||
timerobj.timer= null;
|
||||
let now = new Date();
|
||||
if(now - timerobj.startDate < timerobj.config.maxActionDelayInMs){
|
||||
timerobj.config.action(timerobj.config.actionparams);
|
||||
}
|
||||
}
|
||||
};
|
||||
timerobj.init();
|
||||
return {
|
||||
start:timerobj.start,
|
||||
cancel:timerobj.cancel
|
||||
};
|
||||
};
|
||||
})(jQuery);
|
||||
|
||||
var iosAppRedirect = {
|
||||
config:{
|
||||
appPrefix:'osmandmaps://',
|
||||
containerid:'gocontainer',
|
||||
cookieName:'OsmAndInstalled',
|
||||
cookieNoExpirationTimeoutInDays:30
|
||||
},
|
||||
init:function(config){
|
||||
if (config && typeof (config) == 'object') {
|
||||
$.extend(iosAppRedirect.config, config);
|
||||
}
|
||||
|
||||
if (!requestUtils.isIOS()){
|
||||
return;
|
||||
}
|
||||
iosAppRedirect.$container = $('#' + iosAppRedirect.config.containerid);
|
||||
iosAppRedirect.$overlay = iosAppRedirect.$container.find('.overlay');
|
||||
iosAppRedirect.$popup = iosAppRedirect.$container.find('.popup');
|
||||
iosAppRedirect.$yesBtn = iosAppRedirect.$container.find('.yes');
|
||||
iosAppRedirect.$noBtn = iosAppRedirect.$container.find('.no');
|
||||
iosAppRedirect.$cancelBtn = iosAppRedirect.$container.find('.cancel');
|
||||
iosAppRedirect.applestorelink = iosAppRedirect.$container.find('.gobadges .apple a').attr('href');
|
||||
iosAppRedirect.applink = iosAppRedirect.config.appPrefix + document.location.search;
|
||||
|
||||
|
||||
if (iosAppRedirect.isAppInstalled() === "yes"){
|
||||
iosAppRedirect.redirectToApp();
|
||||
return;
|
||||
}
|
||||
if (iosAppRedirect.isAppInstalled() === "no"){
|
||||
return;
|
||||
}
|
||||
|
||||
iosAppRedirect.$yesBtn.on('click', function(){
|
||||
iosAppRedirect.redirectToApp();
|
||||
iosAppRedirect.closePopup();
|
||||
});
|
||||
|
||||
iosAppRedirect.$noBtn.on('click', function(){
|
||||
iosAppRedirect.setCookie(true);
|
||||
iosAppRedirect.closePopup();
|
||||
window.open(iosAppRedirect.applestorelink , '_blank');
|
||||
});
|
||||
|
||||
iosAppRedirect.$cancelBtn.on('click', function(){
|
||||
iosAppRedirect.setCookie(false);
|
||||
iosAppRedirect.closePopup();
|
||||
});
|
||||
iosAppRedirect.openPopup();
|
||||
},
|
||||
isAppInstalled:function(){
|
||||
return Cookies.get('OsmAndInstalled');
|
||||
},
|
||||
redirectToApp:function(){
|
||||
iosAppRedirect.timer = $.timer({action:iosAppRedirect.clearCookie});
|
||||
iosAppRedirect.timer.start();
|
||||
requestUtils.redirect(iosAppRedirect.applink);
|
||||
},
|
||||
setCookie:function(appInstalled){
|
||||
if (appInstalled === true){
|
||||
Cookies.set(iosAppRedirect.config.cookieName, "yes");
|
||||
}else{
|
||||
Cookies.set(iosAppRedirect.config.cookieName, "no", { expires: iosAppRedirect.config.cookieNoExpirationTimeoutInDays });
|
||||
}
|
||||
},
|
||||
clearCookie:function(){
|
||||
Cookies.remove('OsmAndInstalled');
|
||||
},
|
||||
openPopup:function(){
|
||||
iosAppRedirect.$overlay.show();
|
||||
iosAppRedirect.$popup.show();
|
||||
},
|
||||
closePopup:function(){
|
||||
iosAppRedirect.$overlay.hide();
|
||||
iosAppRedirect.$popup.hide();
|
||||
}
|
||||
};
|
||||
|
||||
$( document ).ready(function() {
|
||||
goMap.init();
|
||||
iosAppRedirect.init();
|
||||
});
|
File diff suppressed because one or more lines are too long
10346
OsmAnd/assets/server/scripts/jquery-1.11.2.js
vendored
10346
OsmAnd/assets/server/scripts/jquery-1.11.2.js
vendored
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -1,38 +0,0 @@
|
|||
(function($) {
|
||||
$.fn.ellipsis = function()
|
||||
{
|
||||
return this.each(function()
|
||||
{
|
||||
var el = $(this);
|
||||
|
||||
if(el.css("overflow") == "hidden")
|
||||
{
|
||||
var text = el.html();
|
||||
var multiline = el.hasClass('multiline');
|
||||
var t = $(this.cloneNode(true))
|
||||
.hide()
|
||||
.css('position', 'absolute')
|
||||
.css('overflow', 'visible')
|
||||
.width(multiline ? el.width() : 'auto')
|
||||
.height(multiline ? 'auto' : el.height())
|
||||
;
|
||||
|
||||
el.after(t);
|
||||
|
||||
function height() { return t.height() > el.height(); };
|
||||
function width() { return t.width() > el.width(); };
|
||||
|
||||
var func = multiline ? height : width;
|
||||
|
||||
while (text.length > 0 && func())
|
||||
{
|
||||
text = text.substr(0, text.length - 1);
|
||||
t.html(text + "...");
|
||||
}
|
||||
|
||||
el.html(t.html());
|
||||
t.remove();
|
||||
}
|
||||
});
|
||||
};
|
||||
})(jQuery);
|
|
@ -1,165 +0,0 @@
|
|||
/*!
|
||||
* JavaScript Cookie v2.1.4
|
||||
* https://github.com/js-cookie/js-cookie
|
||||
*
|
||||
* Copyright 2006, 2015 Klaus Hartl & Fagner Brack
|
||||
* Released under the MIT license
|
||||
*/
|
||||
;(function (factory) {
|
||||
var registeredInModuleLoader = false;
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(factory);
|
||||
registeredInModuleLoader = true;
|
||||
}
|
||||
if (typeof exports === 'object') {
|
||||
module.exports = factory();
|
||||
registeredInModuleLoader = true;
|
||||
}
|
||||
if (!registeredInModuleLoader) {
|
||||
var OldCookies = window.Cookies;
|
||||
var api = window.Cookies = factory();
|
||||
api.noConflict = function () {
|
||||
window.Cookies = OldCookies;
|
||||
return api;
|
||||
};
|
||||
}
|
||||
}(function () {
|
||||
function extend () {
|
||||
var i = 0;
|
||||
var result = {};
|
||||
for (; i < arguments.length; i++) {
|
||||
var attributes = arguments[ i ];
|
||||
for (var key in attributes) {
|
||||
result[key] = attributes[key];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function init (converter) {
|
||||
function api (key, value, attributes) {
|
||||
var result;
|
||||
if (typeof document === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Write
|
||||
|
||||
if (arguments.length > 1) {
|
||||
attributes = extend({
|
||||
path: '/'
|
||||
}, api.defaults, attributes);
|
||||
|
||||
if (typeof attributes.expires === 'number') {
|
||||
var expires = new Date();
|
||||
expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
|
||||
attributes.expires = expires;
|
||||
}
|
||||
|
||||
// We're using "expires" because "max-age" is not supported by IE
|
||||
attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';
|
||||
|
||||
try {
|
||||
result = JSON.stringify(value);
|
||||
if (/^[\{\[]/.test(result)) {
|
||||
value = result;
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
if (!converter.write) {
|
||||
value = encodeURIComponent(String(value))
|
||||
.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
|
||||
} else {
|
||||
value = converter.write(value, key);
|
||||
}
|
||||
|
||||
key = encodeURIComponent(String(key));
|
||||
key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
|
||||
key = key.replace(/[\(\)]/g, escape);
|
||||
|
||||
var stringifiedAttributes = '';
|
||||
|
||||
for (var attributeName in attributes) {
|
||||
if (!attributes[attributeName]) {
|
||||
continue;
|
||||
}
|
||||
stringifiedAttributes += '; ' + attributeName;
|
||||
if (attributes[attributeName] === true) {
|
||||
continue;
|
||||
}
|
||||
stringifiedAttributes += '=' + attributes[attributeName];
|
||||
}
|
||||
return (document.cookie = key + '=' + value + stringifiedAttributes);
|
||||
}
|
||||
|
||||
// Read
|
||||
|
||||
if (!key) {
|
||||
result = {};
|
||||
}
|
||||
|
||||
// To prevent the for loop in the first place assign an empty array
|
||||
// in case there are no cookies at all. Also prevents odd result when
|
||||
// calling "get()"
|
||||
var cookies = document.cookie ? document.cookie.split('; ') : [];
|
||||
var rdecode = /(%[0-9A-Z]{2})+/g;
|
||||
var i = 0;
|
||||
|
||||
for (; i < cookies.length; i++) {
|
||||
var parts = cookies[i].split('=');
|
||||
var cookie = parts.slice(1).join('=');
|
||||
|
||||
if (cookie.charAt(0) === '"') {
|
||||
cookie = cookie.slice(1, -1);
|
||||
}
|
||||
|
||||
try {
|
||||
var name = parts[0].replace(rdecode, decodeURIComponent);
|
||||
cookie = converter.read ?
|
||||
converter.read(cookie, name) : converter(cookie, name) ||
|
||||
cookie.replace(rdecode, decodeURIComponent);
|
||||
|
||||
if (this.json) {
|
||||
try {
|
||||
cookie = JSON.parse(cookie);
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
if (key === name) {
|
||||
result = cookie;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!key) {
|
||||
result[name] = cookie;
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
api.set = api;
|
||||
api.get = function (key) {
|
||||
return api.call(api, key);
|
||||
};
|
||||
api.getJSON = function () {
|
||||
return api.apply({
|
||||
json: true
|
||||
}, [].slice.call(arguments));
|
||||
};
|
||||
api.defaults = {};
|
||||
|
||||
api.remove = function (key, attributes) {
|
||||
api(key, '', extend(attributes, {
|
||||
expires: -1
|
||||
}));
|
||||
};
|
||||
|
||||
api.withConverter = init;
|
||||
|
||||
return api;
|
||||
}
|
||||
|
||||
return init(function () {});
|
||||
}));
|
|
@ -1,29 +0,0 @@
|
|||
|
||||
|
||||
function mapselector(container){
|
||||
var $cnt = $(container);
|
||||
var $selectbox = $cnt.find(".selectbox");
|
||||
|
||||
$cnt.find("label").on('click', function(){
|
||||
refreshMap();
|
||||
});
|
||||
|
||||
var refreshMap = function(){
|
||||
var selectedStyle = getSelectedStyle().val();
|
||||
var selectedMap = getSelectedMap().val();
|
||||
if (selectedStyle && selectedMap){
|
||||
var imageName = selectedMap + "-" + selectedStyle + ".png";
|
||||
$cnt.css('background-image', "url('/images/" + imageName + "')");
|
||||
}
|
||||
}
|
||||
|
||||
var getSelectedStyle = function(){
|
||||
return $selectbox.find("input[name='style']:checked");
|
||||
}
|
||||
var getSelectedMap = function(){
|
||||
return $selectbox.find("input[name='show']:checked");
|
||||
}
|
||||
refreshMap();
|
||||
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
18
OsmAnd/assets/server/scripts/slick.min.js
vendored
18
OsmAnd/assets/server/scripts/slick.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -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();
|
||||
|
||||
}
|
|
@ -542,7 +542,6 @@ dependencies {
|
|||
//implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0'
|
||||
implementation 'com.squareup.picasso:picasso:2.71828'
|
||||
implementation 'me.zhanghai.android.materialprogressbar:library:1.4.2'
|
||||
implementation 'org.nanohttpd:nanohttpd:2.2.0'
|
||||
// JS core
|
||||
implementation group: 'org.mozilla', name: 'rhino', version: '1.7.9'
|
||||
// size restrictions
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="10px">
|
||||
<RelativeLayout
|
||||
android:id="@+id/RelativeLayout03"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_marginTop="20px"
|
||||
android:layout_marginBottom="40px">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/TextView02"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:autoLink="web"
|
||||
android:text="Click button to start server"></TextView>
|
||||
</RelativeLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/Button01"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/RelativeLayout03"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_marginBottom="40px"
|
||||
android:text="Start"></Button>
|
||||
|
||||
<Button
|
||||
android:id="@+id/Button03"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/Button01"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:text="Stop"></Button>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignRight="@+id/Button03"
|
||||
android:fitsSystemWindows="true"
|
||||
android:lines="14"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textSize="8dp" />
|
||||
|
||||
</RelativeLayout>
|
|
@ -58,7 +58,6 @@
|
|||
<string name="shared_string_gpx_files">Tracks</string>
|
||||
<string name="add_segment_to_the_track">Add to a track file</string>
|
||||
<string name="shared_string_save_as_gpx">Save as new track file</string>
|
||||
<string name="web_server">Web server</string>
|
||||
<string name="in_case_of_reverse_direction">In case of reverse direction</string>
|
||||
<string name="plan_route_exit_dialog_descr">Are you sure you want to close Plan route without saving? You will lose all changes.</string>
|
||||
<string name="street_level_imagery">Street-level imagery</string>
|
||||
|
|
|
@ -1009,20 +1009,6 @@ public class MapActivityActions implements DialogProvider {
|
|||
}).createItem());
|
||||
*/
|
||||
|
||||
optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.web_server, mapActivity)
|
||||
.setId("SERVER_ID")
|
||||
.setIcon(R.drawable.mm_shop_computer)
|
||||
.setListener(new ItemClickListener() {
|
||||
@Override
|
||||
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
|
||||
app.logEvent("drawer_help_open");
|
||||
Intent intent = new Intent(mapActivity, ServerActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
mapActivity.startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
}).createItem());
|
||||
|
||||
optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.shared_string_help, mapActivity)
|
||||
.setId(DRAWER_HELP_ID)
|
||||
.setIcon(R.drawable.ic_action_help)
|
||||
|
|
|
@ -1,104 +0,0 @@
|
|||
package net.osmand.plus.activities;
|
||||
|
||||
import android.net.TrafficStats;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.StrictMode;
|
||||
import android.text.format.Formatter;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.server.OsmAndHttpServer;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class ServerActivity extends AppCompatActivity {
|
||||
private boolean initialized = false;
|
||||
private OsmAndHttpServer server;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
enableStrictMode();
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.server_activity);
|
||||
findViewById(R.id.Button01).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (!initialized) {
|
||||
updateTextView("Click second button to deactivate server");
|
||||
initServer();
|
||||
}
|
||||
}
|
||||
});
|
||||
findViewById(R.id.Button03).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (initialized) {
|
||||
updateTextView("Click first button to activate server");
|
||||
deInitServer();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void enableStrictMode() {
|
||||
StrictMode.setThreadPolicy(
|
||||
new StrictMode.ThreadPolicy.Builder()
|
||||
.detectDiskReads()
|
||||
.detectDiskWrites()
|
||||
.detectNetwork()
|
||||
.penaltyLog()
|
||||
.build());
|
||||
StrictMode.setVmPolicy(
|
||||
new StrictMode.VmPolicy.Builder()
|
||||
.detectLeakedSqlLiteObjects()
|
||||
.penaltyLog()
|
||||
.build());
|
||||
}
|
||||
|
||||
|
||||
private void updateTextView(String text) {
|
||||
((TextView) findViewById(R.id.TextView02)).setText(text);
|
||||
}
|
||||
|
||||
private void initServer() {
|
||||
final int THREAD_ID = 10000;
|
||||
TrafficStats.setThreadStatsTag(THREAD_ID);
|
||||
OsmAndHttpServer.HOSTNAME = getDeviceAddress();
|
||||
try {
|
||||
server = new OsmAndHttpServer();
|
||||
server.setAndroidApplication((OsmandApplication)this.getApplication());
|
||||
initialized = true;
|
||||
updateTextView("Server started at: http://" + getDeviceAddress() + ":" + OsmAndHttpServer.PORT);
|
||||
} catch (IOException e) {
|
||||
Toast.makeText(this,
|
||||
e.getLocalizedMessage(),
|
||||
Toast.LENGTH_SHORT).show();
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private String getDeviceAddress() {
|
||||
WifiManager wm = (WifiManager) this.getApplicationContext().getSystemService(WIFI_SERVICE);
|
||||
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
|
||||
return ip != null ? ip : "0.0.0.0";
|
||||
}
|
||||
|
||||
private void deInitServer() {
|
||||
server.closeAllConnections();
|
||||
server.stop();
|
||||
initialized = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
deInitServer();
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package net.osmand.plus.server;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
|
||||
public class ApiEndpoint{
|
||||
public String uri = "";
|
||||
public ApiCall apiCall;
|
||||
|
||||
public NanoHTTPD.Response run(NanoHTTPD.IHTTPSession session){
|
||||
return apiCall.call(session);
|
||||
}
|
||||
|
||||
public interface ApiCall{
|
||||
NanoHTTPD.Response call(NanoHTTPD.IHTTPSession session);
|
||||
}
|
||||
}
|
|
@ -1,186 +0,0 @@
|
|||
package net.osmand.plus.server;
|
||||
|
||||
import android.util.Log;
|
||||
import android.webkit.MimeTypeMap;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import net.osmand.data.FavouritePoint;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
|
||||
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
|
||||
|
||||
public class ApiRouter {
|
||||
private OsmandApplication androidContext;
|
||||
|
||||
public OsmandApplication getAndroidContext() {
|
||||
return androidContext;
|
||||
}
|
||||
|
||||
private final String FOLDER_NAME = "server";
|
||||
private Gson gson = new Gson();
|
||||
private Map<String, ApiEndpoint> endpoints = new HashMap<>();
|
||||
|
||||
public ApiRouter(){
|
||||
initFavorites();
|
||||
}
|
||||
|
||||
private void initFavorites() {
|
||||
ApiEndpoint favorites = new ApiEndpoint();
|
||||
favorites.uri = "/favorites";
|
||||
favorites.apiCall = new ApiEndpoint.ApiCall(){
|
||||
@Override
|
||||
public NanoHTTPD.Response call(NanoHTTPD.IHTTPSession session) {
|
||||
return newFixedLengthResponse(getFavoritesJson());
|
||||
}
|
||||
};
|
||||
endpoints.put(favorites.uri,favorites);
|
||||
}
|
||||
|
||||
public void setAndroidContext(OsmandApplication androidContext) {
|
||||
this.androidContext = androidContext;
|
||||
}
|
||||
|
||||
public NanoHTTPD.Response route(NanoHTTPD.IHTTPSession session) {
|
||||
Log.d("SERVER", "URI: " + session.getUri());
|
||||
String uri = session.getUri();
|
||||
if (uri.equals("/")) return getStatic("/go.html");
|
||||
if (uri.contains("/scripts/") ||
|
||||
uri.contains("/images/") ||
|
||||
uri.contains("/css/") ||
|
||||
uri.contains("/fonts/") ||
|
||||
uri.contains("/favicon.ico")
|
||||
) return getStatic(uri);
|
||||
if (isApiUrl(uri)){
|
||||
return routeApi(session);
|
||||
}
|
||||
else {
|
||||
return routeContent(session);
|
||||
}
|
||||
}
|
||||
|
||||
private NanoHTTPD.Response routeApi(NanoHTTPD.IHTTPSession session) {
|
||||
String uri = session.getUri();
|
||||
ApiEndpoint endpoint = endpoints.get(uri);
|
||||
if (endpoint != null){
|
||||
return endpoint.apiCall.call(session);
|
||||
}
|
||||
return ErrorResponses.response404;
|
||||
}
|
||||
|
||||
private boolean isApiUrl(String uri) {
|
||||
for (String endpoint : endpoints.keySet()){
|
||||
if (endpoint.equals(uri)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private NanoHTTPD.Response routeContent(NanoHTTPD.IHTTPSession session) {
|
||||
String url = session.getUri();
|
||||
//add index page
|
||||
String responseText = getHtmlPage(url);
|
||||
if (responseText != null) {
|
||||
return newFixedLengthResponse(responseText);
|
||||
} else {
|
||||
return ErrorResponses.response404;
|
||||
}
|
||||
}
|
||||
|
||||
public NanoHTTPD.Response getStatic(String uri) {
|
||||
InputStream is = null;
|
||||
String mimeType = parseMimeType(uri);
|
||||
if (androidContext != null) {
|
||||
try {
|
||||
is = androidContext.getAssets().open(FOLDER_NAME + uri);
|
||||
if (is.available() == 0) {
|
||||
return ErrorResponses.response404;
|
||||
}
|
||||
return newFixedLengthResponse(
|
||||
NanoHTTPD.Response.Status.OK,
|
||||
mimeType,
|
||||
is,
|
||||
is.available());
|
||||
} catch (IOException e) {
|
||||
return ErrorResponses.response404;
|
||||
}
|
||||
}
|
||||
return ErrorResponses.response500;
|
||||
}
|
||||
|
||||
private String parseMimeType(String url) {
|
||||
String type = null;
|
||||
if (url.endsWith(".js")) return "text/javascript";
|
||||
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
|
||||
if (extension != null) {
|
||||
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
private String readHTMLFromFile(String filename) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
try {
|
||||
InputStream is = androidContext.getAssets().open(FOLDER_NAME + filename);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is,
|
||||
Charset.forName("UTF-8")));
|
||||
String str;
|
||||
while ((str = br.readLine()) != null) {
|
||||
sb.append(str);
|
||||
}
|
||||
br.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public String getHtmlPage(String name) {
|
||||
String responseText = "";
|
||||
if (androidContext != null) {
|
||||
responseText = readHTMLFromFile(name);
|
||||
}
|
||||
if (responseText == null) {
|
||||
return null;
|
||||
}
|
||||
return responseText;
|
||||
}
|
||||
|
||||
private String getFavoritesJson() {
|
||||
List<FavouritePoint> points = androidContext.getFavorites().getFavouritePoints();
|
||||
StringBuilder text = new StringBuilder();
|
||||
for (FavouritePoint p : points) {
|
||||
String json = jsonFromFavorite(p);
|
||||
text.append(json);
|
||||
text.append(",");
|
||||
}
|
||||
return "[" + text.substring(0,text.length()-1) + "]";
|
||||
}
|
||||
|
||||
private String jsonFromFavorite(FavouritePoint favouritePoint) {
|
||||
return gson.toJson(favouritePoint);
|
||||
}
|
||||
|
||||
static class ErrorResponses {
|
||||
static NanoHTTPD.Response response404 =
|
||||
newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND,
|
||||
NanoHTTPD.MIME_PLAINTEXT, "404 Not Found");
|
||||
|
||||
static NanoHTTPD.Response response500 =
|
||||
newFixedLengthResponse(NanoHTTPD.Response.Status.INTERNAL_ERROR,
|
||||
NanoHTTPD.MIME_PLAINTEXT, "500 Internal Server Error");
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
package net.osmand.plus.server;
|
||||
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
|
||||
public class OsmAndHttpServer extends NanoHTTPD {
|
||||
public static int PORT = 24990;
|
||||
public static String HOSTNAME = "0.0.0.0";
|
||||
|
||||
private ServerSessionHandler sessionHandler = new ServerSessionHandler();
|
||||
private OsmandApplication androidApplication;
|
||||
|
||||
public OsmandApplication getAndroidApplication() {
|
||||
return androidApplication;
|
||||
}
|
||||
|
||||
public void setAndroidApplication(OsmandApplication androidApplication) {
|
||||
this.androidApplication = androidApplication;
|
||||
sessionHandler.setAndroidApplication(androidApplication);
|
||||
}
|
||||
|
||||
public OsmAndHttpServer() throws IOException {
|
||||
super(HOSTNAME,PORT);
|
||||
start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response serve(IHTTPSession session) {
|
||||
return sessionHandler.handle(session);
|
||||
}
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
package net.osmand.plus.server;
|
||||
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD;
|
||||
|
||||
public class ServerSessionHandler {
|
||||
private OsmandApplication androidApplication;
|
||||
|
||||
private ApiRouter router = new ApiRouter();
|
||||
|
||||
public OsmandApplication getAndroidApplication() {
|
||||
return androidApplication;
|
||||
}
|
||||
|
||||
public void setAndroidApplication(OsmandApplication androidApplication) {
|
||||
this.androidApplication = androidApplication;
|
||||
router.setAndroidContext(androidApplication);
|
||||
}
|
||||
|
||||
public NanoHTTPD.Response handle(NanoHTTPD.IHTTPSession session) {
|
||||
return router.route(session);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue