Added Documentation folder
76
Documentation/css/normalize.css
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}
|
||||
body{margin:0;}
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
menu,
|
||||
nav,
|
||||
section,
|
||||
summary{display:block;}
|
||||
audio,
|
||||
canvas,
|
||||
progress,
|
||||
video{display:inline-block;vertical-align:baseline;}
|
||||
audio:not([controls]){display:none;height:0;}
|
||||
[hidden],
|
||||
template{display:none;}
|
||||
a{background-color:transparent;}
|
||||
a:active,
|
||||
a:hover{outline:0;}
|
||||
abbr[title]{border-bottom:1px dotted;}
|
||||
b,
|
||||
strong{font-weight:bold;}
|
||||
dfn{font-style:italic;}
|
||||
h1{font-size:2em;margin:0.67em 0;}
|
||||
mark{background:#ff0;color:#000;}
|
||||
small{font-size:80%;}
|
||||
sub,
|
||||
sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}
|
||||
sup{top:-0.5em;}
|
||||
sub{bottom:-0.25em;}
|
||||
img{border:0;}
|
||||
svg:not(:root){overflow:hidden;}
|
||||
figure{margin:1em 40px;}
|
||||
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}
|
||||
pre{overflow:auto;}
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp{font-family:monospace, monospace;font-size:1em;}
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea{color:inherit;font:inherit;margin:0;}
|
||||
button{overflow:visible;}
|
||||
button,
|
||||
select{text-transform:none;}
|
||||
button,
|
||||
html input[type="button"],
|
||||
input[type="reset"],
|
||||
input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
|
||||
button[disabled],
|
||||
html input[disabled]{cursor:default;}
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner{border:0;padding:0;}
|
||||
input{line-height:normal;}
|
||||
input[type="checkbox"],
|
||||
input[type="radio"]{box-sizing:border-box;padding:0;}
|
||||
input[type="number"]::-webkit-inner-spin-button,
|
||||
input[type="number"]::-webkit-outer-spin-button{height:auto;}
|
||||
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}
|
||||
input[type="search"]::-webkit-search-cancel-button,
|
||||
input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
|
||||
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}
|
||||
legend{border:0;padding:0;}
|
||||
textarea{overflow:auto;}
|
||||
optgroup{font-weight:bold;}
|
||||
table{border-collapse:collapse;border-spacing:0;}
|
||||
td,
|
||||
th{padding:0;}
|
70
Documentation/css/prettify.css
Normal file
@ -0,0 +1,70 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright (C) 2015 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* Pretty printing styles. Used with prettify.js. */
|
||||
|
||||
|
||||
/* SPAN elements with the classes below are added by prettyprint. */
|
||||
.pln { color: #000 } /* plain text */
|
||||
|
||||
@media screen {
|
||||
.str { color: #080 } /* string content */
|
||||
.kwd { color: #008 } /* a keyword */
|
||||
.com { color: #800 } /* a comment */
|
||||
.typ { color: #606 } /* a type name */
|
||||
.lit { color: #066 } /* a literal value */
|
||||
/* punctuation, lisp open bracket, lisp close bracket */
|
||||
.pun, .opn, .clo { color: #660 }
|
||||
.tag { color: #008 } /* a markup tag name */
|
||||
.atn { color: #606 } /* a markup attribute name */
|
||||
.atv { color: #080 } /* a markup attribute value */
|
||||
.dec, .var { color: #606 } /* a declaration; a variable name */
|
||||
.fun { color: red } /* a function name */
|
||||
}
|
||||
|
||||
/* Use higher contrast and text-weight for printable form. */
|
||||
@media print, projection {
|
||||
.str { color: #060 }
|
||||
.kwd { color: #006; font-weight: bold }
|
||||
.com { color: #600; font-style: italic }
|
||||
.typ { color: #404; font-weight: bold }
|
||||
.lit { color: #044 }
|
||||
.pun, .opn, .clo { color: #440 }
|
||||
.tag { color: #006; font-weight: bold }
|
||||
.atn { color: #404 }
|
||||
.atv { color: #060 }
|
||||
}
|
||||
|
||||
/* Put a border around prettyprinted code snippets. */
|
||||
pre.prettyprint { padding: 20px; border: 0!important; background: #f5f5f5!important;margin-bottom:14px; }
|
||||
|
||||
/* Specify class=linenums on a pre to get line numbering */
|
||||
ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
|
||||
li.L0,
|
||||
li.L1,
|
||||
li.L2,
|
||||
li.L3,
|
||||
li.L5,
|
||||
li.L6,
|
||||
li.L7,
|
||||
li.L8 { list-style-type: decimal !important }
|
||||
/* Alternate shading for lines */
|
||||
li.L1,
|
||||
li.L3,
|
||||
li.L5,
|
||||
li.L7,
|
||||
li.L9 { background: #f5f5f5!important }
|
540
Documentation/css/style.css
Normal file
@ -0,0 +1,540 @@
|
||||
body {
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
background:#eaedf2;
|
||||
color:#666;
|
||||
font-size:14px;
|
||||
}
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
p{
|
||||
text-align: justify;
|
||||
text-justify: inter-word;
|
||||
}
|
||||
|
||||
a{
|
||||
-webkit-transition: all .3s ease;
|
||||
-moz-transition: all .3s ease;
|
||||
-o-transition: all .3s ease;
|
||||
transition: all .3s ease;
|
||||
text-decoration:none;
|
||||
}
|
||||
.content-info a{
|
||||
color:#22A7F0
|
||||
}
|
||||
.content-info a:hover{
|
||||
color:#000;
|
||||
}
|
||||
a img {
|
||||
border:0;
|
||||
}
|
||||
|
||||
section img{
|
||||
display:block;
|
||||
max-width:100%;
|
||||
height:auto;
|
||||
margin:25px 0 25px 0;
|
||||
border: 1px solid #000;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
|
||||
display: block;
|
||||
}
|
||||
section{
|
||||
position:relative;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6{
|
||||
font-weight:400;
|
||||
}
|
||||
h1{
|
||||
font-size:36px;
|
||||
margin:0 0 30px 0;
|
||||
}
|
||||
h2{
|
||||
font-size:30px;
|
||||
margin:0 0 30px 0;
|
||||
}
|
||||
h3{
|
||||
font-size:24px;
|
||||
margin:0 0 30px 0;
|
||||
}
|
||||
h4{
|
||||
font-size:20px;
|
||||
margin:0 0 20px 0;
|
||||
}
|
||||
h5{
|
||||
font-size:18px;
|
||||
margin:0 0 15px 0;
|
||||
}
|
||||
h6{
|
||||
font-size:16px;
|
||||
margin:0 0 10px 0;
|
||||
}
|
||||
|
||||
.container {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
width: 1200px;
|
||||
}
|
||||
.container:before, .container:after, .clearfix:before, .row:before, .clearfix:after, .row:after {
|
||||
display: table;
|
||||
content: " ";
|
||||
}
|
||||
.container:after, .clearfix:after, .row:after {
|
||||
clear: both;
|
||||
}
|
||||
.row {
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 {
|
||||
float: left;
|
||||
}
|
||||
.col-xs-1,
|
||||
.col-sm-1,
|
||||
.col-md-1,
|
||||
.col-lg-1,
|
||||
.col-xs-2,
|
||||
.col-sm-2,
|
||||
.col-md-2,
|
||||
.col-lg-2,
|
||||
.col-xs-3,
|
||||
.col-sm-3,
|
||||
.col-md-3,
|
||||
.col-lg-3,
|
||||
.col-xs-4,
|
||||
.col-sm-4,
|
||||
.col-md-4,
|
||||
.col-lg-4,
|
||||
.col-xs-5,
|
||||
.col-sm-5,
|
||||
.col-md-5,
|
||||
.col-lg-5,
|
||||
.col-xs-6,
|
||||
.col-sm-6,
|
||||
.col-md-6,
|
||||
.col-lg-6,
|
||||
.col-xs-7,
|
||||
.col-sm-7,
|
||||
.col-md-7,
|
||||
.col-lg-7,
|
||||
.col-xs-8,
|
||||
.col-sm-8,
|
||||
.col-md-8,
|
||||
.col-lg-8,
|
||||
.col-xs-9,
|
||||
.col-sm-9,
|
||||
.col-md-9,
|
||||
.col-lg-9,
|
||||
.col-xs-10,
|
||||
.col-sm-10,
|
||||
.col-md-10,
|
||||
.col-lg-10,
|
||||
.col-xs-11,
|
||||
.col-sm-11,
|
||||
.col-md-11,
|
||||
.col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
|
||||
position: relative;
|
||||
min-height: 1px;
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
.col-lg-12 {
|
||||
width: 100%;
|
||||
}
|
||||
.col-lg-11 {
|
||||
width: 91.66666667%;
|
||||
}
|
||||
.col-lg-10 {
|
||||
width: 83.33333333%;
|
||||
}
|
||||
.col-lg-9 {
|
||||
width: 75%;
|
||||
}
|
||||
.col-lg-8 {
|
||||
width: 66.66666667%;
|
||||
}
|
||||
.col-lg-7 {
|
||||
width: 58.33333333%;
|
||||
}
|
||||
.col-lg-6 {
|
||||
width: 50%;
|
||||
}
|
||||
.col-lg-5 {
|
||||
width: 41.66666667%;
|
||||
}
|
||||
.col-lg-4 {
|
||||
width: 33.33333333%;
|
||||
}
|
||||
.col-lg-3 {
|
||||
width: 25%;
|
||||
}
|
||||
.col-lg-2 {
|
||||
width: 16.66666667%;
|
||||
}
|
||||
.col-lg-1 {
|
||||
width: 8.33333333%;
|
||||
}
|
||||
.center{
|
||||
text-align:center;
|
||||
}
|
||||
.left{
|
||||
text-align:left;
|
||||
}
|
||||
.right{
|
||||
text-align:right;
|
||||
}
|
||||
.btn{
|
||||
display:inline-block;
|
||||
width:160px;
|
||||
height:40px;
|
||||
line-height:38px;
|
||||
background:#3498db;
|
||||
color:#fff;
|
||||
font-weight:400;
|
||||
text-align:center;
|
||||
text-transform:uppercase;
|
||||
font-size:14px;
|
||||
border-bottom:2px solid #2a8bcc;
|
||||
}
|
||||
.btn:hover{
|
||||
background:#2a8bcc
|
||||
}
|
||||
header{
|
||||
margin:0 0 50px 0;
|
||||
padding:20px 0;
|
||||
background:#22A7F0
|
||||
}
|
||||
.slogan{
|
||||
color:#fff;
|
||||
font-weight:300;
|
||||
font-size:20px;
|
||||
line-height:34px;
|
||||
}
|
||||
#logo img{
|
||||
display:block;
|
||||
margin:0 auto;
|
||||
height:70px;
|
||||
}
|
||||
|
||||
section .container{
|
||||
background:#fff;
|
||||
}
|
||||
|
||||
.content-wrap{
|
||||
padding:50px 0
|
||||
}
|
||||
|
||||
aside{
|
||||
color:#fff;
|
||||
float:left;
|
||||
padding-left:15px;
|
||||
width:285px;
|
||||
}
|
||||
.fixed{
|
||||
position:fixed;
|
||||
top:15px;
|
||||
}
|
||||
aside h4{
|
||||
font-size:20px;
|
||||
font-weight:400;
|
||||
margin:0 0 30px 0;
|
||||
}
|
||||
|
||||
.menu-box{
|
||||
padding:20px;
|
||||
background:#34495e;
|
||||
}
|
||||
.menu-box ul{
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
.menu-box li{
|
||||
display:block;
|
||||
}
|
||||
.menu-box li a{
|
||||
display:block;
|
||||
padding:15px 20px;
|
||||
margin-left: -20px;
|
||||
margin-right: -20px;
|
||||
color:#fff;
|
||||
border-bottom:1px solid #314559;
|
||||
}
|
||||
.menu-box li a:hover, .menu-box li a.current{
|
||||
background:#2c3e50;
|
||||
}
|
||||
.menu-box li:last-child a{
|
||||
border-bottom:0;
|
||||
}
|
||||
|
||||
.content-info{
|
||||
padding-right:15px;
|
||||
padding-left:315px;
|
||||
}
|
||||
.section-txt{
|
||||
padding-bottom:15px;
|
||||
margin-bottom:30px;
|
||||
border-bottom:1px solid #dcdcdc;
|
||||
}
|
||||
.section-txt:last-child{
|
||||
margin-bottom:0;
|
||||
padding-bottom:0;
|
||||
border-bottom:0;
|
||||
}
|
||||
.content-info h3{
|
||||
font-size:24px;
|
||||
font-weight:400;
|
||||
color:#444;
|
||||
margin:0 0 30px 0;
|
||||
}
|
||||
.content-info p{
|
||||
color:#666;
|
||||
line-height:24px;
|
||||
font-size:16px;
|
||||
font-weight:300;
|
||||
}
|
||||
.content-info ul{
|
||||
margin:0 0 14px 0;
|
||||
}
|
||||
.content-info ul li{
|
||||
line-height:24px;
|
||||
font-size:16px;
|
||||
font-weight:300;
|
||||
}
|
||||
|
||||
.content-info iframe {
|
||||
width: 100%!important;
|
||||
height: 350px;
|
||||
border: 0!important;
|
||||
}
|
||||
|
||||
.footer-area{
|
||||
margin-top:50px;
|
||||
padding:60px 0;
|
||||
background:#222;
|
||||
font-size:16px;
|
||||
line-height:24px;
|
||||
color:#fff;
|
||||
font-weight:300;
|
||||
}
|
||||
|
||||
.footer-area a{
|
||||
color:#999;
|
||||
}
|
||||
.footer-area a:hover{
|
||||
color:#eee
|
||||
}
|
||||
footer{
|
||||
background:#111;
|
||||
padding:20px 0;
|
||||
font-weight:300;
|
||||
font-size:12px;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1200px) {
|
||||
.container{
|
||||
width:970px;
|
||||
}
|
||||
.hidden-md{
|
||||
display:none;
|
||||
}
|
||||
.col-md-12 {
|
||||
width: 100%;
|
||||
}
|
||||
.col-md-11 {
|
||||
width: 91.66666667%;
|
||||
}
|
||||
.col-md-10 {
|
||||
width: 83.33333333%;
|
||||
}
|
||||
.col-md-9 {
|
||||
width: 75%;
|
||||
}
|
||||
.col-md-8 {
|
||||
width: 66.66666667%;
|
||||
}
|
||||
.col-md-7 {
|
||||
width: 58.33333333%;
|
||||
}
|
||||
.col-md-6 {
|
||||
width: 50%;
|
||||
}
|
||||
.col-md-5 {
|
||||
width: 41.66666667%;
|
||||
}
|
||||
.col-md-4 {
|
||||
width: 33.33333333%;
|
||||
}
|
||||
.col-md-3 {
|
||||
width: 25%;
|
||||
}
|
||||
.col-md-2 {
|
||||
width: 16.66666667%;
|
||||
}
|
||||
.col-md-1 {
|
||||
width: 8.33333333%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@media only screen and (max-width: 992px){
|
||||
.container{
|
||||
width:750px;
|
||||
}
|
||||
.hidden-sm{
|
||||
display:none;
|
||||
}
|
||||
.col-sm-12 {
|
||||
width: 100%;
|
||||
}
|
||||
.col-sm-11 {
|
||||
width: 91.66666667%;
|
||||
}
|
||||
.col-sm-10 {
|
||||
width: 83.33333333%;
|
||||
}
|
||||
.col-sm-9 {
|
||||
width: 75%;
|
||||
}
|
||||
.col-sm-8 {
|
||||
width: 66.66666667%;
|
||||
}
|
||||
.col-sm-7 {
|
||||
width: 58.33333333%;
|
||||
}
|
||||
.col-sm-6 {
|
||||
width: 50%;
|
||||
}
|
||||
.col-sm-5 {
|
||||
width: 41.66666667%;
|
||||
}
|
||||
.col-sm-4 {
|
||||
width: 33.33333333%;
|
||||
}
|
||||
.col-sm-3 {
|
||||
width: 25%;
|
||||
}
|
||||
.col-sm-2 {
|
||||
width: 16.66666667%;
|
||||
}
|
||||
.col-sm-1 {
|
||||
width: 8.33333333%;
|
||||
}
|
||||
.slogan {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px){
|
||||
.container{
|
||||
width:100%;
|
||||
}
|
||||
.hidden-xs{
|
||||
display:none;
|
||||
}
|
||||
.col-xs-12 {
|
||||
width: 100%;
|
||||
}
|
||||
.col-xs-11 {
|
||||
width: 91.66666667%;
|
||||
}
|
||||
.col-xs-10 {
|
||||
width: 83.33333333%;
|
||||
}
|
||||
.col-xs-9 {
|
||||
width: 75%;
|
||||
}
|
||||
.col-xs-8 {
|
||||
width: 66.66666667%;
|
||||
}
|
||||
.col-xs-7 {
|
||||
width: 58.33333333%;
|
||||
}
|
||||
.col-xs-6 {
|
||||
width: 50%;
|
||||
}
|
||||
.col-xs-5 {
|
||||
width: 41.66666667%;
|
||||
}
|
||||
.col-xs-4 {
|
||||
width: 33.33333333%;
|
||||
}
|
||||
.col-xs-3 {
|
||||
width: 25%;
|
||||
}
|
||||
.col-xs-2 {
|
||||
width: 16.66666667%;
|
||||
}
|
||||
.col-xs-1 {
|
||||
width: 8.33333333%;
|
||||
}
|
||||
header{
|
||||
margin-bottom:30px;
|
||||
}
|
||||
.content-wrap {
|
||||
padding: 30px 0;
|
||||
}
|
||||
.slogan{
|
||||
text-align:center;
|
||||
line-height:22px;
|
||||
margin-bottom:15px;
|
||||
}
|
||||
#logo {
|
||||
text-align:center;
|
||||
margin-bottom:15px;
|
||||
}
|
||||
.btn{
|
||||
display:block;
|
||||
margin:0 auto;
|
||||
}
|
||||
aside{
|
||||
width:100%;
|
||||
float:none;
|
||||
padding:0 15px;
|
||||
margin-bottom:30px;
|
||||
}
|
||||
.content-info {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
.content-info p, .content-info ul li{
|
||||
font-size:14px;
|
||||
line-height:22px;
|
||||
}
|
||||
.content-info h3 {
|
||||
font-size: 20px;
|
||||
}
|
||||
h1{
|
||||
font-size:32px;
|
||||
}
|
||||
h2{
|
||||
font-size:26px;
|
||||
}
|
||||
h3{
|
||||
font-size:20px;
|
||||
}
|
||||
h4{
|
||||
font-size:18px;
|
||||
}
|
||||
h5{
|
||||
font-size:16px;
|
||||
}
|
||||
h6{
|
||||
font-size:14px;
|
||||
}
|
||||
.footer-area {
|
||||
margin-top: 30px;
|
||||
padding: 50px 0;
|
||||
font-size:14px;
|
||||
}
|
||||
}
|
BIN
Documentation/images/admobbanner1.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
Documentation/images/admobinterstitial1.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Documentation/images/admobinterstitial2.png
Normal file
After Width: | Height: | Size: 228 KiB |
BIN
Documentation/images/apkexpansionfiles1.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
Documentation/images/apkinfo1.png
Normal file
After Width: | Height: | Size: 122 KiB |
BIN
Documentation/images/apppermissions1.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
Documentation/images/apppermissions2.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
Documentation/images/apppermissions3.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
Documentation/images/apppermissions4.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
Documentation/images/apppermissions5.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
Documentation/images/batterystate1.png
Normal file
After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
BIN
Documentation/images/signalstrength1.png
Normal file
After Width: | Height: | Size: 32 KiB |
380
Documentation/index.html
Normal file
@ -0,0 +1,380 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||
<title>VDoc - Responsive Documentation HTML Template</title>
|
||||
<meta name="description" content="Free responsive HTML template for your documentation">
|
||||
<meta name="author" content="valthemes.com">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" type="text/css" href="css/style.css">
|
||||
<link rel="stylesheet" type="text/css" href="css/prettify.css">
|
||||
<link rel="stylesheet" type="text/css" href="css/normalize.css" >
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-xs-12 left">
|
||||
<div id="logo">
|
||||
<img src="images/logo.svg" alt="logo">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8 col-md-7 col-xs-12">
|
||||
<div class="slogan">
|
||||
QtAndroidTools is a library that allows to simplify access to some native Android features from QML.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<section class="content">
|
||||
<div class="container">
|
||||
<div class="content-wrap">
|
||||
<div class="row">
|
||||
<aside>
|
||||
<div class="menu-box">
|
||||
<h4>Navigation</h4>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="#HowToIntegrate" class="current">How To Integrate</a></li>
|
||||
<li><a href="#ApkExpansionFiles">ApkExpansionFiles</a></li>
|
||||
<li><a href="#AppPermissions">AppPermissions</a></li>
|
||||
<li><a href="#AdMobBanner">AdMobBanner</a></li>
|
||||
<li><a href="#AdMobInterstitial">AdMobInterstitial</a></li>
|
||||
<li><a href="#ApkInfo">ApkInfo</a></li>
|
||||
<li><a href="#BatteryState">BatteryState</a></li>
|
||||
<li><a href="#SignalStrength">SignalStrength</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</aside>
|
||||
<div class="content-info">
|
||||
<div class="section-txt" id="HowToIntegrate">
|
||||
<h3>How To Integrate</h3>
|
||||
<ul>
|
||||
<li>Place QtAndroidTools lib to your project dir and include it in .pro file<br />
|
||||
<pre class="prettyprint">include(QtAndroidTools/QtAndroidTools.pri)</pre>
|
||||
</li>
|
||||
<li>Assign in you .pro file varialble ANDROID_PACKAGE_SOURCE_DIR before include QtAndroidTools/QtAndroidTools.pri, for ex.<br />
|
||||
<pre class="prettyprint">ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android</pre>
|
||||
</li>
|
||||
<li>In the <i>main()</i> body insert the call for initialize the library<br />
|
||||
<pre class="prettyprint">QtAndroidTools::InitializeQmlTools();</pre>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<p><b>IMPORTANT NOTE:</b> The library .pri check if java sources are already present into android/src folder, if no copy the library files. In case you are updating the library remember to remove these java files to be sure having always the new java versions code.</p>
|
||||
</div>
|
||||
<div class="section-txt" id="ApkExpansionFiles">
|
||||
<h3>ApkExpansionFiles</h3>
|
||||
<p>Help in manage the apk expansion files download</p>
|
||||
<p>Apk upload size limit is currently 100MB but in case your app require more data the Android Console allow to "attach" two files connected to your app. Official documentation about this feature is <a href="https://developer.android.com/google/play/expansion-files" target="_blank">here</a>, is <u>strongly suggested</u> to read it for allow a better comprension about how to use this tool. Usually the expansion files are downloaded by the Google Play together with the main app but in case the user delete it or some other problem occurs and the file will not be available anymore the app have to download again usually at startup. In this phase is required the java code of the two libraries explained in the documentation, the <i>Google Play Licensing Library</i> and the <i>Google Play APK Expansion Library</i>. However, at the time this post was written, there are a couple of problems. The official documentation suggest to get these libraries through the Android SDK Manager and then create two modules using the libraries just obtained. The problem here is the code of there libraries is very very old and use some deprecated dependencies making difficult the compilation using Qt Creator. It exist an updated version of these two libraries always developed by Google <a href="https://github.com/google/play-apk-expansion" target="_blank">here</a> and <a href="https://github.com/google/play-licensing" target="_blank">here</a>. However also these two latest libraries are not supported by a long time and doesn't work very well in the latest versions of Android, from 8 and above. For this reasons this tool implement the two updated version community supported <a href="https://github.com/bolein/better-apk-expansion" target="_blank">better-apk-expansion</a> and <a href="https://github.com/bolein/better-licensing" target="_blank">better-licensing</a> that make the same job but are updated enough for support the new notify feature of Android 8. I only made a small modify for support the Qt multi language engine. In the version inside the tool the java library ask to the C++ level for the info text to use in the Android notify label allowing the Qt language selector to select the correct language string.</p>
|
||||
<p>Remember for have the download library working as expected you have to set the following permission in your app:</p>
|
||||
<pre class="prettyprint"><manifest ...>
|
||||
<!-- Required to access Google Play Licensing -->
|
||||
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
|
||||
|
||||
<!-- Required to download files from Google Play -->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
||||
<!-- Required to keep CPU alive while downloading files
|
||||
(NOT to keep screen awake) -->
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
|
||||
<!-- Required to poll the state of the network connection
|
||||
and respond to changes -->
|
||||
<uses-permission
|
||||
android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
|
||||
<!-- Required to check whether Wi-Fi is enabled -->
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||
|
||||
<!-- Required to read and write the expansion files on shared storage -->
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
...
|
||||
</manifest></pre>
|
||||
<p>Also note, in case your Android app is target for version 23 or above you have to explicitly ask for the <i>WRITE_EXTERNAL_STORAGE</i> permission cause this is one of the "dangerous" permission. You can use the other <a href="#AppPermissions">AppPermissions</a> tool available in this library. Also you have to correctly the various part of the library by addicting these lines inside your <i>AndroidManifest.xml</i> file:</p>
|
||||
<pre class="prettyprint"><application>
|
||||
.....
|
||||
<service android:name="com.google.android.vending.expansion.downloader.impl.DownloaderService" android:enabled="true"/>
|
||||
<receiver android:name="com.google.android.vending.expansion.downloader.impl.DownloaderService$AlarmReceiver" android:enabled="true"/>
|
||||
</application></pre>
|
||||
<p><u>Please note from now it's assumed you have read the documentation</u> and already know the type and the format of expansion files is possible to upload and how the licensing engine work. First initialization is the following:</p>
|
||||
<pre class="prettyprint">QtAndroidApkExpansionFiles.base64PublicKey = "app_public_key_here";
|
||||
QtAndroidApkExpansionFiles.salt = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
|
||||
QtAndroidApkExpansionFiles.main.version = 1;
|
||||
QtAndroidApkExpansionFiles.main.size = 123456789;
|
||||
QtAndroidApkExpansionFiles.patch.version = 1;
|
||||
QtAndroidApkExpansionFiles.patch.size = 123456789;</pre>
|
||||
<p>The <i>base64PublicKey</i> can be found in the Android Console app info and the <i>salt</i> is a random array of 20 bytes you have to generate by yourself. This is required for encrypt your data stored of the server. <i>Version</i> and <i>size</i> is required for identify your main and patch file. You can upload only the main file (and then you have to set only the <i>main</i> fields), these info are used to check if the current expansion files eventually already present in the device correspond in term of version number and file size.</p>
|
||||
<p>Once configured the basic info you can check the operation to make by calling the following function:</p>
|
||||
<pre class="prettyprint">QtAndroidApkExpansionFiles.startDownloadFiles()</pre>
|
||||
<p>If this function will return:</p>
|
||||
<pre class="prettyprint">QtAndroidApkExpansionFiles.APKEF_NO_DOWNLOAD_REQUIRED</pre>
|
||||
<p>mean your expansion file are already available in the device than there is nothing to do, you can proceed with the app execution. In case of return:</p>
|
||||
<pre class="prettyprint">QtAndroidApkExpansionFiles.APKEF_DOWNLOAD_STARTED
|
||||
QtAndroidApkExpansionFiles.APKEF_LVL_CHECK_REQUIRED</pre>
|
||||
<p>mean the apk expansion files download is started than you have to manage the download progress info. A download notify will be showed in the system status bar but your app should also show a progress control to inform the user regarding the operation in progress and that he have to wait. All other return codes are basically error conditions, check the library sources to see all the possible error types.</p>
|
||||
<img src="images/apkexpansionfiles1.png">
|
||||
<p>During download phase the tool generate two signals updating you about current status as follow:</p>
|
||||
<pre class="prettyprint">Connections {
|
||||
target: QtAndroidApkExpansionFiles
|
||||
onDownloadStateChanged: {
|
||||
switch(newState)
|
||||
{
|
||||
case QtAndroidApkExpansionFiles.STATE_COMPLETED:
|
||||
...
|
||||
break;
|
||||
case QtAndroidApkExpansionFiles.STATE_FAILED_UNLICENSED:
|
||||
case QtAndroidApkExpansionFiles.STATE_FAILED_FETCHING_URL:
|
||||
case QtAndroidApkExpansionFiles.STATE_FAILED_SDCARD_FULL:
|
||||
case QtAndroidApkExpansionFiles.STATE_FAILED_CANCELED:
|
||||
case QtAndroidApkExpansionFiles.STATE_FAILED:
|
||||
...
|
||||
break;
|
||||
}
|
||||
}
|
||||
onDownloadProgress: {
|
||||
var time = new Date(timeRemaining);
|
||||
downloadProgressBar.to = overallTotal;
|
||||
downloadProgressBar.value = overallProgress;
|
||||
downloadSizeLabel.text = (overallProgress / (1024*1024)).toFixed(2) + "MB/" + (overallTotal / (1024*1024)).toFixed(2) + "MB";
|
||||
downloadTimeLabel.text = "Time left: ";
|
||||
if(timeRemaining > 1000 * 60 * 60)
|
||||
downloadTimeLabel.text += ("0" + time.getHours()).substr(-2) + ":" + ("0" + time.getMinutes()).substr(-2);
|
||||
else
|
||||
downloadTimeLabel.text += ("0" + time.getMinutes()).substr(-2) + ":" + ("0" + time.getSeconds()).substr(-2);
|
||||
}
|
||||
}</pre>
|
||||
<p><i>onDownloadStateChanged</i> have the <i>newState</i> param informing about the download state changed. Check the sources for all the possible values. <i>onDownloadProgress</i> report info about the download process like current size and time left. Once download completed or if your expansion files are already available is possible to retrieve the full path of both files by use the following functions:</p>
|
||||
<pre class="prettyprint">QtAndroidApkExpansionFiles.mainFileName()
|
||||
QtAndroidApkExpansionFiles.patchFileName()</pre>
|
||||
<p>During download phase always is possible to abort, stop and restart download by using the functions below:</p>
|
||||
<pre class="prettyprint">QtAndroidApkExpansionFiles.abortDownload()
|
||||
QtAndroidApkExpansionFiles.pauseDownload()
|
||||
QtAndroidApkExpansionFiles.continueDownload()</pre>
|
||||
<p>A specific note regarding the function <i>getString()</i>. It return an info string connected with the current download status and some other info. It's used internally to pass correct language string to the java library but you can use also for the main interface as in demo example.</p>
|
||||
</div>
|
||||
<div class="section-txt" id="AppPermissions">
|
||||
<h3>AppPermissions</h3>
|
||||
<p>This tool allow to request Android app permissions in an easier way.</p>
|
||||
<p>From Android version 23 (Marshmallow) there are a list of special permission called "dangerous" because are directly connected to personal data of the user like calendar, contacts list and so on (official documentation <a href="https://developer.android.com/guide/topics/permissions/overview" target="_blank">here</a>). If your app is target for this version and above and your manifest file contains one of the dangerous permissions you have to explicitly get the user authorization for have such permission granted. In the demo app four of these dangerous permission will be requested as follow:</p>
|
||||
<img src="images/apppermissions1.png">
|
||||
<p>There are two functions for request permissions, one accept a list of permissions for allow a unique request for all and another can be used to ask for a single permission only. In this example the multiple request function will be used as follow:</p>
|
||||
<pre class="prettyprint">import QtAndroidTools 1.0
|
||||
...
|
||||
readonly property var permissionsNameList: ["android.permission.WRITE_EXTERNAL_STORAGE","android.permission.READ_CALENDAR","android.permission.READ_PHONE_STATE","android.permission.READ_CONTACTS"]
|
||||
...
|
||||
QtAndroidAppPermissions.requestPermissions(permissionsNameList)</pre>
|
||||
<p>The call of this function will have a result to show the system message informing the user the app require the specific permissions and ask for approval:</p>
|
||||
<img src="images/apppermissions2.png">
|
||||
<p>Once the user will finish to make the choice a signal will be generated with a list of struct as param as follow:</p>
|
||||
<pre class="prettyprint">Connections {
|
||||
target: QtAndroidAppPermissions
|
||||
onRequestPermissionsResults: {
|
||||
for(var i = 0; i < results.length; i++)
|
||||
{
|
||||
if(results[i].granted === true)
|
||||
{
|
||||
setPermissionGranted(results[i].name, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(QtAndroidAppPermissions.shouldShowRequestPermissionInfo(results[i].name) === true)
|
||||
{
|
||||
if(results[i].name === permissionsNameList[0])
|
||||
requestPermissionWRITE_EXTERNAL_STORAGE.open();
|
||||
else if(results[i].name === permissionsNameList[1])
|
||||
requestPermissionREAD_CALENDAR.open();
|
||||
else if(results[i].name === permissionsNameList[2])
|
||||
requestPermissionREAD_PHONE_STATE.open();
|
||||
else if(results[i].name === permissionsNameList[3])
|
||||
requestPermissionREAD_CONTACTS.open();
|
||||
}
|
||||
else
|
||||
{
|
||||
setPermissionGranted(results[i].name, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}</pre>
|
||||
<p>Each item in the list contain the param <i>name</i> containing the permission string name and the boolean field <i>granted</i> informing if the user allowed the app to get the permission or not. Please note, if you app will be target under version 23 this signal will be emitted immediately without show any messagebox and, obviously, with all the permission automatically granted. This for allow the code working in the same way independently by the Android target version selected. In case the user don't granted a permission this special call is used in the code:</p>
|
||||
<pre class="prettyprint">QtAndroidAppPermissions.shouldShowRequestPermissionInfo(...)</pre>
|
||||
<p>This function is quite particular and return true only in the case a first attempt to ask to permission has been denied. Basically it "suggest" to show a message to the user explaining why your app need the specific permission before retry to ask for permission again:</p>
|
||||
<img src="images/apppermissions3.png">
|
||||
<p>Once explained the reasons you can ask again for the same permission by using this time the single request function:</p>
|
||||
<pre class="prettyprint">QtAndroidAppPermissions.requestPermission(...)</pre>
|
||||
<p>Now please note a very important particular. Theoretically you can ask for the same permission infinitely, however from the second time you ask for the same permission the system message window will appear as following:</p>
|
||||
<img src="images/apppermissions4.png">
|
||||
<p>As you can note in this case there is a checkbox allowing the user to not be annoyed by your request anymore (<i>Don't ask again</i>). If the user will check it and will deny the request again any next request for the permission will be automatically denied without show any message than be careful in decide when ask for permission and, above all, to explain very clearly why you need that permission. After the second try the signal reporting the choice result will be generated again with the updated situation:</p>
|
||||
<img src="images/apppermissions5.png">
|
||||
</div>
|
||||
<div class="section-txt" id="AdMobBanner">
|
||||
<h3>AdMobBanner</h3>
|
||||
<p>This tool allow to show AdMob banner inside QML app.</p>
|
||||
<p>Official documentation about AdMob banner is <a href="https://developers.google.com/admob/android/banner" target="_blank">here</a>, please <u>read before continue</u> for understand the options exported by the tool. Remember for allow banner to be loaded your app need the following permissions:</p>
|
||||
<pre class="prettyprint">android.permission.INTERNET
|
||||
android.permission.ACCESS_NETWORK_STATE
|
||||
android.permission.WRITE_EXTERNAL_STORAGE</pre>
|
||||
<p>In add of this you have to install the AdMob required packages through Android SDK Manager. The packages you have to install are the following:</p>
|
||||
<ul>
|
||||
<li>Google Repository</li>
|
||||
<li>Google Play services</li>
|
||||
<li>Support Repository </li>
|
||||
</ul>
|
||||
<p>Than you have to add the following dependencies into your app gradle file:</p>
|
||||
<pre class="prettyprint">dependencies {
|
||||
....
|
||||
implementation 'com.google.android.gms:play-services-ads:16.+'
|
||||
}</pre>
|
||||
<p>Banner is showed inside the following QML item:</p>
|
||||
<pre class="prettyprint">import QtAndroidTools 1.0
|
||||
|
||||
QtAndroidAdMobBanner {
|
||||
id: banner
|
||||
unitId: "admob-banner-unit-id"
|
||||
type: QtAndroidAdMobBanner.TYPE_BANNER
|
||||
}</pre>
|
||||
<p>The <i>unitId</i> is the string generated when you create a new ad unit inside the AdMob site. It's used to identify the ad connected to your app. Using this id you can know how much you earn from this ad unit. The property <i>type</i> is the banner type you want to show. Possible values are:</p>
|
||||
<pre class="prettyprint">TYPE_BANNER
|
||||
TYPE_FULL_BANNER
|
||||
TYPE_LARGE_BANNER
|
||||
TYPE_MEDIUM_RECTANGLE
|
||||
TYPE_SMART_BANNER
|
||||
TYPE_WIDE_SKYSCRAPER</pre>
|
||||
<p>This item generate the following signals informing regarding the ad status:</p>
|
||||
<pre class="prettyprint">onLoadError
|
||||
onLoading
|
||||
onLoaded
|
||||
onClosed
|
||||
onClicked</pre>
|
||||
<p>The only signal passing a param is onLoadError, called in case of problem in loading ad. The param is <i>errorId</i> and possible values are:</p>
|
||||
<pre class="prettyprint">ERROR_INTERNAL
|
||||
ERROR_NETWORK
|
||||
ERROR_INVALID_REQUEST
|
||||
ERROR_NO_FILL</pre>
|
||||
<p>When you want to load and show the banner you have to call the <i>show()</i> function and for hide the <i>hide()</i> functions as follow (banner is the id name of the item in the example above):</p>
|
||||
<pre class="prettyprint">banner.show()
|
||||
banner.hide()</pre>
|
||||
<p>Please note the banner is a native android view over the QML window, that's mean will stay over anything painted into in and you can not place nothing over the banner.</p>
|
||||
<img src="images/admobbanner1.png">
|
||||
</div>
|
||||
<div class="section-txt" id="AdMobInterstitial">
|
||||
<h3>AdMobInterstitial</h3>
|
||||
<p>This tool allow to show AdMob interstitial inside QML app.</p>
|
||||
<p>Official documentation about AdMob interstitial is <a href="https://developers.google.com/admob/android/interstitial" target="_blank">here</a>, please <u>read before continue</u> for understand the options exported by the tool. Remember for allow interstitial to be loaded your app need the following permissions:</p>
|
||||
<pre class="prettyprint">android.permission.INTERNET
|
||||
android.permission.ACCESS_NETWORK_STATE
|
||||
android.permission.WRITE_EXTERNAL_STORAGE</pre>
|
||||
<p>In add of this you have to install the AdMob required packages through Android SDK Manager. The packages you have to install are the following:</p>
|
||||
<ul>
|
||||
<li>Google Repository</li>
|
||||
<li>Google Play services</li>
|
||||
<li>Support Repository </li>
|
||||
</ul>
|
||||
<p>Than you have to add the following dependencies into your app gradle file:</p>
|
||||
<pre class="prettyprint">dependencies {
|
||||
....
|
||||
implementation 'com.google.android.gms:play-services-ads:16.+'
|
||||
}</pre>
|
||||
<p>Interstitial ad show on full screen but you have to define the AdMob <i>unitId</i> using the item as follow:</p>
|
||||
<pre class="prettyprint">QtAndroidAdMobInterstitial {
|
||||
id: interstitial
|
||||
unitId: "admob-interstitial-unit-id"
|
||||
}</pre>
|
||||
<p>The <i>unitId</i> is the string generated when you create a new ad unit inside the AdMob site. It's used to identify the ad connected to your app. Using this id you can know how much you earn from this ad unit.</p>
|
||||
<p>This item generate the following signals informing regarding the ad status:</p>
|
||||
<pre class="prettyprint">onLoadError
|
||||
onLoading
|
||||
onLoaded
|
||||
onClosed
|
||||
onClicked</pre>
|
||||
<p>The only signal passing a param is onLoadError, called in case of problem in loading ad. The param is <i>errorId</i> and possible values are:</p>
|
||||
<pre class="prettyprint">ERROR_INTERNAL
|
||||
ERROR_NETWORK
|
||||
ERROR_INVALID_REQUEST
|
||||
ERROR_NO_FILL</pre>
|
||||
<p>Item have two function as follow:</p>
|
||||
<pre class="prettyprint">interstitial.load()
|
||||
interstitial.show()</pre>
|
||||
<p>The interstitial have to be loaded before show and since loading is not immediate you have to preload a bit in advance before the time to show. You can follow the loading status through the item signals. Once revecied the <i>onLoaded</i> signal this mean your new interstitial is ready to be showed.</p>
|
||||
<img src="images/admobinterstitial1.png">
|
||||
<p>This type of ad have a button allowing the user to close it than you just have to wait about the user choice. Relember also in this case the ad window will go over the QML window and you can not paint anithing on top of it.</p>
|
||||
<img src="images/admobinterstitial2.png">
|
||||
</div>
|
||||
<div class="section-txt" id="ApkInfo">
|
||||
<h3>ApkInfo</h3>
|
||||
<p>This tool will return info about the apk containing the executed app.</p>
|
||||
<p>The info regarding the app apk can be read directly from the <i>QtAndroidApkInfo</i> item as follow:</p>
|
||||
<pre class="prettyprint">import QtAndroidTools 1.0
|
||||
|
||||
QtAndroidApkInfo.firstInstallTime
|
||||
QtAndroidApkInfo.lastUpdateTime
|
||||
QtAndroidApkInfo.packageName
|
||||
QtAndroidApkInfo.versionCode
|
||||
QtAndroidApkInfo.versionName
|
||||
QtAndroidApkInfo.requestedPermissions</pre>
|
||||
<p>Explanation about fields above can be found in the official Android documentation <a href="https://developer.android.com/reference/android/content/pm/PackageInfo" target="_blank">here</a>. The tool export only the most important info but if you need to have some additional data you can easily add you code by using JNI interface as showed in the sources.</p>
|
||||
<img src="images/apkinfo1.png">
|
||||
</div>
|
||||
<div class="section-txt" id="BatteryState">
|
||||
<h3>BatteryState</h3>
|
||||
<p>This allow monitoring the battery level and state.</p>
|
||||
<p>This tool install a listener for monitor the battery level and on charge state. There is nothing difficult in use since there are only two properties as follow:</p>
|
||||
<pre class="prettyprint">import QtAndroidTools 1.0
|
||||
|
||||
QtAndroidBatteryState.level
|
||||
QtAndroidBatteryState.onCharge</pre>
|
||||
<p>Both properties support QML value binding than you can assign to a control for show always the updated value as in the demo example.</p>
|
||||
<img src="images/batterystate1.png">
|
||||
</div>
|
||||
<div class="section-txt" id="SignalStrength">
|
||||
<h3>SignalStrength</h3>
|
||||
<p>This tool allow to monitoring the strength of the phone signal.</p>
|
||||
<p>This tool install a listener for monitor the phone signal. Remember for allow the library to work in this case the app need to have the following permission:</p>
|
||||
<pre class="prettyprint">android.permission.READ_PHONE_STATE</pre>
|
||||
<p>There are two properties reporting the strength of the phone signal in row number and based to the conventional states as follow:</p>
|
||||
<pre class="prettyprint">import QtAndroidTools 1.0
|
||||
|
||||
QtAndroidSignalStrength.signalStrength
|
||||
QtAndroidSignalStrength.signalLevel</pre>
|
||||
<p>Signal level possible states are the following:</p>
|
||||
<ul>
|
||||
<li>LEVEL_GREAT</li>
|
||||
<li>LEVEL_GOOD</li>
|
||||
<li>LEVEL_MODERATE</li>
|
||||
<li>LEVEL_POOR</li>
|
||||
<li>LEVEL_NONE</li>
|
||||
</ul>
|
||||
<p><b>PLEASE NOTE:</b> the report the the signal strength change doesn't arrive immediately but, instead, require some seconds to be updated after the change. Don't worry if you don't see an immediate update, just wait a little.</p>
|
||||
<img src="images/signalstrength1.png">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="footer-area">
|
||||
<div class="container">
|
||||
<div class="row"> Copyright (c) 2018 Fabio Falsini</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-12 center">
|
||||
Developed by valthemes.com © 2016. All rights reserved.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<script src="js/jquery.min.js"></script>
|
||||
<script src="js/prettify.min.js"></script>
|
||||
<script src="js/scripts.min.js"></script>
|
||||
</body>
|
||||
</html>
|
4
Documentation/js/jquery.min.js
vendored
Normal file
28
Documentation/js/prettify.min.js
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
|
||||
(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
|
||||
[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
|
||||
f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
|
||||
(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
|
||||
{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
|
||||
t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
|
||||
"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
|
||||
l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
|
||||
q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
|
||||
q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
|
||||
"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
|
||||
a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
|
||||
for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
|
||||
m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
|
||||
a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
|
||||
j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
|
||||
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
|
||||
H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
|
||||
J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
|
||||
I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
|
||||
["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
|
||||
/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
|
||||
["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
|
||||
hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
|
||||
!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
|
||||
250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
|
||||
PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
|
1
Documentation/js/scripts.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
jQuery(function(){var t=$(".section-txt"),r=$("nav ul li"),n=jQuery(window).width();n>768?$(window).on("scroll",function(){var n=$(this).scrollTop();t.each(function(){var o=$(this).offset().top,e=o+$(this).outerHeight();n>=o&&e>=n&&(r.find("a").removeClass("current"),t.removeClass("current"),$(this).addClass("current"),r.find('a[href="#'+$(this).attr("id")+'"]').addClass("current"))})}):r.find("a").removeClass("current")}),$(window).scroll(function(){var t=$("aside"),r=$(window).scrollTop(),n=jQuery(window).width();n>768&&(r>130?t.addClass("fixed"):t.removeClass("fixed"))}),$(document).ready(function(){prettyPrint(),$(".menu-box a").click(function(){return $("html, body").animate({scrollTop:$($(this).attr("href")).offset().top+"px"},{duration:800}),!1})});
|