diff options
Diffstat (limited to 'build/tools')
51 files changed, 0 insertions, 18942 deletions
diff --git a/build/tools/Darwin/compact_dex_converter b/build/tools/Darwin/compact_dex_converter Binary files differdeleted file mode 100755 index 1c89476c..00000000 --- a/build/tools/Darwin/compact_dex_converter +++ /dev/null diff --git a/build/tools/Darwin/lib64/libart-dexlayout.dylib b/build/tools/Darwin/lib64/libart-dexlayout.dylib Binary files differdeleted file mode 100755 index 88e940fc..00000000 --- a/build/tools/Darwin/lib64/libart-dexlayout.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libart.dylib b/build/tools/Darwin/lib64/libart.dylib Binary files differdeleted file mode 100755 index 53f8712d..00000000 --- a/build/tools/Darwin/lib64/libart.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libbacktrace.dylib b/build/tools/Darwin/lib64/libbacktrace.dylib Binary files differdeleted file mode 100755 index c2e6d899..00000000 --- a/build/tools/Darwin/lib64/libbacktrace.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libbase.dylib b/build/tools/Darwin/lib64/libbase.dylib Binary files differdeleted file mode 100755 index 71130e5b..00000000 --- a/build/tools/Darwin/lib64/libbase.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libc++.dylib b/build/tools/Darwin/lib64/libc++.dylib Binary files differdeleted file mode 100755 index 739164b1..00000000 --- a/build/tools/Darwin/lib64/libc++.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libcutils.dylib b/build/tools/Darwin/lib64/libcutils.dylib Binary files differdeleted file mode 100755 index 73a6c073..00000000 --- a/build/tools/Darwin/lib64/libcutils.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libdexfile.dylib b/build/tools/Darwin/lib64/libdexfile.dylib Binary files differdeleted file mode 100755 index abb0fe28..00000000 --- a/build/tools/Darwin/lib64/libdexfile.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/liblog.dylib b/build/tools/Darwin/lib64/liblog.dylib Binary files differdeleted file mode 100755 index 66a34d8f..00000000 --- a/build/tools/Darwin/lib64/liblog.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/liblz4.dylib b/build/tools/Darwin/lib64/liblz4.dylib Binary files differdeleted file mode 100755 index 0a6bfc63..00000000 --- a/build/tools/Darwin/lib64/liblz4.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libmetricslogger.dylib b/build/tools/Darwin/lib64/libmetricslogger.dylib Binary files differdeleted file mode 100755 index 0b2ae0c6..00000000 --- a/build/tools/Darwin/lib64/libmetricslogger.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libnativebridge.dylib b/build/tools/Darwin/lib64/libnativebridge.dylib Binary files differdeleted file mode 100755 index f53c20e2..00000000 --- a/build/tools/Darwin/lib64/libnativebridge.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libnativehelper.dylib b/build/tools/Darwin/lib64/libnativehelper.dylib Binary files differdeleted file mode 100755 index 56a485a1..00000000 --- a/build/tools/Darwin/lib64/libnativehelper.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libnativeloader.dylib b/build/tools/Darwin/lib64/libnativeloader.dylib Binary files differdeleted file mode 100755 index cba9b63a..00000000 --- a/build/tools/Darwin/lib64/libnativeloader.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libsigchain.dylib b/build/tools/Darwin/lib64/libsigchain.dylib Binary files differdeleted file mode 100755 index 5f6ecbf9..00000000 --- a/build/tools/Darwin/lib64/libsigchain.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libz-host.dylib b/build/tools/Darwin/lib64/libz-host.dylib Binary files differdeleted file mode 100755 index 386865c5..00000000 --- a/build/tools/Darwin/lib64/libz-host.dylib +++ /dev/null diff --git a/build/tools/Darwin/lib64/libziparchive.dylib b/build/tools/Darwin/lib64/libziparchive.dylib Binary files differdeleted file mode 100755 index 394c1914..00000000 --- a/build/tools/Darwin/lib64/libziparchive.dylib +++ /dev/null diff --git a/build/tools/Darwin/vdexExtractor b/build/tools/Darwin/vdexExtractor Binary files differdeleted file mode 100755 index 34b2ee1a..00000000 --- a/build/tools/Darwin/vdexExtractor +++ /dev/null diff --git a/build/tools/Linux/compact_dex_converter b/build/tools/Linux/compact_dex_converter Binary files differdeleted file mode 100755 index 0a99e321..00000000 --- a/build/tools/Linux/compact_dex_converter +++ /dev/null diff --git a/build/tools/Linux/vdexExtractor b/build/tools/Linux/vdexExtractor Binary files differdeleted file mode 100755 index 39684111..00000000 --- a/build/tools/Linux/vdexExtractor +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/android-developer-docs.css b/build/tools/droiddoc/templates-lineage-sdk/assets/android-developer-docs.css deleted file mode 100644 index bc27b324..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/android-developer-docs.css +++ /dev/null @@ -1,2768 +0,0 @@ -/* file: android-developer-core.css - author: smain - date: september 2008 - info: core developer styles (developer.android.com) - Required by jdiff -*/ - - -/* RESET STYLES */ - -html,body,div,h1,h2,h3,h4,h5,h6,p,img, -dl,dt,dd,ol,ul,li,table,caption,tbody, -tfoot,thead,tr,th,td,form,fieldset, -embed,object,applet { - margin: 0; - padding: 0; - border: 0; -} - -/* BASICS */ - -html, body { - overflow:hidden; /* keeps scrollbar off IE */ - background-color:#fff; -} - -body { - font-family:arial,sans-serif; - color:#000; - font-size:13px; - color:#333; - background-image:url(images/bg_fade.jpg); - background-repeat:repeat-x; -} - -a, a code { - color:#006699; -} - -a:active, -a:active code { - color:#f00; -} - -a:visited, -a:visited code { - color:#006699; -} - -input, select, -textarea, option, label { - font-family:inherit; - font-size:inherit; - padding:0; - margin:0; - vertical-align:middle; -} - -option { - padding:0 4px; -} - -p, form { - padding:0; - margin:0 0 1em; -} - -code, pre { - color:#007000; - font-family:monospace; - line-height:1em; -} - -var { - color:#007000; - font-style:italic; -} - -pre { - border:1px solid #ccc; - background-color:#fafafa; - padding:10px; - margin:0 0 1em 1em; - overflow:auto; - line-height:inherit; /* fixes vertical scrolling in webkit */ -} - -h1,h2,h3,h4,h5 { - margin:1em 0; - padding:0; -} - -p,ul,ol,dl,dd,dt,li { - line-height:1.3em; -} - -ul,ol { - margin:0 0 .8em; - padding:0 0 0 2em; -} - -li { - padding:0 0 .5em; -} - -dl { - margin:0 0 1em 0; - padding:0; -} - -dt { - margin:0; - padding:0; -} - -dd { - margin:0 0 1em; - padding:0 0 0 2em; -} - -li p { - margin:.5em 0 0; -} - -dd p { - margin:1em 0 0; -} - -li pre, li table, li img { - margin:.5em 0 0 1em; -} - -dd pre, -#jd-content dd table, -#jd-content dd img { - margin:1em 0 0 1em; -} - -li ul, -li ol, -dd ul, -dd ol { - margin:0; - padding: 0 0 0 2em; -} - -li li, -dd li { - margin:0; - padding:.5em 0 0; -} - -dl dl, -ol dl, -ul dl { - margin:0 0 1em; - padding:0; -} - -table { - font-size:1em; - margin:0 0 1em; - padding:0; - border-collapse:collapse; - border-width:0; - empty-cells:show; -} - -td,th { - border:1px solid #ccc; - padding:6px 12px; - text-align:left; - vertical-align:top; - background-color:inherit; -} - -th { - background-color:#dee8f1; -} - -td > p:last-child { - margin:0; -} - -hr.blue { - background-color:#DDF0F2; - border:none; - height:5px; - margin:20px 0 10px; -} - -blockquote { - margin: 0 0 1em 1em; - padding: 0 4em 0 1em; - border-left:2px solid #eee; -} -/* LAYOUT */ - -#body-content { - /* "Preliminary" watermark for preview releases and interim builds. - background:transparent url(images/preliminary.png) repeat scroll 0 0; */ - margin:0; - position:relative; - width:100%; -} - -#header { - height: 114px; - position:relative; - z-index:100; - min-width:675px; /* min width for the tabs, before they wrap */ - padding:0 10px; - border-bottom:3px solid #94b922; -} - -#headerLeft{ - padding: 25px 0 0; -} - -#headerLeft img{ - height:50px; - width:180px; -} - -#headerRight { - position:absolute; - right:0; - top:0; - text-align:right; -} - -/* Tabs in the header */ - -#header ul { - list-style: none; - margin: 7px 0 0; - padding: 0; - height: 29px; -} - -#header li { - float: left; - margin: 0px 2px 0px 0px; - padding:0; -} - -#header li a { - text-decoration: none; - display: block; - background-image: url(images/bg_images_sprite.png); - background-position: 0 -58px; - background-repeat: no-repeat; - color: #666; - font-size: 13px; - font-weight: bold; - width: 94px; - height: 29px; - text-align: center; - margin: 0px; -} - -#header li a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 -29px; - background-repeat: no-repeat; -} - -#header li a span { - position:relative; - top:7px; -} - -#header li a span+span { - display:none; -} - -/* tab highlighting */ - -.home #home-link a, -.guide #guide-link a, -.reference #reference-link a, -.sdk #sdk-link a, -.resources #resources-link a, -.videos #videos-link a { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; - background-repeat: no-repeat; - color: #fff; - font-weight: bold; - cursor:default; -} - -.home #home-link a:hover, -.guide #guide-link a:hover, -.reference #reference-link a:hover, -.sdk #sdk-link a:hover, -.resources #resources-link a:hover, -.videos #videos-link a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; -} - -#headerLinks { - margin:10px 10px 0 0; - height:13px; - font-size: 11px; - vertical-align: top; -} - -#headerLinks a { - color: #7FA9B5; -} - -#headerLinks img { - vertical-align:middle; -} - -#language { - margin:0 10px 0 4px; -} - -#search { - height:45px; - margin:15px 10px 0 0; -} - -/* MAIN BODY */ - -#mainBodyFluid { - margin: 20px 10px; - color:#333; -} - -#mainBodyFixed { - margin: 20px 10px; - color: #333; - width:930px; - position:relative; -} - -#mainBodyFixed h3, -#mainBodyFluid h3 { - color:#336666; - font-size:1.25em; - margin: 0em 0em 0em 0em; - padding-bottom:.5em; -} - -#mainBodyFixed h2, -#mainBodyFluid h2 { - color:#336666; - font-size:1.25em; - margin: 0; - padding-bottom:.5em; -} - -#mainBodyFixed h1, -#mainBodyFluid h1 { - color:#435A6E; - font-size:1.7em; - margin: 1em 0; -} - -#mainBodyFixed .green, -#mainBodyFluid .green, -#jd-content .green { - color:#7BB026; - background-color:none; -} - -#mainBodyLeft { - float: left; - width: 600px; - margin-right: 20px; - color: #333; - position:relative; -} - -div.indent { - margin-left: 40px; - margin-right: 70px; -} - -#mainBodyLeft p { - color: #333; - font-size: 13px; -} - -#mainBodyLeft p.blue { - color: #669999; -} - -#mainBodyLeft #communityDiv { - float: left; - background-image:url(images/bg_community_leftDiv.jpg); - background-repeat: no-repeat; - width: 581px; - height: 347px; - padding: 20px 0px 0px 20px; -} - -#mainBodyRight { - float: left; - width: 300px; - color: #333; -} - -#mainBodyRight p { - padding-right: 50px; - color: #333; -} - -#mainBodyRight table { - width: 100%; -} - -#mainBodyRight td { - border:0px solid #666; - padding:0px 5px; - text-align:left; -} - -#mainBodyRight td p { - margin:0 0 1em 0; -} - -#mainBodyRight .blueBorderBox { - border:5px solid #ddf0f2; - padding:18px 18px 18px 18px; - text-align:left; -} - -#mainBodyFixed .seperator { - background-image:url(images/hr_gray_side.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -#mainBodyBottom { - float: left; - width: 100%; - clear:both; - color: #333; -} - -#mainBodyBottom .seperator { - background-image:url(images/hr_gray_main.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -/* FOOTER */ - -#footer { - float: left; - width:90%; - margin: 20px; - color: #aaa; - font-size: 11px; -} - -#footer a { - color: #aaa; - font-size: 11px; -} - -#footer a:hover { - text-decoration: underline; - color:#aaa; -} - -#footerlinks { - margin-top:2px; -} - -#footerlinks a, -#footerlinks a:visited { - color:#006699; -} - -/* SEARCH FILTER */ - -#search_autocomplete { - color:#aaa; -} - -#search-button { - display:inline; -} - -#search_filtered_div { - position:absolute; - margin-top:-1px; - z-index:101; - border:1px solid #BCCDF0; - background-color:#fff; -} - -#search_filtered { - min-width:100%; -} -#search_filtered td{ - background-color:#fff; - border-bottom: 1px solid #669999; - line-height:1.5em; -} - -#search_filtered .jd-selected { - background-color: #94b922; - cursor:pointer; -} -#search_filtered .jd-selected, -#search_filtered .jd-selected a { - color:#fff; -} - -.no-display { - display: none; -} - -.jd-autocomplete { - font-family: Arial, sans-serif; - padding-left: 6px; - padding-right: 6px; - padding-top: 1px; - padding-bottom: 1px; - font-size: 0.81em; - border: none; - margin: 0; - line-height: 1.05em; -} - -.show-row { - display: table-row; -} -.hide-row { - display: hidden; -} - -/* SEARCH */ - -/* restrict global search form width */ -#searchForm { - width:350px; -} - -#searchTxt { - width:200px; -} - -/* disable twiddle and size selectors for left column */ -#leftSearchControl div { - width: 100%; -} - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - -#search-button { - margin:0 0 0 2px; - font-size:11px; -} - -/* search result tabs */ - -#doc-content .gsc-control { - position:relative; -} - -#doc-content .gsc-tabsArea { - position:relative; - white-space:nowrap; -} - -#doc-content .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; -} - -#doc-content .gsc-tabHeader.gsc-tabhActive { - border-top: 2px solid #94B922; -} - -#doc-content h2#searchTitle { - padding:0; -} - -#doc-content .gsc-resultsbox-visible { - padding:1em 0 0 6px; -} - -/* CAROUSEL */ - -#homeMiddle { - padding: 0px 0px 0px 0px; - float: left; - width: 584px; - height: 627px; - position:relative; -} - -#topAnnouncement { - background:url(images/home/bg_home_announcement.png) no-repeat 0 0; -} - -#homeTitle { - padding:15px 15px 0; - height:30px; -} - -#homeTitle h2 { - padding:0; -} - -#announcement-block { - padding:0 15px 0; - overflow:hidden; - background: url(images/hr_gray_side.jpg) no-repeat 15px 0; - zoom:1; -} - -#announcement-block>* { - padding:15px 0 0; -} - -#announcement-block img { - float:left; - margin:0 30px 0 0; -} - -#announcement { - float:left; - margin:0; -} - -#carousel { - background:url(images/home/bg_home_carousel.png) no-repeat 0 0; - position:relative; - height:400px; -} - -#carouselMain { - background: url(images/home/bg_home_carousel_board.png) 0 0 no-repeat; - height:auto; - padding: 25px 21px 0; - overflow:hidden; - position:relative; - zoom:1; /*IE6*/ -} - -#carouselMain img { - margin:0; -} - -#carouselMain .bulletinDesc h3 { - margin:0; - padding:0; -} - -#carouselMain .bulletinDesc p { - margin:0; - padding:0.7em 0 0; -} - -#carouselWheel { - background: url(images/home/bg_home_carousel_wheel.png) 0 0 no-repeat; - padding-top:40px; - height:150px; -} - -.clearer { clear:both; } - -a#arrow-left, a#arrow-right { - float:left; - width:42px; - height:42px; - background-image:url(images/home/carousel_buttons_sprite.png); - background-repeat:no-repeat; -} -a#arrow-left { - margin:35px 3px 0 10px; -} -a#arrow-right { - margin:35px 10px 0 0; -} -a.arrow-left-off, -a#arrow-left.arrow-left-off:hover { - background-position:0 0; -} -a.arrow-right-off, -a#arrow-right.arrow-right-off:hover { - background-position:-42px 0; -} -a#arrow-left:hover { - background-position:0 -42px; -} -a#arrow-right:hover { - background-position:-42px -42px; -} -a.arrow-left-on { - background-position:0 0; -} -a.arrow-right-on { - background-position:-42px 0; -} -a.arrow-right-off, -a.arrow-left-off { - cursor:default; -} - -.app-list-container { - margin:0 20px; - position:relative; - width:100%; -} - -div#list-clip { - height:110px; - width:438px; - overflow:hidden; - position:relative; - float:left; -} - -div#app-list { - left:0; - z-index:1; - position:absolute; - margin:11px 0 0; - _margin-top:13px; - width:1000%; -} - -#app-list a { - display:block; - float:left; - height:90px; - width:90px; - margin:0 24px 0; - padding:3px; - background:#99cccc; - -webkit-border-radius:7px; - -moz-border-radius:7px; - border-radius:7px; - text-decoration:none; - text-align:center; - font-size:11px; - line-height:11px; -} - -#app-list a span { - position:relative; - top:-4px; -} - -#app-list img { - width:90px; - height:70px; - margin:0; -} - -#app-list a.selected, -#app-list a:active.selected, -#app-list a:hover.selected { - background:#A4C639; - color:#fff; - cursor:default; - text-decoration:none; -} - -#app-list a:hover, -#app-list a:active { - background:#ff9900; -} - -#app-list a:hover span, -#app-list a:active span { - text-decoration:underline; -} - -#droid-name { - padding-top:.5em; - color:#666; - padding-bottom:.25em; -} - -/*IE6*/ -* html #app-list a { zoom: 1; margin:0 24px 0 15px;} - -* html #list-clip { - width:430px !important; -} - -/*carousel bulletin layouts*/ -/*460px width*/ -/*185px height*/ -.img-left { - float:left; - width:230px; - overflow:hidden; - padding:8px 0 8px 8px; -} -.desc-right { - float:left; - width:270px; - padding:10px; -} -.img-right { - float:right; - width:220px; - overflow:hidden; - padding:8px 8px 8px 0; -} -.desc-left { - float:right; - width:280px; - padding:10px; - text-align:right; -} -.img-top { - padding:20px 20px 0; -} -.desc-bottom { - padding:10px; -} - - -/* VIDEO PAGE */ - -#mainBodyLeft.videoPlayer { - width:570px; -} - -#mainBodyRight.videoPlayer { - width:330px; -} - -/* player */ - -#videoPlayerBox { - background-color: #DAF3FC; - border-radius:7px; - -moz-border-radius:7px; - -webkit-border-radius:7px; - width:530px; - padding:20px; - border:1px solid #d3ecf5; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videoBorder { - background-color: #FFF; - min-height:399px; - height:auto !important; - border:1px solid #ccdada; - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; -} - -#videoPlayerTitle { - width:500px; - padding:15px 15px 0; -} - -#videoPlayerTitle h2 { - font-weight:bold; - font-size:1.2em; - color:#336666; - margin:0; - padding:0; -} - -#objectWrapper { - padding:15px 15px; - height:334px; - width:500px; -} - -/* playlist tabs */ - -ul#videoTabs { - list-style-type:none; - padding:0; - clear:both; - margin:0; - padding: 20px 0 0 15px; - zoom:1; /* IE7/8, otherwise top-padding is double */ -} - -ul#videoTabs li { - display:inline; - padding:0; - margin:0 3px 0 0; - line-height:2em; -} - -ul#videoTabs li a { - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; - background:#95c0d0; - color:#fff; - text-decoration:none; - padding:.45em 1.5em; - font-weight:bold; -} - -ul#videoTabs li.selected a { - font-weight:bold; - text-decoration:none; - color:#555; - background:#daf3fc; - border-bottom:1px solid #daf3fc; -} - -ul#videoTabs li:hover a { - background:#85acba; -} - -ul#videoTabs li.selected:hover a { - background:#daf3fc; -} - -/* playlists */ - -#videos { - background:#daf3fc; - margin-bottom:1.5em; - padding:15px; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videos div { - display:none; -} - -#videos div.selected { - display:block; -} - -ul.videoPreviews { - list-style:none; - padding:0; - margin:0; - zoom:1; /* IE, otherwise, layout doesn't update when showing 'more' */ -} - -ul.videoPreviews li { - margin:0 0 5px; - padding:0; - overflow:hidden; - position:relative; -} - -#mainBodyFixed ul.videoPreviews h3 { - font-size: 12px; - margin:0 0 1em 130px; - padding:0; - font-weight:bold; - color:inherit; -} - -ul.videoPreviews a { - margin:1px; - padding:10px; - text-decoration:none; - height:90px; - display:block; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - background-color:transparent; -} - -ul.videoPreviews a:hover { - background-color:#FFF; - border:none; /* IE8, otherwise, bg doesn't work */ -} - -ul.videoPreviews a.selected { - background-color: #FF9900; -} - -ul.videoPreviews img { - float:left; - clear:left; - margin:0; -} - -ul.videoPreviews h3 { - font-size:12px; - font-weight:bold; - text-decoration:none; - margin:0 0 1em 130px; - padding:0; -} - -ul.videoPreviews p { - font-size: 12px; - text-decoration:none; - margin:0 0 1.2em 130px; -} - -ul.videoPreviews p.full { - display:none; -} - -ul.videoPreviews span.more { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_down.png) 0 2px no-repeat; -} - -ul.videoPreviews span.less { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_up.png) 0 2px no-repeat; - display:none; -} - -ul.videoPreviews p.toggle { - position:absolute; - margin:0; - margin-top:-23px; /* instead of bottom:23px, because IE won't do it correctly */ - left:140px; -} - -ul.videoPreviews p.toggle a { - height:auto; - margin:0; - padding:0; - zoom:1; /* IE6, otherwise the margin considers the img on redraws */ -} - -ul.videoPreviews p.toggle a:hover { - text-decoration:underline; - background:transparent; /* IE6, otherwise it inherits white */ -} - -/* featured videos */ - -#mainBodyRight h2 { - padding:0 0 5px; -} - -#mainBodyRight ul.videoPreviews { - margin:10px 0 0; -} - -#mainBodyRight ul.videoPreviews li { - font-size:11px; - line-height:13px; - margin:0 0 5px; - padding:0; -} - -#mainBodyRight ul.videoPreviews h3 { - padding:0; - margin:0; - font-size:100%; -} - -#mainBodyRight ul.videoPreviews a { - text-decoration:none; - height:108px; - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews a:hover { - border:1px solid #CCDADA; -} - -#mainBodyRight ul.videoPreviews a.selected { - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews p { - line-height:1.2em; - padding:0; - margin:4px 0 0 130px; -} - -#mainBodyRight ul.videoPreviews img { - margin-top:5px; -} - -/* Pretty printing styles. Used with prettify.js. */ - -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -dl.tag-list dt code, -.tag { color: #008; } -dl.atn-list dt code, -.atn { color: #828; } -.atv { color: #080; } -.dec { color: #606; } - -@media print { - .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 { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} - - -#title { - border-bottom: 4px solid #ccc; - display:none; -} - -#title h1 { - color:#336666; - margin:0; - padding: 5px 10px; - font-size: 1em; - line-height: 15px; -} - -#title h1 .small{ - color:#000; - margin:0; - font-size: 13px; - padding:0 0 0 15px; -} - -/* SIDE NAVIGATION */ - -#side-nav { - padding:0 6px 0 0; - background-color: #fff; - font-size:12px; -} - -#resize-packages-nav { -/* keeps the resize handle below the h-scroll handle */ - height:270px; - overflow:hidden; - max-height:100%; -} - -#packages-nav { - height:270px; - max-height:inherit; - position:relative; - overflow:auto; -} - -#classes-nav, -#devdoc-nav { - overflow:auto; - position:relative; -} - -#side-nav ul { - list-style: none; - margin: 0; - padding:5px 0; -} - -#side-nav ul ul { - margin: .5em 0 0 0; - padding: 0; -} - -#side-nav li { - padding:0; - padding:1px 0 1px 0; - zoom:1; -} - -#side-nav li span.heading, -#side-nav li h2 { - display:block; - font-size:12px; - font-weight: bold; - margin:.5em 0 0 0; - padding: 3px 0 1px 9px; -} - -#side-nav li a { - display: inline-block; /* needed to apply padding to line-wraps */ - text-decoration:none; - padding: 0 0 0 18px; - zoom:1; -} - -#side-nav li a span+span { - display:none; -} - -#side-nav li a:hover { - text-decoration:underline; -} - -#side-nav li a+a { - padding: 0; -} -/*second level (nested) list*/ -#side-nav li li li a { - padding: 0 0 0 28px; -} -/*third level (nested) list*/ -#side-nav li li li li a { - padding: 0 0 0 38px; -} - -#side-nav .selected { - background-color: #435a6e; - color: #fff; - font-weight:bold; -} - -#side-nav .selected a { - color: #fff; - text-decoration:none; -} - -#side-nav strong { - display:block; -} - -#side-nav .toggle-list .toggle-img { - margin:0; - padding:0; - position:absolute; - top:0; - left:0; - height:16px; - width:15px; - outline-style:none; -} -/* second-level toggle */ -#side-nav .toggle-list .toggle-list .toggle-img { - left:10px; -} - -#side-nav .closed .toggle-img, -#side-nav .open .closed .toggle-img { - background:url('images/triangle-closed-small.png') 7px 4px no-repeat; -} -#side-nav .open .toggle-img { - background:url('images/triangle-opened-small.png') 7px 4px no-repeat; -} - -#side-nav .toggle-list { - position:relative; -} - -#side-nav .toggle-list ul { - margin:0; - display:none; -} - -#side-nav .toggle-list div { - display:block; -} - -#index-links .selected { - background-color: #fff; - color: #000; - font-weight:normal; - text-decoration:none; -} - -#index-links { - padding:7px 0 4px 10px; -} - -/* nav tree */ - -#nav-tree ul { - padding:5px 0 1.5em; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0 0 0 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - margin:0; -} - -#nav-tree a.nolink { - color: black; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; -} - -#nav-swap { - font-size:10px; - line-height:10px; - margin-left:1em; - text-decoration:none; - display:block; -} - -#tree-link { - -} - -/* DOCUMENT BODY */ - -#doc-content { - overflow:auto; -} - -#jd-header { - background-color: #E2E2E2; - padding: 7px 15px; -} - -#jd-header h1 { - margin: 0 0 10px; - font-size:1.7em; -} - -#jd-header .crumb { - font-size:.9em; - line-height:1em; - color:#777; -} - -#jd-header .crumb a, -#jd-header .crumb a:visited { - text-decoration:none; - color:#777; -} - -#jd-header .crumb a:hover { - text-decoration:underline; -} - -#jd-header table { - margin:0; - padding:0; -} - -#jd-header td { - border:none; - padding:0; - vertical-align:top; -} - -#jd-header.guide-header { - background-color:#fff; - color:#435a6e; - height:50px; -} - -#jd-descr { - position:relative; -} - -/* summary tables for reference pages */ -.jd-sumtable { - margin: .5em 1em 1em 1em; - width:95%; /* consistent table widths; within IE's quirks */ - font-size:.9em; -} - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:.8em; - padding:6px 10px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:70%; -} - -#api-level-toggle { - padding:0 10px; - font-size:11px; - float:right; -} - -#api-level-toggle label.disabled { - color:#999; -} - -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 7px 0; - margin-top:-25px; -} - -#api-info-block div.api-level { - font-size:1.3em; - font-weight:bold; - float:none; - color:#444; - padding:0; - margin:0; -} - -/* Force link colors for IE6 */ -div.api-level a { - color:#999; -} -#api-info-block div.api-level a:link { - color:#444; -} -#api-level-toggle a { - color:#999; -} - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} - -#api-level-toggle a, -.api-level a { - color:inherit; - text-decoration:none; -} - -#api-level-toggle a:hover, -.api-level a:hover { - color:inherit; - text-decoration:underline !important; - cursor:pointer !important; -} - -#side-nav li.absent.selected, -#side-nav li.absent.selected *, -#side-nav div.label.absent.selected, -#side-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -/* IE6 quirk (won't chain classes, so just keep background blue) */ -* html #side-nav li.selected, -* html #side-nav li.selected *, -* html #side-nav div.label.selected, -* html #side-nav div.label.selected * { - background-color: #435a6e !important; -} - - -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} - -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - -/* applies to a div containing links to summary tables */ -.sum-details-links { - padding:0; - font-weight:normal; -} - -.sum-details-links a { - text-decoration:none; -} - -.sum-details-links a:hover { - text-decoration:underline; -} - - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:.9em; -} -.jd-inheritance-table td { - border: none; - margin: 0; - padding: 0; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - -#jd-content { - padding: 18px 15px; -} - -hr { - background-color:#ccc; - border-color:#fff; - margin:2em 0 1em; -} - -/* DOC CLASSES */ - -#jd-content h1 { -/*sdk page*/ - font-size:1.6em; - color:#336666; - margin:0 0 .5em; -} - -#jd-content h2 { - font-size:1.45em; - color:#111; - border-top:2px solid #ccc; - padding: .5em 0 0; - margin: 2em 0 1em 0; -} - -#jd-content h3 { - font-size:1.3em; - color:#3a3a3a; - padding: 0; - margin: 1.5em 0 .65em 0; -} - -#jd-content h4 { - font-size:1.1em; - color:#3a3a3a; - padding: 0; - margin: 1.25em 0 .65em 0; -} - -#jd-content h5 { - font-size:1.0em; - color:#3a3a3a; - padding: 0; - margin: 1em 0 .65em 0; -} - -#jd-content .small-header { - font-size:1em; - color:#000; - font-weight:bold; - border:none; - padding:0; - margin:1em 0 .5em; - position:inherit; -} - -#jd-content table { - margin: 0 0 1em 1em; -} - -#jd-content img { - margin: 0 0 1em 1em; -} - -#jd-content li img, -#jd-content dd img { - margin:.5em 0 .5em 1em; -} - -.nolist { - list-style:none; - padding:0; - margin:0 0 1em 1em; -} - -.nolist li { - padding:0 0 2px; - margin:0; -} - -h4 .normal { - font-size:.9em; - font-weight:normal; -} - -.caps { - font-variant:small-caps; - font-size:1.2em; -} - -dl.tag-list dl.atn-list { - padding:0 0 0 2em; -} - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; - line-height:1em; -} - -.jd-tagdescr p { - margin:.5em 0; - padding:0; - -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} - -h4.jd-tagtitle { - margin:0; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -#jd-content table h2 { - background-color: #d6d6d6; - font-size: 1.1em; - margin:0 0 10px; - padding:5px; - left:0; - width:auto; -} - -div.design-announce { - border-top:1px solid #167c80; - border-bottom:1px solid #167c80; - padding:5px 10px 10px 55px; - margin:2em 0; - background:url('images/icon_design.png') 5px 13px no-repeat; -} - -div.design-announce p { - margin: .5em 0 0 0; -} - -div.special { - padding: .5em 1em 1em 1em; - margin: 0 0 1em; - background-color: #DAF3FC; - border:1px solid #d3ecf5; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; -} - -div.special p { - margin: .5em 0 0 0; -} - -div.special ol { - margin: 0; -} - -div.special ol li { - margin: 0; - padding: 0; -} - -#jd-content div.special h2, -#jd-content div.special h3 { - color:#669999; - font-size:1.2em; - border:none; - margin:0 0 .5em; - padding:0; -} - -#jd-content div.special.reference h2, -#jd-content div.special.reference h3, -#jd-content div.special.reference h4 { - color:#000; - font-size:1em; - border:none; - font-weight:bold; - margin:.5em 0; - padding:0; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - margin: 1em; - padding: 0 0 0 .5em; - border-left: 4px solid; -} - -p.special-note, -div.special-note { - background-color:#EBF3DB; - padding:10px 20px; - margin:0 0 1em; -} - -p.note, -div.note { - border-color: #99aacc; -} - -p.warning, -div.warning { - border-color: #aa0033; -} - -p.caution, -div.caution { - border-color: #ffcf00; -} - -li .note, -li .caution, -li .warning { - margin: .5em 0 0 0; - padding: .2em .5em .2em .9em; -} - -/* Makes sure the first paragraph does not add top-whitespace within the box*/ -li .note>p:first-child, -li .caution>p:first-child, -li .warning>p:first-child { - margin-top:0; - padding-top:0; -} - -dl.xml dt { - font-variant:small-caps; - font-size:1.2em; -} - -dl.xml dl { - padding:0; -} - -dl.xml dl dt { - font-variant:normal; - font-size:1em; -} - -.listhead li { - font-weight: bold; -} - -.listhead li *, /*ie*/.listhead li li { - font-weight: normal; -} - -ol.no-style, -ul.no-style { - list-style:none; - padding-left:1em; -} - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - text-decoration: none; - vertical-align:top; - line-height:.9em; - white-space:nowrap; -} - -.toggle-list.open .new-child { - display:none; -} - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -0.5em 0 1em 1em; /* matches default img left-margin */ -} - -div.figure { - float:right; - clear:right; - margin:1em 0 0 0; - padding:0 0 0 3em; - background-color:#fff; - /* width must be defined w/ an inline style matching the image width */ -} - -#jd-content -div.figure img { - margin: 0 0 1em; -} - -div.figure p.img-caption { - margin: -0.5em 0 1em 0; -} - -p.table-caption { - margin: 0 0 0.5em 1em; /* matches default table left-margin */ -} - - -/* toggle for misc content (such as long sample code) - see toggleContent() script in android-developer-docs.js */ -.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -.toggle-content a[href="#"] { - text-decoration:none; - color:inherit; -} - -.toggle-content-toggleme { - padding-bottom:1px; /* fixes animation bounce due to margins */ -} - -#jd-content .toggle-content img.toggle-content-img { - margin:0; -} - - -/* BEGIN quickview sidebar element styles */ - -#qv-wrapper { - float: right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:-48px 0 2px 0; - padding:0 0 20px 35px; -} - -#qv { - background-color:#fff; - border:4px solid #dee8f1; - margin:0; - padding:0 5px 5px; - width:292px; /* +10px padding; +8px border */ - font-size:.9em; -} - -#qv ol { - list-style:none; - padding: 0; -} - -#qv ol ol{ - list-style:none; - padding: 0 0 0 12px; - margin:0; -} - -#qv ul { - padding: 0 10px 0 2em; -} - -#qv li { - padding: 0 10px 3px; - line-height: 1.2em; -} - -#qv li li { - padding: 3px 10px 0; -} - -#qv ul li { - padding: 0 10px 0 0; -} - -#qv li.selected a { - color:#555; - text-decoration:none; -} - -#qv a, -#qv a code { - color:#cc6600; -} - -#qv p { - margin:8px 0 0; - padding:0 10px; -} - -#jd-content #qv h2 { - font-size:1.05em; - font-weight:bold; - margin:12px 0 .25em 0; - padding:0 10px; - background-color:transparent; - color:#7BB026; - border:none; - left:0; - z-index:1; -} - -#qv-extra #rule { - padding: 0 10px; - margin: 0; -} - -#qv-sub-rule { - padding: 5px 15px 10px; - margin: 0; -} - -#jd-content -#qv-sub-rule h2 { - margin: 0 0 .5em 0; -} - -/* END quickview sidebar element styles */ - -/* Begin sidebox sidebar element styles */ - -.sidebox-wrapper { - float:right; - clear:right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:0; - padding:0 0 20px 35px; -} - -.sidebox { - border-left:1px solid #dee8f1; - background-color:#ffffee; - margin:0; - padding:8px 12px; - font-size:0.9em; - width:285px; /* +24px padding; +1px border */ -} - -.sidebox p { - margin-bottom: .75em; -} - -.sidebox ul { - padding: 0 0 0 1.5em; -} - -.sidebox li ul { - margin-top:0; - margin-bottom:.1em; -} - -.sidebox li { -padding:0 0 0 0em; -} - -#jd-content .sidebox h2, -#jd-content .sidebox h3, -#jd-content .sidebox h4, -#jd-content .sidebox h5 { - border:none; - font-size:1em; - margin:0; - padding:0 0 8px; - left:0; - z-index:0; -} - -.sidebox hr { - background-color:#ccc; - border:none; -} - -/* End sidebox sidebar element styles */ - -/* BEGIN developer training bar styles */ - -div#tb-wrapper { - float: right; - clear:right; - width:380px; /* +25px padding = 405 */ - background-color:#fff; - margin:0 0 2px 0; - padding:0 0 20px 25px; -} - -div#tb { - margin:0; - padding:0 15px; - width:350px; /* +15px padding = 380 */ - font-size:.9em; - background:#e9e9e9; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - overflow:auto; -} - -div#tb h2 { - font-size:1.3em; - font-weight:bold; - margin:1em 0; - padding:0; - background-color:transparent; - border:none; - clear:both; -} - -div.download-box a.button { - color: #069; - font-size:1.1em; - font-weight:bold; - text-decoration:none; - height:27px; - line-height:27px; - text-align:center; - padding:5px 8px; - background-color: #fff; - border: 1px solid #aaa; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -div.download-box a.button:hover { - border-color: #09C; - background-color: #4CADCB; - background-image: -webkit-gradient(linear,left top,left bottom,from(#5dbcd9),to(#4cadcb)); - background-image: -webkit-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -moz-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -ms-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -o-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: linear-gradient(top,#5dbcd9,#4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9',EndColorStr='#4cadcb'); - color: #fff; -} - -div.download-box a.button:active { - background-color: #1E799A; - background-image: none; - border-color: #30B7E6; -} - -div.download-box p.filename { - font-size:0.85em; - color:#888; - margin:4px 0 1em 10px; -} - -/* End developer training bar */ - -/* Training nav bar (previous/next) */ - -div.training-nav-top { - float: right; - width:380px; /* +25px padding = 405 */ - margin:-58px 0 0 0; - padding:0 0 20px 25px; -} - -div.training-nav-bottom { - padding:1px; /* for weird FF bug (scrollbar appears) */ - margin:3em 0; - overflow:auto; -} - -div.training-nav-button-next a, -div.training-nav-button-previous a { - display:block; - width:160px; - height:55px; - padding:4px 7px; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - text-decoration:none; - font-weight:bold; -} - -div.training-nav-button-next a:hover, -div.training-nav-button-previous a:hover { - border:1px solid #069; /* match link color */ -} - -div.training-nav-button-next a:active, -div.training-nav-button-previous a:active { - border:1px solid #f00; /* match link color */ -} - -div.training-nav-button-previous { - float:left; - text-align:left; -} - -div.training-nav-button-next { - float:right; - text-align:right; -} - -span.training-nav-button-title { - display:block; - font-size:.85em; - font-weight:normal; - line-height:1.3em; - margin:.5em 0 0; -} - -/* End training nav bar */ - -/* BEGIN image and caption styles (originally for UI Guidelines docs) */ - -table.image-caption { - padding:0; - margin:.5em 0; - border:0; -} - -td.image-caption-i { - font-size:92%; - padding:0 5px; - margin:0; - border:0; -} - -td.image-caption-i img { - padding:0 1em; - margin:0; -} - -.image-list { - width:24px; - text-align:center; -} - -td.image-caption-c { - font-size:92%; - padding:1em 2px 2px 2px; - margin:0; - border:0; - width:350px; -} - -.grad-rule-top { -background-image:url(images/grad-rule-qv.png); -background-repeat:no-repeat; -padding-top:1em; -margin-top:0; -} - -.image-caption-nested { - margin-top:0; - padding:0 0 0 1em; -} - -.image-caption-nested td { - padding:0 4px 2px 0; - margin:0; - border:0; -} - -/* END image and caption styles */ - -/* table of contents */ - -ol.toc { - margin: 0 0 1em 0; - padding: 0; - list-style: none; - font-size:95%; -} - -ol.toc li { - font-weight: bold; - margin: 0 0 .5em 1em; - padding: 0; -} - -ol.toc li p { - font-weight: normal; -} - -ol.toc li ol { - margin: 0; - padding: 0; -} - -ol.toc li li { - padding: 0; - margin: 0 0 0 1em; - font-weight: normal; - list-style: none; -} - -table ol.toc { - margin-left: 0; -} - -.columns td { - padding:0 5px; - border:none; -} - -/* link table */ -.jd-linktable { - margin: 0 0 1em; - border-bottom: 1px solid #888; -} -.jd-linktable th, -.jd-linktable td { - padding: 3px 5px; - vertical-align: top; - text-align: left; - border:none; -} -.jd-linktable tr { - background-color: #fff; -} -.jd-linktable td { - border-top: 1px solid #888; - background-color: inherit; -} -.jd-linktable td p { - padding: 0 0 5px; -} -.jd-linktable .jd-linkcol { -} -.jd-linktable .jd-descrcol { -} -.jd-linktable .jd-typecol { - text-align:right; -} -.jd-linktable .jd-valcol { -} -.jd-linktable .jd-commentrow { - border-top:none; - padding-left:25px; -} -.jd-deprecated-warning { - margin-top: 0; - margin-bottom: 10px; -} - -tr.alt-color { - background-color: #f6f6f6; -} - -/* expando trigger */ -#jd-content .jd-expando-trigger-img { - margin:0; -} - -/* jd-expando */ -.jd-inheritedlinks { - padding:0 0 0 13px -} - -/* SDK PAGE */ -table.download tr { - background-color:#d9d9d9; -} - -table.download tr.alt-color { - background-color:#ededed; -} - -table.download td, -table.download th { - border:2px solid #fff; - padding:10px 5px; -} - -table.download th { - background-color:#6d8293; - color:#fff; -} - -/* INLAY 180 COPY and 240PX EXTENSION */ -/* modified to 43px so that all browsers eliminate the package panel h-scroll */ -.g-tpl-240 .g-unit, -.g-unit .g-tpl-240 .g-unit, -.g-unit .g-unit .g-tpl-240 .g-unit { - display: block; - margin: 0 0 0 243px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240 .g-first, -.g-unit .g-tpl-240 .g-first, -.g-tpl-240 .g-first { - display: block; - margin: 0; - width: 243px; - float: left; -} -/* 240px alt */ -.g-tpl-240-alt .g-unit, -.g-unit .g-tpl-240-alt .g-unit, -.g-unit .g-unit .g-tpl-240-alt .g-unit { - display: block; - margin: 0 243px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240-alt .g-first, -.g-unit .g-tpl-240-alt .g-first, -.g-tpl-240-alt .g-first { - display: block; - margin: 0; - width: 243px; - float: right; -} - -/* 200px */ -.g-tpl-200 .g-unit, -.g-unit .g-tpl-200 .g-unit, -.g-unit .g-unit .g-tpl-200 .g-unit { - display: block; - margin: 0 0 0 200px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200 .g-first, -.g-unit .g-tpl-200 .g-first, -.g-tpl-200 .g-first { - display: block; - margin: 0; - width: 200px; - float: left; -} -/* 200px alt */ -.g-tpl-200-alt .g-unit, -.g-unit .g-tpl-200-alt .g-unit, -.g-unit .g-unit .g-tpl-200-alt .g-unit { - display: block; - margin: 0 200px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200-alt .g-first, -.g-unit .g-tpl-200-alt .g-first, -.g-tpl-200-alt .g-first { - display: block; - margin: 0; - width: 200px; - float: right; -} - -/* 190px */ -.g-tpl-190 .g-unit, -.g-unit .g-tpl-190 .g-unit, -.g-unit .g-unit .g-tpl-190 .g-unit { - display: block; - margin: 0 0 0 190px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190 .g-first, -.g-unit .g-tpl-190 .g-first, -.g-tpl-190 .g-first { - display: block; - margin: 0; - width: 190px; - float: left; -} -/* 190px alt */ -.g-tpl-190-alt .g-unit, -.g-unit .g-tpl-190-alt .g-unit, -.g-unit .g-unit .g-tpl-190-alt .g-unit { - display: block; - margin: 0 190px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190-alt .g-first, -.g-unit .g-tpl-190-alt .g-first, -.g-tpl-190-alt .g-first { - display: block; - margin: 0; - width: 190px; - float: right; -} - -/* 180px */ -.g-tpl-180 .g-unit, -.g-unit .g-tpl-180 .g-unit, -.g-unit .g-unit .g-tpl-180 .g-unit { - display: block; - margin: 0 0 0 180px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180 .g-first, -.g-unit .g-tpl-180 .g-first, -.g-tpl-180 .g-first { - display: block; - margin: 0; - width: 180px; - float: left; -} -/* 180px alt */ -.g-tpl-180-alt .g-unit, -.g-unit .g-tpl-180-alt .g-unit, -.g-unit .g-unit .g-tpl-180-alt .g-unit { - display: block; - margin: 0 180px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180-alt .g-first, -.g-unit .g-tpl-180-alt .g-first, -.g-tpl-180-alt .g-first { - display: block; - margin: 0; - width: 180px; - float: right; -} - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; } -body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-s { cursor: s-resize; height: 6px; width: 100%; bottom: 0px; left: 0px; - background: transparent url("images/resizable-s2.gif") repeat scroll center top; } -.ui-resizable-e { cursor: e-resize; width: 6px; right: 0px; top: 0px; height: 100%; - background: transparent url("images/resizable-e2.gif") repeat scroll right center; } - -@media print { - - body { - overflow:visible; - } - - #header { - height:60px; - } - - #headerLeft { - padding:0; - } - - #header-tabs, - #headerRight, - #side-nav, - #api-info-block { - display:none; - } - - #body-content { - position:inherit; - } - - #doc-content { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } - - #jd-header { - padding:10px 0; - } - - #jd-content { - padding:15px 0 0; - } - - #footer { - float:none; - margin:2em 0 0; - } - - h4.jd-details-title { - border-bottom:1px solid #666; - } - - pre { - /* these allow lines to break (if there's a white space) */ - overflow: visible; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - } - - h1, h2, h3, h4, h5, h6 { - page-break-after: avoid; - } - - table, img { - page-break-inside: avoid; - } -} diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/css/default.css b/build/tools/droiddoc/templates-lineage-sdk/assets/css/default.css deleted file mode 100644 index 7e0926fc..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/css/default.css +++ /dev/null @@ -1,7439 +0,0 @@ -/* color definitions */ -/* 16 column layout */ -/* clearfix idiom */ -/* common mixins */ -/* page layout + top-level styles */ -::selection { - background-color: #167c80; - color: #fff; } -::-webkit-selection { - background-color: #167c80; - color: #fff; } -::-moz-selection { - background-color: #167c80; - color: #fff; } - -html, body { - height: 100%; - margin: 0; - padding: 0; - background-color:#F9F9F9; - -webkit-font-smoothing: antialiased; - /* prevent subpixel antialiasing, which thickens the text */ - /* text-rendering: optimizeLegibility; */ - /* turned off ligatures due to bug 5945455 */ } - -body { - color: #222; - font: 14px/19px Roboto, sans-serif; - font-weight: 400; - letter-spacing:.1; - padding:0 10px; } - -#page-container { - width: 940px; - margin: 0 40px; } - -#page-header { - height: 80px; - margin-bottom: 20px; - font-size: 48px; - line-height: 48px; - font-weight: 100; - padding-left: 10px; } - #page-header a { - display: block; - position: relative; - top: 20px; - text-decoration: none; - color: #555555 !important; } - -#main-row { - display: inline-block; } - #main-row:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html #main-row { - height: 1px; } - -#page-footer { - margin-left: 190px; - margin-top: 80px; - color: #999999; - padding-bottom: 40px; - font-size: 12px; - line-height: 15px; } - #page-footer a { - color: #777777; } - #page-footer #copyright { - margin-bottom: 10px; } - -#nav-container { - width: 160px; - min-height: 10px; - margin-right: 20px; - float: left; } - -#nav { - margin:0; - padding:0 0 30px; -} - -#side-nav { - min-height:5px; /* silly way to avoid doc floating left when nav goes fixed */ - margin-bottom:1px; -} -#devdoc-nav { - outline:none; - width:auto; - margin: 20px 0 0; } - -#devdoc-nav h2 { - border:0; -} - -#devdoc-nav.fixed { - position: fixed; - margin:0; - top: 65px; /* sticky-header height + 20px gutter */ -} - -#devdoc-nav span.small { - font-size:12px; - font-weight:normal; -} - -#content { - width: 760px; - float: left; } - -a:hover, -acronym:hover { - color: #0C4446 !important; } - -a:focus, -a:active { - color: #167c80 !important; } - -a.external-link { - background:url('../images/styles/open_new_page.png') no-repeat 100% 50%; - padding-right:16px; -} - -img { - border: none; } -#jd-content img { - margin-bottom:15px; -} - -ul { - margin: 0; - padding: 0; } - -strong { - font-weight: 500; } - -em { - font-style: italic; } - -acronym, -.tooltip-link { - border-bottom: 1px dotted #555555; - cursor: help; } - -acronym:hover, -.tooltip-link:hover { - color: #0C4446; - border-bottom-color: #0C4446; } - -img.with-shadow, -video.with-shadow { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); } - -/* disclosures mixin */ -/* content layout */ -.layout-content-row { - display: inline-block; - margin-bottom: 10px; } - * html .layout-content-row { - height: 1px; } - -.layout-content-col { - float: left; - margin-left: 20px; } - .layout-content-col:first-child { - margin-left: 0; } - .layout-content-col h3, - .layout-content-col h4 { - margin-top:0; } - -.layout-content-col.span-1 { - width: 40px; } - -.layout-content-col.span-2 { - width: 100px; } - -.layout-content-col.span-3 { - width: 160px; } - -.layout-content-col.span-4 { - width: 220px; } - -.layout-content-col.span-5 { - width: 280px; } - -.layout-content-col.span-6 { - width: 340px; } - -.layout-content-col.span-7 { - width: 400px; } - -.layout-content-col.span-8 { - width: 460px; } - -.layout-content-col.span-9 { - width: 520px; } - -.layout-content-col.span-10 { - width: 580px; } - -.layout-content-col.span-11 { - width: 640px; } - -.layout-content-col.span-12 { - width: 700px; } - -.layout-content-col.span-13 { - width: 760px; } - -.vspace.size-1 { - height: 10px; } - -.vspace.size-2 { - height: 20px; } - -.vspace.size-3 { - height: 30px; } - -.vspace.size-4 { - height: 40px; } - -.vspace.size-5 { - height: 50px; } - -.vspace.size-6 { - height: 60px; } - -.vspace.size-7 { - height: 70px; } - -.vspace.size-8 { - height: 80px; } - -.vspace.size-9 { - height: 90px; } - -.vspace.size-10 { - height: 100px; } - -.vspace.size-11 { - height: 110px; } - -.vspace.size-12 { - height: 120px; } - -.vspace.size-13 { - height: 130px; } - -.vspace.size-14 { - height: 140px; } - -.vspace.size-15 { - height: 150px; } - -.vspace.size-16 { - height: 160px; } - -/* nav */ -#nav { - /* section header divs */ - /* expanded section header divs */ - /* sublinks */ } - #nav li { - list-style-type: none; - font-size: 14px; - margin:0; - padding:0; - line-height: 15px; } - #nav a { - color: #555555; - text-decoration: none; - word-wrap:break-word; } - #nav .nav-section-header { - position: relative; - margin-bottom: 1px; - padding: 0 30px 0 0; } - #nav li.selected a, #nav li.selected > .nav-section-header > a { - color: #09C; - } - #nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } - #nav .nav-section .nav-section .nav-section-header { - /* no white line between second level sections */ - margin-bottom: 0; } - /* section header links */ - #nav > li > div > a { - display: block; - color: #333333; - font-weight: 500; - padding: 10px 0 10px 10px; } - #nav .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_down.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; - display: block; - position: absolute; - top: 0; - right: 0; } - #nav .nav-section-header.empty { - padding:0; } - #nav .nav-section-header.empty:after { - display: none; } - /* nested nav headers */ - #nav .nav-section .nav-section { - position: relative; - padding: 0; - margin: 0; } - #nav .nav-section li a { - /* first gen child (2nd level li) */ - display:block; - font-weight: normal; - text-transform: none; - padding: 7px 5px 7px 10px; - } - #nav .nav-section li li a { - /* second gen child (3rd level li) */ - padding: 5px 5px 5px 10px; - } - #nav li.expanded .nav-section-header { - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); } - #nav li.expanded li .nav-section-header { - background: transparent; } - #nav li.expanded li ul { - /* 3rd level ul */ - padding:0 0 0 10px; - } - #nav li.expanded > .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_up.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; } - #nav li.expanded li ul.tree-list-children { - padding: 0; - } - #nav li.expanded li ul.tree-list-children .tree-list-children { - padding:0 0 0 10px; - } - #nav li span.tree-list-subtitle { - display:inline-block; - padding:5px 0 0 10px; - color:#555; - text-transform:uppercase; - font-size:12px; - } - #nav li span.tree-list-subtitle:before { - content: '—'; - } - #nav li span.tree-list-subtitle:after { - content: '—'; - } - #nav li span.tree-list-subtitle.package { - padding-top:15px; - cursor:default; - } - #nav li span.tree-list-subtitle.package:before { - content: ''; - } - #nav li span.tree-list-subtitle.package:after { - content: ''; - } - #nav li ul.tree-list-children.classes { - padding-left:10px; - } - #nav li ul { - display:none; - overflow: hidden; - margin: 0; } - #nav li ul.animate-height-in { - -webkit-transition: height 0.25s ease-in; - -moz-transition: height 0.25s ease-in; - transition: height 0.25s ease-in; } - #nav li ul.animate-height-out { - -webkit-transition: height 0.25s ease-out; - -moz-transition: height 0.25s ease-out; - transition: height 0.25s ease-out; } - #nav li ul li { - padding: 0; } - #nav li li li { - padding: 0; } - #nav li.expanded ul { - } - #nav li ul > li { - padding:0; - } - #nav li ul > li:last-child { - padding-bottom:5px; - } - #nav li ul.tree-list-children > li:last-child { - padding-bottom:0; - } - #nav li.expanded ul > li { - background:#efefef; - background: rgba(0, 0, 0, 0.03); } - #nav li.expanded ul > li li { - background:inherit; } - #nav li ul.tree-list-children ul { - display:block; } - -#nav.samples-nav li li li { - font-size:13px; -} -#nav.samples-nav li li li a { - padding-top:3px; - padding-bottom:3px; -} -#nav.samples-nav li li ul > li:last-child { - padding-bottom:3px; -} - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - vertical-align:top; - white-space:nowrap; -} - -/* content header */ -.content-header { - height: 30px; - margin:36px 0 23px; /* same as h1 */ - padding:0 0 10px;} /* same as h1 */ -.content-header.just-links { - margin-bottom:0; - padding-bottom:0;} - -.content-header h1 { - margin:0; - padding:0; - width: 700px; -} -.content-header > div:first-child { - height:1px; /* set fixed height for the header div to ensure the - next/prev links align with toc on training classes */ -} - -.content-footer { - border-top: 1px solid #ccc; - margin-top: 10px; - padding-top:10px; - width:100%; } - -.content-footer .col-9 { - margin-left:0; -} -.content-footer .col-4 { - margin-right:0; -} -.content-footer.wrap { - width:940px; -} -.content-footer .plus-container { - margin:5px 0 0; - text-align:right; - float:right; -} - -a.back-link { - text-decoration: none; - text-transform: uppercase; -} - -.content-header .paging-links { - margin-top:-25px; -} -.paging-links { - position: relative; - height:30px; } - .paging-links a { - position: absolute; } - .paging-links a, - .training-nav-top a { - color: #555555; - text-decoration: none; - text-transform: uppercase; } - .paging-links .prev-page-link:before, - .training-nav-top .prev-page-link:before, - a.back-link:before { - content: ''; - background: transparent url(../images/styles/disclosure_left.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-right: 5px; } - .training-nav-top .next-page-link, - .training-nav-top .start-class-link, - .training-nav-top .start-course-link { - right: 10px; } - .paging-links .prev-page-link { - left: -15px; } - .paging-links .next-page-link { - right: 0; } - .next-page-link:after, - .start-class-link:after, - .start-course-link:after, - .next-class-link:after, - .go-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - .prev-page-link.inline:before { - content: none; } - .next-page-link.inline:after { - content: none; } - - .content-footer .paging-links .next-page-link { - left:0; - } - - .training-nav-top a { - display:block; - float:left; - width:122px; - height:28px; - padding: 8px; - line-height:28px; - text-align:center; - border:1px solid #DADADA; - border-bottom:0; - } - - .training-nav-top a.next-page-link { - border-left:0; - width:123px; - } - - .paging-links a.disabled, - .training-nav-top a.disabled, - .content-footer a.disabled { - color:#bbb; - } - - .paging-links a.disabled:hover, - .training-nav-top a.disabled:hover, - .content-footer a.disabled:hover { - cursor:default; - color:#bbb !important; - } - - .training-nav-top a.start-class-link, - .training-nav-top a.start-course-link { - width:262px; - } - - .paging-links a.start-class-link { - width:100%; - } - - /* list of classes on course landing page */ - ol.class-list { - list-style:none; - margin-left:0; - } - ol.class-list>li { - margin:0 0 15px; - padding:5px 0 0; - overflow:hidden; - border-top:1px solid #ccc; - } - ol.class-list li a.title { - font-size:16px; - margin:0; - clear:left; - display:block; - height:32px; - padding:0 4px; - } - ol.class-list li a.title h2 { - color:inherit; - margin:0 0 10px; - display:block; - float:left; - width:675px; - } - ol.class-list li a.title span { - display:none; - float:left; - font-size:18px; - font-weight:bold; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 32px; - } - ol.class-list li a.title:hover { - background:#ddd; - color:#258AAF !important; - } - ol.class-list li a.title:hover span { - display:block; - } - - #jd-content - ol.class-list li img { - float:left; - clear:left; - width:64px; - margin:0 20px 0 0; - } - ol.class-list li p.description { - float:left; - display:block; - width:250px; - margin:0; - } - ol.class-list li p.description.article { - width: 550px; - } - ol.class-list ol { - float:left; - width:320px; - margin:0 0 0 30px; - list-style:none; - margin:0 0 0 20px; - } - ol.class-list div.lessons li { - margin:0 0 6px; - line-height:16px; - } - - - .hide { - display:none !important; - } - - - - /* inner-doc tabs w/ title */ - -div#title-tabs-wrapper { - border-bottom:1px solid #ccc; - margin:20px 0 30px; -} -h1.with-title-tabs { - display:inline-block; - margin:0 0 -1px 0; - padding:0 60px 0 0; - border-bottom:1px solid #F9F9F9; -} -ul#title-tabs { - list-style:none; - padding:0; - height:29px; - margin:0; - font-size:16px; - line-height:26px; - display:inline-block; - vertical-align:bottom; -} -ul#title-tabs li { - display:block; - float:left; - margin-right:40px; - border-bottom: 3px solid transparent; -} -ul#title-tabs li.selected { - border-bottom: 3px solid #93C; -} -ul#title-tabs li a { - color:#333; -} -ul#title-tabs li a:hover, -ul#title-tabs li a:active { - color:#93C !important; -} - - - -/* content body */ -@-webkit-keyframes glowheader { - from { - background-color: #167c80; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #167c80; - border-bottom-color: #167c80; } } - -@-moz-keyframes glowheader { - from { - background-color: #167c80; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #167c80; - border-bottom-color: #167c80; } } - -@keyframes glowheader { - from { - background-color: #167c80; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #167c80; - border-bottom-color: #167c80; } } - -h1:target, -h2:target, -h3:target { - -webkit-animation-name: glowheader; - -moz-animation-name: glowheader; - animation-name: glowheader; - -webkit-animation-duration: 0.7s; - -moz-animation-duration: 0.7s; - animation-duration: 0.7s; - -webkit-animation-timing-function: ease-out; - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; } - -.design ol h4 { - margin-bottom:0; -} -.design ol { - counter-reset: item; } - .design ol>li { - font-size: 14px; - line-height: 20px; - list-style-type: none; - position: relative; } - .design ol>li:before { - content: counter(item) ". "; - counter-increment: item; - position: absolute; - left: -20px; - top: 0; } - .design ol li.value-1:before { - content: "1. "; } - .design ol li.value-2:before { - content: "2. "; } - .design ol li.value-3:before { - content: "3. "; } - .design ol li.value-4:before { - content: "4. "; } - .design ol li.value-5:before { - content: "5. "; } - .design ol li.value-6:before { - content: "6. "; } - .design ol li.value-7:before { - content: "7. "; } - .design ol li.value-8:before { - content: "8. "; } - .design ol li.value-9:before { - content: "9. "; } - .design ol li.value-10:before { - content: "10. "; } -.design .with-callouts ol>li { - list-style-position: inside; - margin-left: 0; } - .design .with-callouts ol>li:before { - display: inline; - left: -20px; - float: left; - width: 17px; - color: #167c80; - font-weight: 500; } -.design .with-callouts ul>li { - list-style-position: outside; } - -/* special list items */ -li.no-bullet { - list-style-type: none !important; } -li.no-bullet *{ - margin:0; } - -.design li.with-icon { - position: relative; - margin-left: 20px; - min-height: 30px; } - .design li.with-icon p { - margin-left: 0 !important; } - .design li.with-icon:before { - position: absolute; - left: -40px; - top: 0; - content: ''; - width: 30px; - height: 30px; } - .design li.with-icon.tablet:before { - background-image: url(../images/styles/ico_phone_tablet.png); } - .design li.with-icon.web:before { - background-image: url(../images/styles/ico_web.png); } - .design li.with-icon.action:before { - background-image: url(../images/styles/ico_action.png); } - .design li.with-icon.use:before { - background-image: url(../images/styles/ico_use.png); } - -/* figures and callouts */ -.figure { - position: relative; } - .figure.pad-below { - margin-bottom: 20px; } - .figure .figure-callout { - position: absolute; - color: #fff; - font-weight: 500; - font-size: 16px; - line-height: 23px; - text-align: center; - background: transparent url(../images/styles/callout.png) no-repeat scroll 50% 50%; - padding-right: 2px; - width: 30px; - height: 29px; - z-index: 1000; } - .figure .figure-callout.top { - top: -9px; } - .figure .figure-callout.right { - right: -5px; } - -.figure-caption { - margin: 0 10px 20px 0; - font-size: 14px; - line-height: 20px; - font-style: italic; } - -/* rows of figures */ -.figure-row { - font-size: 0; - line-height: 0; - /* to prevent space between figures */ } - .figure-row .figure { - display: inline-block; - vertical-align: top; } - .figure-row .figure + .figure { - margin-left: 10px; - /* reintroduce space between figures */ } - -/* video containers */ -.framed-galaxynexus-land-span-13 { - background: transparent url(../images/styles/device_galaxynexus_blank_land_span13.png) no-repeat -scroll top left; - padding: 42px 122px 62px 126px; - overflow: hidden; } - .framed-galaxynexus-land-span-13, .framed-galaxynexus-land-span-13 video, -.framed-galaxynexus-land-span-13 img { - width: 512px; - height: 286px; } - - -.framed-galaxynexus-land-span-8{ - background: transparent url(../images/styles/device_galaxynexus_blank_land_span8.png) no-repeat -scroll top left; - padding: 26px 68px 38px 72px; - overflow: hidden; } - .framed-galaxynexus-land-span-8, .framed-galaxynexus-land-span-8 video, -.framed-galaxynexus-land-span-8 img { - width: 320px; - height: 180px; } - -.framed-galaxynexus-port-span-9 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span9.png) no-repeat -scroll top left; - padding: 95px 122px 107px 124px; - overflow: hidden; } - .framed-galaxynexus-port-span-9, .framed-galaxynexus-port-span-9 video, -.framed-galaxynexus-port-span-9 img { - width: 274px; - height: 488px; } - -.framed-galaxynexus-port-span-5 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span5.png) no-repeat -scroll top left; - padding: 75px 31px 76px 33px; - overflow: hidden; } - .framed-galaxynexus-port-span-5, .framed-galaxynexus-port-span-5 video, -.framed-galaxynexus-port-span-5 img { - width: 216px; - height: 384px; } - -.framed-nexus4-port-216 { - background: transparent url(../images/styles/device_nexus4_blank_port_432.png) no-repeat -scroll top left; - background-size:240px 465px; - padding: 52px 12px 52px 12px; - overflow: hidden; } - .framed-nexus4-port-216, .framed-nexus4-port-216 video, - .framed-nexus4-port-216 img { - width: 216px; - height: 360px; } - -.framed-nexus5-port-span-5 { - background: transparent url(../images/styles/device_nexus5_blank_port_span5.png) no-repeat - scroll top left; - padding: 52px 33px 69px 31px; - overflow: hidden; -} - -.framed-nexus5-port-span-5, -.framed-nexus5-port-span-5 video, -.framed-nexus5-port-span-5 img { - width: 216px; - height: 384px; -} - -.framed-nexus5-land-span-13 { - background: transparent url(../images/styles/device_nexus5_blank_land_span13.png) no-repeat scroll top left; - padding: 36px 119px 54px 108px; - overflow: hidden; -} - -.framed-nexus5-land-span-13, -.framed-nexus5-land-span-13 video, -.framed-nexus5-land-span-13 img { - width: 533px; - height: 300px; -} - -.framed-nexus5-port-span-5, -.framed-nexus5-port-span-5 video, -.framed-nexus5-port-span-5 img { - width: 216px; - height: 384px; -} - -/* wear device frames */ - -.framed-wear-square { - background: transparent url(../images/styles/device_wear_square.png) no-repeat scroll top left; - background-size: 302px 302px; - height:222px; - width:222px; - padding:40px; - overflow:hidden; -} - -.framed-wear-square-small { - background: transparent url(../images/styles/device_wear_square_small.png) no-repeat scroll top left; - background-size: 169px 200px; - height:147px; - width:147px; - padding:27px 11px; - overflow:hidden; -} - -#jd-content -.framed-wear-square img { - height:222px; - width: 222px; - padding:0; - margin:0; -} - -#jd-content -.framed-wear-square-small img { - height:147px; - width: 147px; - padding:0; - margin:0; -} - - - - - - -/* landing page disclosures */ -.landing-page-link { - text-decoration: none; - font-weight: 500; - color: #333333; } - .landing-page-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - -/* tooltips */ -.tooltip-box { - position: absolute; - background-color: rgba(0, 0, 0, 0.9); - border-radius: 2px; - font-size: 14px; - line-height: 20px; - color: #fff; - padding: 6px 10px; - max-width: 250px; - z-index: 10000; } - .tooltip-box.below:after { - position: absolute; - content: ''; - line-height: 0; - display: block; - top: -10px; - left: 5px; - border: 5px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.9); } - -/* video note */ -.video-instructions { - margin-top: 10px; - margin-bottom: 10px; } - .video-instructions:before { - content: ''; - background: transparent url(../images/styles/ico_movie_inline.png) no-repeat scroll top left; - display: inline-block; - width: 12px; - height: 12px; - margin-right: 8px; } - .video-instructions:after { - content: 'Click device screen to replay movie.'; } - -/* download buttons */ -.download-button { - display: block; - margin-bottom: 5px; - text-decoration: none; - background-color: #167c80; - color: #fff !important; - font-weight: 500; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12); - padding: 6px 12px; - border-radius: 2px; } - .download-button:hover, .download-button:focus { - background-color: #167c80; - color: #fff !important; } - .download-button:active { - background-color: #006699; } - -/* UI tables and other things found in Writing style and Settings pattern */ -.ui-table { - width: 100%; - background-color: #282828; - color: #fff; - border-radius: 2px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); - border-collapse: separate; } - .ui-table th, - .ui-table td { - padding: 5px 10px; - background-color: inherit; - border:0;} - .ui-table thead th { - font-weight: bold; } - .ui-table tfoot td { - border-top: 1px solid #494949; - border-right: 1px solid #494949; - text-align: center; } - .ui-table tfoot td:last-child { - border-right: 0; } - -.layout-with-list-item-margins { - margin-left: 30px !important; } - -.emulate-content-left-padding { - margin-left: 10px; } - -.do-dont-label { - margin-bottom: 10px; - padding-left: 20px; - background: transparent none no-repeat scroll 0px 3px; } - .do-dont-label.bad { - background-image: url(../images/styles/ico_wrong.png); } - .do-dont-label.good { - background-image: url(../images/styles/ico_good.png); } - - - - - - - - - - - - - - - - - - - -/***** PREVIOUSLY style.css ******************/ - - - - - -@media screen, projection, print { -[dir='rtl'] { - direction: rtl; -} -html { - line-height: 20px; -} -pre, table, input, textarea, code { - font-size: 1em; -} -address, abbr, cite { - font-style: normal; -} -[dir='rtl'] th { - text-align: right; -} -html[lang^=ja] blockquote, html[lang^=ja] q, html[lang^=ko] blockquote, html[lang^=ko] q, -html[lang^=zh] blockquote, html[lang^=zh] q { - font-style: normal; -} -q { - font-style: italic; -} -fieldset, iframe, img { - border: 0; -} -img { - -ms-interpolation-mode: bicubic; - vertical-align: middle; - max-width: 100%; -} -q { - quotes: none; -} -sup, sub { - font-size: 11px; - line-height: 0; -} -} - -@media screen, projection { - -table, fieldset { - margin: 0; -} -h1 { - color:#333; - font-size: 34px; - margin: 36px 0 27px; - padding:0 0 10px; - font-weight:300; -} -h1, h2 { - line-height: 30px; -} -h1.short { - margin-right:320px; -} -h1.short { - margin-right:320px; -} -h1.super { - font-size: 37px; -} -h2 { - color:#333; - font-size: 26px; - margin: 32px 0 20px; - padding:0; - font-weight:300; -} -h3 { - color:#333; - font-size: 21px; - font-weight:400; - margin:21px 0 14px 0; -} -h3, h4 { - line-height: 21px; -} -h4 { - font-size: 18px; - margin: 12px 0; - font-weight:500; -} -h5 { - font-size: 14px; -} -h5, h6 { - margin: 5px 0; -} -h6 { - font-size: 12px; -} -hr { /* applied to the bottom of h2 elements */ - height: 1px; - margin: 3px 0 12px; - border: 0; - background: #ccc; -} -p, pre, table, form { - margin: 0 0 15px; -} -small { - font-size: 11.5px; - color: #000; -} -ul, ol { - margin: 0 0 15px 18px; - padding: 0; -} -[dir='rtl'] ul, [dir='rtl'] ol { - margin: 10px 30px 10px 10px; -} -ul ul, ul ol, ol ul, ol ol { - margin-bottom: 0; - margin-top: 0; -} -li { - margin:0 0 5px; -} -dd { - margin:0 0 10px 30px; -} -dd p, -dd pre, -dd ul, -dd ol, -dd dl { - margin-top:10px; -} -li p, -li pre, -li ul, -li ol, -li dl { - margin-top:5px; - margin-bottom:5px; -} -dl dd dl:first-child { - margin-top:0; -} -pre strong, pre b, a strong, a b, a code { - color: inherit; -} -pre, code { - color: #060; - font: 13px/1.5 monospace; -} -code { - font-weight:bold; - font: 13px/14px monospace; -} - -legend { - display: none; -} -a:link, a:visited, .link-color { - color: #167c80; - text-decoration: none; -} -a:focus, a:hover, a:active { - color: #167c80; - text-decoration: none; -} -a.white { - color: #fff; - text-decoration:underline; -} -a.white:hover, a.white:active { - color: #ccc !important; -} -strong, b { - font-weight:bold; - color: #222; -} -table { - border-collapse: collapse; - border-spacing: 0; - border:0; - margin: .5em 1em 1em 0; - width:100%; /* consistent table widths; within IE's quirks */ - background-color:#f7f7f7; -} -th, td { - padding: 4px 12px; - vertical-align: top; - text-align: left; -} -td { - background-color:inherit; - border:solid 1px #DDD; -} -td *:last-child { - margin-bottom:0; -} -th { - background-color: #999; - color: #fff; - border:solid 1px #DDD; - font-weight: normal; -} -tr:first-of-type th:first-of-type:empty { - visibility: hidden; -} - -/* -------------------------------------------------------------------------- -Footer -*/ -.line { - clear: both; - background: #acbc00; - background: -moz-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #acbc00), -color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00)); - background: -webkit-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -o-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -ms-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - height: 2px; - margin-top: 150px; - position: relative; - z-index: 11; -} -#footer { - font-size:11px; - clear: both; - color: #999; - padding: 15px 0; - margin-top:10px; - width:auto; -} -#footer-local ul { - list-style: none; - margin: 5px 0 30px 0; -} -#footer-local li { - display: inline; -} -#footer-local li+li:before { - content: '|'; - padding: 0 3px; - color: #e5e5e5; -} -#footer-global { - padding: 10px 15px; - background: #f5f5f5; -} -#footer-global { - border-top: 1px solid #ebebeb; - font-size: 11.5px; - line-height: 1.8; - list-style: none; -} -#footer-global ul { - margin: 0; -} -#footer-global li { - display: inline; - font-weight: bold; -} -#footer-global li+li:before { - content: '¬?'; - padding: 0 3px; -} -* html #footer-global li { - margin: 0 13px 0 0; -} -* [dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -*+html #footer-global li { - margin: 0 13px 0 0; -} -*+[dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -#footer-global li a { - font-weight: normal; -} -.locales { - margin: 10px 0 0 0px; -} -[dir='rtl'] .locales { - background-position: right center; - float: left; - padding: 0 24px 0 0; -} -.locales form { - margin: 0; -} -.locales select, .sites select { - line-height: 3.08; - margin: 0px 0; - border: solid 1px #EBEBEB; - -webkit-appearance: none; - background: white url('../images/arrows-up-down.png') right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 230px; -} -} - -/* ============================================================================= - Print Only - ========================================================================== */ -@media print { - /* configure printed page */ - @page { - margin: 0.75in 1in; - widows: 4; - orphans: 4; - } - - /* reset spacing metrics */ - html, body, .wrap { - margin: 0 !important; - padding: 0 !important; - width: auto !important; - } - - /* leave enough space on the left for bullets */ - body { - padding-left: 20px !important; - } - #doc-col { - margin-left: 0; - } - - /* hide a bunch of non-content elements */ - #header, #footer, #nav-x, #side-nav, - .training-nav-top, .training-nav-bottom, - #doc-col .content-footer, - .nav-x, .nav-y, - .paging-links { - display: none !important; - } - - /* remove extra space above page titles */ - #doc-col .content-header { - margin-top: 0; - } - - /* bump up spacing above subheadings */ - h2 { - margin-top: 40px !important; - } - - /* print link URLs where possible and give links default text color */ - p a:after { - content: " (" attr(href) ")"; - font-size: 80%; - } - p a { - word-wrap: break-word; - } - a { - color: inherit; - } - - /* syntax highlighting rules */ - .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 { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} - -/* ============================================================================= - Columns - ========================================================================== */ - -@media screen, projection, print { -.full { - padding: 2.5em 0; - border-top: solid 1px #ddd; - border-bottom: solid 1px #ddd; - background: #f7f7f7; -} -.wrap { - margin: 0 auto; - width: 940px; - clear: both; -} -.cols { - height: 1%; - margin: 0 -1.533742331288343558282%; - width: 103.06748466257669%} -*+html .cols { - margin-bottom: 20px; -} -.cols:after { - clear: both; - content: ' '; - display: block; - height: 0; - visibility: hidden; -} -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, -.col-13, .col-14, .col-15, .col-16 { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} -/* -* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html -.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12 { - margin: 0; - padding: 0 1.4% 20px; -} -[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5, -[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10, -[dir='rtl'] .col-11, [dir='rtl'] .col-12 { - float: right; -} -*/ -.col-1 { width: 40px } -.col-2 { width: 100px } -.col-3 { width: 160px } -.col-4 { width: 220px } -.col-5 { width: 280px } -.col-6 { width: 340px } -.col-7 { width: 400px } -.col-8 { width: 460px } -.col-9 { width: 520px } -.col-10 { width: 580px } -.col-11 { width: 640px } -.col-12 { width: 700px } -.col-13 { width: 760px } -.col-14 { width: 820px } -.col-15 { width: 880px } -.col-16 { width: 940px } -} - -.col-right { - margin-right:0px; -} - -@media screen and (max-width:772px) { -.col-5, .col-6, .col-7 { - clear: both; - width: 97.0238096%} -} - -/* ============================================================================= - Layout - ========================================================================== */ -@media screen, projection, print { - -/* -------------------------------------------------------------------------- -Header, Login, Nav-X, Search -*/ -#header { - margin: 0; - padding: 0; -} -#header:before, #header:after { - content: ""; - display: table; - clear: both -} -.logo, .nav-x { - float: left; -} -.nav-x { - margin-top: -2px; - list-style-type: none; -} -.nav-x a { - color: #333; - font-size: 16px; -} -.about a.selected { - color: #9933CC; -} -.design a.selected { - color: #167c80; -} -.develop a.selected { - color: #F80; -} -.distribute a.selected { - color: #9C0; -} - - - -.nav-x li { - display: inline; - margin-right: 45px; -} -.search { - float: right; - position: relative; - width: 220px -} -.search .bottom, .search .left, .search .right { - position: absolute; - background-color: #a3a3a3; -} -.search .bottom { - width: 220px; - height: 1px; - top: 24px; - left: 0 -} -.search .left, .search .right { - height: 5px; - width: 1px -} -.search .left { top: 19px; left: 0 } -.search .right { top: 19px; right: 0 } -.search form { - float: left; - margin-top: 2px; - width: inherit; -} -.search .close, -#player-frame .close { - position: absolute; - right: 8px; - bottom: 4px; - width: 16px; - height: 16px; - margin: 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; - z-index:9999; -} -.search .close:hover, .search .close:focus, -#player-frame .close:hover, #player-frame .close:focus { - background-position: -16px 0; - cursor:pointer; -} -#player-frame .close { - top: 6px; -} -.search form input { - color: #999; - font-size: 1em; - width: inherit; - border: none; - margin: 0; - padding:0 0 0 6px; - z-index: 1500; - background-color: transparent -} -.search:hover .bottom, .search:hover .left, .search:hover .right { - background-color: #167c80; -} -.search:hover .icon { - background-position: -8px 0 -} -.search form input:focus { - color: #222; - font-weight: bold; - outline:0; -} -/* Search Dropdown */ -.search-dropdown { - padding: 15px; - width: 192px; - border: solid 1px #c5c5c5; - background: #fff; - position: absolute; - top: 35px; - left: 0; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.2); - box-shadow: 0 0 10px rgba(0,0,0,0.2) -} -.search-dropdown ul, .search-dropdown ul li { - list-style-type: none; - margin: 0; - padding: 0 -} -.search-dropdown ul li { - clear: both -} -.search-dropdown img { - float: left; - margin: 0 10px 10px 0 -} -.search-dropdown h6 { - color: #222; - margin: 0; - line-height: normal -} -.search-dropdown .desc { - color: #999; - font-size: 11.5px; - line-height: normal; - margin: 0; -} -.search-dropdown li a:hover h6, .search-dropdown li a:hover .desc { - color: #167c80 -} -/* -------------------------------------------------------------------------- -Buttons -*/ -.button, a.button, .button-secondary, a.button-secondary { - border-image: initial; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - cursor: pointer; -} -.button, a.button { - display:inline-block; - background-color: #09c; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2faddb), to(#09c)); - background-image: -webkit-linear-gradient(top, #2faddb, #09c); - background-image: -moz-linear-gradient(top, #2faddb, #09c); - background-image: -ms-linear-gradient(top, #2faddb, #09c); - background-image: -o-linear-gradient(top, #2faddb, #09c); - background-image: linear-gradient(top, #2faddb, #09c); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#167c80',GradientType=0); - border: 1px solid #3990ab; - color: #fff; -} -.button-secondary, a.button-secondary { - background-color: #f3f3f3; - border: 1px solid #dcdcdc; - color: #444; -} -a.button, a.button:visited, a.button-secondary, a.button-secondary:visited { - margin-right: 16px; - font-weight: 400; - min-width: 54px; - outline: 0; - padding: 8px 15px; - text-align: center; -} -.button, .button-secondary { - margin-right: 16px; - font-weight: 400; - min-width: 54px; - outline: 0; - padding: 0 15px; - text-align: center; -} -.button:hover, a.button:hover { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, left bottom, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: linear-gradient(top, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', -EndColorStr='#4cadcb',GradientType=0); - color: #fff !important; -} -.button:active, a.button:active { - background-color: #1e799a; - background-image: none; - border-color: #30b7e6; -} -a.button.big.subtitle { - line-height:18px; -} -.button-secondary:hover, a.button-secondary:hover { - border-color: #dbdbdb; - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); - background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); - background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); - background-image: -o-linear-gradient(top, #f9f9f9, #ececec); - background-image: linear-gradient(top, #f9f9f9, #ececec); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #167c80 !important; -} -.button-secondary:active, a.button-secondary:active { - border-color: #dadada; - background: #ebebeb; /* Old browsers */ - /* IE9 SVG, needs conditional override of 'filter' to 'none' */ - background: -url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/ -Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0Jv -eD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+ -CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIg -eDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ViZWJl -YiIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2ZhZmFmYSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjkwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNmY2ZjYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFy -R3JhZGllbnQ+ -CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIg -Lz4KPC9zdmc+); - background: -moz-linear-gradient(top, #ebebeb 0%, #f9f9f9 5%, #fafafa 50%, #f9f9f9 90%, -#ffffff 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ebebeb), -color-stop(5%,#f9f9f9), color-stop(50%,#fafafa), color-stop(90%,#f9f9f9), color-stop(100%,#ffffff)); -/* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 -90%,#ffffff 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* IE10+ */ - background: linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ebebeb', -endColorstr='#ffffff',GradientType=0 ); /* IE6-8 */ - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - color: #258AAF !important; -} -.button.big { - font-size:20px; - display:inline-block; -} -.button.big span.small { - font-size:14px; -} -.button-caption { - margin-top:10px; - font-size:12px; - font-style:italic; -} - -.button.disabled, -.button.disabled:hover, -.button.disabled:active { - background:#ebebeb; - color:#999 !important; - border-color:#999; - cursor:default; -} - -.training-nav-top a.button-secondary, -.training-nav-bottom a.button-secondary { - display:block; - float:left; - margin:0; - width:130px; - text-transform:uppercase; - font-weight:bold; - - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); - background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); - background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); - background-image: -o-linear-gradient(top, #f9f9f9, #ececec); - background-image: linear-gradient(top, #f9f9f9, #ececec); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #167c80; -} - -.training-nav-top a.button-secondary:hover, -.training-nav-bottom a.button-secondary:hover { - background-color: #09c; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2faddb), to(#09c)); - background-image: -webkit-linear-gradient(top, #2faddb, #09c); - background-image: -moz-linear-gradient(top, #2faddb, #09c); - background-image: -ms-linear-gradient(top, #2faddb, #09c); - background-image: -o-linear-gradient(top, #2faddb, #09c); - background-image: linear-gradient(top, #2faddb, #09c); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#09c'); - border: 1px solid #3990ab; - color: #fff !important; -} - -.training-nav-top a.button-secondary.last, -.training-nav-bottom a.button-secondary.last { - border-left:0; -} - -.training-nav-top a.button-secondary.double-size, -.training-nav-bottom a.button-secondary.double-size { - width:291px; -} - -.training-nav-top, -.training-nav-bottom { - float:right; - margin:0 0 0 20px; -} - -.training-nav-top { - position:relative; - top:73px; -} - -.training-nav-bottom { - padding:0 0 20px; -} - -#tb-wrapper, -#qv-wrapper { - float:right; - clear:right; - margin:6px 0 0 30px; /* negative top-margin to counter the content-header bottom margin */ - padding:0 0 30px; -} - -#tb-wrapper { - margin:51px 0 0 20px; /* negative top-margin to counter the content-header bottom margin */ -} - -#tb, -#qv { - font-size:13px; - line-height:18px; - width:238px; - border:1px solid #ccc; - float:right; -} - -#tb { - width:278px; -} - -#tb h2, -#qv h2 { - margin:10px 15px; - padding:0; - text-transform:uppercase; - border-bottom:1px solid gainsboro; -} - -#tb *, -#qv * { - font-size:inherit; -} - -#tb .download-box, -#qv .download-box { - padding:0 0 0 15px; -} - -#tb .download-box .filename, -#qv .download-box .filename { - font-size:11px; - margin:4px 4px 10px; - color:#666; -} - - -/* Dev guide quicknav */ - -.sidebox-wrapper { - float:right; - clear:right; - margin:0 0 0 20px; - padding:0 0 20px; -} - -.sidebox { - width:226px; - font-size:13px; - line-height:18px; - border-left:4px solid #99CC00; - float:right; - padding:0 0 0 10px; - margin:0 0 1em 20px; -} - -.sidebox h2, -.sidebox h3, -.sidebox h4, -.sidebox h5 { - font-weight:bold; - margin:0 0 10px; - line-height: 16px; -} - -.sidebox * { - font-size:inherit; -} - -.sidebox > *:last-child { - margin-bottom:0; -} - -#tb ol, -#tb ul, -#qv ul { - margin:0 15px 10px 35px; -} - -#tb p { - margin:0 15px 10px; -} - -#qv ol { - list-style:none; - margin:0 15px 15px; - font-size:inherit; - line-height:inherit; -} - -#tb ol ol, -#tb ul ul, -#qv ol ol, -#qv ul ul, -.sidebox ol ol, -.sidebox ul ul { - margin-bottom:0; -} - -#qv ol ol { - margin:3px 0 3px 15px; -} - -.sidebox p, -#qv p, -#tb p { - margin: 0 0 10px; -} - -/* related resources blocks in checklists */ - -/* related resources sections that have dynamic content */ - - - -h3.rel-resources { -margin:1.25em auto; -} - -/* -------------------------------------------------------------------------- -Form -*/ -.article form { - margin: 0 0 20px; -} -.article form .form-required { - color: #dd4b39; -} -.article form fieldset { - margin: 0 0 20px; - padding: 0; -} -.article form legend { - display: block; - line-height: 1.5; - margin: 0; - padding: 0; -} -/* -.article form ol, .article form ul { - margin: 0 0 0 1em; - padding: 0 0 0 1em; -} -[dir='rtl'] .article form ol, [dir='rtl'] .article form ul { - margin: 0 1em 0 0; - padding: 0 1em 0 0; -} -.article form ol ul, .article form ul ul, [dir='rtl'] .article form ol ul, [dir='rtl'] .article form -ul ul { - list-style: none; - margin: 0; - padding: 0; -} -.article form li { - margin: 0 0 20px; -} -.article form li li { - margin: 0 0 5px; -} -*/ -.article form label { - display: block; - margin: 0 0 5px; - padding: 0; -} -.article form input[type='text'], .article form select, .article form textarea, .article form -.checkbox-group, .article form .radio-group { - margin-bottom: 15px; -} -.checkbox-group input { - width: 13px; - height: 13px; - background: #fff; - border: solid 1px #c6c6c6; - float: left; -} -.article form .checkbox-group, .article form .radio-group { - display: block -} -.article form select { - border: solid 1px #ebebeb; - border-top-color: #ddd; - -webkit-appearance: none; - background: #f3f3f3 url(../images/arrows-up-down.png) right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 130px; -} - -.article form .browse .browse-msg { - font-size: 11.5px; -} -.article form .browse .button-secondary { - height: auto; - line-height: 25px; - font-size: 11px; - padding: 0 8px; - margin: 0 10px 15px 0; -} -.article form input[type='text'], .article form textarea { - border: 1px solid #ebebeb; - border-top-color: #dcdcdc; - color: #222; - line-height: normal; - padding: 6px 10px; - width: 300px; -} -.article form textarea { - height: 150px; -} -.article form input[type='text']:focus, .article form textarea:focus { - border-color: #167c80; - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -o-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - outline: 0; -} -.article form input[disabled], .article form textarea[disabled], .article form label.form-disabled { - color: #999; -} -.article form input[type='text'][disabled], .article form textarea[disabled] { - background-color: #ebebeb; -} -form .form-error input[type='text'], form .form-error textarea { - border-color: #dd4b39; - margin-right: 20px; -} -.aside { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 20px; - color: #666; - position: relative; - background: #f9f9f9; -} -/* -.aside, .notification, .promo { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 10px; - position: relative; -} -.aside>:first-child, .notification>:first-child, .promo>:first-child { - margin-top: 0; -} -.aside>:last-child, .notification>:last-child, .promo>:last-child { - margin-bottom: 0; -} -.aside { - background: #f9f9f9; -} -.notification { - background: #fffbe4; - border-color: #f8f6e6; -} -.promo { - background: #f6f9ff; - border-color: #eff2f9; -} -*/ - -/* SDK TOS styles */ - -div.sdk-terms { - white-space: pre-wrap; - word-wrap: break-word; - font-family: inherit; - font-size: inherit; - padding: 10px; - height: 370px; - width: 738px; - border: 1px solid #444; - background: transparent; - overflow:auto; - margin:0 0 10px; -} - -div.sdk-terms.fullsize { - padding: 0; - height: auto; - width: auto; - border:none; -} - -div.sdk-terms h3, -div.sdk-terms h2 { - margin:0; -} - -div#sdk-terms-form { - padding:0 0 0 10px; -} - -div#sdk-terms-form input { - display:inline; - margin:4px 4px 4px 0; -} - - -/* -------------------------------------------------------------------------- -Code Style -*/ -pre { - margin:0 0 1em 0; - padding: 1em; - overflow: auto; - border: solid 1px #ddd; - background: #f7f7f7; -} -.str { color: #800; } /* Code string */ -.kwd { color: #008; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -.tag { color: #008; } -.atn { color: #828; } -.atv { color: #800; } /* XML string */ -.dec { color: #606; } - -/* -------------------------------------------------------------------------- -Three-Pane -*/ -/* Package Nav & Classes Nav */ -.three-pane { - position: relative; - border-top: solid 1px #ebebeb; -} -#packages-nav .js-pane, -#classes-nav .js-pane { - overflow:visible; -} -#packages-nav { - height:270px; - max-height: inherit; - position: relative; -} -#classes-nav { - position: relative; -} -#packages-nav ul, #classes-nav ul { - list-style-type: none; - margin: 10px 0 20px 0; - padding: 0; -} -#classes-nav li { - font-weight: bold; - margin: 5px 0; -} -#packages-nav li, -#classes-nav li li { - margin: 0; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li a, #classes-nav li a:active, #classes-nav li a:visited { - padding: 0 0 0 4px; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited, -#nav-tree li a, #nav-tree li a:active, #nav-tree li a:visited { - color: #222; - font-weight: normal; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited { - display: block; -} -#packages-nav li.selected a, #packages-nav li.selected a:active, #packages-nav li.selected -a:visited, -#classes-nav li li.selected a, #classes-nav li li.selected a:active, #classes-nav li li.selected -a:visited, -#nav-tree li div.selected { - font-weight: 500; - color: #167c80; - background-color:#fff; } - #packages-nav li.selected ul li a, - #classes-nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } -#nav-tree li div.selected a { - font-weight: 500; - color: #167c80; -} -#nav-swap { - height:30px; - border-top:1px solid #ccc; -} -#nav-swap a { - display:inline-block; - height:100%; - color: #222; - font-size: 12px; - padding: 5px 0 5px 5px; -} - -#nav-swap .fullscreen { - float: right; - width: 24px; - height: 24px; - text-indent: -1000em; - padding:0; - margin:3px 5px 0; - background: url(../images/fullscreen.png) no-repeat -24px 0; -} -#nav-swap .fullscreen.disabled { - background-position: 0 0; -} -#nav-swap .fullscreen:hover, -#nav-swap .fullscreen:focus { - cursor:pointer; -} - - -/* nav tree */ -#side-nav, #swapper, -#nav-tree, #tree-list { - overflow:hidden; - margin-left:0; -} - -#devdoc-nav { - overflow:visible !important; /* To keep the "to top" button visible */ -} - -#nav-tree ul { - list-style:none; - padding:0; - margin:10px 0; -} - -#nav-tree ul li div { - padding:0 0 0 4px; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - padding:0; - margin:0; -} -#nav-tree .children_ul li div { - padding:0 0 0 10px; -} -#nav-tree .children_ul .children_ul li div { - padding:0 0 0 20px; -} - -#nav-tree a.nolink { - color: #222; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; - outline:0; -} - - -/* Content */ -#doc-col { - margin-right:0; -} - -/* Uncomment this for preview release watermark -#doc-col { - background: url('../images/preview.png') repeat; -} -*/ - -#doc-content-container { - margin-left: 291px -} -#doc-header, #doc-content { - padding: 1em 2em; -} -#doc-header { - background: #f7f7f7; -} -#doc-header h1 { - line-height: 0; - margin-bottom: 15px; -} -#api-info-block { - float: right; - font-weight: bold; -} -#api-info-block a, #api-info-block a:active, #api-info-block a:visited { - color: #222; -} -#api-info-block a:hover, #api-info-block a:focus { - color: #167c80; -} -#api-nav-header { - height:19px; /* plus 16px padding = 35; same as #nav li */ - font-size:14px; - padding: 8px 0; - margin: 0; - border-bottom: 1px solid #CCC; - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); /* matches #nav li.expanded */ - -} -#api-nav-title { - padding:0 5px; - white-space:nowrap; -} - -#api-level-toggle { - float:right; - padding:0 5px; - -} - -#api-level-toggle label { - margin:0; - vertical-align:top; - line-height: 19px; - font-size:13px; - height: 19px; -} - -#api-level-toggle .select-wrapper { - width: 35px; - display: inline-block; - overflow: hidden; -} -#api-level-toggle select { - border: 0; - appearance:none; - -moz-appearance:none; - -webkit-appearance: none; - background: transparent url(../images/arrows-up-down.png) 23px 5px no-repeat; - color: #222; - height: 19px; - line-height: 19px; - padding: 0; - margin:1px 0 0 0; - width:150%; - font-size:13px; - vertical-align:top; - outline:0; -} - - -/* Toggle for revision notes and stuff */ -div.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -#jd-content img.toggle-content-img { - margin:0 5px 5px 0; -} - -div.toggle-content-toggleme { - padding:0 0 0 15px; -} - - -/* API LEVEL FILTERED MEMBERS */ - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} -#devdoc-nav li.absent.selected, -#devdoc-nav li.absent.selected *, -#devdoc-nav div.label.absent.selected, -#devdoc-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - - - - - - - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; border-bottom: 1px solid #e4e4e4; } -/*body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; }*/ -.ui-resizable-s { cursor: s-resize; height: 10px; width: 100% !important; bottom: -11px; left: 0; -border-bottom: solid 1px #ededed; - background: #f7f7f7 url("../images/resizable-s2.png") no-repeat scroll center center; } -/* -.ui-resizable-e { -cursor: e-resize; width: 10px; right: 0; top: 0; height: 100%; border-right: solid -1px #ededed;background: #f7f7f7 url("../images/resizable-e2.png") no-repeat scroll center center; } -*/ - -/* -------------------------------------------------------------------------- -Lightbox -*/ -.lightbox { - width: 769px; - padding: 1.5em; - margin: 0 auto; - border: solid 1px #dcdcdc; - background: #fff; - -moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - -webkit-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - box-shadow: 1px 1px 5px rgba(0,0,0,0.1) -} -.lightbox .header { - float: left; - width: 720px; - margin: -10px 20px 10px 0; -} -.lightbox .close { - float: right; - width: 10px; - height: 10px; - margin: -10px -10px 10px 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; -} -.lightbox .close:hover, .lightbox .close:focus { - background-position: -10px 0; -} - -/* -------------------------------------------------------------------------- -Styles for samples browser -*/ - -#codesample-wrapper { - width:100000px; /* super wide to contain floats, but doesn't cause scroll */ - overflow:visible; -} -pre#codesample-block { - float:left; - overflow:visible; - background:transparent; - border:none; -} -pre#codesample-block a.number { - display:none; -} -pre#codesample-block .code-line:hover { - background:#e7e7e7; -} -pre#codesample-line-numbers { - float:left; - width:2em; - background:transparent; - border:none; - border-right:1px solid #ccc; - padding-left:0; - font-family:monospace; - text-align:right; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: -moz-none; - -ms-user-select: none; - user-select: none; -} -pre#codesample-line-numbers a { - color:#999; -} -pre#codesample-line-numbers.hidden { - display:none; -} -pre#codesample-block span.code-line { - width:100%; - display:inline-block; -} - -/* -Styles for displaying image or video resources in samples browser. -Resources are marked as no-display if they exceed the size limit. -*/ -div#codesample-resource img, div#codesample-resource video { - border: 1px solid #ececec; -} - -div#codesample-resource.noDisplay div { - border: 1px solid #ececec; - width:120px; - margin-bottom:4px; - padding:20px; -} - -div#codesample-resource .noDisplay-message:after { - font-style:italic; - font-size:12px; - content: 'This resource is not available for browsing. To view it, please download the project.'; -} - -/* -Styles for project structure (treeview) page -*/ -.structure-dir { -background-image:url(../../assets/images/folder.png); -background-repeat:no-repeat; -background-position:16px 2px; - margin:.25em 0 0 0; - padding:0 0 0 0; -} - -.structure-toggleme { - margin:0 0 0 3em; - padding:0 0 0 0; - text-decoration:none; -} - -.structure-java{ -background-image:url(../../assets/images/file-java.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .3em 22px; -} - -.structure-file { -background-image:url(../../assets/images/file-generic.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .3em 22px; -} - -.structure-xml { -background-image:url(../../assets/images/file-xml.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .25em 22px; -} - -.structure-img { -background-image:url(../../assets/images/file-image.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .25em 22px; -} - -.structure-manifest { -background-image:url(../../assets/images/file-manifest.png); -background-repeat:no-repeat; - margin:.0 0 0 1.25em; - padding:0 0 0 22px; - text-decoration:none; -} - -#jd-content .structure-toggle-img { - margin:.5em 0 0 0; -padding-right:2.1em; -} - -.dirInfo { - margin-left:2em; -} - -.structure-dir a { - text-decoration:none; -} - -.structure-manifest a { - text-decoration: none; -} -.structure-file a { - text-decoration: none; -} - -.sampleEmbed { - background-color:rgb(249, 249, 249); -} - -.sampleEmbed ol.lineNumbers { - list-style-type: decimal; - padding-left:1em; -} - -.sampleEmbed ol.lineNumbers li { -border-left:1px solid #ddd; -border-right:1px solid #ddd; -color:gray; -background-color:#f7f7f7; -margin:0 0 0 24px; -padding: 2px 2px 2px 6px; -} - -.sampleEmbed ol.lineNumbers li:hover { -background: #efefef; -} - -.samples-nav li a { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* -------------------------------------------------------------------------- -Styles for raw formatted line numbers (not used with listformatted version) -div.sampleLine div.lineNumber { - display: inline; -} -div.sampleLine div.lineCode { - display: inline; - padding-left:6px; -} -div.sampleLine { - padding:0; - margin:0; -}*/ - -/* -------------------------------------------------------------------------- -Butterbar -*/ -#butterbar-wrapper { - position:absolute; - top:0; - left:0; - width:100%; -} -#butterbar { - width:100%; - margin:0 auto; -} -#butterbar-message { - background-color:rgba(255, 187, 51, .4); - font-size:13px; - padding: 5px 0; - text-align:center; -} -a#butterbar-message { - cursor:pointer; - display:block; -} -a#butterbar-message:hover { - text-decoration:underline; -} - -/* -------------------------------------------------------------------------- -Misc -*/ - - -.clearfix:before, .clearfix:after { - content: ""; - display: table -} -.clearfix:after { - clear: both -} -.clearfix { - *zoom: 1 -} -table.blank th, table.blank td { - border: 0; - background: none -} -.caption { - margin: 0.5em 0 2em 0; - color: #000; - font-size: 11.5px; -} - -.nolist, .nolist ul, .nolist ol { - list-style:none; - margin-left:0; -} -#tb .nolist { - margin-left:15px; -} - -dl.xml>dt { - text-transform:uppercase; -} -dl.xml dl.attr { - margin-top:0; -} - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -10px 0 20px; - font-size:13px; - color:#666; -} - -div.figure, -div.figure-right { - float:right; - clear:right; - margin:10px 0 0 0; - padding:0 0 0 20px; - /* width must be defined w/ an inline style matching the image width */ -} - -div.figure-left { - float:left; - clear:left; - margin:10px 0 0 0; - padding:0 20px 0 0; - /* width must be defined w/ an inline style matching the image width */ -} - -img.frame { - border:1px solid #DDD; - padding:4px; -} - -p.table-caption { - margin: 0 0 4px 0; - font-size:13px; - color:#666; -} - -p.code-caption { - margin-bottom: 4px; - font: 12px/1.5 monospace; - color:#666; -} - -div.note, -div.caution, -div.warning { - margin: 0 0 15px; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - padding: 0 0 0 10px; - border-left: 4px solid; -} - -p.note, div.note { - border-color: #258AAF; -} - -p.caution, div.caution { - border-color: #FF8800; -} - -p.warning, div.warning { - border-color: #ff4443; -} - -div.note.design { - border-left: 4px solid #167c80; -} - -div.note.develop { - border-left: 4px solid #F80; -} - -div.note.distribute { - border-left: 4px solid #9C0; -} - -.note p, .caution p, .warning p { - margin:0 0 5px; -} - -.note p:last-child, .caution p:last-child, .warning p:last-child { - margin-bottom:0; -} - -body.about blockquote { - display:block; - float:right; - width:280px; - font-size:20px; - font-style:italic; - line-height:24px; - color:#167c80; - margin:0 0 20px 30px; -} - -div.design-announce p { - margin:0 0 10px; -} - -.expandable { - height:34px; - padding-left:20px; - position:relative; -} -.expandable:before { - content: ''; - background-image: url(../images/styles/disclosure_down.png); - background-repeat:no-repeat; - background-position: -12px -9px; - width: 20px; - height: 20px; - display: inline-block; - position: absolute; - top: 0; - left: 0; } -} -.expandable.expanded:before { - background-image: url(../images/styles/disclosure_up.png); -} - -/* notice box for cross links between Design/Develop docs */ -a.notice-developers-video, -a.notice-developers, -a.notice-designers-video, -a.notice-designers { - float:right; - clear:right; - width:238px; - min-height:50px; - margin:0 0 20px 20px; - border:1px solid #ddd; -} -a.notice-developers-video.wide, -a.notice-developers.wide, -a.notice-designers-video.wide, -a.notice-designers.wide { - width:278px; -} -a.notice-developers-video div, -a.notice-developers div, -a.notice-designers-video div, -a.notice-designers div { - min-height:40px; - background:url('../images/styles/notice-developers@2x.png') no-repeat 10px 10px; - background-size:40px 40px; - padding:10px 10px 10px 60px; -} -a.notice-designers div { - background:url('../images/styles/notice-designers@2x.png') no-repeat 10px 10px; - background-size:40px 40px; -} -a.notice-designers-video div { - background:url('../images/styles/notice-designers-video@2x.png') no-repeat 10px 10px; - background-size:40px 40px; -} -a.notice-developers-video div { - background:url('../images/styles/notice-developers-video@2x.png') no-repeat 10px 10px; - background-size:40px 40px; -} -a.notice-developers-video:hover, -a.notice-developers:hover, -a.notice-designers-video:hover, -a.notice-designers:hover { - background:#eee; -} -a.notice-developers-video h3, -a.notice-developers h3, -a.notice-designers-video h3, -a.notice-designers h3 { - font-size:13px; - line-height:18px; - font-weight:bold; - text-transform:uppercase; - color:#000 !important; - margin:0 0 1px; -} -a.notice-developers-video p, -a.notice-developers p, -a.notice-designers-video p, -a.notice-designers p { - margin:0; - line-height:14px; -} -a.notice-developers-video.left, -a.notice-developers.left, -a.notice-designers-video.left, -a.notice-designers.left { - margin-left:0; - float:left; -} - - -/* hide nested list items; companion to hideNestedLists() */ -.hide-nested li ol, -.hide-nested li ul { - display:none; -} - -a.header-toggle { - display:block; - float:right; - text-transform:uppercase; - font-size:.8em !important; - font-weight:normal; - margin-top:2px; -} - - -/* for IDE instruction toggle (Studio/Eclipse/Other) */ -select.ide { - background: transparent; - border: 1px solid #bbb; - border-left: 0; - border-right: 0; - margin: 10px 0; - padding: 10px 0; - color:#666; -} -select.ide, -select.ide option { - font-family: inherit; - font-size:16px; - font-weight:500; -} -/* hide all except studio by default */ -.select-ide.eclipse, -.select-ide.other { - display:none; -} -/* ... unless studio also includes one of the others */ -.select-ide.studio.eclipse, -.select-ide.studio.other { - display:none; -} - - -/* ----------------------------------------------- -good/bad example containers -*/ - -div.example-block { - background-repeat: no-repeat; - background-position:10px 8px; - background-color:#ccc; - padding:4px; - margin:.8em auto 1.5em 2em; - width:260px; - float:right; -} -/* red container */ -.example-block.bad { - background-image: url(/images/example-bad.png); - background-color:#f4cccc; -} -/* green container */ -.example-block.good { - background-image: url(/images/example-good.png); - background-color:#d9ead3; -} -/* container heading div */ -#jd-content .example-block .heading { - font-weight:bold; - margin:6px 0 9px 36px; - padding:6px auto; -} -/* container image (if any) */ -#jd-content .example-block img { - margin:0; - padding:0px; -} - -.example-block table { - margin:0; -} - -/* ----------------------------------------------- -Dialog box for popup messages -*/ - -div.dialog { - height:0; - margin:0 auto; -} - -div.dialog>div { - z-index:99; - position:fixed; - margin:70px 0; - width: 391px; - height: 200px; - background: #F7F7F7; --moz-box-shadow: 0 0 15px rgba(0,0,0,0.5); --webkit-box-shadow: 0 0 15px rgba(0,0,0,0.5); -box-shadow: 0 0 15px rgba(0,0,0,0.5); -} -/* IE6 can't position fixed */ -* html div.dialog div { position:absolute; } - - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#langMessage, -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - - -div#langMessage>div, -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #999; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#langMessage>div, -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - -div#langMessage .lang { - display:none; -} - -/* -------------------------------------------------------------------------- -Slideshow Controls & Next/Prev -*/ -.slideshow-next, .slideshow-prev { - width: 20px; - height: 36px; - text-indent: -1000em; -} -.slideshow-container { - margin: 2em 0; -} -.slideshow-container:before, .slideshow-container:after { - content: ""; - display: table; - clear: both; -} -a.slideshow-next, a.slideshow-next:visited { - - float: right; - - background: url(../images/arrow-right.png) no-repeat 0 0 - -} - -a.slideshow-prev, a.slideshow-prev:visited { - - float: left; - - background: url(../images/arrow-left.png) no-repeat 0 0 - -} - -.slideshow-next:hover, .slideshow-prev:hover, .slideshow-next:focus, .slideshow-prev:focus { - - background-position: 0 -36px - -} - -.slideshow-next:active, .slideshow-prev:active { - - background-position: 0 -72px - -} -.slideshow-nav { - width: 74px; - margin: 0 auto; -} -.slideshow-nav a, .slideshow-nav a:visited { - display: inline-block; - width: 12px; - height: 12px; - margin: 0 2px 20px 2px; - background: #ccc; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} -.slideshow-nav a:hover, .slideshow-nav a:focus { - - background: #167c80 -} - -.slideshow-nav a:active { - - background: #1e799a; - background: #ebebeb; - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); -} -.slideshow-nav a.active, .slideshow-nav a.active:active, .slideshow-nav a.active:visited { - background: #167c80 -} -/* -------------------------------------------------------------------------- -Tabs -*/ -ul.tabs { - padding: 0; - margin: 2em 0 0 0; -} -ul.tabs:before, ul.tabs:after { - content: ""; - display: table; - clear: both; -} -ul.tabs li { - list-style-type: none; - float: left; -} -ul.tabs li a, ul.tabs li a:active, ul.tabs li a:visited { - display: block; - height: 36px; - line-height: 36px; - padding: 0 15px; - margin-right: 2px; - color: #222; - -moz-border-radius-topleft: 2px; - -moz-border-radius-topright: 2px; - -moz-border-radius-bottomright: px; - -moz-border-radius-bottomleft: px; - -webkit-border-radius: 2px 2px px px; - border-radius: 2px 2px px px; - border-top: solid 1px #ebebeb; - border-left: solid 1px #ebebeb; - border-right: solid 1px #ebebeb; - background-color: #fff; - background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#fafafa)); - background-image: -webkit-linear-gradient(top, #ffffff, #fafafa); - background-image: -moz-linear-gradient(top, #ffffff, #fafafa); - background-image: -ms-linear-gradient(top, #ffffff, #fafafa); - background-image: -o-linear-gradient(top, #ffffff, #fafafa); - background-image: linear-gradient(top, #ffffff, #fafafa); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', -EndColorStr='#fafafa'); -} -ul.tabs li a:hover { - color: #167c80; -} -ul.tabs li a.selected { - height: 37px; - color: #167c80; - background-color: #f7f7f7; - background-image: none; - border-color: #ddd; -} -.tab-content { - padding: 1.2em; - margin: -1px 0 2em 0; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - border: solid 1px #ddd; - background: #f7f7f7; -} -/* -------------------------------------------------------------------------- -Feature Boxes -*/ -.feature-box { - width: 291px; - height: 200px; - position: relative; - background: #F7F7F7; -} -.box-border .top, .box-border .bottom, .box-border .left, .box-border .right { - z-index: 100; - position: absolute; - background-color: #aaa; -} -.box-border .top, .box-border .bottom { - width: 291px; - height: 1px; -} -.dialog .box-border .top, -.dialog .box-border .bottom { width:391px; } - -.box-border .left, .box-border .right { - width: 1px; - height: 8px; -} -.box-border .top { top: 0; left: 0 } -.box-border .top .left { top: 1px; left: 0 } -.box-border .top .right { top: 1px; right: 0 } -.box-border .bottom .left { top: -8px; left: 0 } -.box-border .bottom { top: 200px; left: 0 } -.box-border .bottom .right { top: -8px; right: 0 } - -.feature-box h4, -.dialog h4 { - margin: 15px 18px 10px; - padding:0; -} - -.feature-box p, -.dialog p { - margin: 10px 18px; - padding:0; -} -.feature-box .link, -.dialog .link { - border-top: 1px solid #dedede; - bottom: 0; - position: absolute; - width: inherit; -} -.feature-box a, .feature-box h4, -.dialog a, .dialog h4 { - -webkit-transition: color .4s ease; - -moz-transition: color .4s ease; - -o-transition: color .4s ease; - transition: color .4s ease; -} -.feature-box:hover { - cursor: pointer; -} -.feature-box:hover .box-border .top, .feature-box:hover .box-border .bottom, .feature-box:hover -.left, .feature-box:hover .right { - background-color: #167c80; -} -.feature-box:hover h4, .feature-box:hover a { - color: #167c80; -} -/* -------------------------------------------------------------------------- -Page-Specific Styles -*/ -.colors { - position: relative; - float: left; - width: 92px; - margin: 40px 0 20px; -} -.colors div { - color: #fff; - font-size: 11.5px; - width: 82px; - height: 82px; - margin-top:-30px; - line-height: 82px; - text-align: center; - border: solid 5px #fff; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} - - - - - - - - - - - - - - -/* ########### REFERENCE DOCS ################## */ - -#packages-nav h2, -#classes-nav h2 { - font-size:18px; - margin:0; - padding:0 0 0 4px; -} - -#jd-header { - padding: 0 0 12px; - margin: 20px 0 12px; - font-size:12px; - padding-bottom:12px; - border-bottom:solid 1px #ccc; -} - -#jd-header h1 { - margin:0; - padding:0 0 6px 0; -} - -/* not sure if this is needed in the ref docs, disabling for now -.jd-descr h2 { - margin:16px 0; -} -*/ - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:12px; - margin:20px 0 0; - padding:0 10px 6px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:80%; - font-size: 12px; - line-height:14px; -} - -#api-info-block div.api-level { - font-weight:bold; - font-size:inherit; - float:none; - color:#222; - padding:0; - margin:0; -} - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:12px; - line-height:14px; - background-color:transparent; -} -.jd-inheritance-table tr td { - border: none; - margin: 0; - padding: 0; - background-color:transparent; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - - - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; - background-color:transparent; - font-size:13px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -#jd-content img.jd-expando-trigger-img { - padding:0 4px 4px 0; - margin:0; -} - -.jd-sumtable-subclasses div#subclasses-direct, -.jd-sumtable-subclasses div#subclasses-indirect { - margin:0 0 0 13px; -} - - - -/********* MEMBER REF *************/ - - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} -body.google h4.jd-details-title { - background-color: #FFF; - padding-top:5px; - border-top: 1px solid #ccc; -} -body.google table.jd-sumtable th { - background-color: #FFF; - color:#000; -} - -h4.jd-tagtitle { - margin:0; -} - -h4 .normal { - font-weight:normal; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; - background-color:transparent; - width:auto; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -/* Inline api level indicator for methods */ -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 8px 0; - margin-top:-30px; -} - -table.jd-tagtable td, -table.jd-tagtable th { - background-color:transparent; -} - -table.jd-tagtable th { - color:inherit; -} - - - - - - - - - - - - - - - - - - - - - - - -/* SEARCH FILTER */ - -.menu-container { - position:relative; -} -#search_autocomplete { - font-weight:normal; -} - -.search_filtered_wrapper.reference { - width: 193px; - float: right; -} -.search_filtered_wrapper.docs { - width:875px; - float: left; - position:absolute; - top:26px; - right:66px; -} -.suggest-card { - position:relative; - width:170px; - min-height:90px; - padding:5px; - border: solid 1px #C5C5C5; - background: white; - top: 15px; - margin-right:-5px; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); -} -.suggest-card.reference { - position:absolute; - z-index:999; - min-width:171px; /* +padding and border makes this match input width */ - min-height:93px; /* add 3px because this has 1 not 4px top border */ - width:auto; - top:41px; - margin:0; -} -.suggest-card.develop { - z-index:997; - border-top: solid 4px #F80; - float:right; -} -.suggest-card.design { - z-index:996; - border-top: solid 4px #167c80; - float:right; -} -.suggest-card.distribute { - z-index:995; - border-top: solid 4px #9C0; - float:right; -} -.child-card { - width:100%; -} -.suggest-card.dummy { - width:172px; - float:right; - border:0; - background:transparent; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -ul.search_filtered { - min-width:100%; - list-style: none; - margin: 0 0 5px; - padding: 0; -} -.search_filtered .jd-selected { - background:#efefef; - cursor:pointer; -} -.search_filtered .jd-selected, -.search_filtered .jd-selected a { - color:#09C !important; -} - -.no-display { - display: none; -} - -.search_filtered li.jd-autocomplete { - font-size: 0.81em; - border: none; - margin: 0 0 2px; - padding: 0; - line-height:1.5em; -} - -.search_filtered li a { - padding:0 5px; - color:#222 !important; - display:inline-block; - line-height:12px; -} - -.search_filtered li.header { - font-weight:bold; - color:#444; - border: none; - margin: 8px 0 2px; - padding:1px 5px; - line-height:1.5em; -} -.search_filtered li.header.small { - font-size:0.85em; -} - -.suggest-card.reference -.search_filtered li.header { - color:#aaa; - font-size: 0.81em; -} - -.search_filtered li.header:first-child { - margin: 0 0 2px; -} - -.show-item { - display: table-row; -} -.hide-item { - display: hidden; -} - - - - - -/* SEARCH RESULTS */ - - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; - padding:0; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -#leftSearchControl .gsc-webResult { - padding:0 0 20px 0; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - - -#searchResults { - overflow:hidden; /* because the repositioned page links makes the section think it needs to scroll -(it doesn't) */ - height:auto; -} - -#searchResults .gsc-control { - position:relative; - width:auto; - padding:0 0 10px; -} - -#searchResults .gsc-tabsArea { - position:relative; - white-space:nowrap; - float:left; - width:200px; -} - -#searchResults .gsc-above-wrapper-area { - display:none; -} - -#searchResults .gsc-resultsbox-visible { - float:left; - width:720px; - margin-left:20px; -} - -#searchResults .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; - display:block; -} - -#searchResults h2#searchTitle { - padding:0; - margin:5px 0; - border:none; -} - -#searchResults h2#searchTitle em { - font-style:normal; - color:#167c80; -} - -#searchResults .gsc-table-result { - margin:5px 0 10px 0; - background-color:transparent; -} -#searchResults .gs-web-image-box, .gs-promotion-image-box { - width:120px; -} -#searchResults .gs-web-image-box img.gs-image, .gs-promotion-image-box img.gs-promotion-image { - max-width:120px; -} - -#searchResults .gsc-table-result .gsc-thumbnail { - padding:0 20px 0 0; -} - -#searchResults td { - background-color:transparent; -} - -#searchResults .gsc-expansionArea { - position:relative; -} -#searchResults .gsc-tabsArea .gsc-cursor-box { - width:200px; - padding:20px 0 0 1px; -} -#searchResults .gsc-cursor-page { - display:inline-block; - float:left; - margin:-1px 0 0 -1px; - padding:0; - height:27px; - width:27px; - text-align:center; - line-height:2; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive, -#searchResults .gsc-cursor-page { - text-decoration:none; - color:#258AAF; - border: solid 1px #DADADA; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive:hover, -#searchResults .gsc-cursor-page:hover { - border-color: #DBDBDB; - background-color: #F3F3F3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#F9F9F9), to(#ECECEC)); - background-image: -webkit-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -moz-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -ms-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -o-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: linear-gradient(top, #F9F9F9, #ECECEC); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #167c80; -} - -#searchResults .gsc-tabHeader.gsc-tabhActive, -#searchResults .gsc-tabHeader.gsc-tabhActive:hover, -#searchResults .gsc-cursor-page.gsc-cursor-current-page, -#searchResults .gsc-cursor-page.gsc-cursor-current-page:hover { - color:#fff; - background-color: #09C; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2FADDB), to(#09C)); - background-image: -webkit-linear-gradient(top, #2FADDB, #09C); - background-image: -moz-linear-gradient(top, #2FADDB, #09C); - background-image: -ms-linear-gradient(top, #2FADDB, #09C); - background-image: -o-linear-gradient(top, #2FADDB, #09C); - background-image: linear-gradient(top, #2FADDB, #09C); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#09c'); - border: 1px solid #3990AB; - z-index:100; -} - - - - - -/************ STICKY NAV BAR ******************/ - -#header-wrapper { - background: #f9f9f9; - margin: 0 -10px 0 -10px; - padding: 31px 10px 0px 10px; - position: relative; -} -#header-wrapper #nav-x div.wrap { - max-width: 940px; - height: 38px; -} -#header-wrapper #nav-x ul.nav-x li { - margin-right: 31px !important; - margin-top: 5px; - margin-bottom: 0px; - height: 30px; -} -#header-wrapper #nav-x > div.wrap ul.nav-x li.active { - color: #669900; - border-bottom: 3px solid #669900; -} -#header-wrapper #nav-x > div.wrap ul.nav-x li.active a { - color: #669900; -} -#header-wrapper #nav-x > div.wrap ul.nav-x a { - font-size: 14.5px; -} -#header-wrapper .developer-console-btn { - float: right; - background: #fefefe; - border-radius: 4px; - padding: 8px 14px; - box-shadow: 1px 1px 0px #7a7a7a; - font-size: 14px; - margin-top: -6px; - cursor: pointer; - color: #464646; - margin-right: 20px; -} -/* not currently used */ -#header-wrapper .shadow { - width: 1034px; - height: 4px; - position: absolute; - left: 50%; - margin-left: -517px; - bottom: -4px; - background-image: url(../images/header-shadow.png); -} - -#context { - clear: both; - padding-top: 14px; -} -#context .breadcrumb { - float: left; - margin-bottom: 10px; -} -#context .util { - float: right; - margin-right: 20px; -} - -.breadcrumb { - list-style: none; - margin: 0; - padding: 0; - position: relative; -} -.breadcrumb li { - float: left; - padding: 0 20px 0 0; - color: #000; - white-space: nowrap; -} -.breadcrumb li a { - color: #000; -} -.breadcrumb li:after { - content: url(../images/breadcrumb.png); - position: relative; - top: 1px; - left: 10px; - width: 5px; - height: 10px; -} -.breadcrumb li.current { - font-weight: 700; -} -.breadcrumb li.current:after { - display: none; -} - -/* Sticky Nav overrides */ -.sticky-menu { - position: fixed; - width: 940px; - height: 0px; - z-index: 51; - top: 12px; -} -#sticky-header { - display: none; - padding: 0 10px; - position: fixed; - background: #f9f9f9; - top: 0px; - left: 0px; - right: 0px; - height: 45px; - box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.1); - border-bottom: 1px solid #a5c43a; - z-index: 50; -} -#sticky-header.design { - border-bottom: 1px solid #167c80; -} -#sticky-header.develop { - border-bottom: 1px solid #F80; -} -#sticky-header.distribute { - border-bottom: 1px solid #9C0; -} -#sticky-header.about { - border-bottom: 1px solid #9933CC; -} -#sticky-header > div { - overflow: hidden; - *zoom: 1; - width: 940px; - margin: 0 auto; - clear: both; - padding-top: 9px; -} -#sticky-header > div .logo { - float: left; - width: 26px; - height: 25px; - background: url(../images/dac_logo.png); - background-image: -webkit-image-set(url(../images/dac_logo.png) 1x, url(../images/dac_logo@2x.png) 2x); - z-index: 52; - position: relative; -} -#sticky-header > div .top { - float: left; - width: 38px; - height: 38px; - position: relative; - background: url(../images/styles/gototop.png); - z-index: 52; -} -#sticky-header > div .breadcrumb { - float: left; - padding: 0 0 0 10px; - border-left: 1px solid #d2d2d2; - line-height: 24px; - font-size: 14px; - position: relative; - top: 0px; - z-index: 52; -} - -/* offset the <a name=""> tags to account for sticky nav */ -body.reference a[name] { - visibility: hidden; - display: block; - position: relative; - top: -56px; -} - - -} - - - - - - - -/*********** PREVIOUSLY dac-styles.css ***************/ - - -#header { - border-bottom:0; -} - -#header .wrap { - max-width:940px; - height:41px; - border-bottom:1px solid; - border-color: #ccc; - position:relative; -} - -.about #header .wrap { - border-color: #9933CC; -} - -.design #header .wrap { - border-color: #167c80; -} - -.develop #header .wrap { - border-color: #F80; -} - -.distribute #header .wrap { - border-color: #9C0; -} - -.logo a { - float:left; -} - -#header .logo { - margin-top: -6px; - margin-left: 0px; - margin-bottom:0px; - width: 160px; - padding-right:10px; -} - - -#header-wrap .logo.landing-logo { - width:220px; - margin:0; - padding:0; - margin-bottom:22px; -} -#header-wrap .logo.landing-logo img { - padding:0 0 0 10px; -} - -.search { - height:25px; - margin-top: -3px; - margin-bottom: 0px; -} - - - -/* Quicknav */ -.btn-quicknav { - width:20px; - height:28px; - float:left; - margin-left:6px; - padding-right:10px; - position:relative; - cursor:pointer; - border-right:1px solid #CCC; -} - -.btn-quicknav a { - zoom:1; - position:absolute; - top:13px; - left:5px; - display:block; - text-indent:-9999em; - width:10px; - height:5px; - background:url(../images/quicknav_arrow.png) no-repeat; -} - -.btn-quicknav a.arrow-active { - background-position: 0 -5px; - display:none; -} - -#header-wrap.quicknav a.arrow-inactive { - display:none; -} - -.btn-quicknav.active a.arrow-active { - display:block; -} - -.nav-x li { - display:block; - float:left; - margin-right:45px; - -webkit-transition: all 0.25s linear; - -moz-transition: all 0.25s linear; - -ms-transition: all 0.25s linear; - -o-transition: all 0.25s linear; - transition: all 0.25s linear; -} - -#header-wrap.quicknav .nav-x li { - min-width:160px; - margin-right:20px; -} - -#header-wrap.quicknav li.last { - margin-right:0px; -} - -#quicknav { - float:none; - clear:both; - margin-left:0; - margin-top:-30px; - display:none; - overflow:hidden; -} - -#header-wrap.quicknav #quicknav { - -} - -#quicknav ul { - margin:10px 0; - padding:0; -} - -#quicknav ul li.about { - border-top:1px solid #9933CC; -} - -#quicknav ul li.design { - border-top:1px solid #167c80; -} - -#quicknav ul li.develop { - border-top:1px solid #FF8800; -} - -#quicknav ul li.distribute { - border-top:1px solid #99cc00; -} - -#quicknav ul li { - display:block; - float:left; - margin:0 20px 0 0; - min-width:140px; -} - -#quicknav ul li.last { - margin-right:0px; -} - -#quicknav ul li ul li { - float:none; -} - -#quicknav ul li ul li a { - color:#222; -} - -#quicknav ul li li ul, -#quicknav ul li li ul li { - margin:0; -} - -#quicknav ul li li ul li:before { - content:"\21B3"; -} - -#header-wrap { - -webkit-transition: all 0.25s ease-out; - -moz-transition: all 0.25s ease-out; - -ms-transition: all 0.25s ease-out; - -o-transition: all 0.25s ease-out; - transition: all 0.25s ease-out; - -} - -#header-wrap.quicknav { - height:216px; - -} - -/* SEARCH AND MORE */ -.search { - position: absolute; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - z-index:100; - right:54px; - -webkit-transition: width 0.4s ease; - -moz-transition: width 0.4s ease; - -o-transition: width 0.4s ease; - transition: width 0.4s ease; -} - -.search #search-btn { - width:50px; - height:28px; - background:url(../images/icon_search.png) no-repeat; - float:left; -} - -.search-inner { - width:245px; -} - -.search:hover, .search.active { - width:245px; -} - -.search .bottom, .search .left, .search .right { - position: absolute; - background-color: #a2a2a2 -} - -.search .bottom { - width: 214px; - height: 1px; - top: 24px; - left: 0 -} - -.search .left, .search .right { - height: 5px; - width: 1px -} - -.search .left { - top: 22px; - left: 56px; - background-color:#CCC; -} - -.search .right { - top: 22px; - left: 238px; - background-color:#CCC; -} - -.search form { - margin-top: 2px; - width: 162px; - float:left; -} - -.search form input { - color: #2f2f2f; - font-size: 0.95em; - width: 178px; - border: none; - margin-left: 6px; - z-index: 1500; - position: relative; - background-color: transparent; - border-bottom:1px solid #CCC; - padding:0 0 0 4px; - outline:none; - height:24px; -} - -.search:hover form input { - border-bottom:1px solid #167c80; -} - -.search:hover .bottom, .search:hover .left, .search:hover .right { - background-color: #167c80; -} - -.search:hover #search-btn { - background-position: 0 -28px -} - -.search form input:focus { - color: #222; - font-weight: bold -} - -.moremenu { - float: right; - position: relative; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - -webkit-transition: width 0.25s ease; - -moz-transition: width 0.25s ease; - -o-transition: width 0.25s ease; - transition: width 0.25s ease; -} - -.moremenu #more-btn { - width:40px; - height:28px; - background:url(../images/icon_more.png) no-repeat; - border-left:1px solid #CCC; - float:left; - cursor:pointer; -} - -.moremenu:hover #more-btn { - background-position:0 -28px; -} - -.morehover { - position:absolute; - right:6px; - top:-9px; - width:40px; - height:35px; - z-index:99; - overflow:hidden; - - -webkit-opacity:0; - -moz-opacity:0; - -o-opacity:0; - opacity:0; - - -webkit-transform-origin:100% 0%; - -moz-transform-origin:100% 0%; - -o-transform-origin:100% 0%; - transform-origin:100% 0%; - - -webkit-transition-property: -webkit-opacity; - -webkit-transition-duration: .25s; - -webkit-transition-timing-function:ease; - - -moz-transition-property: -moz-opacity; - -moz-transition-duration: .25s; - -moz-transition-timing-function:ease; - - -o-transition-property: -o-opacity; - -o-transition-duration: .25s; - -o-transition-timing-function:ease; - - transition-property: opacity; - transition-duration: .25s; - transition-timing-function:ease; -} - -.morehover:hover, -.morehover.hover { - opacity:1; - height:385px; - width:268px; - -webkit-transition-property:height, -webkit-opacity; -} - -.morehover .top { - width:268px; - height:39px; - background:url(../images/more_top.png) no-repeat; -} - -.morehover .mid { - width:228px; - background:url(../images/more_mid.png) repeat-y; - padding:10px 20px 0 20px; -} - -.morehover .mid .header { - border-bottom:1px solid #ccc; - font-weight:bold; -} - -.morehover .bottom { - width:268px; - height:6px; - background:url(../images/more_bottom.png) no-repeat; -} - -.morehover ul { - margin:10px 10px 20px 0; -} - -.morehover ul li { - list-style:none; -} - -.morehover ul li.active a, -.morehover ul li.active a:hover { - color:#222 !important; -} - -.morehover ul li.active img { - margin-right:4px; -} - - - - -/* MARQUEE */ -.slideshow-container { - width:100%; - overflow:hidden; - position:relative; -} -.slideshow-container .slideshow-prev { - position:absolute; - top:50%; - left:0px; - margin-top:-36px; - z-index:99; -} -.slideshow-container .slideshow-next { - position:absolute; - top:50%; - margin-top:-36px; - z-index:99; - right:0px; -} - -.slideshow-container .pagination { - position:absolute; - bottom:20px; - width:100%; - text-align:center; - z-index:99; -} -.slideshow-container .pagination ul { - margin:0; -} -.slideshow-container .pagination ul li{ - display: inline-block; - width:12px; - height:12px; - text-indent:-8000px; - list-style:none; - margin: 0 2px; - border-radius:6px; - background-color:#ccc; - cursor:pointer; - -webkit-transition:color .5s ease-in; - -moz-transition:color .5s ease-in; - -o-transition:color .5s ease-in; - transition:color .5s ease-in; -} -.slideshow-container .pagination ul li:hover { - background-color:#999; -} -.slideshow-container .pagination ul li.active { - background-color:#167c80; -} -.slideshow-container .pagination ul li.active:hover { - background-color:#167c80; -} -.slideshow-container ul li { - display:inline; - list-style:none; -} - - -#landing h1 { - margin:17px 0 20px 0 !important; -} - -a.download-sdk { - float:right; - margin:-10px 0; - height:30px; - padding-top:4px; - padding-bottom:0px; -} - -#nav-x { - padding-top: 13px; -} - -#nav-x .wrap { - min-height:32px; -} - -#nav-x .wrap, -#searchResults.wrap { - max-width:940px; - border-bottom:1px solid #CCC; -} - -#searchResults.wrap #leftSearchControl { - min-height:700px -} -.nav-x { - margin-left:0; - margin-bottom:0; -} - - - - - - - - - - -/* - * CSS Styles that are needed by jScrollPane for it to operate correctly. - */ - -.jspContainer { - overflow: hidden; - position: relative; -} - -.jspPane { - position: absolute; - width:100% !important; /* to avoid cut-off api names in reference in horiz scroll */ -} - -.jspVerticalBar { - position: absolute; - top: 0; - right: 0; - width: 4px; - height: 100%; - background: #f5f5f5; -} - -.jspHorizontalBar { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 4px; - background: #f5f5f5; -} - -.jspVerticalBar *, -.jspHorizontalBar * { - margin: 0; - padding: 0; -} -.jspCap { - display: block; -} - -.jspVerticalBar .jspCap { - height: 4px; -} - -.jspHorizontalBar .jspCap { - width: 0; - height: 100%; -} - -.jspHorizontalBar .jspCap { - float: left; -} - -.jspTrack { - position: relative; -} - -.jspDrag { - background: #bbb; - position: relative; - top: 0; - left: 0; - cursor: pointer; -} - -.jspDrag:hover, -.jspDrag:active { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, right top, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: linear-gradient(left, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', EndColorStr='#4cadcb'); -} - -.jspHorizontalBar .jspTrack, -.jspHorizontalBar .jspDrag { - float: left; - height: 100%; -} - -.jspArrow { - background: #999; - text-indent: -20000px; - display: block; - cursor: pointer; -} - -.jspArrow.jspDisabled { - cursor: default; - background: #ccc; -} - -.jspVerticalBar .jspArrow { - height: 16px; -} - -.jspHorizontalBar .jspArrow { - width: 16px; - float: left; - height: 100%; -} - -.jspVerticalBar .jspArrow:focus { - outline: none; -} - -.jspCorner { - float: left; - height: 100%; -} - -/* Yuk! CSS Hack for IE6 3 pixel bug :( */ -* html .jspCorner { - margin: 0 -3px 0 0; -} -/******* end of jscrollpane *********/ - - - - - -/************ DEVELOP HOMEPAGE ******************/ - -/* Slideshow */ -.slideshow-develop { - height: 316px; - width: 940px; - position: relative; - overflow:hidden; -} -.slideshow-develop .frame { - width: 940px; - height: 316px; -} -.slideshow-develop img.play { - max-width:350px; - max-height:240px; - margin:20px 0 0 90px; - -webkit-transform: perspective(800px ) rotateY( 35deg ); - box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -moz-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); -} -.slideshow-develop img.play.no-shadow { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} -.slideshow-develop img.play.no-transform { - -webkit-transform: none; -} -.slideshow-develop a.slideshow-next { - background: url(../images/arrow-right-develop.png); -} -.slideshow-develop a.slideshow-prev { - background: url(../images/arrow-left-develop.png); -} -.slideshow-develop .content-right { - float: left; -} -.slideshow-develop .content-right h2 { - padding:0; - margin-bottom:10px; - border:none; - font-size:24px; -} -.slideshow-develop .item { - height: 300px; - width: 940px; -} -.slideshow-develop .pagination ul li.active { - background-color: #F80; -} -.slideshow-develop .pagination ul li.active:hover { - background-color: #F80; -} -.slideshow-develop .item hr { - margin:5px 0 10px; -} -.slideshow-develop .item p { - margin:10px 0; -} -.slideshow-develop .item p.title-intro { - position:absolute; - margin:0; -} - -/* Feeds */ -.feed ul { - margin: 0; -} -.feed .feed-nav { - height: 25px; - border-bottom: 1px solid #CCC; -} -.feed .feed-nav li { - list-style: none; - float: left; - height: 21px; /* +4px bottom border = 25px; same as .feed-nav */ - margin-right: 25px; - cursor: pointer; -} -.feed .feed-nav li.active { - color: #000; - border-bottom: 4px solid #F80; -} -.feed .feed-container { - overflow: hidden; - width: 460px; -} -.feed .feed-container .feed-frame { - width: 1000px; -} -.feed .feed-container .feed-frame ul { - float: left; - width:460px; -} -.feed .feed-container .feed-frame ul ul { - float: none; - margin:10px 0 0 30px; -} -.feed .feed-container .feed-frame li { - list-style: none; - margin: 20px 0 20px 0; - width: 460px; - height:93px; -} -.feed .feed-container .feed-frame li.playlist { - height:auto; -} -.feed .feed-container .feed-frame li.playlist a { - height:93px; - display:block; -} -.feed .feed-container .feed-frame li.more { - height:20px; - margin:10px 0 5px 5px; -} -.feed .feed-container .feed-frame li.more a { - height:inherit; -} -.feed .feed-container .feed-frame li.playlist-video { - list-style: none; - margin: 0; - width: 460px; - height:55px; - font-size:12px; -} -.feed .feed-container .feed-frame li.playlist-video a { - height:45px; - padding:5px; -} -.feed .feed-container .feed-frame li.playlist-video h5 { - font-size:12px; - line-height:13px; - margin:0; -} -.feed .feed-container .feed-frame li.playlist-video p { - margin:5px 0 0; - line-height:15px; -} -.feed-container .feed-frame div.feed-image { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; - background:url('../images/blog-default.png') no-repeat 0 0; - background-size:180px; -} -#jd-content .feed .feed-container .feed-frame li img { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; -} -#jd-content .feed .feed-container .feed-frame li.playlist-video img { - width:inherit; - height:inherit; -} - -.feed .feed-container .feed-frame li a, -.feed .feed-container .feed-frame li a:active { - color:#555 !important; -} - -.feed .feed-container .feed-frame li a:hover, -.feed .feed-container .feed-frame li a:hover * { - color:#7AA1B0 !important; -} - -/* Video player */ -#player-wrapper { - display:none; - margin: -1px auto 0; - position: relative; - width: 940px; - height: 0px; -} -#player-frame { - background: #EFEFEF; - border: 1px solid #CCC; - padding: 0px 207px; - z-index: 10; /* stay above marque, but below search suggestions */ - width: 525px; - height: 330px; - position: relative; -} - - - -/************ DEVELOP TOPIC CONTAINERS ************/ - -.landing-banner, -.landing-docs { - margin:20px 0; -} -.landing-banner > div:first-child, -.landing-docs > div:first-child, -.landing-docs > .col-12 { - margin-left:0; - min-height:280px; -} -.landing-banner.short > div { - min-height:50px; -} -.landing-banner > div:last-child, -.landing-docs > div:last-child, -.landing-docs > .col-12 { - margin-right:0; -} - -.landing-banner > div > *:last-child { - margin-bottom:0; -} -.landing-banner h1 { - margin-top:16px; - padding-bottom:24px; -} -.landing-docs, -.landing-banner { - clear:both; - overflow:hidden; -} -.landing-docs h3 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:1px solid #CCC; - margin:0 0 20px; -} -.landing-docs a { - color:#333 !important; -} - -.landing-docs a:hover, -.landing-docs a:hover * { - color:#0C4446 !important -} - -.landing-docs .normal-links a { - color:#167c80 !important; -} - -.plusone { - float:right; -} - - - -.next-docs { - border-top:1px solid #ccc; - margin:40px 0 0; - padding:5px 0 0; - clear:left; - overflow:hidden; -} -.next-docs div:first-child { - margin-left:0; -} -.next-docs div:last-child { - margin-right:0; -} - -.next-docs h2 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:none; - margin:0 0 1em; - padding:5px 0 0; -} - - - -/************* HOME/LANDING PAGE *****************/ - -.slideshow-home { - height: 500px; - width: 940px; - border-bottom: 1px solid #CCC; - position: relative; - margin: 0; -} -.slideshow-home .frame { - width: 940px; - height: 500px; -} -.slideshow-home .content-left { - float: left; - text-align: center; - vertical-align: center; - margin: 0 0 0 35px; -} -.slideshow-home .content-right { - margin: 80px 0 0 0; -} -.slideshow-home .content-right p { - margin-bottom: 10px; -} -.slideshow-home .content-right p:last-child { - margin-top: 15px; -} -.slideshow-home .content-right h1 { - padding:0; -} -.slideshow-home .item { - height: 500px; - width: 940px; -} -.home-sections { - padding: 30px 20px 20px; - margin: 20px 0; - background: -webkit-linear-gradient(top, #F6F6F6,#F9F9F9); -} -.home-sections ul { - margin: 0; -} -.home-sections ul li { - float: left; - display: block; - list-style: none; - width: 170px; - height: 35px; - border: 1px solid #ccc; - background: white; - margin-right: 10px; - border-radius: 1px; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - box-shadow: 1px 1px 5px #EEE; - -webkit-box-shadow: 1px 1px 5px #EEE; - -moz-box-shadow: 1px 1px 5px #EEE; - background: white; -} -.home-sections ul li:hover { - background: #F9F9F9; - border: 1px solid #CCC; -} -.home-sections ul li a, -.home-sections ul li a:hover { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width: 100%; - text-align: center; - color: #09c !important; -} -.home-sections ul li a { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width:100%; - text-align:center; -} -.home-sections ul li img { - float: left; - margin: -8px 0 0 10px; -} -.home-sections ul li.last { - margin-right: 0px; -} -.fullpage #footer { - margin-top: -40px; -} - -/************ DISTRIBUTE PAGES ******************/ - -.article-detail #body-content { - padding-top: 10px; -} - -/* A container for grid sets with uppercase h3 and rule */ -.dynamic-grid h3 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:1px solid #CCC; - padding:8px 0 0 1px; - margin-bottom:14px; - clear:both; -} - -.top-right-float { - float: right; -} - -.clearfloat { - float: none; - clear: both; -} - -.border-img { - border: 1px solid #CCC; -} - -.center-img { - margin: auto; - text-align: center; -} -.center-img img { - margin-bottom: 15px; -} - -.figure img, .border-img { - margin-bottom: 15px; -} - -/************ RESOURCE CARDS ******************/ - -/* Resource cards, 12, 13, 16-col */ - -/* Basic card-styling with shadow */ -.resource-card { - border-radius: 1px; - box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.12); - background: #fefefe; -} - -/* Styling for background image including tinting and section icons in stacks */ -.card-bg { - display: block; - position: absolute; - vertical-align: top; - width: 100%; - left: 0; - top: 0; - background-size: cover; - background-repeat: no-repeat; - background-position: center; - background-image: url(../images/resource-card-default-android.jpg); -} -.card-bg:after { - content: ""; - display: block; - height: 100%; - width: 100%; - opacity: 1; - background: rgba(0, 0, 0, 0.2); - -webkit-transition: opacity 0.5s; - -moz-transition: opacity 0.5s; - -o-transition: opacity 0.5s; - transition: opacity 0.5s; -} -.static .card-bg:after { - display:none; -} -.card-bg .card-section-icon { - position: absolute; - top: 50%; - width: 100%; - margin-top: -35px; - text-align: center; - padding-top: 65px; - z-index: 100; -} -.card-bg .card-section-icon .icon { - position: absolute; - left: 50%; - margin-left: -28px; - top: 0px; - width: 56px; - height: 56px; - background-repeat: no-repeat; - background-position: 50% 50%; - background-image: url(../images/stack-icon.png); -} -.card-bg .card-section-icon .section { - text-transform: uppercase; - color: white; - font-size: 14px; -} - -.card-info { - position: absolute; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - top: 0; - right: 0; - bottom: 0; - left: 0; - overflow: hidden; - background: #fefefe; - padding: 4px 12px 6px 12px; -} -.card-info .section { - text-transform: uppercase; - color: #898989; - font-size: 12px; - margin-bottom: 1px; -} -.card-info .title { - color: #363636; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-bottom: 5px; - margin-bottom: -2px; - font-size: 16px; -} -.card-info .description { - overflow: hidden; -} -.card-info .description .text { - color: #464646; - font: 13px/15px Roboto Condensed; - overflow: hidden; - width:100%; -} -.card-info .description .util { - position: absolute; - right: 5px; - bottom: 70px; /*-2px;*/ - opacity: 0; - -webkit-transition: opacity 0.5s; - -moz-transition: opacity 0.5s; - -o-transition: opacity 0.5s; - transition: opacity 0.5s; -} -.card-info.empty-desc .title { - white-space: normal; - overflow: visible; -} -.card-info.empty-desc .description { - display: none; -} -/* Truncate card summaries at bounding box and - * and apply ellipsis at lower right */ -.ellipsis { - overflow: hidden; - float:right; - line-height: 15px; - width:100%; -} -.resource-card-6x6 .card-info .description .teddddddxt { - float:left; - position:relative; - margin-left:0; -} -.ellipsis:before { - content:""; - float: left; - width: 5px; - height:100%; -} -.ellipsis > *:first-child.text { - float: right; - width: 100% !important; - margin-left: -5px; -} -.ellipsis:after { - content: "\02026"; - height:17px; - padding-bottom:4px; - - box-sizing: content-box; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - - float: right; position: relative; - top: -16px; left: 100%; - width: 4em; margin-left: -4em; - padding-right: 5px; - - background: -webkit-gradient(linear, left top, right top, - from(rgba(255, 255, 255, 0)), to(white), color-stop(65%, white)); - background: -moz-linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white); - background: -o-linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white); - background: -ms-linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white); - background: linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white); -} -.ellipsis:after { - font-style: normal; color: #aaa; - font-size:13px; - text-align: right; -} - -/* Flow Layout */ -.resource-flow-layout { - display: inline-block; -} -.resource-flow-layout .resource-card, .resource-flow-layout .resource-card-stack { - float: left; - position: relative; -} -.resource-flow-layout .resource-card-stack > .resource-card { - margin-right: 0px !important; -} -.resource-flow-layout:after { - content: "."; - display: block; - height: 0; - position:relative; - clear: both; - visibility: hidden; -} -.resource-card:hover { - cursor: pointer; -} -.static .resource-card:hover { - cursor: auto; -} -.resource-card:hover .card-bg:after { - opacity: 0; -} -/* disabled to make way for fade/ellipsis truncation, - and the plusone moves up. -.resource-card:hover .card-info .description .text { - padding-right: 70px; -} */ -.resource-card:hover .card-info .description .util { - opacity: 1; -} - -/* Carousel Layout */ -/* Carousel styles for landing page */ -.resource-carousel-layout { - margin: 20px 0 20px 0; - position: relative; - overflow: hidden; -} -.resource-carousel-layout .slideshow-prev, .resource-carousel-layout .slideshow-next { - display: none; -} -.resource-carousel-layout .pagination { - bottom: 0px; -} -.resource-carousel-layout .frame li { - position: relative; -} -.resource-carousel-layout .frame li .card-bg { - height: 300px; -} -.resource-carousel-layout .frame li .card-info { - padding: 7px 15px 0px 15px; - top: 300px; -} -.resource-carousel-layout .frame li .card-info .section { - font-size: 13px; - margin-bottom: 7px; -} -.resource-carousel-layout .frame li .card-info .title { - font-size: 25px; - margin-bottom: 2px; -} -.resource-carousel-layout .frame li .card-info .description { - font-family: 15px/16px Roboto Condensed, sans-serif; -} -.resource-carousel-layout .frame li .card-info .description .text { - height: 40px; -} -.resource-carousel-layout .frame li .card-info .description .util { - bottom:97px; - right:4px; -} - -/* Stack Layout */ -.resource-stack-layout { - display: inline-block; -} -.resource-stack-layout .resource-card-stack { - float: left; - position: relative; -} -.resource-stack-layout .resource-card { - margin-bottom: 20px; - display: block; - position: relative; -} -.resource-stack-layout .section-card-menu > .card-info .section, .resource-stack-layout .section-card > .card-info .title { - /*text-transform: uppercase;*/ - color: #898989; - font-size: 17px; - line-height: 24px; - margin-bottom: 6px; -} -.resource-stack-layout .section-card { - height: 284px; -} -.resource-stack-layout .section-card > .card-bg { - height: 192px; -} -.resource-stack-layout .section-card > .card-info { - padding: 4px 12px 6px 12px; - top: 192px; -} -.resource-stack-layout .section-card > .card-info .section { - display: none; -} -.resource-stack-layout .section-card > .card-info .title { - font-size: 17px; - border-bottom: 1px solid #959595; - padding-bottom: 0px; -} -.resource-stack-layout .section-card > .card-info .description { - font-size: 13px; - line-height: 15px; -} -.resource-stack-layout .section-card > .card-info .description .text { - height: 30px; -} -.resource-stack-layout .related-card { - height: 90px; -} -.resource-stack-layout .related-card > .card-bg { - left: 0; - top: 0; - width: 90px; - height: 100%; - position: absolute; - display: block; -} -.resource-stack-layout .related-card > .card-info { - left: 90px; - padding: 4px 12px 4px 12px; -} -.resource-stack-layout .related-card > .card-info .section { - font-size: 12px; - margin-bottom: 1px; - display: none; -} -.resource-stack-layout .related-card > .card-info .title { - font-size: 16px; - margin-bottom: -2px; - white-space: normal; - overflow: visible; - text-overflow: ellipsis; -} -.resource-stack-layout .related-card > .card-info .title:after { - content: url(../images/link-out.png); - display: block; -} -.resource-stack-layout .related-card > .card-info .description { - display: none; -} -.resource-stack-layout .section-card-menu { - /* Flexible height */ - display: block; - height: auto; - width: auto; -} -.resource-stack-layout .section-card-menu .card-bg { - height: 155px; - /* Flexible height */ - position: relative; - display: inline-block; - vertical-align: top; -} -.resource-stack-layout .section-card-menu .card-info { - padding: 4px 12px 0px 12px; - /* Flexible height */ - position: relative; - left: auto; - top: auto; - right: auto; - bottom: auto; -} -.resource-stack-layout .section-card-menu .card-info ul { - list-style: none; - margin: 0; -} -.resource-stack-layout .section-card-menu .card-info ul li { - list-style: none; - margin: 0; - padding: 15px 0; - border-top-width: 1px; - border-top-style: solid; - border-top-color: #959595; -} -.resource-stack-layout .section-card-menu .card-info ul li a, .resource-stack-layout .section-card-menu .card-info ul li a:focus, .resource-stack-layout .section-card-menu .card-info ul li a:link, .resource-stack-layout .section-card-menu .card-info ul li a:visited, .resource-stack-layout .section-card-menu .card-info ul li a:active, .resource-stack-layout .section-card-menu .card-info ul li a:hover { - color: #363636 !important; -} -.resource-stack-layout .section-card-menu .card-info ul li:first-child { - border-top: none; -} -.resource-stack-layout .section-card-menu .card-info ul li:hover .title:after { - opacity: 1; - -webkit-transition: opacity 0.5s; - -moz-transition: opacity 0.5s; - -o-transition: opacity 0.5s; - transition: opacity 0.5s; -} -.resource-stack-layout .section-card-menu .card-info ul li:hover .description { - max-height: 30px; - opacity: 1; - -webkit-transition: max-height 0.5s, opacity 1s; - -moz-transition: max-height 0.5s, opacity 1s; - -o-transition: max-height 0.5s, opacity 1s; - transition: max-height 0.5s, opacity 1s; -} -.resource-stack-layout .section-card-menu .card-info .title { - font-size: 16px; - margin-bottom: -2px; - position: relative; -} -.resource-stack-layout .section-card-menu .card-info .title:after { - background: url(../images/stack-arrow-right.png); - content: ''; - opacity: 0; - -webkit-transition: opacity 0.25s; - -moz-transition: opacity 0.25s; - -o-transition: opacity 0.25s; - transition: opacity 0.25s; - position: absolute; - right: 0px; - top: 3px; - width: 10px; - height: 15px; -} -.resource-stack-layout .section-card-menu .card-info .title.more { - text-transform: uppercase; - color: #898989; - display: inline-block; -} -.resource-stack-layout .section-card-menu .card-info .title.more:after { - background: url(../images/stack-arrow-right.png); - content: ''; - display: block; - position: absolute; - right: -20px; - top: 3px; - width: 10px; - height: 15px; -} -.resource-stack-layout .section-card-menu .card-info .description { - max-height: 0px; - opacity: 0; - overflow: hidden; - font-size: 13px; - line-height: 15px; - /* Hover off */ - -webkit-transition: max-height 0.5s, opacity 0.5s; - -moz-transition: max-height 0.5s, opacity 0.5s; - -o-transition: max-height 0.5s, opacity 0.5s; - transition: max-height 0.5s, opacity 0.5s; -} -.resource-stack-layout .section-card-menu .card-info .description .text { - height: 30px; -} -.resource-stack-layout:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; -} - -/* Generate the flow layout styles for a 3-column 16-col span */ -.resource-flow-layout.col-16 { - margin: 0 -14px 0 0; - width: 954px; -} -.resource-flow-layout.col-16 .resource-card, .resource-flow-layout.col-16 .resource-card-stack { - margin: 0 14px 20px 0; -} -.resource-flow-layout.col-16 .resource-card-row-stack-last { - margin-bottom: 0px !important; -} -.resource-flow-layout.col-16 .resource-card-col-stack-last { - margin-bottom: 0px !important; -} -.resource-flow-layout.col-16 .resource-card-3x6 { - width: 145px; - height: 284px; -} -.resource-flow-layout.col-16 .resource-card-3x12 { - width: 145px; - height: 588px; -} -.resource-flow-layout.col-16 .resource-card-3x18 { - width: 145px; - height: 892px; -} -.resource-flow-layout.col-16 .resource-card-6x6 { - width: 304px; - height: 284px; -} -.resource-flow-layout.col-16 .resource-card-6x12 { - width: 304px; - height: 588px; -} -.resource-flow-layout.col-16 .resource-card-6x18 { - width: 304px; - height: 892px; -} -.resource-flow-layout.col-16 .resource-card-9x6 { - width: 463px; - height: 284px; -} -.resource-flow-layout.col-16 .resource-card-9x12 { - width: 463px; - height: 588px; -} -.resource-flow-layout.col-16 .resource-card-9x18 { - width: 463px; - height: 892px; -} -.resource-flow-layout.col-16 .resource-card-12x6 { - width: 622px; - height: 284px; -} -.resource-flow-layout.col-16 .resource-card-12x12 { - width: 622px; - height: 588px; -} -.resource-flow-layout.col-16 .resource-card-12x18 { - width: 622px; - height: 892px; -} -.resource-flow-layout.col-16 .resource-card-15x6 { - width: 781px; - height: 284px; -} -.resource-flow-layout.col-16 .resource-card-15x12 { - width: 781px; - height: 588px; -} -.resource-flow-layout.col-16 .resource-card-15x18 { - width: 781px; - height: 892px; -} -.resource-flow-layout.col-16 .resource-card-18x6 { - width: 940px; - height: 284px; -} -.resource-flow-layout.col-16 .resource-card-18x12 { - width: 940px; - height: 420px; -} -.resource-flow-layout.col-16 .resource-card-18x18 { - width: 940px; - height: 892px; -} -.resource-flow-layout.col-16 .resource-card-3x2 { - width: 145px; - height: 95px; -} -.resource-flow-layout.col-16 .resource-card-3x2x3 { - width: 145px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-16 .resource-card-3x3 { - width: 145px; - height: 142px; -} -.resource-flow-layout.col-16 .resource-card-3x3x2 { - width: 145px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-16 .resource-card-6x2 { - width: 304px; - height: 95px; -} -.resource-flow-layout.col-16 .resource-card-6x2x3 { - width: 304px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-16 .resource-card-6x3 { - width: 304px; - height: 142px; -} -.resource-flow-layout.col-16 .resource-card-6x3x2 { - width: 304px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-16 .resource-card-9x2 { - width: 463px; - height: 95px; -} -.resource-flow-layout.col-16 .resource-card-9x2x3 { - width: 463px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-16 .resource-card-9x3 { - width: 463px; - height: 142px; -} -.resource-flow-layout.col-16 .resource-card-9x3x2 { - width: 463px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-16 .resource-card-12x2 { - width: 622px; - height: 95px; -} -.resource-flow-layout.col-16 .resource-card-12x2x3 { - width: 622px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-16 .resource-card-12x3 { - width: 622px; - height: 142px; -} -.resource-flow-layout.col-16 .resource-card-12x3x2 { - width: 622px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-16 .resource-card-15x2 { - width: 781px; - height: 95px; -} -.resource-flow-layout.col-16 .resource-card-15x2x3 { - width: 781px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-16 .resource-card-15x3 { - width: 781px; - height: 142px; -} -.resource-flow-layout.col-16 .resource-card-15x3x2 { - width: 781px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-16 .resource-card-18x2 { - width: 940px; - height: 95px; -} -.resource-flow-layout.col-16 .resource-card-18x2x3 { - width: 940px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-16 .resource-card-18x3 { - width: 940px; - height: 142px; -} -.resource-flow-layout.col-16 .resource-card-18x3x2 { - width: 940px; - height: 138px; - margin-bottom: 8px; -} - -/* Generate the flow layout styles for a 3-column 16-col span */ -.resource-flow-layout.col-12 { - margin: 0 -14px 0 0; - width: 714px; -} - -.resource-flow-layout.col-12 .resource-card, .resource-flow-layout.col-12 .resource-card-stack { - margin: 0 14px 20px 0; -} -.resource-flow-layout.col-12 .resource-card-row-stack-last { - margin-bottom: 0px !important; -} -.resource-flow-layout.col-12 .resource-card-col-stack-last { - margin-bottom: 0px !important; -} -.resource-flow-layout.col-12 .resource-card-3x6 { - width: 105px; - height: 284px; -} -.resource-flow-layout.col-12 .resource-card-3x12 { - width: 105px; - height: 588px; -} -.resource-flow-layout.col-12 .resource-card-3x18 { - width: 105px; - height: 892px; -} -.resource-flow-layout.col-12 .resource-card-6x6 { - width: 224px; - height: 284px; -} -.resource-flow-layout.col-12 .resource-card-6x12 { - width: 224px; - height: 588px; -} -.resource-flow-layout.col-12 .resource-card-6x18 { - width: 224px; - height: 892px; -} -.resource-flow-layout.col-12 .resource-card-9x6 { - width: 343px; - height: 284px; -} -.resource-flow-layout.col-12 .resource-card-9x12 { - width: 343px; - height: 588px; -} -.resource-flow-layout.col-12 .resource-card-9x18 { - width: 343px; - height: 892px; -} -.resource-flow-layout.col-12 .resource-card-12x6 { - width: 462px; - height: 284px; -} -.resource-flow-layout.col-12 .resource-card-12x12 { - width: 462px; - height: 588px; -} -.resource-flow-layout.col-12 .resource-card-12x18 { - width: 462px; - height: 892px; -} -.resource-flow-layout.col-12 .resource-card-15x6 { - width: 581px; - height: 284px; -} -.resource-flow-layout.col-12 .resource-card-15x12 { - width: 581px; - height: 588px; -} -.resource-flow-layout.col-12 .resource-card-15x18 { - width: 581px; - height: 892px; -} -.resource-flow-layout.col-12 .resource-card-18x6 { - width: 700px; - height: 284px; -} -.resource-flow-layout.col-12 .resource-card-18x12 { - width: 700px; - height: 420px; -} -.resource-flow-layout.col-12 .resource-card-18x18 { - width: 700px; - height: 892px; -} -.resource-flow-layout.col-12 .resource-card-3x2 { - width: 105px; - height: 95px; -} -.resource-flow-layout.col-12 .resource-card-3x2x3 { - width: 105px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-12 .resource-card-3x3 { - width: 105px; - height: 142px; -} -.resource-flow-layout.col-12 .resource-card-3x3x2 { - width: 105px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-12 .resource-card-6x2 { - width: 224px; - height: 95px; -} -.resource-flow-layout.col-12 .resource-card-6x2x3 { - width: 224px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-12 .resource-card-6x3 { - width: 224px; - height: 142px; -} -.resource-flow-layout.col-12 .resource-card-6x3x2 { - width: 224px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-12 .resource-card-9x2 { - width: 343px; - height: 95px; -} -.resource-flow-layout.col-12 .resource-card-9x2x3 { - width: 343px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-12 .resource-card-9x3 { - width: 343px; - height: 142px; -} -.resource-flow-layout.col-12 .resource-card-9x3x2 { - width: 343px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-12 .resource-card-12x2 { - width: 462px; - height: 95px; -} -.resource-flow-layout.col-12 .resource-card-12x2x3 { - width: 462px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-12 .resource-card-12x3 { - width: 462px; - height: 142px; -} -.resource-flow-layout.col-12 .resource-card-12x3x2 { - width: 462px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-12 .resource-card-15x2 { - width: 581px; - height: 95px; -} -.resource-flow-layout.col-12 .resource-card-15x2x3 { - width: 581px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-12 .resource-card-15x3 { - width: 581px; - height: 142px; -} -.resource-flow-layout.col-12 .resource-card-15x3x2 { - width: 581px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-12 .resource-card-18x2 { - width: 700px; - height: 95px; -} -.resource-flow-layout.col-12 .resource-card-18x2x3 { - width: 700px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-12 .resource-card-18x3 { - width: 700px; - height: 142px; -} -.resource-flow-layout.col-12 .resource-card-18x3x2 { - width: 700px; - height: 138px; - margin-bottom: 8px; -} - -/* Generate the flow layout styles for a 3-column 13-col span */ - -.resource-flow-layout.col-13 { - margin: 0 -14px 0 0; - width: 774px; -} -.resource-flow-layout.col-13 .resource-card, .resource-flow-layout.col-13 .resource-card-stack { - margin: 0 14px 20px 0; -} -.resource-flow-layout.col-13 .resource-card-row-stack-last { - margin-bottom: 0px !important; -} -.resource-flow-layout.col-13 .resource-card-col-stack-last { - margin-bottom: 0px !important; -} -.resource-flow-layout.col-13 .resource-card-3x6 { - width: 115px; - height: 284px; -} -.resource-flow-layout.col-13 .resource-card-3x12 { - width: 115px; - height: 588px; -} -.resource-flow-layout.col-13 .resource-card-3x18 { - width: 115px; - height: 892px; -} -.resource-flow-layout.col-13 .resource-card-6x6 { - width: 244px; - height: 284px; -} -.resource-flow-layout.col-13 .resource-card-6x12 { - width: 244px; - height: 588px; -} -.resource-flow-layout.col-13 .resource-card-6x18 { - width: 244px; - height: 892px; -} -.resource-flow-layout.col-13 .resource-card-9x6 { - width: 373px; - height: 284px; -} -.resource-flow-layout.col-13 .resource-card-9x12 { - width: 373px; - height: 588px; -} -.resource-flow-layout.col-13 .resource-card-9x18 { - width: 373px; - height: 892px; -} -.resource-flow-layout.col-13 .resource-card-12x6 { - width: 502px; - height: 284px; -} -.resource-flow-layout.col-13 .resource-card-12x12 { - width: 502px; - height: 588px; -} -.resource-flow-layout.col-13 .resource-card-12x18 { - width: 502px; - height: 892px; -} -.resource-flow-layout.col-13 .resource-card-15x6 { - width: 631px; - height: 284px; -} -.resource-flow-layout.col-13 .resource-card-15x12 { - width: 631px; - height: 588px; -} -.resource-flow-layout.col-13 .resource-card-15x18 { - width: 631px; - height: 892px; -} -.resource-flow-layout.col-13 .resource-card-18x6 { - width: 760px; - height: 284px; -} -.resource-flow-layout.col-13 .resource-card-18x12 { - width: 760px; - height: 420px; -} -.resource-flow-layout.col-13 .resource-card-18x18 { - width: 760px; - height: 892px; -} -.resource-flow-layout.col-13 .resource-card-3x2 { - width: 115px; - height: 95px; -} -.resource-flow-layout.col-13 .resource-card-3x2x3 { - width: 115px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-13 .resource-card-3x3 { - width: 115px; - height: 142px; -} -.resource-flow-layout.col-13 .resource-card-3x3x2 { - width: 115px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-13 .resource-card-6x2 { - width: 244px; - height: 95px; -} -.resource-flow-layout.col-13 .resource-card-6x2x3 { - width: 244px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-13 .resource-card-6x3 { - width: 244px; - height: 142px; -} -.resource-flow-layout.col-13 .resource-card-6x3x2 { - width: 244px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-13 .resource-card-9x2 { - width: 373px; - height: 95px; -} -.resource-flow-layout.col-13 .resource-card-9x2x3 { - width: 373px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-13 .resource-card-9x3 { - width: 373px; - height: 142px; -} -.resource-flow-layout.col-13 .resource-card-9x3x2 { - width: 373px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-13 .resource-card-12x2 { - width: 502px; - height: 95px; -} -.resource-flow-layout.col-13 .resource-card-12x2x3 { - width: 502px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-13 .resource-card-12x3 { - width: 502px; - height: 142px; -} -.resource-flow-layout.col-13 .resource-card-12x3x2 { - width: 502px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-13 .resource-card-15x2 { - width: 631px; - height: 95px; -} -.resource-flow-layout.col-13 .resource-card-15x2x3 { - width: 631px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-13 .resource-card-15x3 { - width: 631px; - height: 142px; -} -.resource-flow-layout.col-13 .resource-card-15x3x2 { - width: 631px; - height: 138px; - margin-bottom: 8px; -} -.resource-flow-layout.col-13 .resource-card-18x2 { - width: 760px; - height: 95px; -} -.resource-flow-layout.col-13 .resource-card-18x2x3 { - width: 760px; - height: 90px; - margin-bottom: 7px; -} -.resource-flow-layout.col-13 .resource-card-18x3 { - width: 760px; - height: 142px; -} -.resource-flow-layout.col-13 .resource-card-18x3x2 { - width: 760px; - height: 138px; - margin-bottom: 8px; -} - -/* - The following are styles for cards in the flowlayout above, styled by the number of rows they span -*/ -/* Single row items, might be simpler to just apply a class */ -.resource-card-3x6 > .card-bg, .resource-card-6x6 > .card-bg, .resource-card-9x6 > .card-bg, .resource-card-12x6 > .card-bg, .resource-card-15x6 > .card-bg, .resource-card-18x6 > .card-bg { - height: 192px; -} -.resource-card-3x6 > .card-info, .resource-card-6x6 > .card-info, .resource-card-9x6 > .card-info, .resource-card-12x6 > .card-info, .resource-card-15x6 > .card-info, .resource-card-18x6 > .card-info { - padding: 4px 12px 6px 12px; - top: 192px; -} -.resource-card-3x6 > .card-info .section, .resource-card-6x6 > .card-info .section, .resource-card-9x6 > .card-info .section, .resource-card-12x6 > .card-info .section, .resource-card-15x6 > .card-info .section, .resource-card-18x6 > .card-info .section { - font-size: 12px; - margin-bottom: 1px; -} -.resource-card-3x6 > .card-info .title, .resource-card-6x6 > .card-info .title, .resource-card-9x6 > .card-info .title, .resource-card-12x6 > .card-info .title, .resource-card-15x6 > .card-info .title, .resource-card-18x6 > .card-info .title { - font-size: 16px; - margin-bottom: -2px; -} -.resource-card-3x6 > .card-info .description, .resource-card-6x6 > .card-info .description, .resource-card-9x6 > .card-info .description, .resource-card-12x6 > .card-info .description, .resource-card-15x6 > .card-info .description, .resource-card-18x6 > .card-info .description { - font-size: 13px; - line-height: 15px; -} -.resource-card-3x6 > .card-info .description .text, .resource-card-6x6 > .card-info .description .text, .resource-card-9x6 > .card-info .description .text, .resource-card-12x6 > .card-info .description .text, .resource-card-15x6 > .card-info .description .text, .resource-card-18x6 > .card-info .description .text { - height: 30px; -} - -/* Double row items */ -.resource-card-3x12 > .card-bg, .resource-card-6x12 > .card-bg, .resource-card-9x12 > .card-bg, .resource-card-12x12 > .card-bg, .resource-card-15x12 > .card-bg, .resource-card-18x12 > .card-bg { - height: 320px; -} -.resource-card-3x12 > .card-info, .resource-card-6x12 > .card-info, .resource-card-9x12 > .card-info, .resource-card-12x12 > .card-info, .resource-card-15x12 > .card-info, .resource-card-18x12 > .card-info { - padding: 4px 12px 6px 12px; - top: 320px; -} -.resource-card-3x12 > .card-info .section, .resource-card-6x12 > .card-info .section, .resource-card-9x12 > .card-info .section, .resource-card-12x12 > .card-info .section, .resource-card-15x12 > .card-info .section, .resource-card-18x12 > .card-info .section { - font-size: 12px; - margin-bottom: 1px; -} -.resource-card-3x12 > .card-info .title, .resource-card-6x12 > .card-info .title, .resource-card-9x12 > .card-info .title, .resource-card-12x12 > .card-info .title, .resource-card-15x12 > .card-info .title, .resource-card-18x12 > .card-info .title { - font-size: 16px; - margin-bottom: -2px; - white-space: normal; -} -.resource-card-3x12 > .card-info .description, .resource-card-6x12 > .card-info .description, .resource-card-9x12 > .card-info .description, .resource-card-12x12 > .card-info .description, .resource-card-15x12 > .card-info .description, .resource-card-18x12 > .card-info .description { - font-size: 13px; - line-height: 15px; -} - -/* 1/3 row items */ -.resource-card-3x2 > .card-bg, .resource-card-6x2 > .card-bg, .resource-card-9x2 > .card-bg, .resource-card-12x2 > .card-bg, .resource-card-15x2 > .card-bg, .resource-card-18x2 > .card-bg { - left: 0; - top: 0; - width: 90px; - height: 100%; - position: absolute; - display: block; -} -.resource-card-3x2 > .card-info, .resource-card-6x2 > .card-info, .resource-card-9x2 > .card-info, .resource-card-12x2 > .card-info, .resource-card-15x2 > .card-info, .resource-card-18x2 > .card-info { - left: 90px; - padding: 4px 12px 4px 12px; - height: 80px; - overflow: hidden; -} -.resource-card-3x2 > .card-info .section, .resource-card-6x2 > .card-info .section, .resource-card-6x3 > .card-info .section, .resource-card-9x2 > .card-info .section, .resource-card-12x2 > .card-info .section, .resource-card-15x2 > .card-info .section, .resource-card-18x2 > .card-info .section { - font-size: 12px; - margin-bottom: 1px; - /* display: none; */ -} -.resource-card-3x2 > .card-info .title, .resource-card-6x2 > .card-info .title, .resource-card-9x2 > .card-info .title, .resource-card-12x2 > .card-info .title, .resource-card-15x2 > .card-info .title, .resource-card-18x2 > .card-info .title { - font-size: 16px; - margin-bottom: -2px; - white-space: normal; - overflow: visible; - text-overflow: ellipsis; -} -.resource-card-3x2 > .card-info .title:after, .resource-card-6x2 > .card-info .title:after, .resource-card-9x2 > .card-info .title:after, .resource-card-12x2 > .card-info .title:after, .resource-card-15x2 > .card-info .title:after, .resource-card-18x2 > .card-info .title:after { - /* content: url(../images/link-out.png); */ - display: block; -} -.resource-card-3x2 > .card-info .description, .resource-card-6x2 > .card-info .description, .resource-card-9x2 > .card-info .description, .resource-card-12x2 > .card-info .description, .resource-card-15x2 > .card-info .description, .resource-card-18x2 > .card-info .description { - display: none; -} - - -/* Override to show the description instead of the content section */ -.no-section .resource-card-3x2 > .card-info .section, -.no-section .resource-card-6x2 > .card-info .section { - display: none; -} -.no-section .resource-card-3x2 > .card-info .description, -.no-section .resource-card-6x2 > .card-info .description { - display: block; -} - -/* 1/2 row items */ -.resource-card-3x3 > .card-bg, .resource-card-6x3 > .card-bg, .resource-card-9x3 > .card-bg, .resource-card-12x3 > .card-bg, .resource-card-15x3 > .card-bg, .resource-card-18x3 > .card-bg { - left: 0; - top: 0; - width: 90px; - height: 100%; - position: absolute; - display: block; -} -.resource-card-3x3 > .card-info, .resource-card-6x3 > .card-info, .resource-card-9x3 > .card-info, .resource-card-12x3 > .card-info, .resource-card-15x3 > .card-info, .resource-card-18x3 > .card-info { - left: 90px; - padding: 4px 12px 0px 12px; -} -.resource-card-3x3 > .card-info .section, .resource-card-6x3 > .card-info .section, .resource-card-9x3 > .card-info .section, .resource-card-12x3 > .card-info .section, .resource-card-15x3 > .card-info .section, .resource-card-18x3 > .card-info .section { - font-size: 12px; - margin-bottom: 1px; - display: none; -} -.resource-card-3x3 > .card-info .title, .resource-card-6x3 > .card-info .title, .resource-card-9x3 > .card-info .title, .resource-card-12x3 > .card-info .title, .resource-card-15x3 > .card-info .title, .resource-card-18x3 > .card-info .title { - font-size: 16px; - margin-bottom: -2px; - white-space: normal; - overflow: visible; -} -.resource-card-3x3 > .card-info .description .text, .resource-card-6x3 > .card-info .description .text, .resource-card-9x3 > .card-info .description .text, .resource-card-12x3 > .card-info .description .text, .resource-card-15x3 > .card-info .description .text, .resource-card-18x3 > .card-info .description .text { - font-size: 12px; - line-height: 15px; - padding-right: 0px !important; - height: 80px; -} -.resource-card-3x3 > .card-info .description .util, .resource-card-6x3 > .card-info .description .util, .resource-card-9x3 > .card-info .description .util, .resource-card-12x3 > .card-info .description .util, .resource-card-15x3 > .card-info .description .util, .resource-card-18x3 > .card-info .description .util { - display: none; -} -/* placement of plusone */ -.resource-card-6x12 > .card-info .description .util, .resource-card-9x12 > .card-info .description .util, .resource-card-12x12 > .card-info .description .util, .resource-card-15x12 > .card-info .description .util { - bottom:2px; -} -.resource-card-18x12 > .card-info .description .util { - bottom:2px; -} -/* Overrides for col-16 6x6 cards linking to local content on landing pages. - Suppresses "section" and puts the title above a hairline rule. */ -.landing .card-info .section, .resource-flow-layout.col-16.landing .resource-card-9x6 .card-info .section { - display:none; -} -.landing .card-info .title { - color: #898989; - font-size: 17px; - line-height: 24px; - margin-bottom: 6px; - border-bottom: 1px solid #959595; - padding-bottom: 0px; -} -.landing .card-info .description { - font-size: 13px; - line-height: 15px; -} -.landing .card-info .description .text { -height:30px; -} -.landing .resource-card-6x6 > .card-info .description .util, .landing .resource-card-9x6 > .card-info .description .util { - bottom:2px; -} -/* - Generate a resource stack layout for a 3 column widget spanning 16 grid cols -*/ -.resource-stack-layout.col-16 { - margin: 0 -14px 0 0; - width: 954px; -} -.resource-stack-layout.col-16 .resource-card-stack { - margin: 0 14px 0 0; - width: 304px; -} - -/* Example of card menu tinting */ -.resource-widget[data-section=distribute\/tools] .section-card-menu -.card-bg:after { - background: rgba(126, 55, 148, 0.4) !important; -} -.resource-widget[data-section=distribute\/tools] .section-card-menu -.card-section-icon .icon { - background-color: #7e3794 !important; -} -.resource-widget[data-section=distribute\/tools] .section-card-menu -.card-info ul li { - border-top-color: #7e3794 !important; -} - -/* tinting for stacks */ - -div.jd-descr > .resource-widget[data-section=distribute\/tools] -.section-card-menu .card-info ul li { - border-top-color: #7e3794 !important; -} - - - -/** - * UTILITIES - */ - - -.border-box { - box-sizing: border-box; -} - -.vertical-center-outer { - display: table; - height: 100%; - width: 100%; -} - -.vertical-center-inner { - display: table-cell; - vertical-align: middle; -} - -/** - * TYPE STYLES - */ - -.landing-h1 { - font-weight: 100; - font-size: 60px; - line-height: 78px; - text-align: center; - letter-spacing: -1px; -} - -.landing-pre-h1 { - font-weight: 400; - font-size: 28px; - color: #93B73F; - line-height: 36px; - text-align: center; - letter-spacing: -1px; - text-transform: uppercase; - -} - -.landing-h1.hero { - text-align: left; -} - -.landing-h2 { - font-weight: 300; - font-size: 42px; - line-height: 64px; - text-align: center; -} - -.landing-subhead { - color: #999999; - font-size: 20px; - line-height: 28px; - font-weight:300; - text-align: center; -} -.landing-subhead.hero { - text-align: left; - color: white; -} - -.landing-hero-description { - text-align: left; - margin: 1em 0; -} - -.landing-hero-description p { - font-weight: 300; - margin: 0; - font-size: 18px; - line-height: 24px; -} - -.landing-body .landing-small { - font-size: 14px; - line-height: 19px; -} - -.landing-body.landing-align-center { - text-align: center; -} - -.landing-align-left { - text-align: left; -} - -/** - * LAYOUT - */ - -#body-content, -.fullpage, -#jd-content, -.jd-descr, -.landing-body-content { - height: 100%; -} - -.landing-section { - padding: 80px 10px 80px; - width: 100%; - margin-left: -10px; - text-rendering: optimizeLegibility; -} - -#extending-android-to-wearables { - padding-top: 30px; -} - -.landing-short-section { - padding: 40px 10px 28px; -} - -.landing-gray-background { - background-color: #e9e9e9; -} - -.landing-white-background { - background-color: white; -} - -.landing-red-background { - color: white; - background-color: hsl(8, 70%, 54%); -} - -.landing-subhead-red { - color: hsl(8, 71%, 84%); - text-align: left; -} - -.landing-subhead-red p { - margin-top: 20px; -} - -.landing-hero-container { - height: 100%; -} - - -.preview-hero { - height: calc(100% - 110px); - min-height: 504px; - margin-top: -5px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../preview/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.wear-hero { - height: calc(100% - 110px); - min-height: 504px; - margin-top: -5px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../wear/images/hero.jpg); - background-size: cover; - background-position: top center; - color: white; - position: relative; - overflow: hidden; -} - -.tv-hero { - height: calc(100% - 110px); - min-height: 504px; - margin-top: -5px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../tv/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.auto-hero { - height: calc(100% - 110px); - min-height: 504px; - margin-top: -5px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../auto/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.landing-hero-scrim { - background: black; - opacity: .2; - position: absolute; - width: 100%; - height: 100%; - margin-left: -10px; -} - -.landing-hero-wrap { - margin: 0 auto; - width: 940px; - clear: both; - height: 100%; - position: relative; -} - -.landing-section-header { - margin-bottom: 40px; -} - -.landing-hero-wrap .landing-section-header { - margin-bottom: 16px; -} - -.landing-body { - font-size: 18px; - line-height: 24px; -} - -.landing-button { - white-space: nowrap; - display: inline-block; - padding: 16px 32px; - font-size: 18px; - font-weight: 500; - line-height: 24px; - cursor: pointer; - color: white; - -webkit-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - -webkit-transition: .2s background-color ease-in-out; - -moz-transition: .2s background-color ease-in-out; - -o-transition: .2s background-color ease-in-out; - transition: .2s background-color ease-in-out; -} - -.landing-primary { - background-color: hsl(8, 70%, 44%); - color: #f8f8f8; -} - -.landing-button.landing-primary:hover { - background-color: hsl(8, 70%, 36%); -} - -.landing-button.landing-primary:active { - background-color: hsl(8, 70%, 30%); -} - -.landing-button.landing-secondary { - background-color: #2faddb; -} - -.landing-button.landing-secondary:hover { - background-color: #09c; -} - -.landing-button.landing-secondary:active { - background-color: #3990ab; -} - -a.landing-button, -a.landing-button:hover, -a.landing-button:visited { - color: white !important; -} - -.landing-video-link { - white-space: nowrap; - display: inline-block; - padding: 16px 32px 16px 82px; - font-size: 18px; - font-weight: 400; - line-height: 24px; - cursor: pointer; - color: hsla(0, 0%, 100%, .8); - -webkit-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - -webkit-transition: .2s color ease-in-out; - -moz-transition: .2s color ease-in-out; - -o-transition: .2s color ease-in-out; - transition: .2s color ease-in-out; -} - -.landing-video-link:before { - height: 64px; - width: 64px; - display: inline-block; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAFuklEQVR42u2dXWgcVRSAV9LWtBBTTZVWUhNqEQtq1QeroDRKFRFsROqTYPuo+JCiIoJKFC0USqlUfCiowRcfrBgVUUElefAPkW5T8aeaGn9aRbFsjP0x2cx8PuRMvFxmdjeb2Z17Z8+B85DsZPbO+eaec3/OPSkABdXsVI2gABSAqgJQAKoKQAGoKgAFoKoAFICqAlAAqgpAAai6DqDRAiwDeoFtwB7gPaAInABKwKToCWAMeB/YDdwJrAWWNLh9+QMAXABsBQ4A3wFTwAxQBmaBAAhjNJDPy3L938BXwAvArUCHAkh+kCXAVcA+YBw4bRg7MngtkgTlDPA98CywHmhTAP8/xCbgVeAvMZZpwDQllN7xB/AysKGlAQAXAvuBkzW85UVgCBgENlfQQbmuWAXELPAnsAvoaikAQBtwh/j3coLhS2LIfqCzzu/plL8fkvvFgZiR4L2lHrfkHQBgpQTFUwmGnwC212v0KjC2y/3jQPwDPA+05xYAcBHwubx1YZzhC02QBBBRbxgBzssdAOBy4JgRZE0ZTPuNr7FHDCbEhqNAd24AAN0yUbID7QSwsZChABut3hANXY8Bq70HIMb/Ocb4w81+66v0hmGrN0QQ1ngLQJYRvpWHMWWo4KDIaMnuCcVKgdlZAGL8t2J8vpPGrwChDLyWBMFlAA8D0z4ZvwKEs8D93gCQEc9Jy/jFgkdizaRDGUSs8wXAu1bQLQE9ngHosWbPAXDQeQAypT9rBd3+gociyxi2K9riLABZUj5iuZ6RgsciM2OzFxw2A7JrAO6VwGtKTwpG+Anoy9AVmb3gDHCPcwCAFcChRox6jPu9CazMeFQUAKNRL3AJwE2yopjq228BQPZ/d2bcCyaBTa4BeNGa8Q6naIA4GQWubiKEYWvBbp8zAGQt5VfL/fQ3GEAkTzXDLVkjokA2k5a7AuA2GaLNj/tTfvhq0pQgbcwLQtlQusYVALtlzSR191MjADNI9zbJDZWBR10BMGr5/4GMADQ0SAMDlht62xUAxy0AmzMEEMnhtIO0ZF2YAH5wITd0hQw/5wE04M1bjDyXZpC2hqMlYGnWAHqBf40APOEYgChI35VSWyasWfGqrAH0WVkOIw4CSC1IG2tDoSy7XJE1gPs8ArDoIG0BmJGk30wBDHgGYFFBOgbAtqwB7GxxAHerC8rOBU0Dt2gQzjYIb8gawDor+6HVhqFdrkzEwhabiAVOTMSkUb+06FLEUVfWgj5q0cW4g64AeNo66ZLlcnTDNmesBN4y8KArAG6QU42ttCEzBVzpCoAO4EfLDeV5SzIEvgHaXdqUP2BlQud1Ux55zj2uZUX02cPRnKalRLmu17qYmPWF5YbymJgVAh8Ay5wCII3ZEZOYm6fURGT2u9X43Mnk3CDHybmfmRVYXExPv9nKEcpLejqSC3SjdY2TBzTesHqB7wc0onTEV2KucxLApXKkJy9HlAI5anuJFwCkYQ/EuCJfD+mdBnYkXOssgHY53un7MdVZ4CVgqVcADAhjMafkfTioHc14P04yvvMApIEXy5F/+7S8y6UKolPyR4BVVf7Wi2IdawwIPhTrmAW+rmZ8bwBIQ7vloXwoVzNWS6UUrwAYy9YfOlqwKZDkgneA5Qu4l3cly84F9sqGhislywLmaozuYoGFXr0DII1ukxP1hxJ6QzR7HqLxRfumZaRzXZ3f4XXZyi7gCeB3kqsnzs+kSb9s5XHgMeD8RTxDLgq3rmeuYuFvNYCoR8wqujNi+L3UWBcu9wAMt3QZ8LiMlk5RuU50teq6kcEDgTolveIRYHUQBOek1O5cFu/ukLz7/ZJgNSm+OirebWpgaPS7slxfAr4EngGuX8jopqUBxGzyrAVuB54EXgc+lV4yLhO8cfn5E+ZqUD8kBu9sQvv0Hzj4rmoEBaAAVBWAAlBVAApAVQEoAFUFoABUFYACUFUACkC1CfofXVRJocowZVYAAAAASUVORK5CYII=); - background-size: contain; - position: absolute; - content: ""; - opacity: .7; - margin-top: -19px; - margin-left: -64px; - -webkit-transition: .2s opacity ease-in-out; - -moz-transition: .2s opacity ease-in-out; - -o-transition: .2s opacity ease-in-out; - transition: .2s opacity ease-in-out; -} - -.landing-video-link:hover { - color: hsla(0, 0%, 100%, 1); -} - -.landing-video-link:hover:before { - opacity: 1; -} - -.landing-social-image { - float: left; - margin-right: 14px; - height: 64px; - width: 64px; -} - -.landing-social-copy { - padding-left: 78px; -} - -.landing-scroll-down-affordance { - position: absolute; - bottom: 0; - width: 100%; - text-align: center; - z-index: 10; -} - -.landing-down-arrow { - padding: 24px; - display: inline-block; - opacity: .5; - -webkit-transition: .2s opacity ease-in-out; - -moz-transition: .2s opacity ease-in-out; - -o-transition: .2s opacity ease-in-out; - transition: .2s opacity ease-in-out; - - -webkit-animation-name: pulse-opacity; - -webkit-animation-duration: 4s; -} - -.landing-down-arrow:hover { - opacity: 1; -} - -.landing-down-arrow img { - height: 28px; - width: 28px; - margin: 0 auto; - display: block; -} - -.landing-divider { - display: inline-block; - height: 2px; - background-color: white; - position: relative; - margin: 10px 0; -} - -/* 3 CLOLUMN LAYOUT */ - -.landing-breakout { - margin-top: 40px; - margin-bottom: 40px; -} - -.landing-breakout img { - margin-bottom: 20px; -} - -.landing-partners img { - margin-bottom: 20px; -} - -.landing-breakout p { - padding: 0 23px; -} - -.landing-breakout.landing-partners img { - margin-bottom: 20px; -} - -.col-3-wide { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} - -.col-3-wide { - width: 302px; -} - -/** - * ANIMATION - */ - -@-webkit-keyframes pulse-opacity { - 0% { - opacity: .5; - } - 20% { - opacity: .5; - } - 40% { - opacity: 1; - } - 60% { - opacity: .5; - } - 80% { - opacity: 1; - } - 100% { - opacity: .5; - } -} - - - -/** - * VIDEO - */ - -#video-container { - display:none; - position:fixed; - top:0; - left:0; - width:100%; - height:100%; - background-color:rgba(0,0,0,0.8); - z-index:9999; -} - -#video-frame { - width:940px; - height:100%; - margin:72px auto; - display:none; - position:relative; -} - -.video-close { - cursor: pointer; - position: absolute; - right: -49px; - top: -49px; - pointer-events: all; -} - -#icon-video-close { - background-image: url("../images/close-white.png"); - background-image: -webkit-image-set(url(../images/close-white.png) 1x, url(../images/close-white_2x.png) 2x); - background-repeat: no-repeat; - background-position: 0 0; - background-size: 36px 36px; - height: 36px; - width: 36px; - display:block; -} - -#icon-video-close:hover { - background-image: url("../images/close-grey.png"); - background-image: -webkit-image-set(url(../images/close-grey.png) 1x, url(../images/close-grey_2x.png) 2x); -} - -/* Preload the hover images */ -a.video-shadowbox-button.white:after { - display:none; - content:url("../images/close-grey.png") url("../images/close-grey_2x.png"); -} - -a.video-shadowbox-button.white { - background-image: url("../images/play-circle-white.png"); - background-image: -webkit-image-set(url(../images/play-circle-white.png) 1x, url(../images/play-circle-white_2x.png) 2x); - background-size: 36px 36px; - background-repeat: no-repeat; - background-position: right; - padding: 16px 42px 16px 8px; - font-size: 18px; - font-weight: 500; - line-height: 24px; - color: #fff; - text-decoration:none; -} - -a.video-shadowbox-button.white:hover { - color:#bababa !important; - background-image: url("../images/play-circle-grey.png"); - background-image: -webkit-image-set(url(../images/play-circle-grey.png) 1x, url(../images/play-circle-grey_2x.png) 2x); -} - -/* Preload the hover images */ -a.video-shadowbox-button.white:after { - display:none; - content:url("../images/play-circle-grey.png") url("../images/play-circle-grey_2x.png"); -} - -/****************** -Styles for d.a.c/index: -*******************/ - - - -/* Generic full screen carousel styling to be used across pages. */ -.fullscreen-carousel { - margin: 0 -10px; - width: 100%; - overflow: hidden; - position: relative; -} - -.fullscreen-carousel-content { - width: 100%; - height: 100%; - position: relative; - display: table; /* For vertical centering */ -} - -.fullscreen-carousel .vcenter { - display: table-cell; - vertical-align: middle; - position: relative; -} - -.fullscreen-carousel .vcenter > div { - margin: 10px auto; -} - -/* Styles for the full-bleed hero image type. */ -.fullscreen-carousel .hero, .fullscreen-carousel .hero h1 { - color: #fff; -} - -.fullscreen-carousel .hero h1 { - font-weight: 300; - font-size: 60px; - line-height: 68px; - letter-spacing: -1px; - margin-top: 0; -} - -.fullscreen-carousel .hero p { - font-weight: 300; - font-size: 18px; - line-height: 24px; - -webkit-font-smoothing: antialiased; -} - -.fullscreen-carousel .hero .hero-bg { - background-size: cover; - width: 100%; - height: 100%; - position: absolute; - left: 0px; - top: 0px; -} - - -/* Full screen carousel styling for the resource flow layout type of content */ -.fullscreen-carousel .resource-flow-layout:after { - height: 0; /* Dont know why this is set at 10 in default.css */ -} - -.fullscreen-carousel .resource-flow-layout { - margin-bottom: 20px; -} - - - -/* Generic Tab carousel styling to be used across multiple pages. */ - -.tab-carousel .tab-nav { - list-style: none; - position: relative; - text-align: center; -} - -.tab-carousel .tab-nav li { - display: inline-block; - font-size: 22px; - font-weight: 400; - line-height: 50px; - list-style: none; - margin: 0; - padding: 0 25px; - position: relative; -} - -.tab-carousel .tab-nav li a, -.tab-carousel .tab-nav li a:hover { - color: #333 !important; - padding: 10px 10px 13px 10px; - position: relative; - z-index: 1000; -} - -.tab-carousel .tab-nav li:after { - background: #ddd; - bottom: 0; - content: ''; - height: 4px; - left: 0; - position: absolute; - width: 100%; - z-index: 0; -} - -.tab-carousel .tab-nav .highlight { - position: absolute; - height: 4px; - width: 100px; - bottom: 0; - background: #167c80; -} - -.tab-carousel .tab-carousel-content { - position: relative; - overflow: hidden; - white-space: nowrap; -} - -.tab-carousel .tab-carousel-content [data-tab] { - display: inline-block; - white-space: normal; -} - - - -/* - Resource styling for the tab carousel. The tab carousel contains either - a 3 column layout of resources or a single full-width resource. The - latter has the 18x12 class applied to it and can be styled differently - that way. -*/ - -.tab-carousel .resource .image { - width: 100%; - height: 250px; - background-repeat: no-repeat; - background-size: contain; - background-position: 50% 50%; -} - -.tab-carousel .resource .info .title { - font-size: 18px; - line-height: 24px; -} - -.tab-carousel .resource .info .summary, -.tab-carousel .resource .info .cta { - line-height: 24px; - font-size: 16px; -} - -.tab-carousel .resource-card-18x12 { - position: relative; - padding-left: 450px; - box-sizing: border-box; - display: table-cell; - vertical-align: middle; -} - -.tab-carousel .resource-card-18x12 .image { - position: absolute; - width: 420px; - height: 100%; - left: 0; - top: 0; -} - -.tab-carousel .resource-card-18x12 .info { - display: inline-block; -} - -.tab-carousel .resource-card-18x12 .info .title { - margin-bottom: 26px; -} - - - - - -/* - Styles for the entity link used in the actions bar and in the cta of - the resources that appear in the tab carousel. -*/ -.actions-bar a:after, -.resource .cta:after { - content: '›'; - font-weight: 400; - font-size: 22px; - left: 5px; - line-height: 1; - position: relative; - top: 1px; - transition: left 190ms ease-out; -} - -.actions-bar a:hover:after, -.resource .cta:hover:after { - left: 10px; -} - - - - -/* - Styles for the actions bar. -*/ -.actions-bar { - background: #9acd00; - margin: 0 -10px; - text-align: center; -} - -.actions-bar .actions { - padding: 30px 0 30px; - text-align: justify; - font-size: 0.1px; - line-height: 0.1px; - margin: 0 10px 0 0; -} - -.actions-bar .actions:after { - content: ''; - width: 100%; - display: inline-block; -} - -.actions-bar .actions > div { - display: inline-block; -} - -.actions-bar a { - font-size: 21px; - line-height: 27px; - color: #fff; - font-weight: 300; - -webkit-font-smoothing: antialiased; -} - -.actions-bar a:after { - top: 0px; - font-size: 22px; -} - -.actions-bar a:hover { - color: #fff !important; -} - - - - - -/* - Specific styles for new home page layout of the carousels. -*/ - -/* Big blue button */ -a.home-new-cta-btn, -.home-new-carousel-1 .resource-card-18x6 .cta { - white-space: nowrap; - display: inline-block; - padding: 14px 32px; - font-size: 18px; - font-weight: 500; - line-height: 24px; - cursor: pointer; - background: #33b5e6; - border-radius: 4px; - margin-top: 20px; - color: #fff; - transition: 0.2s background-color ease-in-out; -} - -.home-new-carousel-1 .resource-card-18x6 .cta:after { - display: none; /* Hide the entity for this button */ -} - -a.home-new-cta-btn:hover, -.home-new-carousel-1 .resource-card-18x6 .cta:hover { - color: #fff !important; - background: #2d9fca; -} - -.home-new-carousel-1 .resource-card-18x6 .cta { - position: absolute; - bottom: 20px; - left: 16px; -} - -/* Fullscreen carousel. */ -.home-new-carousel-1 { - max-height: 700px; /* Set max height so doesn't get too long */ -} - -.home-new-carousel-1 .fullscreen-carousel-content { - min-height: 450px; /* Set min height for all content */ -} - -.home-new-carousel-1 .hero { - background: #000; -} - -.home-new-carousel-1 .hero-bg { - background-image: url(/home-new/images/hero.jpg); - background-position: right center; - opacity: 0.85; -} - -/* - Styling for special top card of full screen layout resource layout. - We need to specifically style the 18x6 card to adjust its size and layout, - since it's not a standard card, not sure if this is unique to the home page - layout or should be namespaced within the fullscreen-carousel container. -*/ -.home-new-carousel-1 .resource-flow-layout.col-16 .resource-card-18x6 { - height: 320px; - background-color:#F9F9F9; - border-radius: 0px; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0); - -} - -.home-new-carousel-1 .resource-card-18x6 .card-bg { - width: 636px; - height: 100%; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info { - right: 0px; - left: 636px; - height: 100%; - top: 0px; - padding: 15px 22px; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info .util { - display: none; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info .title { - font-size: 20px; - font-weight: 500; - margin-top: 15px; - margin-bottom: 15px; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info .text { - font-size: 15px; - line-height: 21px; -} - - -/* Tabbed carousel. */ -.home-new-carousel-2 { - margin: 35px auto 100px auto; -} - -.home-new-carousel-2 h1 { - font-size: 47px; - font-weight: 100; - line-height: 54px; - text-align: center; -} - -.annotation-message { - display: block; - font-style: italic; - color: #F80; -} - - - -/* Helpouts widget */ -.resource-card-6x2.helpouts-card { - width: 255px; - height: 40px; - position:absolute; - z-index:999; - top:-8px; - right:1px; -} - -.resource-card-6x2.helpouts-card > .card-info { - left:35px; - height:35px; - padding:4px 8px 4px 0; -} - -.resource-card-6x2.helpouts-card > .card-info .helpouts-description { - display:block; - overflow:visible; - font-size:12px; - line-height:12px; - text-align:right; - color:#666; -} - -.helpouts-description .link-color { - text-transform: uppercase; -} - -.resource-card-6x2 > .card-bg.helpouts-card-bg { - width:35px; - height:35px; - margin:2px 0 0 0; - background-image: url(../images/styles/helpouts-logo-35_2x.png); - background-image: -webkit-image-set(url(../images/styles/helpouts-logo-35.png) 1x, url(../images/styles/helpouts-logo-35_2x.png) 2x); -} - -.resource-card-6x2 > .card-bg.helpouts-card-bg:after { - display:none; -} diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/css/fullscreen.css b/build/tools/droiddoc/templates-lineage-sdk/assets/css/fullscreen.css deleted file mode 100644 index 7912e349..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/css/fullscreen.css +++ /dev/null @@ -1,208 +0,0 @@ - -/* ============================================================================= - Columns - ========================================================================== */ -/* Applied to body to debug layout alignments -.grid { - width:100%; - height:100%; - background:url(../images/grid.png) center repeat-y; - top:0px; - margin:auto; - position:absolute; -} -*/ - -@media screen, projection, print { -.full { - padding: 2.5em 0; - border-top: solid 1px #ddd; - border-bottom: solid 1px #ddd; - background: #f7f7f7; -} -.wrap { - margin: 0 auto; - width: 100%; - min-width:600px; - clear: both; -} -.cols { - height: 1%; - margin: 0 -1.533742331288343558282%; - width: 103.06748466257669%} -*+html .cols { - margin-bottom: 20px; -} -.cols:after { - clear: both; - content: ' '; - display: block; - height: 0; - visibility: hidden; -} -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, -.col-13, .col-14, .col-15, .col-16 { - float: left; - margin: 0 1.063829787234% 20px 1.063829787234%; -} -* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html -.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12, * html -.col-13, * html .col-14, * html .col-15, * html .col-16 { - margin: 0; - margin: 0 1.063829787234% 20px 1.063829787234%; -} -[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5, -[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10, -[dir='rtl'] .col-11, [dir='rtl'] .col-12 { - float: right; -} -.col-1 { - width: 4.16666666666667%; -} -.col-2 { - width: 10.4166666666667%; -} -.col-3 { - width: 16.6666666666667%; -} -.col-4 { - width: 22.9166666666667%; -} -.col-5 { - width: 29.1666666666667%; -} -.col-6 { - width: 35.4166666666667%; -} -.col-7 { - width: 41.6666666666667%; -} -.col-8 { - width: 47.9166666666667%; -} -.col-9 { - width: 55.3333333333333%; -} -.col-10 { - width: 60.4166666666667%; -} -.col-11 { - width: 66.6666666666667%; -} -.col-12 { - width: 72.9166666666667%; -} -.col-13 { - width: 79.1666666666667%; -} -.col-14 { - width: 85.4166666666667%; -} -.col-15 { - width: 91.6666666666667%; -} -.col-16 { - width: 97.9166666666667%; -} - - - - - - - -#header .col-1, -#nav-x .col-1 { width: 40px } -#header .col-2, -#nav-x .col-2 { width: 100px } -#header .col-3, -#nav-x .col-3 { width: 160px } -#header .col-4, -#nav-x .col-4 { width: 220px } -#header .col-5, -#nav-x .col-5 { width: 280px } -#header .col-6, -#nav-x .col-6 { width: 340px } -#header .col-7, -#nav-x .col-7 { width: 400px } -#header .col-8, -#nav-x .col-8 { width: 460px } -#header .col-9, -#nav-x .col-9 { width: 520px } -#header .col-10, -#nav-x .col-10 { width: 580px } -#header .col-11, -#nav-x .col-11 { width: 640px } -#header .col-12, -#nav-x .col-12 { width: 700px } -#header .col-13, -#nav-x .col-13 { width: 760px } -#header .col-14, -#nav-x .col-14 { width: 820px } -#header .col-15, -#nav-x .col-15 { width: 880px } -#header .col-16, -#nav-x .col-16 { width: 940px } - - - -body { - padding:0 20px; -} -#header, -#searchResults, -#nav-x { - margin:0; -} -#body-content { - margin:0; -} -#body-content > .col-12 { - width:77.9804965%; - margin:0 0 0 0.97%; /* this percentage chosen to make IE9 happy */ -} -#side-nav { - width: 19.9804965%; - margin:0 1.063829787234% 0 0; -} - -#header .wrap { - max-width: 100%; -} - -#header-wrapper #nav-x div.wrap, -#searchResults.wrap { - max-width:100%; -} - -.nav-x { - margin:-2px 0 0 0; -} - -#devdoc-nav.fixed, -#devdoc-nav.fixed a.totop { - left:20px; /* !important ... for IE i think */ -} - -#sticky-header { - padding: 0 20px; -} - -#sticky-header > div { - width: 100%; -} - -.sticky-menu { - width:100%; - left:-20px; -} - -.col-right { - margin-right:0px; -} - -@media screen and (max-width:772px) { -.col-5, .col-6, .col-7 { - clear: both; - width: 97.0238096%} -}
\ No newline at end of file diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/customizations.css b/build/tools/droiddoc/templates-lineage-sdk/assets/customizations.css deleted file mode 100755 index 958f6888..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/customizations.css +++ /dev/null @@ -1,14 +0,0 @@ -#masthead-title { - color: #373332; - text-decoration: none; - font-weight: bold; - margin-left: 5px; -} - -#headerLeft a { - text-decoration: none; -} - -#header { - border-bottom: 4px solid rgb(22, 124, 128); -} diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/design/design.js b/build/tools/droiddoc/templates-lineage-sdk/assets/design/design.js deleted file mode 100644 index 3ba84868..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/design/design.js +++ /dev/null @@ -1,188 +0,0 @@ -$(document).ready(function() { - // prep nav expandos - var pagePath = document.location.pathname; - if (pagePath.indexOf(SITE_ROOT) == 0) { - pagePath = pagePath.substr(SITE_ROOT.length); - if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') { - pagePath += 'index.html'; - } - } - - if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') { - // If running locally, SITE_ROOT will be a relative path, so account for that by - // finding the relative URL to this page. This will allow us to find links on the page - // leading back to this page. - var pathParts = pagePath.split('/'); - var relativePagePathParts = []; - var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3; - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push('..'); - } - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]); - } - relativePagePathParts.push(pathParts[pathParts.length - 1]); - pagePath = relativePagePathParts.join('/'); - } else { - // Otherwise the page path should be an absolute URL. - pagePath = SITE_ROOT + pagePath; - } - - // select current page in sidenav and set up prev/next links if they exist - var $selNavLink = $('.nav-y').find('a[href="' + pagePath + '"]'); - if ($selNavLink.length) { - $selListItem = $selNavLink.closest('li'); - - $selListItem.addClass('selected'); - $selListItem.closest('li>ul').addClass('expanded'); - - // set up prev links - var $prevLink = []; - var $prevListItem = $selListItem.prev('li'); - if ($prevListItem.length) { - if ($prevListItem.hasClass('nav-section')) { - // jump to last topic of previous section - $prevLink = $prevListItem.find('a:last'); - } else { - // jump to previous topic in this section - $prevLink = $prevListItem.find('a:eq(0)'); - } - } else { - // jump to this section's index page (if it exists) - $prevLink = $selListItem.parents('li').find('a'); - } - - if ($prevLink.length) { - var prevHref = $prevLink.attr('href'); - if (prevHref == SITE_ROOT + 'index.html') { - // Don't show Previous when it leads to the homepage - $('.prev-page-link').hide(); - } else { - $('.prev-page-link').attr('href', prevHref).show(); - } - } else { - $('.prev-page-link').hide(); - } - - // set up next links - var $nextLink = []; - if ($selListItem.hasClass('nav-section')) { - // we're on an index page, jump to the first topic - $nextLink = $selListItem.find('ul').find('a:eq(0)') - } else { - // jump to the next topic in this section (if it exists) - $nextLink = $selListItem.next('li').find('a:eq(0)'); - if (!$nextLink.length) { - // no more topics in this section, jump to the first topic in the next section - $nextLink = $selListItem.parents('li').next('li.nav-section').find('a:eq(0)'); - } - } - if ($nextLink.length) { - $('.next-page-link').attr('href', $nextLink.attr('href')).show(); - } else { - $('.next-page-link').hide(); - } - } - - // Set up expand/collapse behavior - $('.nav-y li').has('ul').click(function() { - if ($(this).hasClass('expanded')) { - return; - } - - // hide other - var $old = $('.nav-y li.expanded'); - if ($old.length) { - var $oldUl = $old.children('ul'); - $oldUl.css('height', $oldUl.height() + 'px'); - window.setTimeout(function() { - $oldUl - .addClass('animate-height') - .css('height', ''); - }, 0); - $old.removeClass('expanded'); - } - - // show me - $(this).addClass('expanded'); - var $ul = $(this).children('ul'); - var expandedHeight = $ul.height(); - $ul - .removeClass('animate-height') - .css('height', 0); - window.setTimeout(function() { - $ul - .addClass('animate-height') - .css('height', expandedHeight + 'px'); - }, 0); - }); - - // Stop expand/collapse behavior when clicking on nav section links (since we're navigating away - // from the page) - $('.nav-y li').has('ul').find('a:eq(0)').click(function(evt) { - window.location.href = $(this).attr('href'); - return false; - }); - - // Set up play-on-hover <video> tags. - $('video.play-on-hover').bind('click', function(){ - $(this).get(0).load(); // in case the video isn't seekable - $(this).get(0).play(); - }); - - // Set up tooltips - var TOOLTIP_MARGIN = 10; - $('acronym').each(function() { - var $target = $(this); - var $tooltip = $('<div>') - .addClass('tooltip-box') - .text($target.attr('title')) - .hide() - .appendTo('body'); - $target.removeAttr('title'); - - $target.hover(function() { - // in - var targetRect = $target.offset(); - targetRect.width = $target.width(); - targetRect.height = $target.height(); - - $tooltip.css({ - left: targetRect.left, - top: targetRect.top + targetRect.height + TOOLTIP_MARGIN - }); - $tooltip.addClass('below'); - $tooltip.show(); - }, function() { - // out - $tooltip.hide(); - }); - }); - - // Set up <h2> deeplinks - $('h2').click(function() { - var id = $(this).attr('id'); - if (id) { - document.location.hash = id; - } - }); - - // Set up fixed navbar - var navBarIsFixed = false; - $(window).scroll(function() { - var scrollTop = $(window).scrollTop(); - var navBarShouldBeFixed = (scrollTop > (100 - 40)); - if (navBarIsFixed != navBarShouldBeFixed) { - if (navBarShouldBeFixed) { - $('#nav') - .addClass('fixed') - .prependTo('#page-container'); - } else { - $('#nav') - .removeClass('fixed') - .prependTo('#nav-container'); - } - navBarIsFixed = navBarShouldBeFixed; - } - }); -});
\ No newline at end of file diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/docs.js b/build/tools/droiddoc/templates-lineage-sdk/assets/docs.js deleted file mode 100644 index 3ab4caf8..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/docs.js +++ /dev/null @@ -1,4339 +0,0 @@ -var classesNav; -var devdocNav; -var sidenav; -var cookie_namespace = 'android_developer'; -var NAV_PREF_TREE = "tree"; -var NAV_PREF_PANELS = "panels"; -var nav_pref; -var isMobile = false; // true if mobile, so we can adjust some layout -var mPagePath; // initialized in ready() function - -var basePath = getBaseUri(location.pathname); -var SITE_ROOT = toRoot + basePath.substring(1,basePath.indexOf("/",1)); -var GOOGLE_DATA; // combined data for google service apis, used for search suggest - -// Ensure that all ajax getScript() requests allow caching -$.ajaxSetup({ - cache: true -}); - -/****** ON LOAD SET UP STUFF *********/ - -$(document).ready(function() { - - // show lang dialog if the URL includes /intl/ - //if (location.pathname.substring(0,6) == "/intl/") { - // var lang = location.pathname.split('/')[2]; - // if (lang != getLangPref()) { - // $("#langMessage a.yes").attr("onclick","changeLangPref('" + lang - // + "', true); $('#langMessage').hide(); return false;"); - // $("#langMessage .lang." + lang).show(); - // $("#langMessage").show(); - // } - //} - - // load json file for JD doc search suggestions - $.getScript(toRoot + 'jd_lists_unified.js'); - // load json file for Android API search suggestions - $.getScript(toRoot + 'reference/lists.js'); - - // setup keyboard listener for search shortcut - $('body').keyup(function(event) { - if (event.which == 191) { - $('#search_autocomplete').focus(); - } - }); - - // init the fullscreen toggle click event - $('#nav-swap .fullscreen').click(function(){ - if ($(this).hasClass('disabled')) { - toggleFullscreen(true); - } else { - toggleFullscreen(false); - } - }); - - // initialize the divs with custom scrollbars - $('.scroll-pane').jScrollPane( {verticalGutter:0} ); - - // add HRs below all H2s (except for a few other h2 variants) - $('h2').not('#qv h2') - .not('#tb h2') - .not('.sidebox h2') - .not('#devdoc-nav h2') - .not('h2.norule').css({marginBottom:0}) - .after('<hr/>'); - - // set up the search close button - $('.search .close').click(function() { - $searchInput = $('#search_autocomplete'); - $searchInput.attr('value', ''); - $(this).addClass("hide"); - $("#search-container").removeClass('active'); - $("#search_autocomplete").blur(); - search_focus_changed($searchInput.get(), false); - hideResults(); - }); - - // Set up quicknav - var quicknav_open = false; - $("#btn-quicknav").click(function() { - if (quicknav_open) { - $(this).removeClass('active'); - quicknav_open = false; - collapse(); - } else { - $(this).addClass('active'); - quicknav_open = true; - expand(); - } - }) - - var expand = function() { - $('#header-wrap').addClass('quicknav'); - $('#quicknav').stop().show().animate({opacity:'1'}); - } - - var collapse = function() { - $('#quicknav').stop().animate({opacity:'0'}, 100, function() { - $(this).hide(); - $('#header-wrap').removeClass('quicknav'); - }); - } - - - //Set up search - $("#search_autocomplete").focus(function() { - $("#search-container").addClass('active'); - }) - $("#search-container").mouseover(function() { - $("#search-container").addClass('active'); - $("#search_autocomplete").focus(); - }) - $("#search-container").mouseout(function() { - if ($("#search_autocomplete").is(":focus")) return; - if ($("#search_autocomplete").val() == '') { - setTimeout(function(){ - $("#search-container").removeClass('active'); - $("#search_autocomplete").blur(); - },250); - } - }) - $("#search_autocomplete").blur(function() { - if ($("#search_autocomplete").val() == '') { - $("#search-container").removeClass('active'); - } - }) - - - // prep nav expandos - var pagePath = document.location.pathname; - // account for intl docs by removing the intl/*/ path - if (pagePath.indexOf("/intl/") == 0) { - pagePath = pagePath.substr(pagePath.indexOf("/",6)); // start after intl/ to get last / - } - - if (pagePath.indexOf(SITE_ROOT) == 0) { - if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') { - pagePath += 'index.html'; - } - } - - // Need a copy of the pagePath before it gets changed in the next block; - // it's needed to perform proper tab highlighting in offline docs (see rootDir below) - var pagePathOriginal = pagePath; - if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') { - // If running locally, SITE_ROOT will be a relative path, so account for that by - // finding the relative URL to this page. This will allow us to find links on the page - // leading back to this page. - var pathParts = pagePath.split('/'); - var relativePagePathParts = []; - var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3; - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push('..'); - } - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]); - } - relativePagePathParts.push(pathParts[pathParts.length - 1]); - pagePath = relativePagePathParts.join('/'); - } else { - // Otherwise the page path is already an absolute URL - } - - // Highlight the header tabs... - // highlight Design tab - if ($("body").hasClass("design")) { - $("#header li.design a").addClass("selected"); - $("#sticky-header").addClass("design"); - - // highlight About tabs - } else if ($("body").hasClass("about")) { - var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1)); - if (rootDir == "about") { - $("#nav-x li.about a").addClass("selected"); - } else if (rootDir == "wear") { - $("#nav-x li.wear a").addClass("selected"); - } else if (rootDir == "tv") { - $("#nav-x li.tv a").addClass("selected"); - } else if (rootDir == "auto") { - $("#nav-x li.auto a").addClass("selected"); - } - // highlight Develop tab - } else if ($("body").hasClass("develop") || $("body").hasClass("google")) { - $("#header li.develop a").addClass("selected"); - $("#sticky-header").addClass("develop"); - // In Develop docs, also highlight appropriate sub-tab - var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1)); - if (rootDir == "training") { - $("#nav-x li.training a").addClass("selected"); - } else if (rootDir == "guide") { - $("#nav-x li.guide a").addClass("selected"); - } else if (rootDir == "reference") { - // If the root is reference, but page is also part of Google Services, select Google - if ($("body").hasClass("google")) { - $("#nav-x li.google a").addClass("selected"); - } else { - $("#nav-x li.reference a").addClass("selected"); - } - } else if ((rootDir == "tools") || (rootDir == "sdk")) { - $("#nav-x li.tools a").addClass("selected"); - } else if ($("body").hasClass("google")) { - $("#nav-x li.google a").addClass("selected"); - } else if ($("body").hasClass("samples")) { - $("#nav-x li.samples a").addClass("selected"); - } - - // highlight Distribute tab - } else if ($("body").hasClass("distribute")) { - $("#header li.distribute a").addClass("selected"); - $("#sticky-header").addClass("distribute"); - - var baseFrag = pagePathOriginal.indexOf('/', 1) + 1; - var secondFrag = pagePathOriginal.substring(baseFrag, pagePathOriginal.indexOf('/', baseFrag)); - if (secondFrag == "users") { - $("#nav-x li.users a").addClass("selected"); - } else if (secondFrag == "engage") { - $("#nav-x li.engage a").addClass("selected"); - } else if (secondFrag == "monetize") { - $("#nav-x li.monetize a").addClass("selected"); - } else if (secondFrag == "analyze") { - $("#nav-x li.analyze a").addClass("selected"); - } else if (secondFrag == "tools") { - $("#nav-x li.disttools a").addClass("selected"); - } else if (secondFrag == "stories") { - $("#nav-x li.stories a").addClass("selected"); - } else if (secondFrag == "essentials") { - $("#nav-x li.essentials a").addClass("selected"); - } else if (secondFrag == "googleplay") { - $("#nav-x li.googleplay a").addClass("selected"); - } - } else if ($("body").hasClass("about")) { - $("#sticky-header").addClass("about"); - } - - // set global variable so we can highlight the sidenav a bit later (such as for google reference) - // and highlight the sidenav - mPagePath = pagePath; - highlightSidenav(); - buildBreadcrumbs(); - - // set up prev/next links if they exist - var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]'); - var $selListItem; - if ($selNavLink.length) { - $selListItem = $selNavLink.closest('li'); - - // set up prev links - var $prevLink = []; - var $prevListItem = $selListItem.prev('li'); - - var crossBoundaries = ($("body.design").length > 0) || ($("body.guide").length > 0) ? true : -false; // navigate across topic boundaries only in design docs - if ($prevListItem.length) { - if ($prevListItem.hasClass('nav-section') || crossBoundaries) { - // jump to last topic of previous section - $prevLink = $prevListItem.find('a:last'); - } else if (!$selListItem.hasClass('nav-section')) { - // jump to previous topic in this section - $prevLink = $prevListItem.find('a:eq(0)'); - } - } else { - // jump to this section's index page (if it exists) - var $parentListItem = $selListItem.parents('li'); - $prevLink = $selListItem.parents('li').find('a'); - - // except if cross boundaries aren't allowed, and we're at the top of a section already - // (and there's another parent) - if (!crossBoundaries && $parentListItem.hasClass('nav-section') - && $selListItem.hasClass('nav-section')) { - $prevLink = []; - } - } - - // set up next links - var $nextLink = []; - var startClass = false; - var isCrossingBoundary = false; - - if ($selListItem.hasClass('nav-section') && $selListItem.children('div.empty').length == 0) { - // we're on an index page, jump to the first topic - $nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)'); - - // if there aren't any children, go to the next section (required for About pages) - if($nextLink.length == 0) { - $nextLink = $selListItem.next('li').find('a'); - } else if ($('.topic-start-link').length) { - // as long as there's a child link and there is a "topic start link" (we're on a landing) - // then set the landing page "start link" text to be the first doc title - $('.topic-start-link').text($nextLink.text().toUpperCase()); - } - - // If the selected page has a description, then it's a class or article homepage - if ($selListItem.find('a[description]').length) { - // this means we're on a class landing page - startClass = true; - } - } else { - // jump to the next topic in this section (if it exists) - $nextLink = $selListItem.next('li').find('a:eq(0)'); - if ($nextLink.length == 0) { - isCrossingBoundary = true; - // no more topics in this section, jump to the first topic in the next section - $nextLink = $selListItem.parents('li:eq(0)').next('li').find('a:eq(0)'); - if (!$nextLink.length) { // Go up another layer to look for next page (lesson > class > course) - $nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)'); - if ($nextLink.length == 0) { - // if that doesn't work, we're at the end of the list, so disable NEXT link - $('.next-page-link').attr('href','').addClass("disabled") - .click(function() { return false; }); - // and completely hide the one in the footer - $('.content-footer .next-page-link').hide(); - } - } - } - } - - if (startClass) { - $('.start-class-link').attr('href', $nextLink.attr('href')).removeClass("hide"); - - // if there's no training bar (below the start button), - // then we need to add a bottom border to button - if (!$("#tb").length) { - $('.start-class-link').css({'border-bottom':'1px solid #DADADA'}); - } - } else if (isCrossingBoundary && !$('body.design').length) { // Design always crosses boundaries - $('.content-footer.next-class').show(); - $('.next-page-link').attr('href','') - .removeClass("hide").addClass("disabled") - .click(function() { return false; }); - // and completely hide the one in the footer - $('.content-footer .next-page-link').hide(); - if ($nextLink.length) { - $('.next-class-link').attr('href',$nextLink.attr('href')) - .removeClass("hide") - .append(": " + $nextLink.html()); - $('.next-class-link').find('.new').empty(); - } - } else { - $('.next-page-link').attr('href', $nextLink.attr('href')) - .removeClass("hide"); - // for the footer link, also add the next page title - $('.content-footer .next-page-link').append(": " + $nextLink.html()); - } - - if (!startClass && $prevLink.length) { - var prevHref = $prevLink.attr('href'); - if (prevHref == SITE_ROOT + 'index.html') { - // Don't show Previous when it leads to the homepage - } else { - $('.prev-page-link').attr('href', $prevLink.attr('href')).removeClass("hide"); - } - } - - } - - - - // Set up the course landing pages for Training with class names and descriptions - if ($('body.trainingcourse').length) { - var $classLinks = $selListItem.find('ul li a').not('#nav .nav-section .nav-section ul a'); - - // create an array for all the class descriptions - var $classDescriptions = new Array($classLinks.length); - var lang = getLangPref(); - $classLinks.each(function(index) { - var langDescr = $(this).attr(lang + "-description"); - if (typeof langDescr !== 'undefined' && langDescr !== false) { - // if there's a class description in the selected language, use that - $classDescriptions[index] = langDescr; - } else { - // otherwise, use the default english description - $classDescriptions[index] = $(this).attr("description"); - } - }); - - var $olClasses = $('<ol class="class-list"></ol>'); - var $liClass; - var $imgIcon; - var $h2Title; - var $pSummary; - var $olLessons; - var $liLesson; - $classLinks.each(function(index) { - $liClass = $('<li></li>'); - $h2Title = $('<a class="title" href="'+$(this).attr('href')+'"><h2>' + $(this).html()+'</h2><span></span></a>'); - $pSummary = $('<p class="description">' + $classDescriptions[index] + '</p>'); - - $olLessons = $('<ol class="lesson-list"></ol>'); - - $lessons = $(this).closest('li').find('ul li a'); - - if ($lessons.length) { - $imgIcon = $('<img src="'+toRoot+'assets/images/resource-tutorial.png" ' - + ' width="64" height="64" alt=""/>'); - $lessons.each(function(index) { - $olLessons.append('<li><a href="'+$(this).attr('href')+'">' + $(this).html()+'</a></li>'); - }); - } else { - $imgIcon = $('<img src="'+toRoot+'assets/images/resource-article.png" ' - + ' width="64" height="64" alt=""/>'); - $pSummary.addClass('article'); - } - - $liClass.append($h2Title).append($imgIcon).append($pSummary).append($olLessons); - $olClasses.append($liClass); - }); - $('.jd-descr').append($olClasses); - } - - // Set up expand/collapse behavior - initExpandableNavItems("#nav"); - - - $(".scroll-pane").scroll(function(event) { - event.preventDefault(); - return false; - }); - - /* Resize nav height when window height changes */ - $(window).resize(function() { - if ($('#side-nav').length == 0) return; - var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]'); - setNavBarLeftPos(); // do this even if sidenav isn't fixed because it could become fixed - // make sidenav behave when resizing the window and side-scolling is a concern - if (sticky) { - if ((stylesheet.attr("disabled") == "disabled") || stylesheet.length == 0) { - updateSideNavPosition(); - } else { - updateSidenavFullscreenWidth(); - } - } - resizeNav(); - }); - - - var navBarLeftPos; - if ($('#devdoc-nav').length) { - setNavBarLeftPos(); - } - - - // Set up play-on-hover <video> tags. - $('video.play-on-hover').bind('click', function(){ - $(this).get(0).load(); // in case the video isn't seekable - $(this).get(0).play(); - }); - - // Set up tooltips - var TOOLTIP_MARGIN = 10; - $('acronym,.tooltip-link').each(function() { - var $target = $(this); - var $tooltip = $('<div>') - .addClass('tooltip-box') - .append($target.attr('title')) - .hide() - .appendTo('body'); - $target.removeAttr('title'); - - $target.hover(function() { - // in - var targetRect = $target.offset(); - targetRect.width = $target.width(); - targetRect.height = $target.height(); - - $tooltip.css({ - left: targetRect.left, - top: targetRect.top + targetRect.height + TOOLTIP_MARGIN - }); - $tooltip.addClass('below'); - $tooltip.show(); - }, function() { - // out - $tooltip.hide(); - }); - }); - - // Set up <h2> deeplinks - $('h2').click(function() { - var id = $(this).attr('id'); - if (id) { - document.location.hash = id; - } - }); - - //Loads the +1 button - var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; - po.src = 'https://apis.google.com/js/plusone.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); - - - // Revise the sidenav widths to make room for the scrollbar - // which avoids the visible width from changing each time the bar appears - var $sidenav = $("#side-nav"); - var sidenav_width = parseInt($sidenav.innerWidth()); - - $("#devdoc-nav #nav").css("width", sidenav_width - 4 + "px"); // 4px is scrollbar width - - - $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller - - if ($(".scroll-pane").length > 1) { - // Check if there's a user preference for the panel heights - var cookieHeight = readCookie("reference_height"); - if (cookieHeight) { - restoreHeight(cookieHeight); - } - } - - // Resize once loading is finished - resizeNav(); - // Check if there's an anchor that we need to scroll into view. - // A delay is needed, because some browsers do not immediately scroll down to the anchor - window.setTimeout(offsetScrollForSticky, 100); - - /* init the language selector based on user cookie for lang */ - loadLangPref(); - changeNavLang(getLangPref()); - - /* setup event handlers to ensure the overflow menu is visible while picking lang */ - $("#language select") - .mousedown(function() { - $("div.morehover").addClass("hover"); }) - .blur(function() { - $("div.morehover").removeClass("hover"); }); - - /* some global variable setup */ - resizePackagesNav = $("#resize-packages-nav"); - classesNav = $("#classes-nav"); - devdocNav = $("#devdoc-nav"); - - var cookiePath = ""; - if (location.href.indexOf("/reference/") != -1) { - cookiePath = "reference_"; - } else if (location.href.indexOf("/guide/") != -1) { - cookiePath = "guide_"; - } else if (location.href.indexOf("/tools/") != -1) { - cookiePath = "tools_"; - } else if (location.href.indexOf("/training/") != -1) { - cookiePath = "training_"; - } else if (location.href.indexOf("/design/") != -1) { - cookiePath = "design_"; - } else if (location.href.indexOf("/distribute/") != -1) { - cookiePath = "distribute_"; - } - - - /* setup shadowbox for any videos that want it */ - var $videoLinks = $("a.video-shadowbox-button, a.notice-developers-video"); - if ($videoLinks.length) { - // if there's at least one, add the shadowbox HTML to the body - $('body').prepend( -'<div id="video-container">'+ - '<div id="video-frame">'+ - '<div class="video-close">'+ - '<span id="icon-video-close" onclick="closeVideo()"> </span>'+ - '</div>'+ - '<div id="youTubePlayer"></div>'+ - '</div>'+ -'</div>'); - - // loads the IFrame Player API code asynchronously. - $.getScript("https://www.youtube.com/iframe_api"); - - $videoLinks.each(function() { - var videoId = $(this).attr('href').split('?v=')[1]; - $(this).click(function(event) { - event.preventDefault(); - startYouTubePlayer(videoId); - }); - }); - } -}); -// END of the onload event - - -var youTubePlayer; -function onYouTubeIframeAPIReady() { -} - -/* Returns the height the shadowbox video should be. It's based on the current - height of the "video-frame" element, which is 100% height for the window. - Then minus the margin so the video isn't actually the full window height. */ -function getVideoHeight() { - var frameHeight = $("#video-frame").height(); - var marginTop = $("#video-frame").css('margin-top').split('px')[0]; - return frameHeight - (marginTop * 2); -} - -var mPlayerPaused = false; - -function startYouTubePlayer(videoId) { - $("#video-container").show(); - $("#video-frame").show(); - mPlayerPaused = false; - - // compute the size of the player so it's centered in window - var maxWidth = 940; // the width of the web site content - var videoAspect = .5625; // based on 1280x720 resolution - var maxHeight = maxWidth * videoAspect; - var videoHeight = getVideoHeight(); - var videoWidth = videoHeight / videoAspect; - if (videoWidth > maxWidth) { - videoWidth = maxWidth; - videoHeight = maxHeight; - } - $("#video-frame").css('width', videoWidth); - - // check if we've already created this player - if (youTubePlayer == null) { - // check if there's a start time specified - var idAndHash = videoId.split("#"); - var startTime = 0; - if (idAndHash.length > 1) { - startTime = idAndHash[1].split("t=")[1] != undefined ? idAndHash[1].split("t=")[1] : 0; - } - // enable localized player - var lang = getLangPref(); - var captionsOn = lang == 'en' ? 0 : 1; - - youTubePlayer = new YT.Player('youTubePlayer', { - height: videoHeight, - width: videoWidth, - videoId: idAndHash[0], - playerVars: {start: startTime, hl: lang, cc_load_policy: captionsOn}, - events: { - 'onReady': onPlayerReady, - 'onStateChange': onPlayerStateChange - } - }); - } else { - // reset the size in case the user adjusted the window since last play - youTubePlayer.setSize(videoWidth, videoHeight); - // if a video different from the one already playing was requested, cue it up - if (videoId != youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0]) { - youTubePlayer.cueVideoById(videoId); - } - youTubePlayer.playVideo(); - } -} - -function onPlayerReady(event) { - event.target.playVideo(); - mPlayerPaused = false; -} - -function closeVideo() { - try { - youTubePlayer.pauseVideo(); - } catch(e) { - } - $("#video-container").fadeOut(200); -} - -/* Track youtube playback for analytics */ -function onPlayerStateChange(event) { - // Video starts, send the video ID - if (event.data == YT.PlayerState.PLAYING) { - if (mPlayerPaused) { - ga('send', 'event', 'Videos', 'Resume', - youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0]); - } else { - // track the start playing event so we know from which page the video was selected - ga('send', 'event', 'Videos', 'Start: ' + - youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0], - 'on: ' + document.location.href); - } - mPlayerPaused = false; - } - // Video paused, send video ID and video elapsed time - if (event.data == YT.PlayerState.PAUSED) { - ga('send', 'event', 'Videos', 'Paused', - youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0], - youTubePlayer.getCurrentTime()); - mPlayerPaused = true; - } - // Video finished, send video ID and video elapsed time - if (event.data == YT.PlayerState.ENDED) { - ga('send', 'event', 'Videos', 'Finished', - youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0], - youTubePlayer.getCurrentTime()); - mPlayerPaused = true; - } -} - - - -function initExpandableNavItems(rootTag) { - $(rootTag + ' li.nav-section .nav-section-header').click(function() { - var section = $(this).closest('li.nav-section'); - if (section.hasClass('expanded')) { - /* hide me and descendants */ - section.find('ul').slideUp(250, function() { - // remove 'expanded' class from my section and any children - section.closest('li').removeClass('expanded'); - $('li.nav-section', section).removeClass('expanded'); - resizeNav(); - }); - } else { - /* show me */ - // first hide all other siblings - var $others = $('li.nav-section.expanded', $(this).closest('ul')).not('.sticky'); - $others.removeClass('expanded').children('ul').slideUp(250); - - // now expand me - section.closest('li').addClass('expanded'); - section.children('ul').slideDown(250, function() { - resizeNav(); - }); - } - }); - - // Stop expand/collapse behavior when clicking on nav section links - // (since we're navigating away from the page) - // This selector captures the first instance of <a>, but not those with "#" as the href. - $('.nav-section-header').find('a:eq(0)').not('a[href="#"]').click(function(evt) { - window.location.href = $(this).attr('href'); - return false; - }); -} - - -/** Create the list of breadcrumb links in the sticky header */ -function buildBreadcrumbs() { - var $breadcrumbUl = $("#sticky-header ul.breadcrumb"); - // Add the secondary horizontal nav item, if provided - var $selectedSecondNav = $("div#nav-x ul.nav-x a.selected").clone().removeClass("selected"); - if ($selectedSecondNav.length) { - $breadcrumbUl.prepend($("<li>").append($selectedSecondNav)) - } - // Add the primary horizontal nav - var $selectedFirstNav = $("div#header-wrap ul.nav-x a.selected").clone().removeClass("selected"); - // If there's no header nav item, use the logo link and title from alt text - if ($selectedFirstNav.length < 1) { - $selectedFirstNav = $("<a>") - .attr('href', $("div#header .logo a").attr('href')) - .text($("div#header .logo img").attr('alt')); - } - $breadcrumbUl.prepend($("<li>").append($selectedFirstNav)); -} - - - -/** Highlight the current page in sidenav, expanding children as appropriate */ -function highlightSidenav() { - // if something is already highlighted, undo it. This is for dynamic navigation (Samples index) - if ($("ul#nav li.selected").length) { - unHighlightSidenav(); - } - // look for URL in sidenav, including the hash - var $selNavLink = $('#nav').find('a[href="' + mPagePath + location.hash + '"]'); - - // If the selNavLink is still empty, look for it without the hash - if ($selNavLink.length == 0) { - $selNavLink = $('#nav').find('a[href="' + mPagePath + '"]'); - } - - var $selListItem; - if ($selNavLink.length) { - // Find this page's <li> in sidenav and set selected - $selListItem = $selNavLink.closest('li'); - $selListItem.addClass('selected'); - - // Traverse up the tree and expand all parent nav-sections - $selNavLink.parents('li.nav-section').each(function() { - $(this).addClass('expanded'); - $(this).children('ul').show(); - }); - } -} - -function unHighlightSidenav() { - $("ul#nav li.selected").removeClass("selected"); - $('ul#nav li.nav-section.expanded').removeClass('expanded').children('ul').hide(); -} - -function toggleFullscreen(enable) { - var delay = 20; - var enabled = true; - var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]'); - if (enable) { - // Currently NOT USING fullscreen; enable fullscreen - stylesheet.removeAttr('disabled'); - $('#nav-swap .fullscreen').removeClass('disabled'); - $('#devdoc-nav').css({left:''}); - setTimeout(updateSidenavFullscreenWidth,delay); // need to wait a moment for css to switch - enabled = true; - } else { - // Currently USING fullscreen; disable fullscreen - stylesheet.attr('disabled', 'disabled'); - $('#nav-swap .fullscreen').addClass('disabled'); - setTimeout(updateSidenavFixedWidth,delay); // need to wait a moment for css to switch - enabled = false; - } - writeCookie("fullscreen", enabled, null); - setNavBarLeftPos(); - resizeNav(delay); - updateSideNavPosition(); - setTimeout(initSidenavHeightResize,delay); -} - - -function setNavBarLeftPos() { - navBarLeftPos = $('#body-content').offset().left; -} - - -function updateSideNavPosition() { - var newLeft = $(window).scrollLeft() - navBarLeftPos; - $('#devdoc-nav').css({left: -newLeft}); - $('#devdoc-nav .totop').css({left: -(newLeft - parseInt($('#side-nav').css('margin-left')))}); -} - -// TODO: use $(document).ready instead -function addLoadEvent(newfun) { - var current = window.onload; - if (typeof window.onload != 'function') { - window.onload = newfun; - } else { - window.onload = function() { - current(); - newfun(); - } - } -} - -var agent = navigator['userAgent'].toLowerCase(); -// If a mobile phone, set flag and do mobile setup -if ((agent.indexOf("mobile") != -1) || // android, iphone, ipod - (agent.indexOf("blackberry") != -1) || - (agent.indexOf("webos") != -1) || - (agent.indexOf("mini") != -1)) { // opera mini browsers - isMobile = true; -} - - -$(document).ready(function() { - $("pre:not(.no-pretty-print)").addClass("prettyprint"); - prettyPrint(); -}); - - - - -/* ######### RESIZE THE SIDENAV HEIGHT ########## */ - -function resizeNav(delay) { - var $nav = $("#devdoc-nav"); - var $window = $(window); - var navHeight; - - // Get the height of entire window and the total header height. - // Then figure out based on scroll position whether the header is visible - var windowHeight = $window.height(); - var scrollTop = $window.scrollTop(); - var headerHeight = $('#header-wrapper').outerHeight(); - var headerVisible = scrollTop < stickyTop; - - // get the height of space between nav and top of window. - // Could be either margin or top position, depending on whether the nav is fixed. - var topMargin = (parseInt($nav.css('margin-top')) || parseInt($nav.css('top'))) + 1; - // add 1 for the #side-nav bottom margin - - // Depending on whether the header is visible, set the side nav's height. - if (headerVisible) { - // The sidenav height grows as the header goes off screen - navHeight = windowHeight - (headerHeight - scrollTop) - topMargin; - } else { - // Once header is off screen, the nav height is almost full window height - navHeight = windowHeight - topMargin; - } - - - - $scrollPanes = $(".scroll-pane"); - if ($scrollPanes.length > 1) { - // subtract the height of the api level widget and nav swapper from the available nav height - navHeight -= ($('#api-nav-header').outerHeight(true) + $('#nav-swap').outerHeight(true)); - - $("#swapper").css({height:navHeight + "px"}); - if ($("#nav-tree").is(":visible")) { - $("#nav-tree").css({height:navHeight}); - } - - var classesHeight = navHeight - parseInt($("#resize-packages-nav").css("height")) - 10 + "px"; - //subtract 10px to account for drag bar - - // if the window becomes small enough to make the class panel height 0, - // then the package panel should begin to shrink - if (parseInt(classesHeight) <= 0) { - $("#resize-packages-nav").css({height:navHeight - 10}); //subtract 10px for drag bar - $("#packages-nav").css({height:navHeight - 10}); - } - - $("#classes-nav").css({'height':classesHeight, 'margin-top':'10px'}); - $("#classes-nav .jspContainer").css({height:classesHeight}); - - - } else { - $nav.height(navHeight); - } - - if (delay) { - updateFromResize = true; - delayedReInitScrollbars(delay); - } else { - reInitScrollbars(); - } - -} - -var updateScrollbars = false; -var updateFromResize = false; - -/* Re-initialize the scrollbars to account for changed nav size. - * This method postpones the actual update by a 1/4 second in order to optimize the - * scroll performance while the header is still visible, because re-initializing the - * scroll panes is an intensive process. - */ -function delayedReInitScrollbars(delay) { - // If we're scheduled for an update, but have received another resize request - // before the scheduled resize has occured, just ignore the new request - // (and wait for the scheduled one). - if (updateScrollbars && updateFromResize) { - updateFromResize = false; - return; - } - - // We're scheduled for an update and the update request came from this method's setTimeout - if (updateScrollbars && !updateFromResize) { - reInitScrollbars(); - updateScrollbars = false; - } else { - updateScrollbars = true; - updateFromResize = false; - setTimeout('delayedReInitScrollbars()',delay); - } -} - -/* Re-initialize the scrollbars to account for changed nav size. */ -function reInitScrollbars() { - var pane = $(".scroll-pane").each(function(){ - var api = $(this).data('jsp'); - if (!api) { setTimeout(reInitScrollbars,300); return;} - api.reinitialise( {verticalGutter:0} ); - }); - $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller -} - - -/* Resize the height of the nav panels in the reference, - * and save the new size to a cookie */ -function saveNavPanels() { - var basePath = getBaseUri(location.pathname); - var section = basePath.substring(1,basePath.indexOf("/",1)); - writeCookie("height", resizePackagesNav.css("height"), section); -} - - - -function restoreHeight(packageHeight) { - $("#resize-packages-nav").height(packageHeight); - $("#packages-nav").height(packageHeight); - // var classesHeight = navHeight - packageHeight; - // $("#classes-nav").css({height:classesHeight}); - // $("#classes-nav .jspContainer").css({height:classesHeight}); -} - - - -/* ######### END RESIZE THE SIDENAV HEIGHT ########## */ - - - - - -/** Scroll the jScrollPane to make the currently selected item visible - This is called when the page finished loading. */ -function scrollIntoView(nav) { - var $nav = $("#"+nav); - var element = $nav.jScrollPane({/* ...settings... */}); - var api = element.data('jsp'); - - if ($nav.is(':visible')) { - var $selected = $(".selected", $nav); - if ($selected.length == 0) { - // If no selected item found, exit - return; - } - // get the selected item's offset from its container nav by measuring the item's offset - // relative to the document then subtract the container nav's offset relative to the document - var selectedOffset = $selected.offset().top - $nav.offset().top; - if (selectedOffset > $nav.height() * .8) { // multiply nav height by .8 so we move up the item - // if it's more than 80% down the nav - // scroll the item up by an amount equal to 80% the container nav's height - api.scrollTo(0, selectedOffset - ($nav.height() * .8), false); - } - } -} - - - - - - -/* Show popup dialogs */ -function showDialog(id) { - $dialog = $("#"+id); - $dialog.prepend('<div class="box-border"><div class="top"> <div class="left"></div> <div class="right"></div></div><div class="bottom"> <div class="left"></div> <div class="right"></div> </div> </div>'); - $dialog.wrapInner('<div/>'); - $dialog.removeClass("hide"); -} - - - - - -/* ######### COOKIES! ########## */ - -function readCookie(cookie) { - var myCookie = cookie_namespace+"_"+cookie+"="; - if (document.cookie) { - var index = document.cookie.indexOf(myCookie); - if (index != -1) { - var valStart = index + myCookie.length; - var valEnd = document.cookie.indexOf(";", valStart); - if (valEnd == -1) { - valEnd = document.cookie.length; - } - var val = document.cookie.substring(valStart, valEnd); - return val; - } - } - return 0; -} - -function writeCookie(cookie, val, section) { - if (val==undefined) return; - section = section == null ? "_" : "_"+section+"_"; - var age = 2*365*24*60*60; // set max-age to 2 years - var cookieValue = cookie_namespace + section + cookie + "=" + val - + "; max-age=" + age +"; path=/"; - document.cookie = cookieValue; -} - -/* ######### END COOKIES! ########## */ - - -var sticky = false; -var stickyTop; -var prevScrollLeft = 0; // used to compare current position to previous position of horiz scroll -/* Sets the vertical scoll position at which the sticky bar should appear. - This method is called to reset the position when search results appear or hide */ -function setStickyTop() { - stickyTop = $('#header-wrapper').outerHeight() - $('#sticky-header').outerHeight(); -} - -/* - * Displays sticky nav bar on pages when dac header scrolls out of view - */ -$(window).scroll(function(event) { - - setStickyTop(); - var hiding = false; - var $stickyEl = $('#sticky-header'); - var $menuEl = $('.menu-container'); - // Exit if there's no sidenav - if ($('#side-nav').length == 0) return; - // Exit if the mouse target is a DIV, because that means the event is coming - // from a scrollable div and so there's no need to make adjustments to our layout - if ($(event.target).nodeName == "DIV") { - return; - } - - var top = $(window).scrollTop(); - // we set the navbar fixed when the scroll position is beyond the height of the site header... - var shouldBeSticky = top >= stickyTop; - // ... except if the document content is shorter than the sidenav height. - // (this is necessary to avoid crazy behavior on OSX Lion due to overscroll bouncing) - if ($("#doc-col").height() < $("#side-nav").height()) { - shouldBeSticky = false; - } - // Account for horizontal scroll - var scrollLeft = $(window).scrollLeft(); - // When the sidenav is fixed and user scrolls horizontally, reposition the sidenav to match - if (sticky && (scrollLeft != prevScrollLeft)) { - updateSideNavPosition(); - prevScrollLeft = scrollLeft; - } - - // Don't continue if the header is sufficently far away - // (to avoid intensive resizing that slows scrolling) - if (sticky == shouldBeSticky) { - return; - } - - // If sticky header visible and position is now near top, hide sticky - if (sticky && !shouldBeSticky) { - sticky = false; - hiding = true; - // make the sidenav static again - $('#devdoc-nav') - .removeClass('fixed') - .css({'width':'auto','margin':''}) - .prependTo('#side-nav'); - // delay hide the sticky - $menuEl.removeClass('sticky-menu'); - $stickyEl.fadeOut(250); - hiding = false; - - // update the sidenaav position for side scrolling - updateSideNavPosition(); - } else if (!sticky && shouldBeSticky) { - sticky = true; - $stickyEl.fadeIn(10); - $menuEl.addClass('sticky-menu'); - - // make the sidenav fixed - var width = $('#devdoc-nav').width(); - $('#devdoc-nav') - .addClass('fixed') - .css({'width':width+'px'}) - .prependTo('#body-content'); - - // update the sidenaav position for side scrolling - updateSideNavPosition(); - - } else if (hiding && top < 15) { - $menuEl.removeClass('sticky-menu'); - $stickyEl.hide(); - hiding = false; - } - resizeNav(250); // pass true in order to delay the scrollbar re-initialization for performance -}); - -/* - * Manages secion card states and nav resize to conclude loading - */ -(function() { - $(document).ready(function() { - - // Stack hover states - $('.section-card-menu').each(function(index, el) { - var height = $(el).height(); - $(el).css({height:height+'px', position:'relative'}); - var $cardInfo = $(el).find('.card-info'); - - $cardInfo.css({position: 'absolute', bottom:'0px', left:'0px', right:'0px', overflow:'visible'}); - }); - - }); - -})(); - - - - - - - - - - - - - - -/* MISC LIBRARY FUNCTIONS */ - - - - - -function toggle(obj, slide) { - var ul = $("ul:first", obj); - var li = ul.parent(); - if (li.hasClass("closed")) { - if (slide) { - ul.slideDown("fast"); - } else { - ul.show(); - } - li.removeClass("closed"); - li.addClass("open"); - $(".toggle-img", li).attr("title", "hide pages"); - } else { - ul.slideUp("fast"); - li.removeClass("open"); - li.addClass("closed"); - $(".toggle-img", li).attr("title", "show pages"); - } -} - - -function buildToggleLists() { - $(".toggle-list").each( - function(i) { - $("div:first", this).append("<a class='toggle-img' href='#' title='show pages' onClick='toggle(this.parentNode.parentNode, true); return false;'></a>"); - $(this).addClass("closed"); - }); -} - - - -function hideNestedItems(list, toggle) { - $list = $(list); - // hide nested lists - if($list.hasClass('showing')) { - $("li ol", $list).hide('fast'); - $list.removeClass('showing'); - // show nested lists - } else { - $("li ol", $list).show('fast'); - $list.addClass('showing'); - } - $(".more,.less",$(toggle)).toggle(); -} - - -/* Call this to add listeners to a <select> element for Studio/Eclipse/Other docs */ -function setupIdeDocToggle() { - $( "select.ide" ).change(function() { - var selected = $(this).find("option:selected").attr("value"); - $(".select-ide").hide(); - $(".select-ide."+selected).show(); - - $("select.ide").val(selected); - }); -} - - - - - - - - - - - - - - - - - - - - - - - - -/* REFERENCE NAV SWAP */ - - -function getNavPref() { - var v = readCookie('reference_nav'); - if (v != NAV_PREF_TREE) { - v = NAV_PREF_PANELS; - } - return v; -} - -function chooseDefaultNav() { - nav_pref = getNavPref(); - if (nav_pref == NAV_PREF_TREE) { - $("#nav-panels").toggle(); - $("#panel-link").toggle(); - $("#nav-tree").toggle(); - $("#tree-link").toggle(); - } -} - -function swapNav() { - if (nav_pref == NAV_PREF_TREE) { - nav_pref = NAV_PREF_PANELS; - } else { - nav_pref = NAV_PREF_TREE; - init_default_navtree(toRoot); - } - writeCookie("nav", nav_pref, "reference"); - - $("#nav-panels").toggle(); - $("#panel-link").toggle(); - $("#nav-tree").toggle(); - $("#tree-link").toggle(); - - resizeNav(); - - // Gross nasty hack to make tree view show up upon first swap by setting height manually - $("#nav-tree .jspContainer:visible") - .css({'height':$("#nav-tree .jspContainer .jspPane").height() +'px'}); - // Another nasty hack to make the scrollbar appear now that we have height - resizeNav(); - - if ($("#nav-tree").is(':visible')) { - scrollIntoView("nav-tree"); - } else { - scrollIntoView("packages-nav"); - scrollIntoView("classes-nav"); - } -} - - - -/* ############################################ */ -/* ########## LOCALIZATION ############ */ -/* ############################################ */ - -function getBaseUri(uri) { - var intlUrl = (uri.substring(0,6) == "/intl/"); - if (intlUrl) { - base = uri.substring(uri.indexOf('intl/')+5,uri.length); - base = base.substring(base.indexOf('/')+1, base.length); - //alert("intl, returning base url: /" + base); - return ("/" + base); - } else { - //alert("not intl, returning uri as found."); - return uri; - } -} - -function requestAppendHL(uri) { -//append "?hl=<lang> to an outgoing request (such as to blog) - var lang = getLangPref(); - if (lang) { - var q = 'hl=' + lang; - uri += '?' + q; - window.location = uri; - return false; - } else { - return true; - } -} - - -function changeNavLang(lang) { - var $links = $("#devdoc-nav,#header,#nav-x,.training-nav-top,.content-footer").find("a["+lang+"-lang]"); - $links.each(function(i){ // for each link with a translation - var $link = $(this); - if (lang != "en") { // No need to worry about English, because a language change invokes new request - // put the desired language from the attribute as the text - $link.text($link.attr(lang+"-lang")) - } - }); -} - -function changeLangPref(lang, submit) { - writeCookie("pref_lang", lang, null); - - // ####### TODO: Remove this condition once we're stable on devsite ####### - // This condition is only needed if we still need to support legacy GAE server - if (devsite) { - // Switch language when on Devsite server - if (submit) { - $("#setlang").submit(); - } - } else { - // Switch language when on legacy GAE server - if (submit) { - window.location = getBaseUri(location.pathname); - } - } -} - -function loadLangPref() { - var lang = readCookie("pref_lang"); - if (lang != 0) { - $("#language").find("option[value='"+lang+"']").attr("selected",true); - } -} - -function getLangPref() { - var lang = $("#language").find(":selected").attr("value"); - if (!lang) { - lang = readCookie("pref_lang"); - } - return (lang != 0) ? lang : 'en'; -} - -/* ########## END LOCALIZATION ############ */ - - - - - - -/* Used to hide and reveal supplemental content, such as long code samples. - See the companion CSS in android-developer-docs.css */ -function toggleContent(obj) { - var div = $(obj).closest(".toggle-content"); - var toggleMe = $(".toggle-content-toggleme:eq(0)",div); - if (div.hasClass("closed")) { // if it's closed, open it - toggleMe.slideDown(); - $(".toggle-content-text:eq(0)", obj).toggle(); - div.removeClass("closed").addClass("open"); - $(".toggle-content-img:eq(0)", div).attr("title", "hide").attr("src", toRoot - + "assets/images/triangle-opened.png"); - } else { // if it's open, close it - toggleMe.slideUp('fast', function() { // Wait until the animation is done before closing arrow - $(".toggle-content-text:eq(0)", obj).toggle(); - div.removeClass("open").addClass("closed"); - div.find(".toggle-content").removeClass("open").addClass("closed") - .find(".toggle-content-toggleme").hide(); - $(".toggle-content-img", div).attr("title", "show").attr("src", toRoot - + "assets/images/triangle-closed.png"); - }); - } - return false; -} - - -/* New version of expandable content */ -function toggleExpandable(link,id) { - if($(id).is(':visible')) { - $(id).slideUp(); - $(link).removeClass('expanded'); - } else { - $(id).slideDown(); - $(link).addClass('expanded'); - } -} - -function hideExpandable(ids) { - $(ids).slideUp(); - $(ids).prev('h4').find('a.expandable').removeClass('expanded'); -} - - - - - -/* - * Slideshow 1.0 - * Used on /index.html and /develop/index.html for carousel - * - * Sample usage: - * HTML - - * <div class="slideshow-container"> - * <a href="" class="slideshow-prev">Prev</a> - * <a href="" class="slideshow-next">Next</a> - * <ul> - * <li class="item"><img src="images/marquee1.jpg"></li> - * <li class="item"><img src="images/marquee2.jpg"></li> - * <li class="item"><img src="images/marquee3.jpg"></li> - * <li class="item"><img src="images/marquee4.jpg"></li> - * </ul> - * </div> - * - * <script type="text/javascript"> - * $('.slideshow-container').dacSlideshow({ - * auto: true, - * btnPrev: '.slideshow-prev', - * btnNext: '.slideshow-next' - * }); - * </script> - * - * Options: - * btnPrev: optional identifier for previous button - * btnNext: optional identifier for next button - * btnPause: optional identifier for pause button - * auto: whether or not to auto-proceed - * speed: animation speed - * autoTime: time between auto-rotation - * easing: easing function for transition - * start: item to select by default - * scroll: direction to scroll in - * pagination: whether or not to include dotted pagination - * - */ - - (function($) { - $.fn.dacSlideshow = function(o) { - - //Options - see above - o = $.extend({ - btnPrev: null, - btnNext: null, - btnPause: null, - auto: true, - speed: 500, - autoTime: 12000, - easing: null, - start: 0, - scroll: 1, - pagination: true - - }, o || {}); - - //Set up a carousel for each - return this.each(function() { - - var running = false; - var animCss = o.vertical ? "top" : "left"; - var sizeCss = o.vertical ? "height" : "width"; - var div = $(this); - var ul = $("ul", div); - var tLi = $("li", ul); - var tl = tLi.size(); - var timer = null; - - var li = $("li", ul); - var itemLength = li.size(); - var curr = o.start; - - li.css({float: o.vertical ? "none" : "left"}); - ul.css({margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1"}); - div.css({position: "relative", "z-index": "2", left: "0px"}); - - var liSize = o.vertical ? height(li) : width(li); - var ulSize = liSize * itemLength; - var divSize = liSize; - - li.css({width: li.width(), height: li.height()}); - ul.css(sizeCss, ulSize+"px").css(animCss, -(curr*liSize)); - - div.css(sizeCss, divSize+"px"); - - //Pagination - if (o.pagination) { - var pagination = $("<div class='pagination'></div>"); - var pag_ul = $("<ul></ul>"); - if (tl > 1) { - for (var i=0;i<tl;i++) { - var li = $("<li>"+i+"</li>"); - pag_ul.append(li); - if (i==o.start) li.addClass('active'); - li.click(function() { - go(parseInt($(this).text())); - }) - } - pagination.append(pag_ul); - div.append(pagination); - } - } - - //Previous button - if(o.btnPrev) - $(o.btnPrev).click(function(e) { - e.preventDefault(); - return go(curr-o.scroll); - }); - - //Next button - if(o.btnNext) - $(o.btnNext).click(function(e) { - e.preventDefault(); - return go(curr+o.scroll); - }); - - //Pause button - if(o.btnPause) - $(o.btnPause).click(function(e) { - e.preventDefault(); - if ($(this).hasClass('paused')) { - startRotateTimer(); - } else { - pauseRotateTimer(); - } - }); - - //Auto rotation - if(o.auto) startRotateTimer(); - - function startRotateTimer() { - clearInterval(timer); - timer = setInterval(function() { - if (curr == tl-1) { - go(0); - } else { - go(curr+o.scroll); - } - }, o.autoTime); - $(o.btnPause).removeClass('paused'); - } - - function pauseRotateTimer() { - clearInterval(timer); - $(o.btnPause).addClass('paused'); - } - - //Go to an item - function go(to) { - if(!running) { - - if(to<0) { - to = itemLength-1; - } else if (to>itemLength-1) { - to = 0; - } - curr = to; - - running = true; - - ul.animate( - animCss == "left" ? { left: -(curr*liSize) } : { top: -(curr*liSize) } , o.speed, o.easing, - function() { - running = false; - } - ); - - $(o.btnPrev + "," + o.btnNext).removeClass("disabled"); - $( (curr-o.scroll<0 && o.btnPrev) - || - (curr+o.scroll > itemLength && o.btnNext) - || - [] - ).addClass("disabled"); - - - var nav_items = $('li', pagination); - nav_items.removeClass('active'); - nav_items.eq(to).addClass('active'); - - - } - if(o.auto) startRotateTimer(); - return false; - }; - }); - }; - - function css(el, prop) { - return parseInt($.css(el[0], prop)) || 0; - }; - function width(el) { - return el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight'); - }; - function height(el) { - return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom'); - }; - - })(jQuery); - - -/* - * dacSlideshow 1.0 - * Used on develop/index.html for side-sliding tabs - * - * Sample usage: - * HTML - - * <div class="slideshow-container"> - * <a href="" class="slideshow-prev">Prev</a> - * <a href="" class="slideshow-next">Next</a> - * <ul> - * <li class="item"><img src="images/marquee1.jpg"></li> - * <li class="item"><img src="images/marquee2.jpg"></li> - * <li class="item"><img src="images/marquee3.jpg"></li> - * <li class="item"><img src="images/marquee4.jpg"></li> - * </ul> - * </div> - * - * <script type="text/javascript"> - * $('.slideshow-container').dacSlideshow({ - * auto: true, - * btnPrev: '.slideshow-prev', - * btnNext: '.slideshow-next' - * }); - * </script> - * - * Options: - * btnPrev: optional identifier for previous button - * btnNext: optional identifier for next button - * auto: whether or not to auto-proceed - * speed: animation speed - * autoTime: time between auto-rotation - * easing: easing function for transition - * start: item to select by default - * scroll: direction to scroll in - * pagination: whether or not to include dotted pagination - * - */ - (function($) { - $.fn.dacTabbedList = function(o) { - - //Options - see above - o = $.extend({ - speed : 250, - easing: null, - nav_id: null, - frame_id: null - }, o || {}); - - //Set up a carousel for each - return this.each(function() { - - var curr = 0; - var running = false; - var animCss = "margin-left"; - var sizeCss = "width"; - var div = $(this); - - var nav = $(o.nav_id, div); - var nav_li = $("li", nav); - var nav_size = nav_li.size(); - var frame = div.find(o.frame_id); - var content_width = $(frame).find('ul').width(); - //Buttons - $(nav_li).click(function(e) { - go($(nav_li).index($(this))); - }) - - //Go to an item - function go(to) { - if(!running) { - curr = to; - running = true; - - frame.animate({ 'margin-left' : -(curr*content_width) }, o.speed, o.easing, - function() { - running = false; - } - ); - - - nav_li.removeClass('active'); - nav_li.eq(to).addClass('active'); - - - } - return false; - }; - }); - }; - - function css(el, prop) { - return parseInt($.css(el[0], prop)) || 0; - }; - function width(el) { - return el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight'); - }; - function height(el) { - return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom'); - }; - - })(jQuery); - - - - - -/* ######################################################## */ -/* ################ SEARCH SUGGESTIONS ################## */ -/* ######################################################## */ - - - -var gSelectedIndex = -1; // the index position of currently highlighted suggestion -var gSelectedColumn = -1; // which column of suggestion lists is currently focused - -var gMatches = new Array(); -var gLastText = ""; -var gInitialized = false; -var ROW_COUNT_FRAMEWORK = 20; // max number of results in list -var gListLength = 0; - - -var gGoogleMatches = new Array(); -var ROW_COUNT_GOOGLE = 15; // max number of results in list -var gGoogleListLength = 0; - -var gDocsMatches = new Array(); -var ROW_COUNT_DOCS = 100; // max number of results in list -var gDocsListLength = 0; - -function onSuggestionClick(link) { - // When user clicks a suggested document, track it - ga('send', 'event', 'Suggestion Click', 'clicked: ' + $(link).attr('href'), - 'query: ' + $("#search_autocomplete").val().toLowerCase()); -} - -function set_item_selected($li, selected) -{ - if (selected) { - $li.attr('class','jd-autocomplete jd-selected'); - } else { - $li.attr('class','jd-autocomplete'); - } -} - -function set_item_values(toroot, $li, match) -{ - var $link = $('a',$li); - $link.html(match.__hilabel || match.label); - $link.attr('href',toroot + match.link); -} - -function set_item_values_jd(toroot, $li, match) -{ - var $link = $('a',$li); - $link.html(match.title); - $link.attr('href',toroot + match.url); -} - -function new_suggestion($list) { - var $li = $("<li class='jd-autocomplete'></li>"); - $list.append($li); - - $li.mousedown(function() { - window.location = this.firstChild.getAttribute("href"); - }); - $li.mouseover(function() { - $('.search_filtered_wrapper li').removeClass('jd-selected'); - $(this).addClass('jd-selected'); - gSelectedColumn = $(".search_filtered:visible").index($(this).closest('.search_filtered')); - gSelectedIndex = $("li", $(".search_filtered:visible")[gSelectedColumn]).index(this); - }); - $li.append("<a onclick='onSuggestionClick(this)'></a>"); - $li.attr('class','show-item'); - return $li; -} - -function sync_selection_table(toroot) -{ - var $li; //list item jquery object - var i; //list item iterator - - // if there are NO results at all, hide all columns - if (!(gMatches.length > 0) && !(gGoogleMatches.length > 0) && !(gDocsMatches.length > 0)) { - $('.suggest-card').hide(300); - return; - } - - // if there are api results - if ((gMatches.length > 0) || (gGoogleMatches.length > 0)) { - // reveal suggestion list - $('.suggest-card.dummy').show(); - $('.suggest-card.reference').show(); - var listIndex = 0; // list index position - - // reset the lists - $(".search_filtered_wrapper.reference li").remove(); - - // ########### ANDROID RESULTS ############# - if (gMatches.length > 0) { - - // determine android results to show - gListLength = gMatches.length < ROW_COUNT_FRAMEWORK ? - gMatches.length : ROW_COUNT_FRAMEWORK; - for (i=0; i<gListLength; i++) { - var $li = new_suggestion($(".suggest-card.reference ul")); - set_item_values(toroot, $li, gMatches[i]); - set_item_selected($li, i == gSelectedIndex); - } - } - - // ########### GOOGLE RESULTS ############# - if (gGoogleMatches.length > 0) { - // show header for list - $(".suggest-card.reference ul").append("<li class='header'>in Google Services:</li>"); - - // determine google results to show - gGoogleListLength = gGoogleMatches.length < ROW_COUNT_GOOGLE ? gGoogleMatches.length : ROW_COUNT_GOOGLE; - for (i=0; i<gGoogleListLength; i++) { - var $li = new_suggestion($(".suggest-card.reference ul")); - set_item_values(toroot, $li, gGoogleMatches[i]); - set_item_selected($li, i == gSelectedIndex); - } - } - } else { - $('.suggest-card.reference').hide(); - $('.suggest-card.dummy').hide(); - } - - // ########### JD DOC RESULTS ############# - if (gDocsMatches.length > 0) { - // reset the lists - $(".search_filtered_wrapper.docs li").remove(); - - // determine google results to show - // NOTE: The order of the conditions below for the sugg.type MUST BE SPECIFIC: - // The order must match the reverse order that each section appears as a card in - // the suggestion UI... this may be only for the "develop" grouped items though. - gDocsListLength = gDocsMatches.length < ROW_COUNT_DOCS ? gDocsMatches.length : ROW_COUNT_DOCS; - for (i=0; i<gDocsListLength; i++) { - var sugg = gDocsMatches[i]; - var $li; - if (sugg.type == "design") { - $li = new_suggestion($(".suggest-card.design ul")); - } else - if (sugg.type == "distribute") { - $li = new_suggestion($(".suggest-card.distribute ul")); - } else - if (sugg.type == "samples") { - $li = new_suggestion($(".suggest-card.develop .child-card.samples")); - } else - if (sugg.type == "training") { - $li = new_suggestion($(".suggest-card.develop .child-card.training")); - } else - if (sugg.type == "about"||"guide"||"tools"||"google") { - $li = new_suggestion($(".suggest-card.develop .child-card.guides")); - } else { - continue; - } - - set_item_values_jd(toroot, $li, sugg); - set_item_selected($li, i == gSelectedIndex); - } - - // add heading and show or hide card - if ($(".suggest-card.design li").length > 0) { - $(".suggest-card.design ul").prepend("<li class='header'>Design:</li>"); - $(".suggest-card.design").show(300); - } else { - $('.suggest-card.design').hide(300); - } - if ($(".suggest-card.distribute li").length > 0) { - $(".suggest-card.distribute ul").prepend("<li class='header'>Distribute:</li>"); - $(".suggest-card.distribute").show(300); - } else { - $('.suggest-card.distribute').hide(300); - } - if ($(".child-card.guides li").length > 0) { - $(".child-card.guides").prepend("<li class='header'>Guides:</li>"); - $(".child-card.guides li").appendTo(".suggest-card.develop ul"); - } - if ($(".child-card.training li").length > 0) { - $(".child-card.training").prepend("<li class='header'>Training:</li>"); - $(".child-card.training li").appendTo(".suggest-card.develop ul"); - } - if ($(".child-card.samples li").length > 0) { - $(".child-card.samples").prepend("<li class='header'>Samples:</li>"); - $(".child-card.samples li").appendTo(".suggest-card.develop ul"); - } - - if ($(".suggest-card.develop li").length > 0) { - $(".suggest-card.develop").show(300); - } else { - $('.suggest-card.develop').hide(300); - } - - } else { - $('.search_filtered_wrapper.docs .suggest-card:not(.dummy)').hide(300); - } -} - -/** Called by the search input's onkeydown and onkeyup events. - * Handles navigation with keyboard arrows, Enter key to invoke search, - * otherwise invokes search suggestions on key-up event. - * @param e The JS event - * @param kd True if the event is key-down - * @param toroot A string for the site's root path - * @returns True if the event should bubble up - */ -function search_changed(e, kd, toroot) -{ - var currentLang = getLangPref(); - var search = document.getElementById("search_autocomplete"); - var text = search.value.replace(/(^ +)|( +$)/g, ''); - // get the ul hosting the currently selected item - gSelectedColumn = gSelectedColumn >= 0 ? gSelectedColumn : 0; - var $columns = $(".search_filtered_wrapper").find(".search_filtered:visible"); - var $selectedUl = $columns[gSelectedColumn]; - - // show/hide the close button - if (text != '') { - $(".search .close").removeClass("hide"); - } else { - $(".search .close").addClass("hide"); - } - // 27 = esc - if (e.keyCode == 27) { - // close all search results - if (kd) $('.search .close').trigger('click'); - return true; - } - // 13 = enter - else if (e.keyCode == 13) { - if (gSelectedIndex < 0) { - $('.suggest-card').hide(); - if ($("#searchResults").is(":hidden") && (search.value != "")) { - // if results aren't showing (and text not empty), return true to allow search to execute - $('body,html').animate({scrollTop:0}, '500', 'swing'); - return true; - } else { - // otherwise, results are already showing, so allow ajax to auto refresh the results - // and ignore this Enter press to avoid the reload. - return false; - } - } else if (kd && gSelectedIndex >= 0) { - // click the link corresponding to selected item - $("a",$("li",$selectedUl)[gSelectedIndex]).get()[0].click(); - return false; - } - } - // If Google results are showing, return true to allow ajax search to execute - else if ($("#searchResults").is(":visible")) { - // Also, if search_results is scrolled out of view, scroll to top to make results visible - if ((sticky ) && (search.value != "")) { - $('body,html').animate({scrollTop:0}, '500', 'swing'); - } - return true; - } - // 38 UP ARROW - else if (kd && (e.keyCode == 38)) { - // if the next item is a header, skip it - if ($($("li", $selectedUl)[gSelectedIndex-1]).hasClass("header")) { - gSelectedIndex--; - } - if (gSelectedIndex >= 0) { - $('li', $selectedUl).removeClass('jd-selected'); - gSelectedIndex--; - $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected'); - // If user reaches top, reset selected column - if (gSelectedIndex < 0) { - gSelectedColumn = -1; - } - } - return false; - } - // 40 DOWN ARROW - else if (kd && (e.keyCode == 40)) { - // if the next item is a header, skip it - if ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header")) { - gSelectedIndex++; - } - if ((gSelectedIndex < $("li", $selectedUl).length-1) || - ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header"))) { - $('li', $selectedUl).removeClass('jd-selected'); - gSelectedIndex++; - $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected'); - } - return false; - } - // Consider left/right arrow navigation - // NOTE: Order of suggest columns are reverse order (index position 0 is on right) - else if (kd && $columns.length > 1 && gSelectedColumn >= 0) { - // 37 LEFT ARROW - // go left only if current column is not left-most column (last column) - if (e.keyCode == 37 && gSelectedColumn < $columns.length - 1) { - $('li', $selectedUl).removeClass('jd-selected'); - gSelectedColumn++; - $selectedUl = $columns[gSelectedColumn]; - // keep or reset the selected item to last item as appropriate - gSelectedIndex = gSelectedIndex > - $("li", $selectedUl).length-1 ? - $("li", $selectedUl).length-1 : gSelectedIndex; - // if the corresponding item is a header, move down - if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) { - gSelectedIndex++; - } - // set item selected - $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected'); - return false; - } - // 39 RIGHT ARROW - // go right only if current column is not the right-most column (first column) - else if (e.keyCode == 39 && gSelectedColumn > 0) { - $('li', $selectedUl).removeClass('jd-selected'); - gSelectedColumn--; - $selectedUl = $columns[gSelectedColumn]; - // keep or reset the selected item to last item as appropriate - gSelectedIndex = gSelectedIndex > - $("li", $selectedUl).length-1 ? - $("li", $selectedUl).length-1 : gSelectedIndex; - // if the corresponding item is a header, move down - if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) { - gSelectedIndex++; - } - // set item selected - $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected'); - return false; - } - } - - // if key-up event and not arrow down/up/left/right, - // read the search query and add suggestions to gMatches - else if (!kd && (e.keyCode != 40) - && (e.keyCode != 38) - && (e.keyCode != 37) - && (e.keyCode != 39)) { - gSelectedIndex = -1; - gMatches = new Array(); - matchedCount = 0; - gGoogleMatches = new Array(); - matchedCountGoogle = 0; - gDocsMatches = new Array(); - matchedCountDocs = 0; - - // Search for Android matches - for (var i=0; i<DATA.length; i++) { - var s = DATA[i]; - if (text.length != 0 && - s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) { - gMatches[matchedCount] = s; - matchedCount++; - } - } - rank_autocomplete_api_results(text, gMatches); - for (var i=0; i<gMatches.length; i++) { - var s = gMatches[i]; - } - - - // Search for Google matches - for (var i=0; i<GOOGLE_DATA.length; i++) { - var s = GOOGLE_DATA[i]; - if (text.length != 0 && - s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) { - gGoogleMatches[matchedCountGoogle] = s; - matchedCountGoogle++; - } - } - rank_autocomplete_api_results(text, gGoogleMatches); - for (var i=0; i<gGoogleMatches.length; i++) { - var s = gGoogleMatches[i]; - } - - highlight_autocomplete_result_labels(text); - - - - // Search for matching JD docs - if (text.length >= 2) { - // Regex to match only the beginning of a word - var textRegex = new RegExp("\\b" + text.toLowerCase(), "g"); - - - // Search for Training classes - for (var i=0; i<TRAINING_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = TRAINING_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Don't consider doc title for lessons (only for class landing pages), - // unless the lesson has a tag that already matches - if ((s.lang == currentLang) && - (!(s.type == "training" && s.url.indexOf("index.html") == -1) || matched)) { - // it matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for API Guides - for (var i=0; i<GUIDE_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = GUIDE_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for Tools Guides - for (var i=0; i<TOOLS_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = TOOLS_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for About docs - for (var i=0; i<ABOUT_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = ABOUT_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for Design guides - for (var i=0; i<DESIGN_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = DESIGN_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for Distribute guides - for (var i=0; i<DISTRIBUTE_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = DISTRIBUTE_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for Google guides - for (var i=0; i<GOOGLE_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = GOOGLE_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - - // Search for Samples - for (var i=0; i<SAMPLES_RESOURCES.length; i++) { - // current search comparison, with counters for tag and title, - // used later to improve ranking - var s = SAMPLES_RESOURCES[i]; - s.matched_tag = 0; - s.matched_title = 0; - var matched = false; - // Check if query matches any tags; work backwards toward 1 to assist ranking - for (var j = s.keywords.length - 1; j >= 0; j--) { - // it matches a tag - if (s.keywords[j].toLowerCase().match(textRegex)) { - matched = true; - s.matched_tag = j + 1; // add 1 to index position - } - } - // Check if query matches the doc title, but only for current language - if (s.lang == currentLang) { - // if query matches the doc title.t - if (s.title.toLowerCase().match(textRegex)) { - matched = true; - s.matched_title = 1; - } - } - if (matched) { - gDocsMatches[matchedCountDocs] = s; - matchedCountDocs++; - } - } - - // Rank/sort all the matched pages - rank_autocomplete_doc_results(text, gDocsMatches); - } - - // draw the suggestions - sync_selection_table(toroot); - return true; // allow the event to bubble up to the search api - } -} - -/* Order the jd doc result list based on match quality */ -function rank_autocomplete_doc_results(query, matches) { - query = query || ''; - if (!matches || !matches.length) - return; - - var _resultScoreFn = function(match) { - var score = 1.0; - - // if the query matched a tag - if (match.matched_tag > 0) { - // multiply score by factor relative to position in tags list (max of 3) - score *= 3 / match.matched_tag; - - // if it also matched the title - if (match.matched_title > 0) { - score *= 2; - } - } else if (match.matched_title > 0) { - score *= 3; - } - - return score; - }; - - for (var i=0; i<matches.length; i++) { - matches[i].__resultScore = _resultScoreFn(matches[i]); - } - - matches.sort(function(a,b){ - var n = b.__resultScore - a.__resultScore; - if (n == 0) // lexicographical sort if scores are the same - n = (a.label < b.label) ? -1 : 1; - return n; - }); -} - -/* Order the result list based on match quality */ -function rank_autocomplete_api_results(query, matches) { - query = query || ''; - if (!matches || !matches.length) - return; - - // helper function that gets the last occurence index of the given regex - // in the given string, or -1 if not found - var _lastSearch = function(s, re) { - if (s == '') - return -1; - var l = -1; - var tmp; - while ((tmp = s.search(re)) >= 0) { - if (l < 0) l = 0; - l += tmp; - s = s.substr(tmp + 1); - } - return l; - }; - - // helper function that counts the occurrences of a given character in - // a given string - var _countChar = function(s, c) { - var n = 0; - for (var i=0; i<s.length; i++) - if (s.charAt(i) == c) ++n; - return n; - }; - - var queryLower = query.toLowerCase(); - var queryAlnum = (queryLower.match(/\w+/) || [''])[0]; - var partPrefixAlnumRE = new RegExp('\\b' + queryAlnum); - var partExactAlnumRE = new RegExp('\\b' + queryAlnum + '\\b'); - - var _resultScoreFn = function(result) { - // scores are calculated based on exact and prefix matches, - // and then number of path separators (dots) from the last - // match (i.e. favoring classes and deep package names) - var score = 1.0; - var labelLower = result.label.toLowerCase(); - var t; - t = _lastSearch(labelLower, partExactAlnumRE); - if (t >= 0) { - // exact part match - var partsAfter = _countChar(labelLower.substr(t + 1), '.'); - score *= 200 / (partsAfter + 1); - } else { - t = _lastSearch(labelLower, partPrefixAlnumRE); - if (t >= 0) { - // part prefix match - var partsAfter = _countChar(labelLower.substr(t + 1), '.'); - score *= 20 / (partsAfter + 1); - } - } - - return score; - }; - - for (var i=0; i<matches.length; i++) { - // if the API is deprecated, default score is 0; otherwise, perform scoring - if (matches[i].deprecated == "true") { - matches[i].__resultScore = 0; - } else { - matches[i].__resultScore = _resultScoreFn(matches[i]); - } - } - - matches.sort(function(a,b){ - var n = b.__resultScore - a.__resultScore; - if (n == 0) // lexicographical sort if scores are the same - n = (a.label < b.label) ? -1 : 1; - return n; - }); -} - -/* Add emphasis to part of string that matches query */ -function highlight_autocomplete_result_labels(query) { - query = query || ''; - if ((!gMatches || !gMatches.length) && (!gGoogleMatches || !gGoogleMatches.length)) - return; - - var queryLower = query.toLowerCase(); - var queryAlnumDot = (queryLower.match(/[\w\.]+/) || [''])[0]; - var queryRE = new RegExp( - '(' + queryAlnumDot.replace(/\./g, '\\.') + ')', 'ig'); - for (var i=0; i<gMatches.length; i++) { - gMatches[i].__hilabel = gMatches[i].label.replace( - queryRE, '<b>$1</b>'); - } - for (var i=0; i<gGoogleMatches.length; i++) { - gGoogleMatches[i].__hilabel = gGoogleMatches[i].label.replace( - queryRE, '<b>$1</b>'); - } -} - -function search_focus_changed(obj, focused) -{ - if (!focused) { - if(obj.value == ""){ - $(".search .close").addClass("hide"); - } - $(".suggest-card").hide(); - } -} - -function submit_search() { - var query = document.getElementById('search_autocomplete').value; - location.hash = 'q=' + query; - loadSearchResults(); - $("#searchResults").slideDown('slow', setStickyTop); - return false; -} - - -function hideResults() { - $("#searchResults").slideUp('fast', setStickyTop); - $(".search .close").addClass("hide"); - location.hash = ''; - - $("#search_autocomplete").val("").blur(); - - // reset the ajax search callback to nothing, so results don't appear unless ENTER - searchControl.setSearchStartingCallback(this, function(control, searcher, query) {}); - - // forcefully regain key-up event control (previously jacked by search api) - $("#search_autocomplete").keyup(function(event) { - return search_changed(event, false, toRoot); - }); - - return false; -} - - - -/* ########################################################## */ -/* ################ CUSTOM SEARCH ENGINE ################## */ -/* ########################################################## */ - -var searchControl; -google.load('search', '1', {"callback" : function() { - searchControl = new google.search.SearchControl(); - } }); - -function loadSearchResults() { - document.getElementById("search_autocomplete").style.color = "#000"; - - searchControl = new google.search.SearchControl(); - - // use our existing search form and use tabs when multiple searchers are used - drawOptions = new google.search.DrawOptions(); - drawOptions.setDrawMode(google.search.SearchControl.DRAW_MODE_TABBED); - drawOptions.setInput(document.getElementById("search_autocomplete")); - - // configure search result options - searchOptions = new google.search.SearcherOptions(); - searchOptions.setExpandMode(GSearchControl.EXPAND_MODE_OPEN); - - // configure each of the searchers, for each tab - devSiteSearcher = new google.search.WebSearch(); - devSiteSearcher.setUserDefinedLabel("All"); - devSiteSearcher.setSiteRestriction("001482626316274216503:zu90b7s047u"); - - designSearcher = new google.search.WebSearch(); - designSearcher.setUserDefinedLabel("Design"); - designSearcher.setSiteRestriction("http://developer.android.com/design/"); - - trainingSearcher = new google.search.WebSearch(); - trainingSearcher.setUserDefinedLabel("Training"); - trainingSearcher.setSiteRestriction("http://developer.android.com/training/"); - - guidesSearcher = new google.search.WebSearch(); - guidesSearcher.setUserDefinedLabel("Guides"); - guidesSearcher.setSiteRestriction("http://developer.android.com/guide/"); - - referenceSearcher = new google.search.WebSearch(); - referenceSearcher.setUserDefinedLabel("Reference"); - referenceSearcher.setSiteRestriction("http://developer.android.com/reference/"); - - googleSearcher = new google.search.WebSearch(); - googleSearcher.setUserDefinedLabel("Google Services"); - googleSearcher.setSiteRestriction("http://developer.android.com/google/"); - - blogSearcher = new google.search.WebSearch(); - blogSearcher.setUserDefinedLabel("Blog"); - blogSearcher.setSiteRestriction("http://android-developers.blogspot.com"); - - // add each searcher to the search control - searchControl.addSearcher(devSiteSearcher, searchOptions); - searchControl.addSearcher(designSearcher, searchOptions); - searchControl.addSearcher(trainingSearcher, searchOptions); - searchControl.addSearcher(guidesSearcher, searchOptions); - searchControl.addSearcher(referenceSearcher, searchOptions); - searchControl.addSearcher(googleSearcher, searchOptions); - searchControl.addSearcher(blogSearcher, searchOptions); - - // configure result options - searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET); - searchControl.setLinkTarget(google.search.Search.LINK_TARGET_SELF); - searchControl.setTimeoutInterval(google.search.SearchControl.TIMEOUT_SHORT); - searchControl.setNoResultsString(google.search.SearchControl.NO_RESULTS_DEFAULT_STRING); - - // upon ajax search, refresh the url and search title - searchControl.setSearchStartingCallback(this, function(control, searcher, query) { - updateResultTitle(query); - var query = document.getElementById('search_autocomplete').value; - location.hash = 'q=' + query; - }); - - // once search results load, set up click listeners - searchControl.setSearchCompleteCallback(this, function(control, searcher, query) { - addResultClickListeners(); - }); - - // draw the search results box - searchControl.draw(document.getElementById("leftSearchControl"), drawOptions); - - // get query and execute the search - searchControl.execute(decodeURI(getQuery(location.hash))); - - document.getElementById("search_autocomplete").focus(); - addTabListeners(); -} -// End of loadSearchResults - - -google.setOnLoadCallback(function(){ - if (location.hash.indexOf("q=") == -1) { - // if there's no query in the url, don't search and make sure results are hidden - $('#searchResults').hide(); - return; - } else { - // first time loading search results for this page - $('#searchResults').slideDown('slow', setStickyTop); - $(".search .close").removeClass("hide"); - loadSearchResults(); - } -}, true); - -/* Adjust the scroll position to account for sticky header, only if the hash matches an id. - This does not handle <a name=""> tags. Some CSS fixes those, but only for reference docs. */ -function offsetScrollForSticky() { - // Ignore if there's no search bar (some special pages have no header) - if ($("#search-container").length < 1) return; - - var hash = escape(location.hash.substr(1)); - var $matchingElement = $("#"+hash); - // Sanity check that there's an element with that ID on the page - if ($matchingElement.length) { - // If the position of the target element is near the top of the page (<20px, where we expect it - // to be because we need to move it down 60px to become in view), then move it down 60px - if (Math.abs($matchingElement.offset().top - $(window).scrollTop()) < 20) { - $(window).scrollTop($(window).scrollTop() - 60); - } - } -} - -// when an event on the browser history occurs (back, forward, load) requery hash and do search -$(window).hashchange( function(){ - // Ignore if there's no search bar (some special pages have no header) - if ($("#search-container").length < 1) return; - - // If the hash isn't a search query or there's an error in the query, - // then adjust the scroll position to account for sticky header, then exit. - if ((location.hash.indexOf("q=") == -1) || (query == "undefined")) { - // If the results pane is open, close it. - if (!$("#searchResults").is(":hidden")) { - hideResults(); - } - offsetScrollForSticky(); - return; - } - - // Otherwise, we have a search to do - var query = decodeURI(getQuery(location.hash)); - searchControl.execute(query); - $('#searchResults').slideDown('slow', setStickyTop); - $("#search_autocomplete").focus(); - $(".search .close").removeClass("hide"); - - updateResultTitle(query); -}); - -function updateResultTitle(query) { - $("#searchTitle").html("Results for <em>" + escapeHTML(query) + "</em>"); -} - -// forcefully regain key-up event control (previously jacked by search api) -$("#search_autocomplete").keyup(function(event) { - return search_changed(event, false, toRoot); -}); - -// add event listeners to each tab so we can track the browser history -function addTabListeners() { - var tabHeaders = $(".gsc-tabHeader"); - for (var i = 0; i < tabHeaders.length; i++) { - $(tabHeaders[i]).attr("id",i).click(function() { - /* - // make a copy of the page numbers for the search left pane - setTimeout(function() { - // remove any residual page numbers - $('#searchResults .gsc-tabsArea .gsc-cursor-box.gs-bidi-start-align').remove(); - // move the page numbers to the left position; make a clone, - // because the element is drawn to the DOM only once - // and because we're going to remove it (previous line), - // we need it to be available to move again as the user navigates - $('#searchResults .gsc-webResult .gsc-cursor-box.gs-bidi-start-align:visible') - .clone().appendTo('#searchResults .gsc-tabsArea'); - }, 200); - */ - }); - } - setTimeout(function(){$(tabHeaders[0]).click()},200); -} - -// add analytics tracking events to each result link -function addResultClickListeners() { - $("#searchResults a.gs-title").each(function(index, link) { - // When user clicks enter for Google search results, track it - $(link).click(function() { - ga('send', 'event', 'Google Click', 'clicked: ' + $(this).attr('href'), - 'query: ' + $("#search_autocomplete").val().toLowerCase()); - }); - }); -} - - -function getQuery(hash) { - var queryParts = hash.split('='); - return queryParts[1]; -} - -/* returns the given string with all HTML brackets converted to entities - TODO: move this to the site's JS library */ -function escapeHTML(string) { - return string.replace(/</g,"<") - .replace(/>/g,">"); -} - - - - - - - -/* ######################################################## */ -/* ################# JAVADOC REFERENCE ################### */ -/* ######################################################## */ - -/* Initialize some droiddoc stuff, but only if we're in the reference */ -if (location.pathname.indexOf("/reference") == 0) { - if(!(location.pathname.indexOf("/reference-gms/packages.html") == 0) - && !(location.pathname.indexOf("/reference-gcm/packages.html") == 0) - && !(location.pathname.indexOf("/reference/com/google") == 0)) { - $(document).ready(function() { - // init available apis based on user pref - changeApiLevel(); - initSidenavHeightResize() - }); - } -} - -var API_LEVEL_COOKIE = "api_level"; -var minLevel = 1; -var maxLevel = 1; - -/******* SIDENAV DIMENSIONS ************/ - - function initSidenavHeightResize() { - // Change the drag bar size to nicely fit the scrollbar positions - var $dragBar = $(".ui-resizable-s"); - $dragBar.css({'width': $dragBar.parent().width() - 5 + "px"}); - - $( "#resize-packages-nav" ).resizable({ - containment: "#nav-panels", - handles: "s", - alsoResize: "#packages-nav", - resize: function(event, ui) { resizeNav(); }, /* resize the nav while dragging */ - stop: function(event, ui) { saveNavPanels(); } /* once stopped, save the sizes to cookie */ - }); - - } - -function updateSidenavFixedWidth() { - if (!sticky) return; - $('#devdoc-nav').css({ - 'width' : $('#side-nav').css('width'), - 'margin' : $('#side-nav').css('margin') - }); - $('#devdoc-nav a.totop').css({'display':'block','width':$("#nav").innerWidth()+'px'}); - - initSidenavHeightResize(); -} - -function updateSidenavFullscreenWidth() { - if (!sticky) return; - $('#devdoc-nav').css({ - 'width' : $('#side-nav').css('width'), - 'margin' : $('#side-nav').css('margin') - }); - $('#devdoc-nav .totop').css({'left': 'inherit'}); - - initSidenavHeightResize(); -} - -function buildApiLevelSelector() { - maxLevel = SINCE_DATA.length; - var userApiLevel = parseInt(readCookie(API_LEVEL_COOKIE)); - userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default - - minLevel = parseInt($("#doc-api-level").attr("class")); - // Handle provisional api levels; the provisional level will always be the highest possible level - // Provisional api levels will also have a length; other stuff that's just missing a level won't, - // so leave those kinds of entities at the default level of 1 (for example, the R.styleable class) - if (isNaN(minLevel) && minLevel.length) { - minLevel = maxLevel; - } - var select = $("#apiLevelSelector").html("").change(changeApiLevel); - for (var i = maxLevel-1; i >= 0; i--) { - var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]); - // if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames) - select.append(option); - } - - // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true) - var selectedLevelItem = $("#apiLevelSelector option[value='"+userApiLevel+"']").get(0); - selectedLevelItem.setAttribute('selected',true); -} - -function changeApiLevel() { - maxLevel = SINCE_DATA.length; - var selectedLevel = maxLevel; - - selectedLevel = parseInt($("#apiLevelSelector option:selected").val()); - toggleVisisbleApis(selectedLevel, "body"); - - writeCookie(API_LEVEL_COOKIE, selectedLevel, null); - - if (selectedLevel < minLevel) { - var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class"; - $("#naMessage").show().html("<div><p><strong>This " + thing - + " requires API level " + minLevel + " or higher.</strong></p>" - + "<p>This document is hidden because your selected API level for the documentation is " - + selectedLevel + ". You can change the documentation API level with the selector " - + "above the left navigation.</p>" - + "<p>For more information about specifying the API level your app requires, " - + "read <a href='" + toRoot + "training/basics/supporting-devices/platforms.html'" - + ">Supporting Different Platform Versions</a>.</p>" - + "<input type='button' value='OK, make this page visible' " - + "title='Change the API level to " + minLevel + "' " - + "onclick='$(\"#apiLevelSelector\").val(\"" + minLevel + "\");changeApiLevel();' />" - + "</div>"); - } else { - $("#naMessage").hide(); - } -} - -function toggleVisisbleApis(selectedLevel, context) { - var apis = $(".api",context); - apis.each(function(i) { - var obj = $(this); - var className = obj.attr("class"); - var apiLevelIndex = className.lastIndexOf("-")+1; - var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex); - apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length; - var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex); - if (apiLevel.length == 0) { // for odd cases when the since data is actually missing, just bail - return; - } - apiLevel = parseInt(apiLevel); - - // Handle provisional api levels; if this item's level is the provisional one, set it to the max - var selectedLevelNum = parseInt(selectedLevel) - var apiLevelNum = parseInt(apiLevel); - if (isNaN(apiLevelNum)) { - apiLevelNum = maxLevel; - } - - // Grey things out that aren't available and give a tooltip title - if (apiLevelNum > selectedLevelNum) { - obj.addClass("absent").attr("title","Requires API Level \"" - + apiLevel + "\" or higher. To reveal, change the target API level " - + "above the left navigation."); - } - else obj.removeClass("absent").removeAttr("title"); - }); -} - - - - -/* ################# SIDENAV TREE VIEW ################### */ - -function new_node(me, mom, text, link, children_data, api_level) -{ - var node = new Object(); - node.children = Array(); - node.children_data = children_data; - node.depth = mom.depth + 1; - - node.li = document.createElement("li"); - mom.get_children_ul().appendChild(node.li); - - node.label_div = document.createElement("div"); - node.label_div.className = "label"; - if (api_level != null) { - $(node.label_div).addClass("api"); - $(node.label_div).addClass("api-level-"+api_level); - } - node.li.appendChild(node.label_div); - - if (children_data != null) { - node.expand_toggle = document.createElement("a"); - node.expand_toggle.href = "javascript:void(0)"; - node.expand_toggle.onclick = function() { - if (node.expanded) { - $(node.get_children_ul()).slideUp("fast"); - node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png"; - node.expanded = false; - } else { - expand_node(me, node); - } - }; - node.label_div.appendChild(node.expand_toggle); - - node.plus_img = document.createElement("img"); - node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png"; - node.plus_img.className = "plus"; - node.plus_img.width = "8"; - node.plus_img.border = "0"; - node.expand_toggle.appendChild(node.plus_img); - - node.expanded = false; - } - - var a = document.createElement("a"); - node.label_div.appendChild(a); - node.label = document.createTextNode(text); - a.appendChild(node.label); - if (link) { - a.href = me.toroot + link; - } else { - if (children_data != null) { - a.className = "nolink"; - a.href = "javascript:void(0)"; - a.onclick = node.expand_toggle.onclick; - // This next line shouldn't be necessary. I'll buy a beer for the first - // person who figures out how to remove this line and have the link - // toggle shut on the first try. --joeo@android.com - node.expanded = false; - } - } - - - node.children_ul = null; - node.get_children_ul = function() { - if (!node.children_ul) { - node.children_ul = document.createElement("ul"); - node.children_ul.className = "children_ul"; - node.children_ul.style.display = "none"; - node.li.appendChild(node.children_ul); - } - return node.children_ul; - }; - - return node; -} - - - - -function expand_node(me, node) -{ - if (node.children_data && !node.expanded) { - if (node.children_visited) { - $(node.get_children_ul()).slideDown("fast"); - } else { - get_node(me, node); - if ($(node.label_div).hasClass("absent")) { - $(node.get_children_ul()).addClass("absent"); - } - $(node.get_children_ul()).slideDown("fast"); - } - node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png"; - node.expanded = true; - - // perform api level toggling because new nodes are new to the DOM - var selectedLevel = $("#apiLevelSelector option:selected").val(); - toggleVisisbleApis(selectedLevel, "#side-nav"); - } -} - -function get_node(me, mom) -{ - mom.children_visited = true; - for (var i in mom.children_data) { - var node_data = mom.children_data[i]; - mom.children[i] = new_node(me, mom, node_data[0], node_data[1], - node_data[2], node_data[3]); - } -} - -function this_page_relative(toroot) -{ - var full = document.location.pathname; - var file = ""; - if (toroot.substr(0, 1) == "/") { - if (full.substr(0, toroot.length) == toroot) { - return full.substr(toroot.length); - } else { - // the file isn't under toroot. Fail. - return null; - } - } else { - if (toroot != "./") { - toroot = "./" + toroot; - } - do { - if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") { - var pos = full.lastIndexOf("/"); - file = full.substr(pos) + file; - full = full.substr(0, pos); - toroot = toroot.substr(0, toroot.length-3); - } - } while (toroot != "" && toroot != "/"); - return file.substr(1); - } -} - -function find_page(url, data) -{ - var nodes = data; - var result = null; - for (var i in nodes) { - var d = nodes[i]; - if (d[1] == url) { - return new Array(i); - } - else if (d[2] != null) { - result = find_page(url, d[2]); - if (result != null) { - return (new Array(i).concat(result)); - } - } - } - return null; -} - -function init_default_navtree(toroot) { - // load json file for navtree data - $.getScript(toRoot + 'navtree_data.js', function(data, textStatus, jqxhr) { - // when the file is loaded, initialize the tree - if(jqxhr.status === 200) { - init_navtree("tree-list", toroot, NAVTREE_DATA); - } - }); - - // perform api level toggling because because the whole tree is new to the DOM - var selectedLevel = $("#apiLevelSelector option:selected").val(); - toggleVisisbleApis(selectedLevel, "#side-nav"); -} - -function init_navtree(navtree_id, toroot, root_nodes) -{ - var me = new Object(); - me.toroot = toroot; - me.node = new Object(); - - me.node.li = document.getElementById(navtree_id); - me.node.children_data = root_nodes; - me.node.children = new Array(); - me.node.children_ul = document.createElement("ul"); - me.node.get_children_ul = function() { return me.node.children_ul; }; - //me.node.children_ul.className = "children_ul"; - me.node.li.appendChild(me.node.children_ul); - me.node.depth = 0; - - get_node(me, me.node); - - me.this_page = this_page_relative(toroot); - me.breadcrumbs = find_page(me.this_page, root_nodes); - if (me.breadcrumbs != null && me.breadcrumbs.length != 0) { - var mom = me.node; - for (var i in me.breadcrumbs) { - var j = me.breadcrumbs[i]; - mom = mom.children[j]; - expand_node(me, mom); - } - mom.label_div.className = mom.label_div.className + " selected"; - addLoadEvent(function() { - scrollIntoView("nav-tree"); - }); - } -} - - - - - - - - -/* TODO: eliminate redundancy with non-google functions */ -function init_google_navtree(navtree_id, toroot, root_nodes) -{ - var me = new Object(); - me.toroot = toroot; - me.node = new Object(); - - me.node.li = document.getElementById(navtree_id); - me.node.children_data = root_nodes; - me.node.children = new Array(); - me.node.children_ul = document.createElement("ul"); - me.node.get_children_ul = function() { return me.node.children_ul; }; - //me.node.children_ul.className = "children_ul"; - me.node.li.appendChild(me.node.children_ul); - me.node.depth = 0; - - get_google_node(me, me.node); -} - -function new_google_node(me, mom, text, link, children_data, api_level) -{ - var node = new Object(); - var child; - node.children = Array(); - node.children_data = children_data; - node.depth = mom.depth + 1; - node.get_children_ul = function() { - if (!node.children_ul) { - node.children_ul = document.createElement("ul"); - node.children_ul.className = "tree-list-children"; - node.li.appendChild(node.children_ul); - } - return node.children_ul; - }; - node.li = document.createElement("li"); - - mom.get_children_ul().appendChild(node.li); - - - if(link) { - child = document.createElement("a"); - - } - else { - child = document.createElement("span"); - child.className = "tree-list-subtitle"; - - } - if (children_data != null) { - node.li.className="nav-section"; - node.label_div = document.createElement("div"); - node.label_div.className = "nav-section-header-ref"; - node.li.appendChild(node.label_div); - get_google_node(me, node); - node.label_div.appendChild(child); - } - else { - node.li.appendChild(child); - } - if(link) { - child.href = me.toroot + link; - } - node.label = document.createTextNode(text); - child.appendChild(node.label); - - node.children_ul = null; - - return node; -} - -function get_google_node(me, mom) -{ - mom.children_visited = true; - var linkText; - for (var i in mom.children_data) { - var node_data = mom.children_data[i]; - linkText = node_data[0]; - - if(linkText.match("^"+"com.google.android")=="com.google.android"){ - linkText = linkText.substr(19, linkText.length); - } - mom.children[i] = new_google_node(me, mom, linkText, node_data[1], - node_data[2], node_data[3]); - } -} - - - - - - -/****** NEW version of script to build google and sample navs dynamically ******/ -// TODO: update Google reference docs to tolerate this new implementation - -var NODE_NAME = 0; -var NODE_HREF = 1; -var NODE_GROUP = 2; -var NODE_TAGS = 3; -var NODE_CHILDREN = 4; - -function init_google_navtree2(navtree_id, data) -{ - var $containerUl = $("#"+navtree_id); - for (var i in data) { - var node_data = data[i]; - $containerUl.append(new_google_node2(node_data)); - } - - // Make all third-generation list items 'sticky' to prevent them from collapsing - $containerUl.find('li li li.nav-section').addClass('sticky'); - - initExpandableNavItems("#"+navtree_id); -} - -function new_google_node2(node_data) -{ - var linkText = node_data[NODE_NAME]; - if(linkText.match("^"+"com.google.android")=="com.google.android"){ - linkText = linkText.substr(19, linkText.length); - } - var $li = $('<li>'); - var $a; - if (node_data[NODE_HREF] != null) { - $a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >' - + linkText + '</a>'); - } else { - $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >' - + linkText + '/</a>'); - } - var $childUl = $('<ul>'); - if (node_data[NODE_CHILDREN] != null) { - $li.addClass("nav-section"); - $a = $('<div class="nav-section-header">').append($a); - if (node_data[NODE_HREF] == null) $a.addClass('empty'); - - for (var i in node_data[NODE_CHILDREN]) { - var child_node_data = node_data[NODE_CHILDREN][i]; - $childUl.append(new_google_node2(child_node_data)); - } - $li.append($childUl); - } - $li.prepend($a); - - return $li; -} - - - - - - - - - - - -function showGoogleRefTree() { - init_default_google_navtree(toRoot); - init_default_gcm_navtree(toRoot); -} - -function init_default_google_navtree(toroot) { - // load json file for navtree data - $.getScript(toRoot + 'gms_navtree_data.js', function(data, textStatus, jqxhr) { - // when the file is loaded, initialize the tree - if(jqxhr.status === 200) { - init_google_navtree("gms-tree-list", toroot, GMS_NAVTREE_DATA); - highlightSidenav(); - resizeNav(); - } - }); -} - -function init_default_gcm_navtree(toroot) { - // load json file for navtree data - $.getScript(toRoot + 'gcm_navtree_data.js', function(data, textStatus, jqxhr) { - // when the file is loaded, initialize the tree - if(jqxhr.status === 200) { - init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA); - highlightSidenav(); - resizeNav(); - } - }); -} - -function showSamplesRefTree() { - init_default_samples_navtree(toRoot); -} - -function init_default_samples_navtree(toroot) { - // load json file for navtree data - $.getScript(toRoot + 'samples_navtree_data.js', function(data, textStatus, jqxhr) { - // when the file is loaded, initialize the tree - if(jqxhr.status === 200) { - // hack to remove the "about the samples" link then put it back in - // after we nuke the list to remove the dummy static list of samples - var $firstLi = $("#nav.samples-nav > li:first-child").clone(); - $("#nav.samples-nav").empty(); - $("#nav.samples-nav").append($firstLi); - - init_google_navtree2("nav.samples-nav", SAMPLES_NAVTREE_DATA); - highlightSidenav(); - resizeNav(); - if ($("#jd-content #samples").length) { - showSamples(); - } - } - }); -} - -/* TOGGLE INHERITED MEMBERS */ - -/* Toggle an inherited class (arrow toggle) - * @param linkObj The link that was clicked. - * @param expand 'true' to ensure it's expanded. 'false' to ensure it's closed. - * 'null' to simply toggle. - */ -function toggleInherited(linkObj, expand) { - var base = linkObj.getAttribute("id"); - var list = document.getElementById(base + "-list"); - var summary = document.getElementById(base + "-summary"); - var trigger = document.getElementById(base + "-trigger"); - var a = $(linkObj); - if ( (expand == null && a.hasClass("closed")) || expand ) { - list.style.display = "none"; - summary.style.display = "block"; - trigger.src = toRoot + "assets/images/triangle-opened.png"; - a.removeClass("closed"); - a.addClass("opened"); - } else if ( (expand == null && a.hasClass("opened")) || (expand == false) ) { - list.style.display = "block"; - summary.style.display = "none"; - trigger.src = toRoot + "assets/images/triangle-closed.png"; - a.removeClass("opened"); - a.addClass("closed"); - } - return false; -} - -/* Toggle all inherited classes in a single table (e.g. all inherited methods) - * @param linkObj The link that was clicked. - * @param expand 'true' to ensure it's expanded. 'false' to ensure it's closed. - * 'null' to simply toggle. - */ -function toggleAllInherited(linkObj, expand) { - var a = $(linkObj); - var table = $(a.parent().parent().parent()); // ugly way to get table/tbody - var expandos = $(".jd-expando-trigger", table); - if ( (expand == null && a.text() == "[Expand]") || expand ) { - expandos.each(function(i) { - toggleInherited(this, true); - }); - a.text("[Collapse]"); - } else if ( (expand == null && a.text() == "[Collapse]") || (expand == false) ) { - expandos.each(function(i) { - toggleInherited(this, false); - }); - a.text("[Expand]"); - } - return false; -} - -/* Toggle all inherited members in the class (link in the class title) - */ -function toggleAllClassInherited() { - var a = $("#toggleAllClassInherited"); // get toggle link from class title - var toggles = $(".toggle-all", $("#body-content")); - if (a.text() == "[Expand All]") { - toggles.each(function(i) { - toggleAllInherited(this, true); - }); - a.text("[Collapse All]"); - } else { - toggles.each(function(i) { - toggleAllInherited(this, false); - }); - a.text("[Expand All]"); - } - return false; -} - -/* Expand all inherited members in the class. Used when initiating page search */ -function ensureAllInheritedExpanded() { - var toggles = $(".toggle-all", $("#body-content")); - toggles.each(function(i) { - toggleAllInherited(this, true); - }); - $("#toggleAllClassInherited").text("[Collapse All]"); -} - - -/* HANDLE KEY EVENTS - * - Listen for Ctrl+F (Cmd on Mac) and expand all inherited members (to aid page search) - */ -var agent = navigator['userAgent'].toLowerCase(); -var mac = agent.indexOf("macintosh") != -1; - -$(document).keydown( function(e) { -var control = mac ? e.metaKey && !e.ctrlKey : e.ctrlKey; // get ctrl key - if (control && e.which == 70) { // 70 is "F" - ensureAllInheritedExpanded(); - } -}); - - - - - - -/* On-demand functions */ - -/** Move sample code line numbers out of PRE block and into non-copyable column */ -function initCodeLineNumbers() { - var numbers = $("#codesample-block a.number"); - if (numbers.length) { - $("#codesample-line-numbers").removeClass("hidden").append(numbers); - } - - $(document).ready(function() { - // select entire line when clicked - $("span.code-line").click(function() { - if (!shifted) { - selectText(this); - } - }); - // invoke line link on double click - $(".code-line").dblclick(function() { - document.location.hash = $(this).attr('id'); - }); - // highlight the line when hovering on the number - $("#codesample-line-numbers a.number").mouseover(function() { - var id = $(this).attr('href'); - $(id).css('background','#e7e7e7'); - }); - $("#codesample-line-numbers a.number").mouseout(function() { - var id = $(this).attr('href'); - $(id).css('background','none'); - }); - }); -} - -// create SHIFT key binder to avoid the selectText method when selecting multiple lines -var shifted = false; -$(document).bind('keyup keydown', function(e){shifted = e.shiftKey; return true;} ); - -// courtesy of jasonedelman.com -function selectText(element) { - var doc = document - , range, selection - ; - if (doc.body.createTextRange) { //ms - range = doc.body.createTextRange(); - range.moveToElementText(element); - range.select(); - } else if (window.getSelection) { //all others - selection = window.getSelection(); - range = doc.createRange(); - range.selectNodeContents(element); - selection.removeAllRanges(); - selection.addRange(range); - } -} - - - - -/** Display links and other information about samples that match the - group specified by the URL */ -function showSamples() { - var group = $("#samples").attr('class'); - $("#samples").html("<p>Here are some samples for <b>" + group + "</b> apps:</p>"); - - var $ul = $("<ul>"); - $selectedLi = $("#nav li.selected"); - - $selectedLi.children("ul").children("li").each(function() { - var $li = $("<li>").append($(this).find("a").first().clone()); - $ul.append($li); - }); - - $("#samples").append($ul); - -} - - - -/* ########################################################## */ -/* ################### RESOURCE CARDS ##################### */ -/* ########################################################## */ - -/** Handle resource queries, collections, and grids (sections). Requires - jd_tag_helpers.js and the *_unified_data.js to be loaded. */ - -(function() { - // Prevent the same resource from being loaded more than once per page. - var addedPageResources = {}; - - $(document).ready(function() { - $('.resource-widget').each(function() { - initResourceWidget(this); - }); - - /* Pass the line height to ellipsisfade() to adjust the height of the - text container to show the max number of lines possible, without - showing lines that are cut off. This works with the css ellipsis - classes to fade last text line and apply an ellipsis char. */ - - //card text currently uses 15px line height. - var lineHeight = 15; - $('.card-info .text').ellipsisfade(lineHeight); - }); - - /* - Three types of resource layouts: - Flow - Uses a fixed row-height flow using float left style. - Carousel - Single card slideshow all same dimension absolute. - Stack - Uses fixed columns and flexible element height. - */ - function initResourceWidget(widget) { - var $widget = $(widget); - var isFlow = $widget.hasClass('resource-flow-layout'), - isCarousel = $widget.hasClass('resource-carousel-layout'), - isStack = $widget.hasClass('resource-stack-layout'); - - // find size of widget by pulling out its class name - var sizeCols = 1; - var m = $widget.get(0).className.match(/\bcol-(\d+)\b/); - if (m) { - sizeCols = parseInt(m[1], 10); - } - - var opts = { - cardSizes: ($widget.data('cardsizes') || '').split(','), - maxResults: parseInt($widget.data('maxresults') || '100', 10), - itemsPerPage: $widget.data('itemsperpage'), - sortOrder: $widget.data('sortorder'), - query: $widget.data('query'), - section: $widget.data('section'), - sizeCols: sizeCols, - /* Added by LFL 6/6/14 */ - resourceStyle: $widget.data('resourcestyle') || 'card', - stackSort: $widget.data('stacksort') || 'true' - }; - - // run the search for the set of resources to show - - var resources = buildResourceList(opts); - - if (isFlow) { - drawResourcesFlowWidget($widget, opts, resources); - } else if (isCarousel) { - drawResourcesCarouselWidget($widget, opts, resources); - } else if (isStack) { - /* Looks like this got removed and is not used, so repurposing for the - homepage style layout. - Modified by LFL 6/6/14 - */ - //var sections = buildSectionList(opts); - opts['numStacks'] = $widget.data('numstacks'); - drawResourcesStackWidget($widget, opts, resources/*, sections*/); - } - } - - /* Initializes a Resource Carousel Widget */ - function drawResourcesCarouselWidget($widget, opts, resources) { - $widget.empty(); - var plusone = true; //always show plusone on carousel - - $widget.addClass('resource-card slideshow-container') - .append($('<a>').addClass('slideshow-prev').text('Prev')) - .append($('<a>').addClass('slideshow-next').text('Next')); - - var css = { 'width': $widget.width() + 'px', - 'height': $widget.height() + 'px' }; - - var $ul = $('<ul>'); - - for (var i = 0; i < resources.length; ++i) { - var $card = $('<a>') - .attr('href', cleanUrl(resources[i].url)) - .decorateResourceCard(resources[i],plusone); - - $('<li>').css(css) - .append($card) - .appendTo($ul); - } - - $('<div>').addClass('frame') - .append($ul) - .appendTo($widget); - - $widget.dacSlideshow({ - auto: true, - btnPrev: '.slideshow-prev', - btnNext: '.slideshow-next' - }); - }; - - /* Initializes a Resource Card Stack Widget (column-based layout) - Modified by LFL 6/6/14 - */ - function drawResourcesStackWidget($widget, opts, resources, sections) { - // Don't empty widget, grab all items inside since they will be the first - // items stacked, followed by the resource query - var plusone = true; //by default show plusone on section cards - var cards = $widget.find('.resource-card').detach().toArray(); - var numStacks = opts.numStacks || 1; - var $stacks = []; - var urlString; - - for (var i = 0; i < numStacks; ++i) { - $stacks[i] = $('<div>').addClass('resource-card-stack') - .appendTo($widget); - } - - var sectionResources = []; - - // Extract any subsections that are actually resource cards - if (sections) { - for (var i = 0; i < sections.length; ++i) { - if (!sections[i].sections || !sections[i].sections.length) { - // Render it as a resource card - sectionResources.push( - $('<a>') - .addClass('resource-card section-card') - .attr('href', cleanUrl(sections[i].resource.url)) - .decorateResourceCard(sections[i].resource,plusone)[0] - ); - - } else { - cards.push( - $('<div>') - .addClass('resource-card section-card-menu') - .decorateResourceSection(sections[i],plusone)[0] - ); - } - } - } - - cards = cards.concat(sectionResources); - - for (var i = 0; i < resources.length; ++i) { - var $card = createResourceElement(resources[i], opts); - - if (opts.resourceStyle.indexOf('related') > -1) { - $card.addClass('related-card'); - } - - cards.push($card[0]); - } - - if (opts.stackSort != 'false') { - for (var i = 0; i < cards.length; ++i) { - // Find the stack with the shortest height, but give preference to - // left to right order. - var minHeight = $stacks[0].height(); - var minIndex = 0; - - for (var j = 1; j < numStacks; ++j) { - var height = $stacks[j].height(); - if (height < minHeight - 45) { - minHeight = height; - minIndex = j; - } - } - - $stacks[minIndex].append($(cards[i])); - } - } - - }; - - /* - Create a resource card using the given resource object and a list of html - configured options. Returns a jquery object containing the element. - */ - function createResourceElement(resource, opts, plusone) { - var $el; - - // The difference here is that generic cards are not entirely clickable - // so its a div instead of an a tag, also the generic one is not given - // the resource-card class so it appears with a transparent background - // and can be styled in whatever way the css setup. - if (opts.resourceStyle == 'generic') { - $el = $('<div>') - .addClass('resource') - .attr('href', cleanUrl(resource.url)) - .decorateResource(resource, opts); - } else { - var cls = 'resource resource-card'; - - $el = $('<a>') - .addClass(cls) - .attr('href', cleanUrl(resource.url)) - .decorateResourceCard(resource, plusone); - } - - return $el; - } - - /* Initializes a flow widget, see distribute.scss for generating accompanying css */ - function drawResourcesFlowWidget($widget, opts, resources) { - $widget.empty(); - var cardSizes = opts.cardSizes || ['6x6']; - var i = 0, j = 0; - var plusone = true; // by default show plusone on resource cards - - while (i < resources.length) { - var cardSize = cardSizes[j++ % cardSizes.length]; - cardSize = cardSize.replace(/^\s+|\s+$/,''); - // Some card sizes do not get a plusone button, such as where space is constrained - // or for cards commonly embedded in docs (to improve overall page speed). - plusone = !((cardSize == "6x2") || (cardSize == "6x3") || - (cardSize == "9x2") || (cardSize == "9x3") || - (cardSize == "12x2") || (cardSize == "12x3")); - - // A stack has a third dimension which is the number of stacked items - var isStack = cardSize.match(/(\d+)x(\d+)x(\d+)/); - var stackCount = 0; - var $stackDiv = null; - - if (isStack) { - // Create a stack container which should have the dimensions defined - // by the product of the items inside. - $stackDiv = $('<div>').addClass('resource-card-stack resource-card-' + isStack[1] - + 'x' + isStack[2] * isStack[3]) .appendTo($widget); - } - - // Build each stack item or just a single item - do { - var resource = resources[i]; - - var $card = createResourceElement(resources[i], opts, plusone); - - $card.addClass('resource-card-' + cardSize + - ' resource-card-' + resource.type); - - if (isStack) { - $card.addClass('resource-card-' + isStack[1] + 'x' + isStack[2]); - if (++stackCount == parseInt(isStack[3])) { - $card.addClass('resource-card-row-stack-last'); - stackCount = 0; - } - } else { - stackCount = 0; - } - - $card.appendTo($stackDiv || $widget); - - } while (++i < resources.length && stackCount > 0); - } - } - - /* Build a site map of resources using a section as a root. */ - function buildSectionList(opts) { - if (opts.section && SECTION_BY_ID[opts.section]) { - return SECTION_BY_ID[opts.section].sections || []; - } - return []; - } - - function buildResourceList(opts) { - var maxResults = opts.maxResults || 100; - - var query = opts.query || ''; - var expressions = parseResourceQuery(query); - var addedResourceIndices = {}; - var results = []; - - for (var i = 0; i < expressions.length; i++) { - var clauses = expressions[i]; - - // build initial set of resources from first clause - var firstClause = clauses[0]; - var resources = []; - switch (firstClause.attr) { - case 'type': - resources = ALL_RESOURCES_BY_TYPE[firstClause.value]; - break; - case 'lang': - resources = ALL_RESOURCES_BY_LANG[firstClause.value]; - break; - case 'tag': - resources = ALL_RESOURCES_BY_TAG[firstClause.value]; - break; - case 'collection': - var urls = RESOURCE_COLLECTIONS[firstClause.value].resources || []; - resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; }); - break; - case 'section': - var urls = SITE_MAP[firstClause.value].sections || []; - resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; }); - break; - } - // console.log(firstClause.attr + ':' + firstClause.value); - resources = resources || []; - - // use additional clauses to filter corpus - if (clauses.length > 1) { - var otherClauses = clauses.slice(1); - resources = resources.filter(getResourceMatchesClausesFilter(otherClauses)); - } - - // filter out resources already added - if (i > 1) { - resources = resources.filter(getResourceNotAlreadyAddedFilter(addedResourceIndices)); - } - - // add to list of already added indices - for (var j = 0; j < resources.length; j++) { - // console.log(resources[j].title); - addedResourceIndices[resources[j].index] = 1; - } - - // concat to final results list - results = results.concat(resources); - } - - if (opts.sortOrder && results.length) { - var attr = opts.sortOrder; - - if (opts.sortOrder == 'random') { - var i = results.length, j, temp; - while (--i) { - j = Math.floor(Math.random() * (i + 1)); - temp = results[i]; - results[i] = results[j]; - results[j] = temp; - } - } else { - var desc = attr.charAt(0) == '-'; - if (desc) { - attr = attr.substring(1); - } - results = results.sort(function(x,y) { - return (desc ? -1 : 1) * (parseInt(x[attr], 10) - parseInt(y[attr], 10)); - }); - } - } - - results = results.filter(getResourceNotAlreadyAddedFilter(addedPageResources)); - results = results.slice(0, maxResults); - - for (var j = 0; j < results.length; ++j) { - addedPageResources[results[j].index] = 1; - } - - return results; - } - - - function getResourceNotAlreadyAddedFilter(addedResourceIndices) { - return function(resource) { - return !addedResourceIndices[resource.index]; - }; - } - - - function getResourceMatchesClausesFilter(clauses) { - return function(resource) { - return doesResourceMatchClauses(resource, clauses); - }; - } - - - function doesResourceMatchClauses(resource, clauses) { - for (var i = 0; i < clauses.length; i++) { - var map; - switch (clauses[i].attr) { - case 'type': - map = IS_RESOURCE_OF_TYPE[clauses[i].value]; - break; - case 'lang': - map = IS_RESOURCE_IN_LANG[clauses[i].value]; - break; - case 'tag': - map = IS_RESOURCE_TAGGED[clauses[i].value]; - break; - } - - if (!map || (!!clauses[i].negative ? map[resource.index] : !map[resource.index])) { - return clauses[i].negative; - } - } - return true; - } - - function cleanUrl(url) - { - if (url && url.indexOf('//') === -1) { - url = toRoot + url; - } - - return url; - } - - - function parseResourceQuery(query) { - // Parse query into array of expressions (expression e.g. 'tag:foo + type:video') - var expressions = []; - var expressionStrs = query.split(',') || []; - for (var i = 0; i < expressionStrs.length; i++) { - var expr = expressionStrs[i] || ''; - - // Break expression into clauses (clause e.g. 'tag:foo') - var clauses = []; - var clauseStrs = expr.split(/(?=[\+\-])/); - for (var j = 0; j < clauseStrs.length; j++) { - var clauseStr = clauseStrs[j] || ''; - - // Get attribute and value from clause (e.g. attribute='tag', value='foo') - var parts = clauseStr.split(':'); - var clause = {}; - - clause.attr = parts[0].replace(/^\s+|\s+$/g,''); - if (clause.attr) { - if (clause.attr.charAt(0) == '+') { - clause.attr = clause.attr.substring(1); - } else if (clause.attr.charAt(0) == '-') { - clause.negative = true; - clause.attr = clause.attr.substring(1); - } - } - - if (parts.length > 1) { - clause.value = parts[1].replace(/^\s+|\s+$/g,''); - } - - clauses.push(clause); - } - - if (!clauses.length) { - continue; - } - - expressions.push(clauses); - } - - return expressions; - } -})(); - -(function($) { - - /* - Utility method for creating dom for the description area of a card. - Used in decorateResourceCard and decorateResource. - */ - function buildResourceCardDescription(resource, plusone) { - var $description = $('<div>').addClass('description ellipsis'); - - $description.append($('<div>').addClass('text').html(resource.summary)); - - if (resource.cta) { - $description.append($('<a>').addClass('cta').html(resource.cta)); - } - - if (plusone) { - var plusurl = resource.url.indexOf("//") > -1 ? resource.url : - "//developer.android.com/" + resource.url; - - $description.append($('<div>').addClass('util') - .append($('<div>').addClass('g-plusone') - .attr('data-size', 'small') - .attr('data-align', 'right') - .attr('data-href', plusurl))); - } - - return $description; - } - - - /* Simple jquery function to create dom for a standard resource card */ - $.fn.decorateResourceCard = function(resource,plusone) { - var section = resource.group || resource.type; - var imgUrl = resource.image || - 'assets/images/resource-card-default-android.jpg'; - - if (imgUrl.indexOf('//') === -1) { - imgUrl = toRoot + imgUrl; - } - - $('<div>').addClass('card-bg') - .css('background-image', 'url(' + (imgUrl || toRoot + - 'assets/images/resource-card-default-android.jpg') + ')') - .appendTo(this); - - $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : '')) - .append($('<div>').addClass('section').text(section)) - .append($('<div>').addClass('title').html(resource.title)) - .append(buildResourceCardDescription(resource, plusone)) - .appendTo(this); - - return this; - }; - - /* Simple jquery function to create dom for a resource section card (menu) */ - $.fn.decorateResourceSection = function(section,plusone) { - var resource = section.resource; - //keep url clean for matching and offline mode handling - var urlPrefix = resource.image.indexOf("//") > -1 ? "" : toRoot; - var $base = $('<a>') - .addClass('card-bg') - .attr('href', resource.url) - .append($('<div>').addClass('card-section-icon') - .append($('<div>').addClass('icon')) - .append($('<div>').addClass('section').html(resource.title))) - .appendTo(this); - - var $cardInfo = $('<div>').addClass('card-info').appendTo(this); - - if (section.sections && section.sections.length) { - // Recurse the section sub-tree to find a resource image. - var stack = [section]; - - while (stack.length) { - if (stack[0].resource.image) { - $base.css('background-image', 'url(' + urlPrefix + stack[0].resource.image + ')'); - break; - } - - if (stack[0].sections) { - stack = stack.concat(stack[0].sections); - } - - stack.shift(); - } - - var $ul = $('<ul>') - .appendTo($cardInfo); - - var max = section.sections.length > 3 ? 3 : section.sections.length; - - for (var i = 0; i < max; ++i) { - - var subResource = section.sections[i]; - if (!plusone) { - $('<li>') - .append($('<a>').attr('href', subResource.url) - .append($('<div>').addClass('title').html(subResource.title)) - .append($('<div>').addClass('description ellipsis') - .append($('<div>').addClass('text').html(subResource.summary)) - .append($('<div>').addClass('util')))) - .appendTo($ul); - } else { - $('<li>') - .append($('<a>').attr('href', subResource.url) - .append($('<div>').addClass('title').html(subResource.title)) - .append($('<div>').addClass('description ellipsis') - .append($('<div>').addClass('text').html(subResource.summary)) - .append($('<div>').addClass('util') - .append($('<div>').addClass('g-plusone') - .attr('data-size', 'small') - .attr('data-align', 'right') - .attr('data-href', resource.url))))) - .appendTo($ul); - } - } - - // Add a more row - if (max < section.sections.length) { - $('<li>') - .append($('<a>').attr('href', resource.url) - .append($('<div>') - .addClass('title') - .text('More'))) - .appendTo($ul); - } - } else { - // No sub-resources, just render description? - } - - return this; - }; - - - - - /* Render other types of resource styles that are not cards. */ - $.fn.decorateResource = function(resource, opts) { - var imgUrl = resource.image || - 'assets/images/resource-card-default-android.jpg'; - var linkUrl = resource.url; - - if (imgUrl.indexOf('//') === -1) { - imgUrl = toRoot + imgUrl; - } - - if (linkUrl && linkUrl.indexOf('//') === -1) { - linkUrl = toRoot + linkUrl; - } - - $(this).append( - $('<div>').addClass('image') - .css('background-image', 'url(' + imgUrl + ')'), - $('<div>').addClass('info').append( - $('<h4>').addClass('title').html(resource.title), - $('<p>').addClass('summary').html(resource.summary), - $('<a>').attr('href', linkUrl).addClass('cta').html('Learn More') - ) - ); - - return this; - }; -})(jQuery); - - -/* Calculate the vertical area remaining */ -(function($) { - $.fn.ellipsisfade= function(lineHeight) { - this.each(function() { - // get element text - var $this = $(this); - var remainingHeight = $this.parent().parent().height(); - $this.parent().siblings().each(function () - { - if ($(this).is(":visible")) { - var h = $(this).height(); - remainingHeight = remainingHeight - h; - } - }); - - adjustedRemainingHeight = ((remainingHeight)/lineHeight>>0)*lineHeight - $this.parent().css({'height': adjustedRemainingHeight}); - $this.css({'height': "auto"}); - }); - - return this; - }; -}) (jQuery); - -/* - Fullscreen Carousel - - The following allows for an area at the top of the page that takes over the - entire browser height except for its top offset and an optional bottom - padding specified as a data attribute. - - HTML: - - <div class="fullscreen-carousel"> - <div class="fullscreen-carousel-content"> - <!-- content here --> - </div> - <div class="fullscreen-carousel-content"> - <!-- content here --> - </div> - - etc ... - - </div> - - Control over how the carousel takes over the screen can mostly be defined in - a css file. Setting min-height on the .fullscreen-carousel-content elements - will prevent them from shrinking to far vertically when the browser is very - short, and setting max-height on the .fullscreen-carousel itself will prevent - the area from becoming to long in the case that the browser is stretched very - tall. - - There is limited functionality for having multiple sections since that request - was removed, but it is possible to add .next-arrow and .prev-arrow elements to - scroll between multiple content areas. -*/ - -(function() { - $(document).ready(function() { - $('.fullscreen-carousel').each(function() { - initWidget(this); - }); - }); - - function initWidget(widget) { - var $widget = $(widget); - - var topOffset = $widget.offset().top; - var padBottom = parseInt($widget.data('paddingbottom')) || 0; - var maxHeight = 0; - var minHeight = 0; - var $content = $widget.find('.fullscreen-carousel-content'); - var $nextArrow = $widget.find('.next-arrow'); - var $prevArrow = $widget.find('.prev-arrow'); - var $curSection = $($content[0]); - - if ($content.length <= 1) { - $nextArrow.hide(); - $prevArrow.hide(); - } else { - $nextArrow.click(function() { - var index = ($content.index($curSection) + 1); - $curSection.hide(); - $curSection = $($content[index >= $content.length ? 0 : index]); - $curSection.show(); - }); - - $prevArrow.click(function() { - var index = ($content.index($curSection) - 1); - $curSection.hide(); - $curSection = $($content[index < 0 ? $content.length - 1 : 0]); - $curSection.show(); - }); - } - - // Just hide all content sections except first. - $content.each(function(index) { - if ($(this).height() > minHeight) minHeight = $(this).height(); - $(this).css({position: 'absolute', display: index > 0 ? 'none' : ''}); - }); - - // Register for changes to window size, and trigger. - $(window).resize(resizeWidget); - resizeWidget(); - - function resizeWidget() { - var height = $(window).height() - topOffset - padBottom; - $widget.width($(window).width()); - $widget.height(height < minHeight ? minHeight : - (maxHeight && height > maxHeight ? maxHeight : height)); - } - } -})(); - - - - - -/* - Tab Carousel - - The following allows tab widgets to be installed via the html below. Each - tab content section should have a data-tab attribute matching one of the - nav items'. Also each tab content section should have a width matching the - tab carousel. - - HTML: - - <div class="tab-carousel"> - <ul class="tab-nav"> - <li><a href="#" data-tab="handsets">Handsets</a> - <li><a href="#" data-tab="wearable">Wearable</a> - <li><a href="#" data-tab="tv">TV</a> - </ul> - - <div class="tab-carousel-content"> - <div data-tab="handsets"> - <!--Full width content here--> - </div> - - <div data-tab="wearable"> - <!--Full width content here--> - </div> - - <div data-tab="tv"> - <!--Full width content here--> - </div> - </div> - </div> - -*/ -(function() { - $(document).ready(function() { - $('.tab-carousel').each(function() { - initWidget(this); - }); - }); - - function initWidget(widget) { - var $widget = $(widget); - var $nav = $widget.find('.tab-nav'); - var $anchors = $nav.find('[data-tab]'); - var $li = $nav.find('li'); - var $contentContainer = $widget.find('.tab-carousel-content'); - var $tabs = $contentContainer.find('[data-tab]'); - var $curTab = $($tabs[0]); // Current tab is first tab. - var width = $widget.width(); - - // Setup nav interactivity. - $anchors.click(function(evt) { - evt.preventDefault(); - var query = '[data-tab=' + $(this).data('tab') + ']'; - transitionWidget($tabs.filter(query)); - }); - - // Add highlight for navigation on first item. - var $highlight = $('<div>').addClass('highlight') - .css({left:$li.position().left + 'px', width:$li.outerWidth() + 'px'}) - .appendTo($nav); - - // Store height since we will change contents to absolute. - $contentContainer.height($contentContainer.height()); - - // Absolutely position tabs so they're ready for transition. - $tabs.each(function(index) { - $(this).css({position: 'absolute', left: index > 0 ? width + 'px' : '0'}); - }); - - function transitionWidget($toTab) { - if (!$curTab.is($toTab)) { - var curIndex = $tabs.index($curTab[0]); - var toIndex = $tabs.index($toTab[0]); - var dir = toIndex > curIndex ? 1 : -1; - - // Animate content sections. - $toTab.css({left:(width * dir) + 'px'}); - $curTab.animate({left:(width * -dir) + 'px'}); - $toTab.animate({left:'0'}); - - // Animate navigation highlight. - $highlight.animate({left:$($li[toIndex]).position().left + 'px', - width:$($li[toIndex]).outerWidth() + 'px'}) - - // Store new current section. - $curTab = $toTab; - } - } - } -})(); diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/favicon.ico b/build/tools/droiddoc/templates-lineage-sdk/assets/favicon.ico Binary files differdeleted file mode 100755 index 35b571ac..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/favicon.ico +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/fullscreen.png b/build/tools/droiddoc/templates-lineage-sdk/assets/fullscreen.png Binary files differdeleted file mode 100644 index 01f971cd..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/fullscreen.png +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/images/fullscreen.png b/build/tools/droiddoc/templates-lineage-sdk/assets/images/fullscreen.png Binary files differdeleted file mode 100644 index 01f971cd..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/images/fullscreen.png +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_down.png b/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_down.png Binary files differdeleted file mode 100644 index 6a0a8eea..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_down.png +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_left.png b/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_left.png Binary files differdeleted file mode 100644 index e887b2a6..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_left.png +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_right.png b/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_right.png Binary files differdeleted file mode 100644 index ced7fa48..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_right.png +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_up.png b/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_up.png Binary files differdeleted file mode 100644 index ddd4ec93..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/images/styles/disclosure_up.png +++ /dev/null diff --git a/build/tools/droiddoc/templates-lineage-sdk/assets/lineage_logo.svg b/build/tools/droiddoc/templates-lineage-sdk/assets/lineage_logo.svg deleted file mode 100644 index f908c5ee..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/assets/lineage_logo.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144 72"><defs><style>.cls-1{fill:#167c80;}</style></defs><title>lineage_logo_mark_ltrbox_teal_144x72</title><g id="mark_-_letterbox" data-name="mark - letterbox"><path class="cls-1" d="M112,36a10,10,0,0,0-7.78,3.72l-.38-.15A73.82,73.82,0,0,0,92,36s0,0,0,0a20,20,0,0,0-40,0v0l-.43.09a73.47,73.47,0,0,0-11.42,3.44l-.38.15a10.1,10.1,0,1,0,1.84,3.57h0A69.34,69.34,0,0,1,52.41,40a20,20,0,0,0,39.18,0,69.32,69.32,0,0,1,10.78,3.24h0A10,10,0,1,0,112,36ZM32,52a6,6,0,1,1,6-6A6,6,0,0,1,32,52Zm40,0A16,16,0,1,1,88,36,16,16,0,0,1,72,52Zm40,0a6,6,0,1,1,6-6A6,6,0,0,1,112,52ZM80,36a8,8,0,1,1-8-8A8,8,0,0,1,80,36Z"/></g></svg>
\ No newline at end of file diff --git a/build/tools/droiddoc/templates-lineage-sdk/class.cs b/build/tools/droiddoc/templates-lineage-sdk/class.cs deleted file mode 100644 index 7aa99f96..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/class.cs +++ /dev/null @@ -1,679 +0,0 @@ -<?cs include:"doctype.cs" ?> -<?cs include:"macros.cs" ?> -<?cs include:"macros_override.cs" ?> -<html<?cs if:devsite ?> devsite<?cs /if ?>> -<?cs include:"head_tag.cs" ?> -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?> - <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs - if:reference ?> reference<?cs - /if ?><?cs - elif:design ?>design<?cs - elif:distribute ?>distribute<?cs - /if ?>" itemscope itemtype="http://schema.org/Article"> - <div id="doc-api-level" class="<?cs var:class.since ?>" style="display:none"></div> - <a name="top"></a> -<?cs include:"header.cs" ?> - -<div class="col-12" id="doc-col"> - -<div id="api-info-block"> - -<?cs # are there inherited members ?> -<?cs each:cl=class.inherited ?> - <?cs if:subcount(cl.methods) ?> - <?cs set:inhmethods = #1 ?> - <?cs /if ?> - <?cs if:subcount(cl.constants) ?> - <?cs set:inhconstants = #1 ?> - <?cs /if ?> - <?cs if:subcount(cl.fields) ?> - <?cs set:inhfields = #1 ?> - <?cs /if ?> - <?cs if:subcount(cl.attrs) ?> - <?cs set:inhattrs = #1 ?> - <?cs /if ?> -<?cs /each ?> - -<div class="sum-details-links"> -<?cs if:inhattrs || inhconstants || inhfields || inhmethods || (!class.subclasses.hidden && - (subcount(class.subclasses.direct) || subcount(class.subclasses.indirect))) ?> -Summary: -<?cs if:subcount(class.inners) ?> - <a href="#nestedclasses">Nested Classes</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.attrs) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#lattrs">XML Attrs</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:inhattrs ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#inhattrs">Inherited XML Attrs</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.enumConstants) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#enumconstants">Enums</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.constants) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#constants">Constants</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:inhconstants ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#inhconstants">Inherited Constants</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.fields) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#lfields">Fields</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:inhfields ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#inhfields">Inherited Fields</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.ctors.public) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#pubctors">Ctors</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.ctors.protected) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#proctors">Protected Ctors</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.methods.public) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#pubmethods">Methods</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:subcount(class.methods.protected) ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#promethods">Protected Methods</a> - <?cs set:linkcount = #1 ?> -<?cs /if ?> -<?cs if:inhmethods ?> - <?cs if:linkcount ?>| <?cs /if ?><a href="#inhmethods">Inherited Methods</a> -<?cs /if ?> -| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a> -<?cs /if ?> -</div><!-- end sum-details-links --> -<div class="api-level"> - <?cs call:since_tags(class) ?><?cs - if:class.deprecatedsince - ?><br>Deprecated since <a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html#ApiLevels" - >API level <?cs var:class.deprecatedsince ?></a><?cs - /if ?> - <?cs call:federated_refs(class) ?> -</div> -</div><!-- end api-info-block --> - -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ======== START OF CLASS DATA ======== --> - -<div id="jd-header"> - <?cs var:class.scope ?> - <?cs var:class.static ?> - <?cs var:class.final ?> - <?cs var:class.abstract ?> - <?cs var:class.kind ?> -<h1 itemprop="name"><?cs var:class.name ?></h1> - -<?cs set:colspan = subcount(class.inheritance) ?> -<?cs each:supr = class.inheritance ?> - <?cs if:colspan == 2 ?> - extends <?cs call:type_link(supr.short_class) ?><br/> - <?cs /if ?> - <?cs if:last(supr) && subcount(supr.interfaces) ?> - implements - <?cs each:t=supr.interfaces ?> - <?cs call:type_link(t) ?> - <?cs /each ?> - <?cs /if ?> - <?cs set:colspan = colspan-1 ?> -<?cs /each ?> -<?cs call:show_annotations_list(class) ?> - -</div><!-- end header --> - -<div id="naMessage"></div> - -<div id="jd-content" class="api apilevel-<?cs var:class.since ?>"> -<table class="jd-inheritance-table"> -<?cs set:colspan = subcount(class.inheritance) ?> -<?cs each:supr = class.inheritance ?> - <tr> - <?cs loop:i = 1, (subcount(class.inheritance)-colspan), 1 ?> - <td class="jd-inheritance-space"> <?cs if:(subcount(class.inheritance)-colspan) == i ?> ↳<?cs /if ?></td> - <?cs /loop ?> - <td colspan="<?cs var:colspan ?>" class="jd-inheritance-class-cell"><?cs - if:colspan == 1 - ?><?cs call:class_name(class.qualifiedType) ?><?cs - else - ?><?cs call:type_link(supr.class) ?><?cs - /if ?></td> - </tr> - <?cs set:colspan = colspan-1 ?> -<?cs /each ?> -</table> - -<?cs # this next line must be exactly like this to be parsed by eclipse ?> - -<?cs if:subcount(class.subclasses.direct) && !class.subclasses.hidden ?> -<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;"> -<?cs call:expando_trigger("subclasses-direct", "closed") ?>Known Direct Subclasses -<?cs call:expandable_class_list("subclasses-direct", class.subclasses.direct, "list") ?> -</td></tr></table> -<?cs /if ?> - -<?cs if:subcount(class.subclasses.indirect) && !class.subclasses.hidden ?> -<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;"> -<?cs call:expando_trigger("subclasses-indirect", "closed") ?>Known Indirect Subclasses -<?cs call:expandable_class_list("subclasses-indirect", class.subclasses.indirect, "list") ?> -</td></tr></table> -<?cs /if ?> - -<div class="jd-descr"> -<?cs call:deprecated_warning(class) ?> -<?cs if:subcount(class.descr) ?> -<h2>Class Overview</h2> -<p itemprop="articleBody"><?cs call:tag_list(class.descr) ?></p> -<?cs /if ?> - -<?cs call:see_also_tags(class.seeAlso) ?> - -</div><!-- jd-descr --> - - -<?cs # summary macros ?> - -<?cs def:write_method_summary(methods, included) ?> -<?cs set:count = #1 ?> -<?cs each:method = methods ?> - <?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:method.since ?>" > - <td class="jd-typecol"><nobr> - <?cs var:method.abstract ?> - <?cs var:method.synchronized ?> - <?cs var:method.final ?> - <?cs var:method.static ?> - <?cs call:type_link(method.generic) ?> - <?cs call:type_link(method.returnType) ?></nobr> - </td> - <td class="jd-linkcol" width="100%"><nobr> - <span class="sympad"><?cs call:cond_link(method.name, toroot, method.href, included) ?></span>(<?cs call:parameter_list(method.params) ?>)</nobr> - <?cs if:subcount(method.shortDescr) || subcount(method.deprecated) ?> - <div class="jd-descrdiv"> - <?cs call:short_descr(method) ?> - <?cs call:show_annotations_list(method) ?> - </div> - <?cs /if ?> - </td></tr> -<?cs set:count = count + #1 ?> -<?cs /each ?> -<?cs /def ?> - -<?cs def:write_field_summary(fields, included) ?> -<?cs set:count = #1 ?> - <?cs each:field=fields ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" > - <td class="jd-typecol"><nobr> - <?cs var:field.scope ?> - <?cs var:field.static ?> - <?cs var:field.final ?> - <?cs call:type_link(field.type) ?></nobr></td> - <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(field) ?> - <?cs call:show_annotations_list(field) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> -<?cs /def ?> - -<?cs def:write_constant_summary(fields, included) ?> -<?cs set:count = #1 ?> - <?cs each:field=fields ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" > - <td class="jd-typecol"><?cs call:type_link(field.type) ?></td> - <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(field) ?> - <?cs call:show_annotations_list(field) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> -<?cs /def ?> - -<?cs def:write_attr_summary(attrs, included) ?> -<?cs set:count = #1 ?> - <tr> - <td><nobr><em>Attribute Name</em></nobr></td> - <td><nobr><em>Related Method</em></nobr></td> - <td><nobr><em>Description</em></nobr></td> - </tr> - <?cs each:attr=attrs ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:attr.since ?>" > - <td class="jd-linkcol"><?cs if:included ?><a href="<?cs var:toroot ?><?cs var:attr.href ?>"><?cs /if ?><?cs var:attr.name ?><?cs if:included ?></a><?cs /if ?></td> - <td class="jd-linkcol"><?cs each:m=attr.methods ?> - <?cs call:cond_link(m.name, toroot, m.href, included) ?> - <?cs /each ?> - </td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(attr) ?> - <?cs call:show_annotations_list(attr) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> -<?cs /def ?> - -<?cs def:write_inners_summary(classes) ?> -<?cs set:count = #1 ?> - <?cs each:cl=class.inners ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" > - <td class="jd-typecol"><nobr> - <?cs var:cl.scope ?> - <?cs var:cl.static ?> - <?cs var:cl.final ?> - <?cs var:cl.abstract ?> - <?cs var:cl.kind ?></nobr></td> - <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(cl) ?> - <?cs call:show_annotations_list(cl) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> -<?cs /def ?> - -<?cs # end macros ?> - -<div class="jd-descr"> -<?cs # make sure there's a summary view to display ?> -<?cs if:subcount(class.inners) - || subcount(class.attrs) - || inhattrs - || subcount(class.enumConstants) - || subcount(class.constants) - || inhconstants - || subcount(class.fields) - || inhfields - || subcount(class.ctors.public) - || subcount(class.ctors.protected) - || subcount(class.methods.public) - || subcount(class.methods.protected) - || inhmethods ?> -<h2>Summary</h2> - -<?cs if:subcount(class.inners) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ======== NESTED CLASS SUMMARY ======== --> -<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr> -<?cs call:write_inners_summary(class.inners) ?> -<?cs /if ?> - -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<?cs if:subcount(class.attrs) ?> -<!-- =========== FIELD SUMMARY =========== --> -<table id="lattrs" class="jd-sumtable"><tr><th colspan="12">XML Attributes</th></tr> -<?cs call:write_attr_summary(class.attrs, 1) ?> -<?cs /if ?> - -<?cs # if there are inherited attrs, write the table ?> -<?cs if:inhattrs ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- =========== FIELD SUMMARY =========== --> -<table id="inhattrs" class="jd-sumtable"><tr><th> - <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a> - <div style="clear:left;">Inherited XML Attributes</div></th></tr> -<?cs each:cl=class.inherited ?> -<?cs if:subcount(cl.attrs) ?> -<tr class="api apilevel-<?cs var:cl.since ?>" > -<td colspan="12"> -<?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?> -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?> -<div id="inherited-attrs-<?cs var:cl.qualified ?>"> - <div id="inherited-attrs-<?cs var:cl.qualified ?>-list" - class="jd-inheritedlinks"> - </div> - <div id="inherited-attrs-<?cs var:cl.qualified ?>-summary" style="display: none;"> - <table class="jd-sumtable-expando"> - <?cs call:write_attr_summary(cl.attrs, cl.included) ?></table> - </div> -</div> -</td></tr> -<?cs /if ?> -<?cs /each ?> -</table> -<?cs /if ?> - -<?cs if:subcount(class.enumConstants) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- =========== ENUM CONSTANT SUMMARY =========== --> -<table id="enumconstants" class="jd-sumtable"><tr><th colspan="12">Enum Values</th></tr> -<?cs set:count = #1 ?> - <?cs each:field=class.enumConstants ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" > - <td class="jd-descrcol"><?cs call:type_link(field.type) ?> </td> - <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, cl.included) ?> </td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(field) ?> - <?cs call:show_annotations_list(field) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> -<?cs /if ?> - -<?cs if:subcount(class.constants) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- =========== ENUM CONSTANT SUMMARY =========== --> -<table id="constants" class="jd-sumtable"><tr><th colspan="12">Constants</th></tr> -<?cs call:write_constant_summary(class.constants, 1) ?> -</table> -<?cs /if ?> - -<?cs # if there are inherited constants, write the table ?> -<?cs if:inhconstants ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- =========== ENUM CONSTANT SUMMARY =========== --> -<table id="inhconstants" class="jd-sumtable"><tr><th> - <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a> - <div style="clear:left;">Inherited Constants</div></th></tr> -<?cs each:cl=class.inherited ?> -<?cs if:subcount(cl.constants) ?> -<tr class="api apilevel-<?cs var:cl.since ?>" > -<td colspan="12"> -<?cs call:expando_trigger("inherited-constants-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?> -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?> -<div id="inherited-constants-<?cs var:cl.qualified ?>"> - <div id="inherited-constants-<?cs var:cl.qualified ?>-list" - class="jd-inheritedlinks"> - </div> - <div id="inherited-constants-<?cs var:cl.qualified ?>-summary" style="display: none;"> - <table class="jd-sumtable-expando"> - <?cs call:write_constant_summary(cl.constants, cl.included) ?></table> - </div> -</div> -</td></tr> -<?cs /if ?> -<?cs /each ?> -</table> -<?cs /if ?> - -<?cs if:subcount(class.fields) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- =========== FIELD SUMMARY =========== --> -<table id="lfields" class="jd-sumtable"><tr><th colspan="12">Fields</th></tr> -<?cs call:write_field_summary(class.fields, 1) ?> -</table> -<?cs /if ?> - -<?cs # if there are inherited fields, write the table ?> -<?cs if:inhfields ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- =========== FIELD SUMMARY =========== --> -<table id="inhfields" class="jd-sumtable"><tr><th> - <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a> - <div style="clear:left;">Inherited Fields</div></th></tr> -<?cs each:cl=class.inherited ?> -<?cs if:subcount(cl.fields) ?> -<tr class="api apilevel-<?cs var:cl.since ?>" > -<td colspan="12"> -<?cs call:expando_trigger("inherited-fields-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?> -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?> -<div id="inherited-fields-<?cs var:cl.qualified ?>"> - <div id="inherited-fields-<?cs var:cl.qualified ?>-list" - class="jd-inheritedlinks"> - </div> - <div id="inherited-fields-<?cs var:cl.qualified ?>-summary" style="display: none;"> - <table class="jd-sumtable-expando"> - <?cs call:write_field_summary(cl.fields, cl.included) ?></table> - </div> -</div> -</td></tr> -<?cs /if ?> -<?cs /each ?> -</table> -<?cs /if ?> - -<?cs if:subcount(class.ctors.public) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ======== CONSTRUCTOR SUMMARY ======== --> -<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr> -<?cs call:write_method_summary(class.ctors.public, 1) ?> -</table> -<?cs /if ?> - -<?cs if:subcount(class.ctors.protected) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ======== CONSTRUCTOR SUMMARY ======== --> -<table id="proctors" class="jd-sumtable"><tr><th colspan="12">Protected Constructors</th></tr> -<?cs call:write_method_summary(class.ctors.protected, 1) ?> -</table> -<?cs /if ?> - -<?cs if:subcount(class.methods.public) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========== METHOD SUMMARY =========== --> -<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr> -<?cs call:write_method_summary(class.methods.public, 1) ?> -</table> -<?cs /if ?> - -<?cs if:subcount(class.methods.protected) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========== METHOD SUMMARY =========== --> -<table id="promethods" class="jd-sumtable"><tr><th colspan="12">Protected Methods</th></tr> -<?cs call:write_method_summary(class.methods.protected, 1) ?> -</table> -<?cs /if ?> - -<?cs # if there are inherited methods, write the table ?> -<?cs if:inhmethods ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========== METHOD SUMMARY =========== --> -<table id="inhmethods" class="jd-sumtable"><tr><th> - <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a> - <div style="clear:left;">Inherited Methods</div></th></tr> -<?cs each:cl=class.inherited ?> -<?cs if:subcount(cl.methods) ?> -<tr class="api apilevel-<?cs var:cl.since ?>" > -<td colspan="12"><?cs call:expando_trigger("inherited-methods-"+cl.qualified, "closed") ?> -From <?cs var:cl.kind ?> -<?cs if:cl.included ?> - <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a> -<?cs elif:cl.federated ?> - <a href="<?cs var:cl.link ?>"><?cs var:cl.qualified ?></a> -<?cs else ?> - <?cs var:cl.qualified ?> -<?cs /if ?> -<div id="inherited-methods-<?cs var:cl.qualified ?>"> - <div id="inherited-methods-<?cs var:cl.qualified ?>-list" - class="jd-inheritedlinks"> - </div> - <div id="inherited-methods-<?cs var:cl.qualified ?>-summary" style="display: none;"> - <table class="jd-sumtable-expando"> - <?cs call:write_method_summary(cl.methods, cl.included) ?></table> - </div> -</div> -</td></tr> -<?cs /if ?> -<?cs /each ?> -</table> -<?cs /if ?> -<?cs /if ?> -</div><!-- jd-descr (summary) --> - -<!-- Details --> - -<?cs def:write_field_details(fields) ?> -<?cs each:field=fields ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?> -<A NAME="<?cs var:field.anchor ?>"></A> -<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?> -<div class="jd-details api apilevel-<?cs var:field.since ?>"> - <h4 class="jd-details-title"> - <span class="normal"> - <?cs var:field.scope ?> - <?cs var:field.static ?> - <?cs var:field.final ?> - <?cs call:type_link(field.type) ?> - </span> - <?cs var:field.name ?> - </h4> - <div class="api-level"> - <?cs call:since_tags(field) ?> - <?cs call:federated_refs(field) ?> - </div> - <div class="jd-details-descr"> - <?cs call:show_annotations_list(field) ?> - <?cs call:description(field) ?> - <?cs if:subcount(field.constantValue) ?> - <div class="jd-tagdata"> - <span class="jd-tagtitle">Constant Value: </span> - <span> - <?cs if:field.constantValue.isString ?> - <?cs var:field.constantValue.str ?> - <?cs else ?> - <?cs var:field.constantValue.dec ?> - (<?cs var:field.constantValue.hex ?>) - <?cs /if ?> - </span> - </div> - <?cs /if ?> - </div> -</div> -<?cs /each ?> -<?cs /def ?> - -<?cs def:write_method_details(methods) ?> -<?cs each:method=methods ?> -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?> -<A NAME="<?cs var:method.anchor ?>"></A> -<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?> -<div class="jd-details api apilevel-<?cs var:method.since ?>"> - <h4 class="jd-details-title"> - <span class="normal"> - <?cs var:method.scope ?> - <?cs var:method.static ?> - <?cs var:method.final ?> - <?cs var:method.abstract ?> - <?cs var:method.synchronized ?> - <?cs call:type_link(method.returnType) ?> - </span> - <span class="sympad"><?cs var:method.name ?></span> - <span class="normal">(<?cs call:parameter_list(method.params) ?>)</span> - </h4> - <div class="api-level"> - <div><?cs call:since_tags(method) ?></div> - <?cs call:federated_refs(method) ?> - </div> - <div class="jd-details-descr"> - <?cs call:show_annotations_list(method) ?> - <?cs call:description(method) ?> - </div> -</div> -<?cs /each ?> -<?cs /def ?> - -<?cs def:write_attr_details(attrs) ?> -<?cs each:attr=attrs ?> -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?> -<A NAME="<?cs var:attr.anchor ?>"></A> -<div class="jd-details"> - <h4 class="jd-details-title"><?cs var:attr.name ?> - </h4> - <div class="jd-details-descr"> - <?cs call:show_annotations_list(attr) ?> - <?cs call:description(attr) ?> - - <div class="jd-tagdata"> - <h5 class="jd-tagtitle">Related Methods</h5> - <ul class="nolist"> - <?cs each:m=attr.methods ?> - <li><a href="<?cs var:toroot ?><?cs var:m.href ?>"><?cs var:m.name ?></a></li> - <?cs /each ?> - </ul> - </div> - </div> -</div> -<?cs /each ?> -<?cs /def ?> - - -<!-- XML Attributes --> -<?cs if:subcount(class.attrs) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= FIELD DETAIL ======== --> -<h2>XML Attributes</h2> -<?cs call:write_attr_details(class.attrs) ?> -<?cs /if ?> - -<!-- Enum Values --> -<?cs if:subcount(class.enumConstants) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= ENUM CONSTANTS DETAIL ======== --> -<h2>Enum Values</h2> -<?cs call:write_field_details(class.enumConstants) ?> -<?cs /if ?> - -<!-- Constants --> -<?cs if:subcount(class.constants) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= ENUM CONSTANTS DETAIL ======== --> -<h2>Constants</h2> -<?cs call:write_field_details(class.constants) ?> -<?cs /if ?> - -<!-- Fields --> -<?cs if:subcount(class.fields) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= FIELD DETAIL ======== --> -<h2>Fields</h2> -<?cs call:write_field_details(class.fields) ?> -<?cs /if ?> - -<!-- Public ctors --> -<?cs if:subcount(class.ctors.public) ?> -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= CONSTRUCTOR DETAIL ======== --> -<h2>Public Constructors</h2> -<?cs call:write_method_details(class.ctors.public) ?> -<?cs /if ?> - -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= CONSTRUCTOR DETAIL ======== --> -<!-- Protected ctors --> -<?cs if:subcount(class.ctors.protected) ?> -<h2>Protected Constructors</h2> -<?cs call:write_method_details(class.ctors.protected) ?> -<?cs /if ?> - -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= METHOD DETAIL ======== --> -<!-- Public methdos --> -<?cs if:subcount(class.methods.public) ?> -<h2>Public Methods</h2> -<?cs call:write_method_details(class.methods.public) ?> -<?cs /if ?> - -<?cs # this next line must be exactly like this to be parsed by eclipse ?> -<!-- ========= METHOD DETAIL ======== --> -<?cs if:subcount(class.methods.protected) ?> -<h2>Protected Methods</h2> -<?cs call:write_method_details(class.methods.protected) ?> -<?cs /if ?> - -<?cs # the next two lines must be exactly like this to be parsed by eclipse ?> -<!-- ========= END OF CLASS DATA ========= --> -<A NAME="navbar_top"></A> - -<?cs include:"footer.cs" ?> -</div> <!-- jd-content --> - -</div><!-- end doc-content --> - -<?cs include:"trailer.cs" ?> - -</body> -</html> diff --git a/build/tools/droiddoc/templates-lineage-sdk/classes.cs b/build/tools/droiddoc/templates-lineage-sdk/classes.cs deleted file mode 100644 index 0928d7c0..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/classes.cs +++ /dev/null @@ -1,53 +0,0 @@ -<?cs include:"doctype.cs" ?> -<?cs include:"macros.cs" ?> -<?cs include:"macros_override.cs" ?> -<html<?cs if:devsite ?> devsite<?cs /if ?>> -<?cs include:"head_tag.cs" ?> -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?> - <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs - if:reference ?> reference<?cs - /if ?><?cs - elif:design ?>design<?cs - elif:distribute ?>distribute<?cs - /if ?>" itemscope itemtype="http://schema.org/Article"> - <a name="top"></a> -<?cs include:"header.cs" ?> - -<div class="col-12" id="doc-col"> - -<div id="jd-header"> -<h1><?cs var:page.title ?></h1> -</div> - -<div id="jd-content"> -<p>These are the LineageOS Platform API classes. See all <a href="packages.html">API packages</a>.</p> -<div class="jd-letterlist"><?cs each:letter=docs.classes ?> - <a href="#letter_<?cs name:letter ?>"><?cs name:letter ?></a> <?cs /each?> -</div> - -<?cs each:letter=docs.classes ?> -<?cs set:count = #1 ?> -<h2 id="letter_<?cs name:letter ?>"><?cs name:letter ?></h2> -<table class="jd-sumtable"> - <?cs set:cur_row = #0 ?> - <?cs each:cl = letter ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" > - <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(cl) ?> - <?cs call:show_annotations_list(cl) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> -</table> -<?cs /each ?> - -<?cs include:"footer.cs" ?> -</div><!-- end jd-content --> -</div><!-- end doc-content --> - -<?cs include:"trailer.cs" ?> - -</body> -</html> diff --git a/build/tools/droiddoc/templates-lineage-sdk/components/masthead.cs b/build/tools/droiddoc/templates-lineage-sdk/components/masthead.cs deleted file mode 100755 index f583642b..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/components/masthead.cs +++ /dev/null @@ -1,10 +0,0 @@ -<?cs def:custom_masthead() ?> - <div id="header"> - <div id="headerLeft"> - <a href="<?cs var:toroot ?>reference/packages.html" tabindex="-1"><img - src="<?cs var:toroot ?>assets/lineage_logo.svg" alt="CID" width="144" height="72"/> - <span id="masthead-title" style="font-size: 28px;">LineageOS Platform SDK</span></a> - </div> - </div><!-- header --><?cs -/def ?> - diff --git a/build/tools/droiddoc/templates-lineage-sdk/customizations.cs b/build/tools/droiddoc/templates-lineage-sdk/customizations.cs deleted file mode 100644 index e302e0c2..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/customizations.cs +++ /dev/null @@ -1,516 +0,0 @@ -<?cs -def:fullpage() ?> - <div id="body-content"> -<?cs /def ?> -<?cs -def:sdk_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> -<?cs /def ?><?cs - -def:no_nav() ?> - <div class="wrap clearfix" id="body-content"> -<?cs /def ?><?cs - -def:tools_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs - include:"../../../../frameworks/base/docs/html/tools/tools_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> -<?cs -def:training_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - - -<?cs - include:"../../../../frameworks/base/docs/html/training/training_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:googleplay_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/googleplay/googleplay_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:essentials_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/essentials/essentials_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:users_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/users/users_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:engage_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/engage/engage_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:analyze_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/analyze/analyze_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:monetize_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/monetize/monetize_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:disttools_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/tools/disttools_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:stories_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> -<?cs include:"../../../../frameworks/base/docs/html/distribute/stories/stories_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?><?cs - -def:guide_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> -<?cs -def:design_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - - -<?cs - include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> -<?cs -def:distribute_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/distribute/distribute_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> - -<?cs -def:samples_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?> - - </div> - - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> - -<?cs -def:google_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?> - - - </div> - <script type="text/javascript"> - showGoogleRefTree(); - - </script> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> - -<?cs -def:about_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> - - -<?cs -def:wear_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - -<?cs - include:"../../../../frameworks/base/docs/html/wear/wear_toc.cs" ?> - - - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> - -<?cs -def:preview_nav() ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav" class="scroll-pane"> - <?cs - include:"../../../../frameworks/base/docs/html/preview/preview_toc.cs" ?> - </div> - </div> <!-- end side-nav --> - <script> - $(document).ready(function() { - scrollIntoView("devdoc-nav"); - }); - </script> -<?cs /def ?> - -<?cs # The default side navigation for the reference docs ?><?cs -def:default_left_nav() ?> -<?cs if:reference.gcm || reference.gms ?> - <?cs call:google_nav() ?> -<?cs else ?> - <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> - <div id="devdoc-nav"> - <div id="api-nav-header"> - <div id="api-level-toggle"> - <label for="apiLevelCheckbox" class="disabled" - title="Select your target API level to dim unavailable APIs">API level: </label> - <div class="select-wrapper"> - <select id="apiLevelSelector"> - <!-- option elements added by buildApiLevelSelector() --> - </select> - </div> - </div><!-- end toggle --> - <div id="api-nav-title">LineageOS APIs</div> - </div><!-- end nav header --> - <script> - var SINCE_DATA = [ <?cs - each:since = since ?>'<?cs - var:since.name ?>'<?cs - if:!last(since) ?>, <?cs /if ?><?cs - /each - ?> ]; - buildApiLevelSelector(); - </script> - - <div id="swapper"> - <div id="nav-panels"> - <div id="resize-packages-nav"> - <div id="packages-nav" class="scroll-pane"> - - <ul> - <?cs call:package_link_list(docs.packages) ?> - </ul><br/> - - </div> <!-- end packages-nav --> - </div> <!-- end resize-packages --> - <div id="classes-nav" class="scroll-pane"> - - -<?cs - if:subcount(class.package) ?> - <ul> - <?cs call:list("Annotations", class.package.annotations) ?> - <?cs call:list("Interfaces", class.package.interfaces) ?> - <?cs call:list("Classes", class.package.classes) ?> - <?cs call:list("Enums", class.package.enums) ?> - <?cs call:list("Exceptions", class.package.exceptions) ?> - <?cs call:list("Errors", class.package.errors) ?> - </ul><?cs - elif:subcount(package) ?> - <ul> - <?cs call:class_link_list("Annotations", package.annotations) ?> - <?cs call:class_link_list("Interfaces", package.interfaces) ?> - <?cs call:class_link_list("Classes", package.classes) ?> - <?cs call:class_link_list("Enums", package.enums) ?> - <?cs call:class_link_list("Exceptions", package.exceptions) ?> - <?cs call:class_link_list("Errors", package.errors) ?> - </ul><?cs - else ?> - <p style="padding:10px">Select a package to view its members</p><?cs - /if ?><br/> - - - </div><!-- end classes --> - </div><!-- end nav-panels --> - <div id="nav-tree" style="display:none" class="scroll-pane"> - <div id="tree-list"></div> - </div><!-- end nav-tree --> - </div><!-- end swapper --> - <div id="nav-swap"> - <a class="fullscreen">fullscreen</a> - <a href='#' onclick='swapNav();return false;'><span id='tree-link'>Use Tree Navigation</span><span id='panel-link' style='display:none'>Use Panel Navigation</span></a> - </div> - </div> <!-- end devdoc-nav --> - </div> <!-- end side-nav --> - <script type="text/javascript"> - // init fullscreen based on user pref - var fullscreen = readCookie("fullscreen"); - if (fullscreen != 0) { - if (fullscreen == "false") { - toggleFullscreen(false); - } else { - toggleFullscreen(true); - } - } - // init nav version for mobile - if (isMobile) { - swapNav(); // tree view should be used on mobile - $('#nav-swap').hide(); - } else { - chooseDefaultNav(); - if ($("#nav-tree").is(':visible')) { - init_default_navtree("<?cs var:toroot ?>"); - } - } - // scroll the selected page into view - $(document).ready(function() { - scrollIntoView("packages-nav"); - scrollIntoView("classes-nav"); - }); - </script> -<?cs /if ?> - <?cs -/def ?> - -<?cs -def:custom_left_nav() ?><?cs - if:fullpage ?><?cs - call:fullpage() ?><?cs - elif:nonavpage ?><?cs - call:no_nav() ?><?cs - elif:guide ?><?cs - call:guide_nav() ?><?cs - elif:design ?><?cs - call:design_nav() ?><?cs - elif:training ?><?cs - call:training_nav() ?><?cs - elif:tools ?><?cs - call:tools_nav() ?><?cs - elif:google ?><?cs - call:google_nav() ?><?cs - elif:samples ?><?cs - call:samples_nav() ?><?cs - elif:distribute ?><?cs - if:googleplay ?><?cs - call:googleplay_nav() ?><?cs - elif:essentials ?><?cs - call:essentials_nav() ?><?cs - elif:users ?><?cs - call:users_nav() ?><?cs - elif:engage ?><?cs - call:engage_nav() ?><?cs - elif:monetize ?><?cs - call:monetize_nav() ?><?cs - elif:analyze ?><?cs - call:analyze_nav() ?><?cs - elif:disttools ?><?cs - call:disttools_nav() ?><?cs - elif:stories ?><?cs - call:stories_nav() ?><?cs - /if ?><?cs - elif:about ?><?cs - call:about_nav() ?><?cs - elif:distribute ?><?cs - call:distribute_nav() ?><?cs - elif:wear ?><?cs - call:wear_nav() ?><?cs - elif:preview ?><?cs - call:preview_nav() ?><?cs - else ?><?cs - call:default_left_nav() ?> <?cs - /if ?><?cs -/def ?> - -<?cs # appears at the bottom of every page ?><?cs -def:custom_cc_copyright() ?> - Except as noted, this content is - licensed under <a href="http://creativecommons.org/licenses/by/2.5/"> - Creative Commons Attribution 2.5</a>. For details and - restrictions, see the <a href="<?cs var:toroot ?>license.html">Content - License</a>.<?cs -/def ?> - -<?cs -def:custom_copyright() ?> - Except as noted, this content is licensed under <a - href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>. - For details and restrictions, see the <a href="<?cs var:toroot ?>license.html"> - Content License</a>.<?cs -/def ?> - -<?cs -def:custom_footerlinks() ?> - <p> - <a href="<?cs var:toroot ?>about/index.html">About Android</a> | - <a href="<?cs var:toroot ?>legal.html">Legal</a> | - <a href="<?cs var:toroot ?>support.html">Support</a> - </p><?cs -/def ?> - -<?cs # appears on the right side of the blue bar at the bottom off every page ?><?cs -def:custom_buildinfo() ?><?cs - if:!google && !reference.gcm && !reference.gms ?> - Android <?cs var:sdk.version ?> r<?cs var:sdk.rel.id ?> — <?cs - /if ?> -<script src="<?cs var:toroot ?>timestamp.js" type="text/javascript"></script> -<script>document.write(BUILD_TIMESTAMP)</script> -<?cs /def ?> - diff --git a/build/tools/droiddoc/templates-lineage-sdk/head_tag.cs b/build/tools/droiddoc/templates-lineage-sdk/head_tag.cs deleted file mode 100644 index 74621aa3..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/head_tag.cs +++ /dev/null @@ -1,87 +0,0 @@ -<head> -<?cs - ####### If building devsite, add some meta data needed for when generating the top nav ######### ?> -<?cs - if:devsite ?><?cs - if:guide||develop||training||reference||tools||sdk||google||samples - ?><meta name="top_category" value="develop" /><?cs - elif:google - ?><meta name="top_category" value="google" /><?cs - elif:reference && !(reference.gms || reference.gcm) - ?><meta name="top_category" value="css-fullscreen" /><?cs - /if ?> - <?cs - /if -?><?cs - # END if/else devsite ?> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=<?cs - if:page.viewport_width ?><?cs - var:page.viewport_width ?><?cs - else ?>device-width<?cs /if ?>" /> -<?cs - if:page.metaDescription ?> -<meta name="Description" content="<?cs var:page.metaDescription ?>"><?cs - /if ?> -<link rel="shortcut icon" type="image/x-icon" href="<?cs var:toroot ?>assets/favicon.ico" /> -<title><?cs - if:page.title ?><?cs - var:page.title ?> | <?cs - /if ?>Android Developers</title> - -<!-- STYLESHEETS --> -<link rel="stylesheet" -href="<?cs -if:android.whichdoc != 'online' ?>http:<?cs -/if ?>//fonts.googleapis.com/css?family=Roboto+Condensed"> -<link rel="stylesheet" href="<?cs -if:android.whichdoc != 'online' ?>http:<?cs -/if ?>//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold" - title="roboto"> -<link href="<?cs var:toroot ?>assets/css/default.css?v=5" rel="stylesheet" type="text/css"> - -<?cs if:reference && !(reference.gms || reference.gcm || preview) ?> -<!-- FULLSCREEN STYLESHEET --> -<link href="<?cs var:toroot ?>assets/css/fullscreen.css" rel="stylesheet" class="fullscreen" -type="text/css"> -<?cs /if ?> - -<!-- JAVASCRIPT --> -<script src="<?cs if:android.whichdoc != 'online' ?>http:<?cs /if ?>//www.google.com/jsapi" type="text/javascript"></script> -<?cs -if:devsite - ?><script src="<?cs var:toroot ?>_static/js/android_3p-bundle.js" type="text/javascript"></script><?cs -else - ?><script src="<?cs var:toroot ?>assets/js/android_3p-bundle.js" type="text/javascript"></script><?cs -/if ?><?cs - if:page.customHeadTag ?> -<?cs var:page.customHeadTag ?><?cs - /if ?> -<script type="text/javascript"> - var toRoot = "<?cs var:toroot ?>"; - var metaTags = [<?cs var:meta.tags ?>]; - var devsite = <?cs if:devsite ?>true<?cs else ?>false<?cs /if ?>; -</script> - -<?cs if:helpoutsWidget ?> -<script type="text/javascript" src="https://helpouts.google.com/ps/res/embed.js" defer async - data-helpouts-embed data-helpouts-vertical="programming" - data-helpouts-tags="<?cs var:page.tags ?>" data-helpouts-prefix="android" - data-helpouts-standalone="true"></script> -<?cs /if ?> - -<script> - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - - ga('create', 'UA-5831155-1', 'android.com'); - ga('create', 'UA-49880327-2', 'android.com', {'name': 'universal'}); // New tracker); - ga('send', 'pageview'); - ga('universal.send', 'pageview'); // Send page view for new tracker. -</script> - -<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> -<script src="<?cs var:toroot ?>assets/docs.js?v=3" type="text/javascript"></script> -</head> diff --git a/build/tools/droiddoc/templates-lineage-sdk/macros_override.cs b/build/tools/droiddoc/templates-lineage-sdk/macros_override.cs deleted file mode 100644 index 0a945986..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/macros_override.cs +++ /dev/null @@ -1,36 +0,0 @@ -<?cs # Create a comma separated list of annotations on obj that were in showAnnotations in Doclava ?> -<?cs # pre is an HTML string to start the list, post is an HTML string to close the list ?> -<?cs # for example call:show_annotations_list(cl, "<td>Annotations: ", "</td>") ?> -<?cs # if obj has nothing on obj.showAnnotations, nothing will be output ?> -<?cs def:show_annotations_list(obj) ?> - <?cs each:anno = obj.showAnnotations ?> - <?cs if:first(anno) ?> - <span class='annotation-message'> - Included in documentation by the annotations: - <?cs /if ?> - @<?cs var:anno.type.label ?> - <?cs if:last(anno) == 0 ?> - , - <?cs /if ?> - <?cs if:last(anno)?> - </span> - <?cs /if ?> - <?cs /each ?> -<?cs /def ?> - -<?cs # Override default class_link_table to display annotations ?> -<?cs def:class_link_table(classes) ?> - <?cs set:count = #1 ?> - <table class="jd-sumtable-expando"> - <?cs each:cl=classes ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.type.since ?>" > - <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td> - <td class="jd-descrcol" width="100%"> - <?cs call:short_descr(cl) ?> - <?cs call:show_annotations_list(cl) ?> - </td> - </tr> - <?cs set:count = count + #1 ?> - <?cs /each ?> - </table> -<?cs /def ?>
\ No newline at end of file diff --git a/build/tools/droiddoc/templates-lineage-sdk/package.cs b/build/tools/droiddoc/templates-lineage-sdk/package.cs deleted file mode 100644 index 22255650..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/package.cs +++ /dev/null @@ -1,65 +0,0 @@ -<?cs include:"doctype.cs" ?> -<?cs include:"macros.cs" ?> -<?cs include:"macros_override.cs" ?> -<html<?cs if:devsite ?> devsite<?cs /if ?>> -<?cs include:"head_tag.cs" ?> - -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?> - <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs - if:reference ?> reference<?cs - /if ?><?cs - elif:design ?>design<?cs - elif:distribute ?>distribute<?cs - /if ?>"> - <div id="doc-api-level" class="<?cs var:package.since ?>" style="display:none"></div> - <a name="top"></a> -<?cs include:"header.cs" ?> - -<div class="col-12" id="doc-col"> - -<div id="api-info-block"> -<div class="api-level"> - <?cs call:since_tags(package) ?> - <?cs call:federated_refs(package) ?> -</div> -</div> - -<div id="jd-header"> - package - <h1><?cs var:package.name ?></h1> -</div><!-- end header --> - -<div id="naMessage"></div> - -<div id="jd-content" class="api apilevel-<?cs var:package.since ?>"> - -<?cs if:subcount(package.descr) ?> - <div class="jd-descr"> - <?cs call:tag_list(package.descr) ?> - </div> -<?cs /if ?> - -<?cs def:class_table(label, classes) ?> - <?cs if:subcount(classes) ?> - <h2><?cs var:label ?></h2> - <div class="jd-sumtable"> - <?cs call:class_link_table(classes) ?> - </div> - <?cs /if ?> -<?cs /def ?> - -<?cs call:class_table("Annotations", package.annotations) ?> -<?cs call:class_table("Interfaces", package.interfaces) ?> -<?cs call:class_table("Classes", package.classes) ?> -<?cs call:class_table("Enums", package.enums) ?> -<?cs call:class_table("Exceptions", package.exceptions) ?> -<?cs call:class_table("Errors", package.errors) ?> - -<?cs include:"footer.cs" ?> -</div><!-- end jd-content --> -</div><!-- doc-content --> - -<?cs include:"trailer.cs" ?> - -</body> -</html> diff --git a/build/tools/droiddoc/templates-lineage-sdk/packages.cs b/build/tools/droiddoc/templates-lineage-sdk/packages.cs deleted file mode 100644 index 5056d3a5..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/packages.cs +++ /dev/null @@ -1,45 +0,0 @@ -<?cs include:"doctype.cs" ?> -<?cs include:"macros.cs" ?> -<html<?cs if:devsite ?> devsite<?cs /if ?>> -<?cs include:"head_tag.cs" ?> -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?> - <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs - if:reference ?> reference<?cs - /if ?><?cs - elif:design ?>design<?cs - elif:distribute ?>distribute<?cs - /if ?>"> - <a name="top"></a> -<?cs include:"header.cs" ?> - -<div class="col-12" id="doc-col"> - -<div id="jd-header"> -<h1><?cs var:page.title ?></h1> -</div> - -<div id="jd-content"> - -<div class="jd-descr"> -<p><?cs call:tag_list(root.descr) ?></p> -</div> - -<?cs set:count = #1 ?> -<table class="jd-sumtable"> -<?cs each:pkg = docs.packages ?> - <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:pkg.since ?>" > - <td class="jd-linkcol"><?cs call:package_link(pkg) ?></td> - <td class="jd-descrcol" width="100%"><?cs call:tag_list(pkg.shortDescr) ?></td> - </tr> -<?cs set:count = count + #1 ?> -<?cs /each ?> -</table> - -<?cs include:"footer.cs" ?> -</div><!-- end jd-content --> -</div> <!-- end doc-content --> - -<?cs include:"trailer.cs" ?> - -</body> -</html> diff --git a/build/tools/droiddoc/templates-lineage-sdk/timestamp.cs b/build/tools/droiddoc/templates-lineage-sdk/timestamp.cs deleted file mode 100644 index 4bf502a0..00000000 --- a/build/tools/droiddoc/templates-lineage-sdk/timestamp.cs +++ /dev/null @@ -1 +0,0 @@ -var BUILD_TIMESTAMP = "<?cs var:page.now ?>"; diff --git a/build/tools/extract_utils.sh b/build/tools/extract_utils.sh deleted file mode 100644 index 19820ba4..00000000 --- a/build/tools/extract_utils.sh +++ /dev/null @@ -1,1433 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2016 The CyanogenMod Project -# -# 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. -# - -PRODUCT_COPY_FILES_LIST=() -PRODUCT_COPY_FILES_HASHES=() -PRODUCT_COPY_FILES_FIXUP_HASHES=() -PRODUCT_PACKAGES_LIST=() -PRODUCT_PACKAGES_HASHES=() -PRODUCT_PACKAGES_FIXUP_HASHES=() -PACKAGE_LIST=() -VENDOR_STATE=-1 -VENDOR_RADIO_STATE=-1 -COMMON=-1 -ARCHES= -FULLY_DEODEXED=-1 - -TMPDIR=$(mktemp -d) - -# -# cleanup -# -# kill our tmpfiles with fire on exit -# -function cleanup() { - rm -rf "${TMPDIR:?}" -} - -trap cleanup 0 - -# -# setup_vendor -# -# $1: device name -# $2: vendor name -# $3: Lineage root directory -# $4: is common device - optional, default to false -# $5: cleanup - optional, default to true -# $6: custom vendor makefile name - optional, default to false -# -# Must be called before any other functions can be used. This -# sets up the internal state for a new vendor configuration. -# -function setup_vendor() { - local DEVICE="$1" - if [ -z "$DEVICE" ]; then - echo "\$DEVICE must be set before including this script!" - exit 1 - fi - - export VENDOR="$2" - if [ -z "$VENDOR" ]; then - echo "\$VENDOR must be set before including this script!" - exit 1 - fi - - export LINEAGE_ROOT="$3" - if [ ! -d "$LINEAGE_ROOT" ]; then - echo "\$LINEAGE_ROOT must be set and valid before including this script!" - exit 1 - fi - - export OUTDIR=vendor/"$VENDOR"/"$DEVICE" - if [ ! -d "$LINEAGE_ROOT/$OUTDIR" ]; then - mkdir -p "$LINEAGE_ROOT/$OUTDIR" - fi - - VNDNAME="$6" - if [ -z "$VNDNAME" ]; then - VNDNAME="$DEVICE" - fi - - export PRODUCTMK="$LINEAGE_ROOT"/"$OUTDIR"/"$VNDNAME"-vendor.mk - export ANDROIDMK="$LINEAGE_ROOT"/"$OUTDIR"/Android.mk - export BOARDMK="$LINEAGE_ROOT"/"$OUTDIR"/BoardConfigVendor.mk - - if [ "$4" == "true" ] || [ "$4" == "1" ]; then - COMMON=1 - else - COMMON=0 - fi - - if [ "$5" == "false" ] || [ "$5" == "0" ]; then - VENDOR_STATE=1 - VENDOR_RADIO_STATE=1 - else - VENDOR_STATE=0 - VENDOR_RADIO_STATE=0 - fi -} - -# Helper functions for parsing a spec. -# notes: an optional "|SHA1" that may appear in the format is stripped -# early from the spec in the parse_file_list function, and -# should not be present inside the input parameter passed -# to these functions. - -# -# input: spec in the form of "src[:dst][;args]" -# output: "src" -# -function src_file() { - local SPEC="$1" - local SPLIT=(${SPEC//:/ }) - local ARGS="$(target_args ${SPEC})" - # Regardless of there being a ":" delimiter or not in the spec, - # the source file is always either the first, or the only entry. - local SRC="${SPLIT[0]}" - # Remove target_args suffix, if present - echo "${SRC%;${ARGS}}" -} - -# -# input: spec in the form of "src[:dst][;args]" -# output: "dst" if present, "src" otherwise. -# -function target_file() { - local SPEC="$1" - local SPLIT=(${SPEC//:/ }) - local ARGS="$(target_args ${SPEC})" - local DST= - case ${#SPLIT[@]} in - 1) - # The spec doesn't have a : delimiter - DST="${SPLIT[0]}" - ;; - *) - # The spec actually has a src:dst format - DST="${SPLIT[1]}" - ;; - esac - # Remove target_args suffix, if present - echo "${DST%;${ARGS}}" -} - -# -# input: spec in the form of "src[:dst][;args]" -# output: "args" if present, "" otherwise. -# -function target_args() { - local SPEC="$1" - local SPLIT=(${SPEC//;/ }) - local ARGS= - case ${#SPLIT[@]} in - 1) - # No ";" delimiter in the spec. - ;; - *) - # The "args" are whatever comes after the ";" character. - # Basically the spec stripped of whatever is to the left of ";". - ARGS="${SPEC#${SPLIT[0]};}" - ;; - esac - echo "${ARGS}" -} - -# -# prefix_match: -# -# input: -# - $1: prefix -# - (global variable) PRODUCT_PACKAGES_LIST: array of [src:]dst[;args] specs. -# output: -# - new array consisting of dst[;args] entries where $1 is a prefix of ${dst}. -# -function prefix_match() { - local PREFIX="$1" - for LINE in "${PRODUCT_PACKAGES_LIST[@]}"; do - local FILE=$(target_file "$LINE") - if [[ "$FILE" =~ ^"$PREFIX" ]]; then - local ARGS=$(target_args "$LINE") - if [ -z "${ARGS}" ]; then - echo "${FILE#$PREFIX}" - else - echo "${FILE#$PREFIX};${ARGS}" - fi - fi - done -} - -# -# prefix_match_file: -# -# $1: the prefix to match on -# $2: the file to match the prefix for -# -# Internal function which returns true if a filename contains the -# specified prefix. -# -function prefix_match_file() { - local PREFIX="$1" - local FILE="$2" - if [[ "$FILE" =~ ^"$PREFIX" ]]; then - return 0 - else - return 1 - fi -} - -# -# suffix_match_file: -# -# $1: the suffix to match on -# $2: the file to match the suffix for -# -# Internal function which returns true if a filename contains the -# specified suffix. -# -function suffix_match_file() { - local SUFFIX="$1" - local FILE="$2" - if [[ "$FILE" = *"$SUFFIX" ]]; then - return 0 - else - return 1 - fi -} - -# -# truncate_file -# -# $1: the filename to truncate -# $2: the argument to output the truncated filename to -# -# Internal function which truncates a filename by removing the first dir -# in the path. ex. vendor/lib/libsdmextension.so -> lib/libsdmextension.so -# -function truncate_file() { - local FILE="$1" - RETURN_FILE="$2" - local FIND="${FILE%%/*}" - local LOCATION="${#FIND}+1" - echo ${FILE:$LOCATION} -} - -# -# write_product_copy_files: -# -# $1: make treble compatible makefile - optional, default to false -# -# Creates the PRODUCT_COPY_FILES section in the product makefile for all -# items in the list which do not start with a dash (-). -# -function write_product_copy_files() { - local COUNT=${#PRODUCT_COPY_FILES_LIST[@]} - local TARGET= - local FILE= - local LINEEND= - local TREBLE_COMPAT=$1 - - if [ "$COUNT" -eq "0" ]; then - return 0 - fi - - printf '%s\n' "PRODUCT_COPY_FILES += \\" >> "$PRODUCTMK" - for (( i=1; i<COUNT+1; i++ )); do - FILE="${PRODUCT_COPY_FILES_LIST[$i-1]}" - LINEEND=" \\" - if [ "$i" -eq "$COUNT" ]; then - LINEEND="" - fi - - TARGET=$(target_file "$FILE") - if [ "$TREBLE_COMPAT" == "true" ] || [ "$TREBLE_COMPAT" == "1" ]; then - if prefix_match_file "vendor/" $TARGET ; then - local OUTTARGET=$(truncate_file $TARGET) - printf ' %s/proprietary/%s:$(TARGET_COPY_OUT_VENDOR)/%s%s\n' \ - "$OUTDIR" "$TARGET" "$OUTTARGET" "$LINEEND" >> "$PRODUCTMK" - elif prefix_match_file "product/" $TARGET ; then - local OUTTARGET=$(truncate_file $TARGET) - printf ' %s/proprietary/%s:$(TARGET_COPY_OUT_PRODUCT)/%s%s\n' \ - "$OUTDIR" "$TARGET" "$OUTTARGET" "$LINEEND" >> "$PRODUCTMK" - else - printf ' %s/proprietary/%s:system/%s%s\n' \ - "$OUTDIR" "$TARGET" "$TARGET" "$LINEEND" >> "$PRODUCTMK" - fi - else - printf ' %s/proprietary/%s:system/%s%s\n' \ - "$OUTDIR" "$TARGET" "$TARGET" "$LINEEND" >> "$PRODUCTMK" - fi - done - return 0 -} - -# -# write_packages: -# -# $1: The LOCAL_MODULE_CLASS for the given module list -# $2: /product or /vendor partition -# $3: type-specific extra flags -# $4: Name of the array holding the target list -# -# Internal function which writes out the BUILD_PREBUILT stanzas -# for all modules in the list. This is called by write_product_packages -# after the modules are categorized. -# -function write_packages() { - - local CLASS="$1" - local PARTITION="$2" - local EXTRA="$3" - - # Yes, this is a horrible hack - we create a new array using indirection - local ARR_NAME="$4[@]" - local FILELIST=("${!ARR_NAME}") - - local FILE= - local ARGS= - local BASENAME= - local EXTENSION= - local PKGNAME= - local SRC= - - for P in "${FILELIST[@]}"; do - FILE=$(target_file "$P") - ARGS=$(target_args "$P") - - BASENAME=$(basename "$FILE") - DIRNAME=$(dirname "$FILE") - EXTENSION=${BASENAME##*.} - PKGNAME=${BASENAME%.*} - - # Add to final package list - PACKAGE_LIST+=("$PKGNAME") - - SRC="proprietary" - if [ "$PARTITION" = "vendor" ]; then - SRC+="/vendor" - elif [ "$PARTITION" = "product" ]; then - SRC+="/product" - fi - - printf 'include $(CLEAR_VARS)\n' - printf 'LOCAL_MODULE := %s\n' "$PKGNAME" - printf 'LOCAL_MODULE_OWNER := %s\n' "$VENDOR" - if [ "$CLASS" = "SHARED_LIBRARIES" ]; then - if [ "$EXTRA" = "both" ]; then - printf 'LOCAL_SRC_FILES_64 := %s/lib64/%s\n' "$SRC" "$FILE" - printf 'LOCAL_SRC_FILES_32 := %s/lib/%s\n' "$SRC" "$FILE" - #if [ "$VENDOR_PKG" = "true" ]; then - # echo "LOCAL_MODULE_PATH_64 := \$(TARGET_OUT_VENDOR_SHARED_LIBRARIES)" - # echo "LOCAL_MODULE_PATH_32 := \$(2ND_TARGET_OUT_VENDOR_SHARED_LIBRARIES)" - #else - # echo "LOCAL_MODULE_PATH_64 := \$(TARGET_OUT_SHARED_LIBRARIES)" - # echo "LOCAL_MODULE_PATH_32 := \$(2ND_TARGET_OUT_SHARED_LIBRARIES)" - #fi - elif [ "$EXTRA" = "64" ]; then - printf 'LOCAL_SRC_FILES := %s/lib64/%s\n' "$SRC" "$FILE" - else - printf 'LOCAL_SRC_FILES := %s/lib/%s\n' "$SRC" "$FILE" - fi - if [ "$EXTRA" != "none" ]; then - printf 'LOCAL_MULTILIB := %s\n' "$EXTRA" - fi - elif [ "$CLASS" = "APPS" ]; then - if [ "$EXTRA" = "priv-app" ]; then - SRC="$SRC/priv-app" - else - SRC="$SRC/app" - fi - printf 'LOCAL_SRC_FILES := %s/%s\n' "$SRC" "$FILE" - local CERT=platform - if [ ! -z "$ARGS" ]; then - CERT="$ARGS" - fi - printf 'LOCAL_CERTIFICATE := %s\n' "$CERT" - elif [ "$CLASS" = "JAVA_LIBRARIES" ]; then - printf 'LOCAL_SRC_FILES := %s/framework/%s\n' "$SRC" "$FILE" - local CERT=platform - if [ ! -z "$ARGS" ]; then - CERT="$ARGS" - fi - printf 'LOCAL_CERTIFICATE := %s\n' "$CERT" - elif [ "$CLASS" = "ETC" ]; then - printf 'LOCAL_SRC_FILES := %s/etc/%s\n' "$SRC" "$FILE" - elif [ "$CLASS" = "EXECUTABLES" ]; then - if [ "$ARGS" = "rootfs" ]; then - SRC="$SRC/rootfs" - if [ "$EXTRA" = "sbin" ]; then - SRC="$SRC/sbin" - printf '%s\n' "LOCAL_MODULE_PATH := \$(TARGET_ROOT_OUT_SBIN)" - printf '%s\n' "LOCAL_UNSTRIPPED_PATH := \$(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)" - fi - else - SRC="$SRC/bin" - fi - printf 'LOCAL_SRC_FILES := %s/%s\n' "$SRC" "$FILE" - unset EXTENSION - else - printf 'LOCAL_SRC_FILES := %s/%s\n' "$SRC" "$FILE" - fi - printf 'LOCAL_MODULE_TAGS := optional\n' - printf 'LOCAL_MODULE_CLASS := %s\n' "$CLASS" - if [ "$CLASS" = "APPS" ]; then - printf 'LOCAL_DEX_PREOPT := false\n' - fi - if [ ! -z "$EXTENSION" ]; then - printf 'LOCAL_MODULE_SUFFIX := .%s\n' "$EXTENSION" - fi - if [ "$CLASS" = "SHARED_LIBRARIES" ] || [ "$CLASS" = "EXECUTABLES" ]; then - if [ "$DIRNAME" != "." ]; then - printf 'LOCAL_MODULE_RELATIVE_PATH := %s\n' "$DIRNAME" - fi - fi - if [ "$EXTRA" = "priv-app" ]; then - printf 'LOCAL_PRIVILEGED_MODULE := true\n' - fi - if [ "$PARTITION" = "vendor" ]; then - printf 'LOCAL_VENDOR_MODULE := true\n' - elif [ "$PARTITION" = "product" ]; then - printf 'LOCAL_PRODUCT_MODULE := true\n' - fi - printf 'include $(BUILD_PREBUILT)\n\n' - done -} - -# -# write_product_packages: -# -# This function will create BUILD_PREBUILT entries in the -# Android.mk and associated PRODUCT_PACKAGES list in the -# product makefile for all files in the blob list which -# start with a single dash (-) character. -# -function write_product_packages() { - PACKAGE_LIST=() - - local COUNT=${#PRODUCT_PACKAGES_LIST[@]} - - if [ "$COUNT" = "0" ]; then - return 0 - fi - - # Figure out what's 32-bit, what's 64-bit, and what's multilib - # I really should not be doing this in bash due to shitty array passing :( - local T_LIB32=( $(prefix_match "lib/") ) - local T_LIB64=( $(prefix_match "lib64/") ) - local MULTILIBS=( $(comm -12 <(printf '%s\n' "${T_LIB32[@]}") <(printf '%s\n' "${T_LIB64[@]}")) ) - local LIB32=( $(comm -23 <(printf '%s\n' "${T_LIB32[@]}") <(printf '%s\n' "${MULTILIBS[@]}")) ) - local LIB64=( $(comm -23 <(printf '%s\n' "${T_LIB64[@]}") <(printf '%s\n' "${MULTILIBS[@]}")) ) - - if [ "${#MULTILIBS[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "" "both" "MULTILIBS" >> "$ANDROIDMK" - fi - if [ "${#LIB32[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "" "32" "LIB32" >> "$ANDROIDMK" - fi - if [ "${#LIB64[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "" "64" "LIB64" >> "$ANDROIDMK" - fi - - local T_V_LIB32=( $(prefix_match "vendor/lib/") ) - local T_V_LIB64=( $(prefix_match "vendor/lib64/") ) - local V_MULTILIBS=( $(comm -12 <(printf '%s\n' "${T_V_LIB32[@]}") <(printf '%s\n' "${T_V_LIB64[@]}")) ) - local V_LIB32=( $(comm -23 <(printf '%s\n' "${T_V_LIB32[@]}") <(printf '%s\n' "${V_MULTILIBS[@]}")) ) - local V_LIB64=( $(comm -23 <(printf '%s\n' "${T_V_LIB64[@]}") <(printf '%s\n' "${V_MULTILIBS[@]}")) ) - - if [ "${#V_MULTILIBS[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "vendor" "both" "V_MULTILIBS" >> "$ANDROIDMK" - fi - if [ "${#V_LIB32[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "vendor" "32" "V_LIB32" >> "$ANDROIDMK" - fi - if [ "${#V_LIB64[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "vendor" "64" "V_LIB64" >> "$ANDROIDMK" - fi - - local T_P_LIB32=( $(prefix_match "product/lib/") ) - local T_P_LIB64=( $(prefix_match "product/lib64/") ) - local P_MULTILIBS=( $(comm -12 <(printf '%s\n' "${T_P_LIB32[@]}") <(printf '%s\n' "${T_P_LIB64[@]}")) ) - local P_LIB32=( $(comm -23 <(printf '%s\n' "${T_P_LIB32[@]}") <(printf '%s\n' "${P_MULTILIBS[@]}")) ) - local P_LIB64=( $(comm -23 <(printf '%s\n' "${T_P_LIB64[@]}") <(printf '%s\n' "${P_MULTILIBS[@]}")) ) - - if [ "${#P_MULTILIBS[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "product" "both" "P_MULTILIBS" >> "$ANDROIDMK" - fi - if [ "${#P_LIB32[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "product" "32" "P_LIB32" >> "$ANDROIDMK" - fi - if [ "${#P_LIB64[@]}" -gt "0" ]; then - write_packages "SHARED_LIBRARIES" "product" "64" "P_LIB64" >> "$ANDROIDMK" - fi - - # Apps - local APPS=( $(prefix_match "app/") ) - if [ "${#APPS[@]}" -gt "0" ]; then - write_packages "APPS" "" "" "APPS" >> "$ANDROIDMK" - fi - local PRIV_APPS=( $(prefix_match "priv-app/") ) - if [ "${#PRIV_APPS[@]}" -gt "0" ]; then - write_packages "APPS" "" "priv-app" "PRIV_APPS" >> "$ANDROIDMK" - fi - local V_APPS=( $(prefix_match "vendor/app/") ) - if [ "${#V_APPS[@]}" -gt "0" ]; then - write_packages "APPS" "vendor" "" "V_APPS" >> "$ANDROIDMK" - fi - local V_PRIV_APPS=( $(prefix_match "vendor/priv-app/") ) - if [ "${#V_PRIV_APPS[@]}" -gt "0" ]; then - write_packages "APPS" "vendor" "priv-app" "V_PRIV_APPS" >> "$ANDROIDMK" - fi - local P_APPS=( $(prefix_match "product/app/") ) - if [ "${#P_APPS[@]}" -gt "0" ]; then - write_packages "APPS" "product" "" "P_APPS" >> "$ANDROIDMK" - fi - local P_PRIV_APPS=( $(prefix_match "product/priv-app/") ) - if [ "${#P_PRIV_APPS[@]}" -gt "0" ]; then - write_packages "APPS" "product" "priv-app" "P_PRIV_APPS" >> "$ANDROIDMK" - fi - - # Framework - local FRAMEWORK=( $(prefix_match "framework/") ) - if [ "${#FRAMEWORK[@]}" -gt "0" ]; then - write_packages "JAVA_LIBRARIES" "" "" "FRAMEWORK" >> "$ANDROIDMK" - fi - local V_FRAMEWORK=( $(prefix_match "vendor/framework/") ) - if [ "${#V_FRAMEWORK[@]}" -gt "0" ]; then - write_packages "JAVA_LIBRARIES" "vendor" "" "V_FRAMEWORK" >> "$ANDROIDMK" - fi - local P_FRAMEWORK=( $(prefix_match "product/framework/") ) - if [ "${#P_FRAMEWORK[@]}" -gt "0" ]; then - write_packages "JAVA_LIBRARIES" "product" "" "P_FRAMEWORK" >> "$ANDROIDMK" - fi - - # Etc - local ETC=( $(prefix_match "etc/") ) - if [ "${#ETC[@]}" -gt "0" ]; then - write_packages "ETC" "" "" "ETC" >> "$ANDROIDMK" - fi - local V_ETC=( $(prefix_match "vendor/etc/") ) - if [ "${#V_ETC[@]}" -gt "0" ]; then - write_packages "ETC" "vendor" "" "V_ETC" >> "$ANDROIDMK" - fi - local P_ETC=( $(prefix_match "product/etc/") ) - if [ "${#P_ETC[@]}" -gt "0" ]; then - write_packages "ETC" "product" "" "P_ETC" >> "$ANDROIDMK" - fi - - # Executables - local BIN=( $(prefix_match "bin/") ) - if [ "${#BIN[@]}" -gt "0" ]; then - write_packages "EXECUTABLES" "" "" "BIN" >> "$ANDROIDMK" - fi - local V_BIN=( $(prefix_match "vendor/bin/") ) - if [ "${#V_BIN[@]}" -gt "0" ]; then - write_packages "EXECUTABLES" "vendor" "" "V_BIN" >> "$ANDROIDMK" - fi - local P_BIN=( $(prefix_match "product/bin/") ) - if [ "${#P_BIN[@]}" -gt "0" ]; then - write_packages "EXECUTABLES" "product" "" "P_BIN" >> "$ANDROIDMK" - fi - local SBIN=( $(prefix_match "sbin/") ) - if [ "${#SBIN[@]}" -gt "0" ]; then - write_packages "EXECUTABLES" "" "sbin" "SBIN" >> "$ANDROIDMK" - fi - - - # Actually write out the final PRODUCT_PACKAGES list - local PACKAGE_COUNT=${#PACKAGE_LIST[@]} - - if [ "$PACKAGE_COUNT" -eq "0" ]; then - return 0 - fi - - printf '\n%s\n' "PRODUCT_PACKAGES += \\" >> "$PRODUCTMK" - for (( i=1; i<PACKAGE_COUNT+1; i++ )); do - local LINEEND=" \\" - if [ "$i" -eq "$PACKAGE_COUNT" ]; then - LINEEND="" - fi - printf ' %s%s\n' "${PACKAGE_LIST[$i-1]}" "$LINEEND" >> "$PRODUCTMK" - done -} - -# -# write_header: -# -# $1: file which will be written to -# -# writes out the copyright header with the current year. -# note that this is not an append operation, and should -# be executed first! -# -function write_header() { - if [ -f $1 ]; then - rm $1 - fi - - YEAR=$(date +"%Y") - - [ "$COMMON" -eq 1 ] && local DEVICE="$DEVICE_COMMON" - - NUM_REGEX='^[0-9]+$' - if [[ $INITIAL_COPYRIGHT_YEAR =~ $NUM_REGEX ]] && [ $INITIAL_COPYRIGHT_YEAR -le $YEAR ]; then - if [ $INITIAL_COPYRIGHT_YEAR -lt 2016 ]; then - printf "# Copyright (C) $INITIAL_COPYRIGHT_YEAR-2016 The CyanogenMod Project\n" > $1 - elif [ $INITIAL_COPYRIGHT_YEAR -eq 2016 ]; then - printf "# Copyright (C) 2016 The CyanogenMod Project\n" > $1 - fi - if [ $YEAR -eq 2017 ]; then - printf "# Copyright (C) 2017 The LineageOS Project\n" >> $1 - elif [ $INITIAL_COPYRIGHT_YEAR -eq $YEAR ]; then - printf "# Copyright (C) $YEAR The LineageOS Project\n" >> $1 - elif [ $INITIAL_COPYRIGHT_YEAR -le 2017 ]; then - printf "# Copyright (C) 2017-$YEAR The LineageOS Project\n" >> $1 - else - printf "# Copyright (C) $INITIAL_COPYRIGHT_YEAR-$YEAR The LineageOS Project\n" >> $1 - fi - else - printf "# Copyright (C) $YEAR The LineageOS Project\n" > $1 - fi - - cat << EOF >> $1 -# -# 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. - -# This file is generated by device/$VENDOR/$DEVICE/setup-makefiles.sh - -EOF -} - -# -# write_headers: -# -# $1: devices falling under common to be added to guard - optional -# $2: custom guard - optional -# -# Calls write_header for each of the makefiles and creates -# the initial path declaration and device guard for the -# Android.mk -# -function write_headers() { - write_header "$ANDROIDMK" - - GUARD="$2" - if [ -z "$GUARD" ]; then - GUARD="TARGET_DEVICE" - fi - - cat << EOF >> "$ANDROIDMK" -LOCAL_PATH := \$(call my-dir) - -EOF - if [ "$COMMON" -ne 1 ]; then - cat << EOF >> "$ANDROIDMK" -ifeq (\$($GUARD),$DEVICE) - -EOF - else - if [ -z "$1" ]; then - echo "Argument with devices to be added to guard must be set!" - exit 1 - fi - cat << EOF >> "$ANDROIDMK" -ifneq (\$(filter $1,\$($GUARD)),) - -EOF - fi - - write_header "$BOARDMK" - write_header "$PRODUCTMK" -} - -# -# write_footers: -# -# Closes the inital guard and any other finalization tasks. Must -# be called as the final step. -# -function write_footers() { - cat << EOF >> "$ANDROIDMK" -endif -EOF -} - -# Return success if adb is up and not in recovery -function _adb_connected { - { - if [[ "$(adb get-state)" == device ]] - then - return 0 - fi - } 2>/dev/null - - return 1 -}; - -# -# parse_file_list: -# -# $1: input file -# $2: blob section in file - optional -# -# Sets PRODUCT_PACKAGES and PRODUCT_COPY_FILES while parsing the input file -# -function parse_file_list() { - if [ -z "$1" ]; then - echo "An input file is expected!" - exit 1 - elif [ ! -f "$1" ]; then - echo "Input file "$1" does not exist!" - exit 1 - fi - - if [ -n "$2" ]; then - echo "Using section \"$2\"" - LIST=$TMPDIR/files.txt - # Match all lines starting with first line found to start* with '#' - # comment and contain** $2, and ending with first line to be empty*. - # *whitespaces (tabs, spaces) at the beginning of lines are discarded - # **the $2 match is case-insensitive - cat $1 | sed -n '/^[[:space:]]*#.*'"$2"'/I,/^[[:space:]]*$/ p' > $LIST - else - LIST=$1 - fi - - - PRODUCT_PACKAGES_LIST=() - PRODUCT_PACKAGES_HASHES=() - PRODUCT_PACKAGES_FIXUP_HASHES=() - PRODUCT_COPY_FILES_LIST=() - PRODUCT_COPY_FILES_HASHES=() - PRODUCT_COPY_FILES_FIXUP_HASHES=() - - while read -r line; do - if [ -z "$line" ]; then continue; fi - - # If the line has a pipe delimiter, a sha1 hash should follow. - # This indicates the file should be pinned and not overwritten - # when extracting files. - local SPLIT=(${line//\|/ }) - local COUNT=${#SPLIT[@]} - local SPEC=${SPLIT[0]} - local HASH="x" - local FIXUP_HASH="x" - if [ "$COUNT" -gt "1" ]; then - HASH=${SPLIT[1]} - fi - if [ "$COUNT" -gt "2" ]; then - FIXUP_HASH=${SPLIT[2]} - fi - - # if line starts with a dash, it needs to be packaged - if [[ "$SPEC" =~ ^- ]]; then - PRODUCT_PACKAGES_LIST+=("${SPEC#-}") - PRODUCT_PACKAGES_HASHES+=("$HASH") - PRODUCT_PACKAGES_FIXUP_HASHES+=("$FIXUP_HASH") - else - PRODUCT_COPY_FILES_LIST+=("$SPEC") - PRODUCT_COPY_FILES_HASHES+=("$HASH") - PRODUCT_COPY_FILES_FIXUP_HASHES+=("$FIXUP_HASH") - fi - - done < <(egrep -v '(^#|^[[:space:]]*$)' "$LIST" | LC_ALL=C sort | uniq) -} - -# -# write_makefiles: -# -# $1: file containing the list of items to extract -# $2: make treble compatible makefile - optional -# -# Calls write_product_copy_files and write_product_packages on -# the given file and appends to the Android.mk as well as -# the product makefile. -# -function write_makefiles() { - parse_file_list "$1" - write_product_copy_files "$2" - write_product_packages -} - -# -# append_firmware_calls_to_makefiles: -# -# Appends to Android.mk the calls to all images present in radio folder -# (filesmap file used by releasetools to map firmware images should be kept in the device tree) -# -function append_firmware_calls_to_makefiles() { - cat << EOF >> "$ANDROIDMK" -ifeq (\$(LOCAL_PATH)/radio, \$(wildcard \$(LOCAL_PATH)/radio)) - -RADIO_FILES := \$(wildcard \$(LOCAL_PATH)/radio/*) -\$(foreach f, \$(notdir \$(RADIO_FILES)), \\ - \$(call add-radio-file,radio/\$(f))) -\$(call add-radio-file,../../../device/$VENDOR/$DEVICE/radio/filesmap) - -endif - -EOF -} - -# -# get_file: -# -# $1: input file -# $2: target file/folder -# $3: source of the file (can be "adb" or a local folder) -# -# Silently extracts the input file to defined target -# Returns success if file can be pulled from the device or found locally -# -function get_file() { - local SRC="$3" - - if [ "$SRC" = "adb" ]; then - # try to pull - adb pull "$1" "$2" >/dev/null 2>&1 && return 0 - - return 1 - else - # try to copy - cp -r "$SRC/$1" "$2" 2>/dev/null && return 0 - cp -r "$SRC/${1#/system}" "$2" 2>/dev/null && return 0 - cp -r "$SRC/system/$1" "$2" 2>/dev/null && return 0 - - return 1 - fi -}; - -# -# oat2dex: -# -# $1: extracted apk|jar (to check if deodex is required) -# $2: odexed apk|jar to deodex -# $3: source of the odexed apk|jar -# -# Convert apk|jar .odex in the corresposing classes.dex -# -function oat2dex() { - local LINEAGE_TARGET="$1" - local OEM_TARGET="$2" - local SRC="$3" - local TARGET= - local OAT= - local HOST="$(uname)" - - if [ -z "$BAKSMALIJAR" ] || [ -z "$SMALIJAR" ]; then - export BAKSMALIJAR="$LINEAGE_ROOT"/vendor/lineage/build/tools/smali/baksmali.jar - export SMALIJAR="$LINEAGE_ROOT"/vendor/lineage/build/tools/smali/smali.jar - fi - - if [ -z "$VDEXEXTRACTOR" ]; then - export VDEXEXTRACTOR="$LINEAGE_ROOT"/vendor/lineage/build/tools/"$HOST"/vdexExtractor - fi - - if [ -z "$CDEXCONVERTER" ]; then - export CDEXCONVERTER="$LINEAGE_ROOT"/vendor/lineage/build/tools/"$HOST"/compact_dex_converter - fi - - # Extract existing boot.oats to the temp folder - if [ -z "$ARCHES" ]; then - echo "Checking if system is odexed and locating boot.oats..." - for ARCH in "arm64" "arm" "x86_64" "x86"; do - mkdir -p "$TMPDIR/system/framework/$ARCH" - if get_file "/system/framework/$ARCH" "$TMPDIR/system/framework/" "$SRC"; then - ARCHES+="$ARCH " - else - rmdir "$TMPDIR/system/framework/$ARCH" - fi - done - fi - - if [ -z "$ARCHES" ]; then - FULLY_DEODEXED=1 && return 0 # system is fully deodexed, return - fi - - if [ ! -f "$LINEAGE_TARGET" ]; then - return; - fi - - if grep "classes.dex" "$LINEAGE_TARGET" >/dev/null; then - return 0 # target apk|jar is already odexed, return - fi - - for ARCH in $ARCHES; do - BOOTOAT="$TMPDIR/system/framework/$ARCH/boot.oat" - - local OAT="$(dirname "$OEM_TARGET")/oat/$ARCH/$(basename "$OEM_TARGET" ."${OEM_TARGET##*.}").odex" - local VDEX="$(dirname "$OEM_TARGET")/oat/$ARCH/$(basename "$OEM_TARGET" ."${OEM_TARGET##*.}").vdex" - - if get_file "$OAT" "$TMPDIR" "$SRC"; then - if get_file "$VDEX" "$TMPDIR" "$SRC"; then - "$VDEXEXTRACTOR" -o "$TMPDIR/" -i "$TMPDIR/$(basename "$VDEX")" > /dev/null - CLASSES=$(ls "$TMPDIR/$(basename "${OEM_TARGET%.*}")_classes"*) - for CLASS in $CLASSES; do - NEWCLASS=$(echo "$CLASS" | sed 's/.*_//;s/cdex/dex/') - # Check if we have to deal with CompactDex - if [[ "$CLASS" == *.cdex ]]; then - "$CDEXCONVERTER" "$CLASS" &>/dev/null - mv "$CLASS.new" "$TMPDIR/$NEWCLASS" - else - mv "$CLASS" "$TMPDIR/$NEWCLASS" - fi - done - else - java -jar "$BAKSMALIJAR" deodex -o "$TMPDIR/dexout" -b "$BOOTOAT" -d "$TMPDIR" "$TMPDIR/$(basename "$OAT")" - java -jar "$SMALIJAR" assemble "$TMPDIR/dexout" -o "$TMPDIR/classes.dex" - fi - elif [[ "$LINEAGE_TARGET" =~ .jar$ ]]; then - JAROAT="$TMPDIR/system/framework/$ARCH/boot-$(basename ${OEM_TARGET%.*}).oat" - JARVDEX="/system/framework/boot-$(basename ${OEM_TARGET%.*}).vdex" - if [ ! -f "$JAROAT" ]; then - JAROAT=$BOOTOAT - fi - # try to extract classes.dex from boot.vdex for frameworks jars - # fallback to boot.oat if vdex is not available - if get_file "$JARVDEX" "$TMPDIR" "$SRC"; then - "$VDEXEXTRACTOR" -o "$TMPDIR/" -i "$TMPDIR/$(basename "$JARVDEX")" > /dev/null - CLASSES=$(ls "$TMPDIR/$(basename "${JARVDEX%.*}")_classes"*) - for CLASS in $CLASSES; do - NEWCLASS=$(echo "$CLASS" | sed 's/.*_//;s/cdex/dex/') - # Check if we have to deal with CompactDex - if [[ "$CLASS" == *.cdex ]]; then - "$CDEXCONVERTER" "$CLASS" &>/dev/null - mv "$CLASS.new" "$TMPDIR/$NEWCLASS" - else - mv "$CLASS" "$TMPDIR/$NEWCLASS" - fi - done - else - java -jar "$BAKSMALIJAR" deodex -o "$TMPDIR/dexout" -b "$BOOTOAT" -d "$TMPDIR" "$JAROAT/$OEM_TARGET" - java -jar "$SMALIJAR" assemble "$TMPDIR/dexout" -o "$TMPDIR/classes.dex" - fi - else - continue - fi - - done - - rm -rf "$TMPDIR/dexout" -} - -# -# init_adb_connection: -# -# Starts adb server and waits for the device -# -function init_adb_connection() { - adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if ! _adb_connected; then - echo "No device is online. Waiting for one..." - echo "Please connect USB and/or enable USB debugging" - until _adb_connected; do - sleep 1 - done - echo "Device Found." - fi - - # Retrieve IP and PORT info if we're using a TCP connection - TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ - | head -1 | awk '{print $1}') - adb root &> /dev/null - sleep 0.3 - if [ -n "$TCPIPPORT" ]; then - # adb root just killed our connection - # so reconnect... - adb connect "$TCPIPPORT" - fi - adb wait-for-device &> /dev/null - sleep 0.3 -} - -# -# fix_xml: -# -# $1: xml file to fix -# -function fix_xml() { - local XML="$1" - local TEMP_XML="$TMPDIR/`basename "$XML"`.temp" - - grep -a '^<?xml version' "$XML" > "$TEMP_XML" - grep -av '^<?xml version' "$XML" >> "$TEMP_XML" - - mv "$TEMP_XML" "$XML" -} - -function get_hash() { - local FILE="$1" - - if [ "$(uname)" == "Darwin" ]; then - shasum "${FILE}" | awk '{print $1}' - else - sha1sum "${FILE}" | awk '{print $1}' - fi -} - -function print_spec() { - local SPEC_PRODUCT_PACKAGE="$1" - local SPEC_SRC_FILE="$2" - local SPEC_DST_FILE="$3" - local SPEC_ARGS="$4" - local SPEC_HASH="$5" - local SPEC_FIXUP_HASH="$6" - - local PRODUCT_PACKAGE="" - if [ ${SPEC_PRODUCT_PACKAGE} = true ]; then - PRODUCT_PACKAGE="-" - fi - local SRC="" - if [ ! -z "${SPEC_SRC_FILE}" ] && [ "${SPEC_SRC_FILE}" != "${SPEC_DST_FILE}" ]; then - SRC="${SPEC_SRC_FILE}:" - fi - local DST="" - if [ ! -z "${SPEC_DST_FILE}" ]; then - DST="${SPEC_DST_FILE}" - fi - local ARGS="" - if [ ! -z "${SPEC_ARGS}" ]; then - ARGS=";${SPEC_ARGS}" - fi - local HASH="" - if [ ! -z "${SPEC_HASH}" ] && [ "${SPEC_HASH}" != "x" ]; then - HASH="|${SPEC_HASH}" - fi - local FIXUP_HASH="" - if [ ! -z "${SPEC_FIXUP_HASH}" ] && [ "${SPEC_FIXUP_HASH}" != "x" ] && [ "${SPEC_FIXUP_HASH}" != "${SPEC_HASH}" ]; then - FIXUP_HASH="|${SPEC_FIXUP_HASH}" - fi - printf '%s%s%s%s%s%s\n' "${PRODUCT_PACKAGE}" "${SRC}" "${DST}" "${ARGS}" "${HASH}" "${FIXUP_HASH}" -} - -# To be overridden by device-level extract-files.sh -# Parameters: -# $1: spec name of a blob. Can be used for filtering. -# If the spec is "src:dest", then $1 is "dest". -# If the spec is "src", then $1 is "src". -# $2: path to blob file. Can be used for fixups. -# -function blob_fixup() { - : -} - -# -# extract: -# -# Positional parameters: -# $1: file containing the list of items to extract (aka proprietary-files.txt) -# $2: path to extracted system folder, an ota zip file, or "adb" to extract from device -# $3: section in list file to extract - optional. Setting section via $3 is deprecated. -# -# Non-positional parameters (coming after $2): -# --section: preferred way of selecting the portion to parse and extract from -# proprietary-files.txt -# --kang: if present, this option will activate the printing of hashes for the -# extracted blobs. Useful with --section for subsequent pinning of -# blobs taken from other origins. -# -function extract() { - # Consume positional parameters - local PROPRIETARY_FILES_TXT="$1"; shift - local SRC="$1"; shift - local SECTION="" - local KANG=false - - # Consume optional, non-positional parameters - while [ "$#" -gt 0 ]; do - case "$1" in - -s|--section) - SECTION="$2"; shift - ;; - -k|--kang) - KANG=true - DISABLE_PINNING=1 - ;; - *) - # Backwards-compatibility with the old behavior, where $3, if - # present, denoted an optional positional ${SECTION} argument. - # Users of ${SECTION} are encouraged to migrate from setting it as - # positional $3, to non-positional --section ${SECTION}, the - # reason being that it doesn't scale to have more than 1 optional - # positional argument. - SECTION="$1" - ;; - esac - shift - done - - if [ -z "$OUTDIR" ]; then - echo "Output dir not set!" - exit 1 - fi - - parse_file_list "${PROPRIETARY_FILES_TXT}" "${SECTION}" - - # Allow failing, so we can try $DEST and/or $FILE - set +e - - local FILELIST=( ${PRODUCT_COPY_FILES_LIST[@]} ${PRODUCT_PACKAGES_LIST[@]} ) - local HASHLIST=( ${PRODUCT_COPY_FILES_HASHES[@]} ${PRODUCT_PACKAGES_HASHES[@]} ) - local FIXUP_HASHLIST=( ${PRODUCT_COPY_FILES_FIXUP_HASHES[@]} ${PRODUCT_PACKAGES_FIXUP_HASHES[@]} ) - local PRODUCT_COPY_FILES_COUNT=${#PRODUCT_COPY_FILES_LIST[@]} - local COUNT=${#FILELIST[@]} - local OUTPUT_ROOT="$LINEAGE_ROOT"/"$OUTDIR"/proprietary - local OUTPUT_TMP="$TMPDIR"/"$OUTDIR"/proprietary - - if [ "$SRC" = "adb" ]; then - init_adb_connection - fi - - if [ -f "$SRC" ] && [ "${SRC##*.}" == "zip" ]; then - DUMPDIR="$TMPDIR"/system_dump - - # Check if we're working with the same zip that was passed last time. - # If so, let's just use what's already extracted. - MD5=`md5sum "$SRC"| awk '{print $1}'` - OLDMD5=`cat "$DUMPDIR"/zipmd5.txt` - - if [ "$MD5" != "$OLDMD5" ]; then - rm -rf "$DUMPDIR" - mkdir "$DUMPDIR" - unzip "$SRC" -d "$DUMPDIR" - echo "$MD5" > "$DUMPDIR"/zipmd5.txt - - # Stop if an A/B OTA zip is detected. We cannot extract these. - if [ -a "$DUMPDIR"/payload.bin ]; then - echo "A/B style OTA zip detected. This is not supported at this time. Stopping..." - exit 1 - # If OTA is block based, extract it. - elif [ -a "$DUMPDIR"/system.new.dat ]; then - echo "Converting system.new.dat to system.img" - python "$LINEAGE_ROOT"/vendor/lineage/build/tools/sdat2img.py "$DUMPDIR"/system.transfer.list "$DUMPDIR"/system.new.dat "$DUMPDIR"/system.img 2>&1 - rm -rf "$DUMPDIR"/system.new.dat "$DUMPDIR"/system - mkdir "$DUMPDIR"/system "$DUMPDIR"/tmp - echo "Requesting sudo access to mount the system.img" - sudo mount -o loop "$DUMPDIR"/system.img "$DUMPDIR"/tmp - cp -r "$DUMPDIR"/tmp/* "$DUMPDIR"/system/ - sudo umount "$DUMPDIR"/tmp - rm -rf "$DUMPDIR"/tmp "$DUMPDIR"/system.img - fi - fi - - SRC="$DUMPDIR" - fi - - if [ "$VENDOR_STATE" -eq "0" ]; then - echo "Cleaning output directory ($OUTPUT_ROOT).." - rm -rf "${OUTPUT_TMP:?}" - mkdir -p "${OUTPUT_TMP:?}" - if [ -d "$OUTPUT_ROOT" ]; then - mv "${OUTPUT_ROOT:?}/"* "${OUTPUT_TMP:?}/" - fi - VENDOR_STATE=1 - fi - - echo "Extracting ${COUNT} files in ${PROPRIETARY_FILES_TXT} from ${SRC}:" - - for (( i=1; i<COUNT+1; i++ )); do - - local SPEC_SRC_FILE=$(src_file "${FILELIST[$i-1]}") - local SPEC_DST_FILE=$(target_file "${FILELIST[$i-1]}") - local SPEC_ARGS=$(target_args "${FILELIST[$i-1]}") - local OUTPUT_DIR= - local TMP_DIR= - local SRC_FILE= - local DST_FILE= - local IS_PRODUCT_PACKAGE=false - - # Note: this relies on the fact that the ${FILELIST[@]} array - # contains first ${PRODUCT_COPY_FILES_LIST[@]}, then ${PRODUCT_PACKAGES_LIST[@]}. - if [ "${i}" -gt "${PRODUCT_COPY_FILES_COUNT}" ]; then - IS_PRODUCT_PACKAGE=true - fi - - if [ "${SPEC_ARGS}" = "rootfs" ]; then - OUTPUT_DIR="${OUTPUT_ROOT}/rootfs" - TMP_DIR="${OUTPUT_TMP}/rootfs" - SRC_FILE="/${SPEC_SRC_FILE}" - DST_FILE="/${SPEC_DST_FILE}" - else - OUTPUT_DIR="${OUTPUT_ROOT}" - TMP_DIR="${OUTPUT_TMP}" - SRC_FILE="/system/${SPEC_SRC_FILE}" - DST_FILE="/system/${SPEC_DST_FILE}" - fi - - # Strip the file path in the vendor repo of "system", if present - local VENDOR_REPO_FILE="$OUTPUT_DIR/${DST_FILE#/system}" - local BLOB_DISPLAY_NAME="${DST_FILE#/system/}" - mkdir -p $(dirname "${VENDOR_REPO_FILE}") - - # Check pinned files - local HASH="$(echo ${HASHLIST[$i-1]} | awk '{ print tolower($0); }')" - local FIXUP_HASH="$(echo ${FIXUP_HASHLIST[$i-1]} | awk '{ print tolower($0); }')" - local KEEP="" - if [ "$DISABLE_PINNING" != "1" ] && [ "$HASH" != "x" ]; then - if [ -f "${VENDOR_REPO_FILE}" ]; then - local PINNED="${VENDOR_REPO_FILE}" - else - local PINNED="${TMP_DIR}${DST_FILE#/system}" - fi - if [ -f "$PINNED" ]; then - local TMP_HASH=$(get_hash "${PINNED}") - if [ "${TMP_HASH}" = "${HASH}" ] || [ "${TMP_HASH}" = "${FIXUP_HASH}" ]; then - KEEP="1" - if [ ! -f "${VENDOR_REPO_FILE}" ]; then - cp -p "$PINNED" "${VENDOR_REPO_FILE}" - fi - fi - fi - fi - - if [ "${KANG}" = false ]; then - printf ' - %s\n' "${BLOB_DISPLAY_NAME}" - fi - - if [ "$KEEP" = "1" ]; then - printf ' + keeping pinned file with hash %s\n' "${HASH}" - else - FOUND=false - # Try Lineage target first. - # Also try to search for files stripped of - # the "/system" prefix, if we're actually extracting - # from a system image. - for CANDIDATE in "${DST_FILE}" "${SRC_FILE}"; do - get_file ${CANDIDATE} ${VENDOR_REPO_FILE} ${SRC} && { - FOUND=true - break - } - done - - if [ "${FOUND}" = false ]; then - printf ' !! %s: file not found in source\n' "${BLOB_DISPLAY_NAME}" - continue - fi - fi - - # Blob fixup pipeline has 2 parts: one that is fixed and - # one that is user-configurable - local PRE_FIXUP_HASH=$(get_hash ${VENDOR_REPO_FILE}) - # Deodex apk|jar if that's the case - if [[ "$FULLY_DEODEXED" -ne "1" && "${VENDOR_REPO_FILE}" =~ .(apk|jar)$ ]]; then - oat2dex "${VENDOR_REPO_FILE}" "${SRC_FILE}" "$SRC" - if [ -f "$TMPDIR/classes.dex" ]; then - touch -t 200901010000 "$TMPDIR/classes"* - zip -gjq "${VENDOR_REPO_FILE}" "$TMPDIR/classes"* - rm "$TMPDIR/classes"* - printf ' (updated %s from odex files)\n' "${SRC_FILE}" - fi - elif [[ "${VENDOR_REPO_FILE}" =~ .xml$ ]]; then - fix_xml "${VENDOR_REPO_FILE}" - fi - # Now run user-supplied fixup function - blob_fixup "${BLOB_DISPLAY_NAME}" "${VENDOR_REPO_FILE}" - local POST_FIXUP_HASH=$(get_hash ${VENDOR_REPO_FILE}) - - if [ -f "${VENDOR_REPO_FILE}" ]; then - local DIR=$(dirname "${VENDOR_REPO_FILE}") - local TYPE="${DIR##*/}" - if [ "$TYPE" = "bin" -o "$TYPE" = "sbin" ]; then - chmod 755 "${VENDOR_REPO_FILE}" - else - chmod 644 "${VENDOR_REPO_FILE}" - fi - fi - - if [ "${KANG}" = true ]; then - print_spec "${IS_PRODUCT_PACKAGE}" "${SPEC_SRC_FILE}" "${SPEC_DST_FILE}" "${SPEC_ARGS}" "${PRE_FIXUP_HASH}" "${POST_FIXUP_HASH}" - fi - - # Check and print whether the fixup pipeline actually did anything. - # This isn't done right after the fixup pipeline because we want this print - # to come after print_spec above, when in kang mode. - if [ "${PRE_FIXUP_HASH}" != "${POST_FIXUP_HASH}" ]; then - printf " + Fixed up %s\n" "${BLOB_DISPLAY_NAME}" - # Now sanity-check the spec for this blob. - if [ "${KANG}" = false ] && [ "${FIXUP_HASH}" = "x" ] && [ "${HASH}" != "x" ]; then - printf "WARNING: The %s file was fixed up, but it is pinned.\n" ${BLOB_DISPLAY_NAME} - printf "This is a mistake and you want to either remove the hash completely, or add an extra one.\n" - fi - fi - - done - - # Don't allow failing - set -e -} - -# -# extract_firmware: -# -# $1: file containing the list of items to extract -# $2: path to extracted radio folder -# -function extract_firmware() { - if [ -z "$OUTDIR" ]; then - echo "Output dir not set!" - exit 1 - fi - - parse_file_list "$1" - - # Don't allow failing - set -e - - local FILELIST=( ${PRODUCT_COPY_FILES_LIST[@]} ) - local COUNT=${#FILELIST[@]} - local SRC="$2" - local OUTPUT_DIR="$LINEAGE_ROOT"/"$OUTDIR"/radio - - if [ "$VENDOR_RADIO_STATE" -eq "0" ]; then - echo "Cleaning firmware output directory ($OUTPUT_DIR).." - rm -rf "${OUTPUT_DIR:?}/"* - VENDOR_RADIO_STATE=1 - fi - - echo "Extracting $COUNT files in $1 from $SRC:" - - for (( i=1; i<COUNT+1; i++ )); do - local FILE="${FILELIST[$i-1]}" - printf ' - %s \n' "/radio/$FILE" - - if [ ! -d "$OUTPUT_DIR" ]; then - mkdir -p "$OUTPUT_DIR" - fi - cp "$SRC/$FILE" "$OUTPUT_DIR/$FILE" - chmod 644 "$OUTPUT_DIR/$FILE" - done -} - -function extract_img_data() { - local image_file="$1" - local out_dir="$2" - local logFile="$TMPDIR/debugfs.log" - - if [ ! -d "$out_dir" ]; then - mkdir -p "$out_dir" - fi - - if [[ "$HOST_OS" == "Darwin" ]]; then - debugfs -R "rdump / \"$out_dir\"" "$image_file" &> "$logFile" || { - echo "[-] Failed to extract data from '$image_file'" - abort 1 - } - else - debugfs -R 'ls -p' "$image_file" 2>/dev/null | cut -d '/' -f6 | while read -r entry - do - debugfs -R "rdump \"$entry\" \"$out_dir\"" "$image_file" >> "$logFile" 2>&1 || { - echo "[-] Failed to extract data from '$image_file'" - abort 1 - } - done - fi - - local symlink_err="rdump: Attempt to read block from filesystem resulted in short read while reading symlink" - if grep -Fq "$symlink_err" "$logFile"; then - echo "[-] Symlinks have not been properly processed from $image_file" - echo "[!] If you don't have a compatible debugfs version, modify 'execute-all.sh' to disable 'USE_DEBUGFS' flag" - abort 1 - fi -} - -declare -ra VENDOR_SKIP_FILES=( - "bin/toybox_vendor" - "bin/toolbox" - "bin/grep" - "build.prop" - "compatibility_matrix.xml" - "default.prop" - "etc/NOTICE.xml.gz" - "etc/vintf/compatibility_matrix.xml" - "etc/vintf/manifest.xml" - "etc/wifi/wpa_supplicant.conf" - "manifest.xml" - "overlay/DisplayCutoutEmulationCorner/DisplayCutoutEmulationCornerOverlay.apk" - "overlay/DisplayCutoutEmulationDouble/DisplayCutoutEmulationDoubleOverlay.apk" - "overlay/DisplayCutoutEmulationTall/DisplayCutoutEmulationTallOverlay.apk" - "overlay/DisplayCutoutNoCutout/NoCutoutOverlay.apk" - "overlay/framework-res__auto_generated_rro.apk" - "overlay/SysuiDarkTheme/SysuiDarkThemeOverlay.apk" -) - -function array_contains() { - local element - for element in "${@:2}"; do [[ "$element" == "$1" ]] && return 0; done - return 1 -} - -function generate_prop_list_from_image() { - local image_file="$1" - local image_dir="$TMPDIR/image-temp" - local output_list="$2" - local output_list_tmp="$TMPDIR/_proprietary-blobs.txt" - local -n skipped_vendor_files="$3" - - extract_img_data "$image_file" "$image_dir" - - find "$image_dir" -not -type d | sed "s#^$image_dir/##" | while read -r FILE - do - # Skip VENDOR_SKIP_FILES since it will be re-generated at build time - if array_contains "$FILE" "${VENDOR_SKIP_FILES[@]}"; then - continue - fi - # Skip device defined skipped files since they will be re-generated at build time - if array_contains "$FILE" "${skipped_vendor_files[@]}"; then - continue - fi - if suffix_match_file ".apk" "$FILE" ; then - echo "-vendor/$FILE" >> "$output_list_tmp" - else - echo "vendor/$FILE" >> "$output_list_tmp" - fi - done - - # Sort merged file with all lists - sort -u "$output_list_tmp" > "$output_list" - - # Clean-up - rm -f "$output_list_tmp" -} diff --git a/build/tools/getb64key.py b/build/tools/getb64key.py deleted file mode 100755 index 976a1576..00000000 --- a/build/tools/getb64key.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python - -from __future__ import print_function - -import base64 -import sys - -pkFile = open(sys.argv[1], 'rb').readlines() -base64Key = "" -inCert = False -for line in pkFile: - if line.startswith(b"-"): - inCert = not inCert - continue - - base64Key += line.strip() - -print(base64.b16encode(base64.b64decode(base64Key)).lower()) diff --git a/build/tools/repopick.py b/build/tools/repopick.py deleted file mode 100755 index 7025dc67..00000000 --- a/build/tools/repopick.py +++ /dev/null @@ -1,480 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2013-15 The CyanogenMod Project -# (C) 2017 The LineageOS Project -# -# 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. -# - -# -# Run repopick.py -h for a description of this utility. -# - -from __future__ import print_function - -import sys -import json -import os -import subprocess -import re -import argparse -import textwrap -from functools import cmp_to_key -from xml.etree import ElementTree - -try: - import requests -except ImportError: - try: - # For python3 - import urllib.error - import urllib.request - except ImportError: - # For python2 - import imp - import urllib2 - urllib = imp.new_module('urllib') - urllib.error = urllib2 - urllib.request = urllib2 - - -# cmp() is not available in Python 3, define it manually -# See https://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons -def cmp(a, b): - return (a > b) - (a < b) - - -# Verifies whether pathA is a subdirectory (or the same) as pathB -def is_subdir(a, b): - a = os.path.realpath(a) + '/' - b = os.path.realpath(b) + '/' - return b == a[:len(b)] - - -def fetch_query_via_ssh(remote_url, query): - """Given a remote_url and a query, return the list of changes that fit it - This function is slightly messy - the ssh api does not return data in the same structure as the HTTP REST API - We have to get the data, then transform it to match what we're expecting from the HTTP RESET API""" - if remote_url.count(':') == 2: - (uri, userhost, port) = remote_url.split(':') - userhost = userhost[2:] - elif remote_url.count(':') == 1: - (uri, userhost) = remote_url.split(':') - userhost = userhost[2:] - port = 29418 - else: - raise Exception('Malformed URI: Expecting ssh://[user@]host[:port]') - - - out = subprocess.check_output(['ssh', '-x', '-p{0}'.format(port), userhost, 'gerrit', 'query', '--format=JSON --patch-sets --current-patch-set', query]) - if not hasattr(out, 'encode'): - out = out.decode() - reviews = [] - for line in out.split('\n'): - try: - data = json.loads(line) - # make our data look like the http rest api data - review = { - 'branch': data['branch'], - 'change_id': data['id'], - 'current_revision': data['currentPatchSet']['revision'], - 'number': int(data['number']), - 'revisions': {patch_set['revision']: { - '_number': int(patch_set['number']), - 'fetch': { - 'ssh': { - 'ref': patch_set['ref'], - 'url': 'ssh://{0}:{1}/{2}'.format(userhost, port, data['project']) - } - }, - 'commit': { - 'parents': [{ 'commit': parent } for parent in patch_set['parents']] - }, - } for patch_set in data['patchSets']}, - 'subject': data['subject'], - 'project': data['project'], - 'status': data['status'] - } - reviews.append(review) - except: - pass - args.quiet or print('Found {0} reviews'.format(len(reviews))) - return reviews - - -def fetch_query_via_http(remote_url, query): - if "requests" in sys.modules: - auth = None - if os.path.isfile(os.getenv("HOME") + "/.gerritrc"): - f = open(os.getenv("HOME") + "/.gerritrc", "r") - for line in f: - parts = line.rstrip().split("|") - if parts[0] in remote_url: - auth = requests.auth.HTTPBasicAuth(username=parts[1], password=parts[2]) - statusCode = '-1' - if auth: - url = '{0}/a/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS&o=ALL_COMMITS'.format(remote_url, query) - data = requests.get(url, auth=auth) - statusCode = str(data.status_code) - if statusCode != '200': - #They didn't get good authorization or data, Let's try the old way - url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS&o=ALL_COMMITS'.format(remote_url, query) - data = requests.get(url) - reviews = json.loads(data.text[5:]) - else: - """Given a query, fetch the change numbers via http""" - url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS&o=ALL_COMMITS'.format(remote_url, query) - data = urllib.request.urlopen(url).read().decode('utf-8') - reviews = json.loads(data[5:]) - - for review in reviews: - review['number'] = review.pop('_number') - - return reviews - - -def fetch_query(remote_url, query): - """Wrapper for fetch_query_via_proto functions""" - if remote_url[0:3] == 'ssh': - return fetch_query_via_ssh(remote_url, query) - elif remote_url[0:4] == 'http': - return fetch_query_via_http(remote_url, query.replace(' ', '+')) - else: - raise Exception('Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]') - -if __name__ == '__main__': - # Default to LineageOS Gerrit - default_gerrit = 'https://review.lineageos.org' - - parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\ - repopick.py is a utility to simplify the process of cherry picking - patches from LineageOS's Gerrit instance (or any gerrit instance of your choosing) - - Given a list of change numbers, repopick will cd into the project path - and cherry pick the latest patch available. - - With the --start-branch argument, the user can specify that a branch - should be created before cherry picking. This is useful for - cherry-picking many patches into a common branch which can be easily - abandoned later (good for testing other's changes.) - - The --abandon-first argument, when used in conjunction with the - --start-branch option, will cause repopick to abandon the specified - branch in all repos first before performing any cherry picks.''')) - parser.add_argument('change_number', nargs='*', help='change number to cherry pick. Use {change number}/{patchset number} to get a specific revision.') - parser.add_argument('-i', '--ignore-missing', action='store_true', help='do not error out if a patch applies to a missing directory') - parser.add_argument('-s', '--start-branch', nargs=1, help='start the specified branch before cherry picking') - parser.add_argument('-r', '--reset', action='store_true', help='reset to initial state (abort cherry-pick) if there is a conflict') - parser.add_argument('-a', '--abandon-first', action='store_true', help='before cherry picking, abandon the branch specified in --start-branch') - parser.add_argument('-b', '--auto-branch', action='store_true', help='shortcut to "--start-branch auto --abandon-first --ignore-missing"') - parser.add_argument('-q', '--quiet', action='store_true', help='print as little as possible') - parser.add_argument('-v', '--verbose', action='store_true', help='print extra information to aid in debug') - parser.add_argument('-f', '--force', action='store_true', help='force cherry pick even if change is closed') - parser.add_argument('-p', '--pull', action='store_true', help='execute pull instead of cherry-pick') - parser.add_argument('-P', '--path', help='use the specified path for the change') - parser.add_argument('-t', '--topic', help='pick all commits from a specified topic') - parser.add_argument('-Q', '--query', help='pick all commits using the specified query') - parser.add_argument('-g', '--gerrit', default=default_gerrit, help='Gerrit Instance to use. Form proto://[user@]host[:port]') - parser.add_argument('-e', '--exclude', nargs=1, help='exclude a list of commit numbers separated by a ,') - parser.add_argument('-c', '--check-picked', type=int, default=10, help='pass the amount of commits to check for already picked changes') - args = parser.parse_args() - if not args.start_branch and args.abandon_first: - parser.error('if --abandon-first is set, you must also give the branch name with --start-branch') - if args.auto_branch: - args.abandon_first = True - args.ignore_missing = True - if not args.start_branch: - args.start_branch = ['auto'] - if args.quiet and args.verbose: - parser.error('--quiet and --verbose cannot be specified together') - - if (1 << bool(args.change_number) << bool(args.topic) << bool(args.query)) != 2: - parser.error('One (and only one) of change_number, topic, and query are allowed') - - # Change current directory to the top of the tree - if 'ANDROID_BUILD_TOP' in os.environ: - top = os.environ['ANDROID_BUILD_TOP'] - - if not is_subdir(os.getcwd(), top): - sys.stderr.write('ERROR: You must run this tool from within $ANDROID_BUILD_TOP!\n') - sys.exit(1) - os.chdir(os.environ['ANDROID_BUILD_TOP']) - - # Sanity check that we are being run from the top level of the tree - if not os.path.isdir('.repo'): - sys.stderr.write('ERROR: No .repo directory found. Please run this from the top of your tree.\n') - sys.exit(1) - - # If --abandon-first is given, abandon the branch before starting - if args.abandon_first: - # Determine if the branch already exists; skip the abandon if it does not - plist = subprocess.check_output(['repo', 'info']) - if not hasattr(plist, 'encode'): - plist = plist.decode() - needs_abandon = False - for pline in plist.splitlines(): - matchObj = re.match(r'Local Branches.*\[(.*)\]', pline) - if matchObj: - local_branches = re.split('\s*,\s*', matchObj.group(1)) - if any(args.start_branch[0] in s for s in local_branches): - needs_abandon = True - - if needs_abandon: - # Perform the abandon only if the branch already exists - if not args.quiet: - print('Abandoning branch: %s' % args.start_branch[0]) - subprocess.check_output(['repo', 'abandon', args.start_branch[0]]) - if not args.quiet: - print('') - - # Get the master manifest from repo - # - convert project name and revision to a path - project_name_to_data = {} - manifest = subprocess.check_output(['repo', 'manifest']) - xml_root = ElementTree.fromstring(manifest) - projects = xml_root.findall('project') - remotes = xml_root.findall('remote') - default_revision = xml_root.findall('default')[0].get('revision') - - #dump project data into the a list of dicts with the following data: - #{project: {path, revision}} - - for project in projects: - name = project.get('name') - # when name and path are equal, "repo manifest" doesn't return a path at all, so fall back to name - path = project.get('path', name) - revision = project.get('upstream') - if revision is None: - for remote in remotes: - if remote.get('name') == project.get('remote'): - revision = remote.get('revision') - if revision is None: - revision = default_revision - - if not name in project_name_to_data: - project_name_to_data[name] = {} - revision = revision.split('refs/heads/')[-1] - project_name_to_data[name][revision] = path - - # get data on requested changes - reviews = [] - change_numbers = [] - - def cmp_reviews(review_a, review_b): - current_a = review_a['current_revision'] - parents_a = [r['commit'] for r in review_a['revisions'][current_a]['commit']['parents']] - current_b = review_b['current_revision'] - parents_b = [r['commit'] for r in review_b['revisions'][current_b]['commit']['parents']] - if current_a in parents_b: - return -1 - elif current_b in parents_a: - return 1 - else: - return cmp(review_a['number'], review_b['number']) - - if args.topic: - reviews = fetch_query(args.gerrit, 'topic:{0}'.format(args.topic)) - change_numbers = [str(r['number']) for r in sorted(reviews, key=cmp_to_key(cmp_reviews))] - if args.query: - reviews = fetch_query(args.gerrit, args.query) - change_numbers = [str(r['number']) for r in sorted(reviews, key=cmp_to_key(cmp_reviews))] - if args.change_number: - change_url_re = re.compile('https?://.+?/([0-9]+(?:/[0-9]+)?)/?') - for c in args.change_number: - change_number = change_url_re.findall(c) - if change_number: - change_numbers.extend(change_number) - elif '-' in c: - templist = c.split('-') - for i in range(int(templist[0]), int(templist[1]) + 1): - change_numbers.append(str(i)) - else: - change_numbers.append(c) - reviews = fetch_query(args.gerrit, ' OR '.join('change:{0}'.format(x.split('/')[0]) for x in change_numbers)) - - # make list of things to actually merge - mergables = [] - - # If --exclude is given, create the list of commits to ignore - exclude = [] - if args.exclude: - exclude = args.exclude[0].split(',') - - for change in change_numbers: - patchset = None - if '/' in change: - (change, patchset) = change.split('/') - - if change in exclude: - continue - - change = int(change) - - if patchset: - patchset = int(patchset) - - review = next((x for x in reviews if x['number'] == change), None) - if review is None: - print('Change %d not found, skipping' % change) - continue - - mergables.append({ - 'subject': review['subject'], - 'project': review['project'], - 'branch': review['branch'], - 'change_id': review['change_id'], - 'change_number': review['number'], - 'status': review['status'], - 'fetch': None, - 'patchset': review['revisions'][review['current_revision']]['_number'], - }) - - mergables[-1]['fetch'] = review['revisions'][review['current_revision']]['fetch'] - mergables[-1]['id'] = change - if patchset: - try: - mergables[-1]['fetch'] = [review['revisions'][x]['fetch'] for x in review['revisions'] if review['revisions'][x]['_number'] == patchset][0] - mergables[-1]['id'] = '{0}/{1}'.format(change, patchset) - mergables[-1]['patchset'] = patchset - except (IndexError, ValueError): - args.quiet or print('ERROR: The patch set {0}/{1} could not be found, using CURRENT_REVISION instead.'.format(change, patchset)) - - for item in mergables: - args.quiet or print('Applying change number {0}...'.format(item['id'])) - # Check if change is open and exit if it's not, unless -f is specified - if (item['status'] != 'OPEN' and item['status'] != 'NEW' and item['status'] != 'DRAFT') and not args.query: - if args.force: - print('!! Force-picking a closed change !!\n') - else: - print('Change status is ' + item['status'] + '. Skipping the cherry pick.\nUse -f to force this pick.') - continue - - # Convert the project name to a project path - # - check that the project path exists - project_path = None - - if item['project'] in project_name_to_data and item['branch'] in project_name_to_data[item['project']]: - project_path = project_name_to_data[item['project']][item['branch']] - elif args.path: - project_path = args.path - elif args.ignore_missing: - print('WARNING: Skipping {0} since there is no project directory for: {1}\n'.format(item['id'], item['project'])) - continue - else: - sys.stderr.write('ERROR: For {0}, could not determine the project path for project {1}\n'.format(item['id'], item['project'])) - sys.exit(1) - - # If --start-branch is given, create the branch (more than once per path is okay; repo ignores gracefully) - if args.start_branch: - subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) - - # Determine the maximum commits to check already picked changes - check_picked_count = args.check_picked - branch_commits_count = int(subprocess.check_output(['git', 'rev-list', '--count', 'HEAD'], cwd=project_path)) - if branch_commits_count <= check_picked_count: - check_picked_count = branch_commits_count - 1 - - # Check if change is already picked to HEAD...HEAD~check_picked_count - found_change = False - for i in range(0, check_picked_count): - if subprocess.call(['git', 'cat-file', '-e', 'HEAD~{0}'.format(i)], cwd=project_path, stderr=open(os.devnull, 'wb')): - continue - output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split() - if 'Change-Id:' in output: - head_change_id = '' - for j,t in enumerate(reversed(output)): - if t == 'Change-Id:': - head_change_id = output[len(output) - j] - break - if head_change_id.strip() == item['change_id']: - print('Skipping {0} - already picked in {1} as HEAD~{2}'.format(item['id'], project_path, i)) - found_change = True - break - if found_change: - continue - - # Print out some useful info - if not args.quiet: - print('--> Subject: "{0}"'.format(item['subject'].encode('utf-8'))) - print('--> Project path: {0}'.format(project_path)) - print('--> Change number: {0} (Patch Set {1})'.format(item['id'], item['patchset'])) - - if 'anonymous http' in item['fetch']: - method = 'anonymous http' - else: - method = 'ssh' - - # Try fetching from GitHub first if using default gerrit - if args.gerrit == default_gerrit: - if args.verbose: - print('Trying to fetch the change from GitHub') - - if args.pull: - cmd = ['git pull --no-edit github', item['fetch'][method]['ref']] - else: - cmd = ['git fetch github', item['fetch'][method]['ref']] - if args.quiet: - cmd.append('--quiet') - else: - print(cmd) - result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) - FETCH_HEAD = '{0}/.git/FETCH_HEAD'.format(project_path) - if result != 0 and os.stat(FETCH_HEAD).st_size != 0: - print('ERROR: git command failed') - sys.exit(result) - # Check if it worked - if args.gerrit != default_gerrit or os.stat(FETCH_HEAD).st_size == 0: - # If not using the default gerrit or github failed, fetch from gerrit. - if args.verbose: - if args.gerrit == default_gerrit: - print('Fetching from GitHub didn\'t work, trying to fetch the change from Gerrit') - else: - print('Fetching from {0}'.format(args.gerrit)) - - if args.pull: - cmd = ['git pull --no-edit', item['fetch'][method]['url'], item['fetch'][method]['ref']] - else: - cmd = ['git fetch', item['fetch'][method]['url'], item['fetch'][method]['ref']] - if args.quiet: - cmd.append('--quiet') - else: - print(cmd) - result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) - if result != 0: - print('ERROR: git command failed') - sys.exit(result) - # Perform the cherry-pick - if not args.pull: - cmd = ['git cherry-pick --ff FETCH_HEAD'] - if args.quiet: - cmd_out = open(os.devnull, 'wb') - else: - cmd_out = None - result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) - if result != 0: - cmd = ['git diff-index --quiet HEAD --'] - result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) - if result == 0: - print('WARNING: git command resulted with an empty commit, aborting cherry-pick') - cmd = ['git cherry-pick --abort'] - subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) - elif args.reset: - print('ERROR: git command failed, aborting cherry-pick') - cmd = ['git cherry-pick --abort'] - subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) - sys.exit(result) - else: - print('ERROR: git command failed') - sys.exit(result) - if not args.quiet: - print('') diff --git a/build/tools/roomservice.py b/build/tools/roomservice.py deleted file mode 100755 index bf502a53..00000000 --- a/build/tools/roomservice.py +++ /dev/null @@ -1,315 +0,0 @@ -#!/usr/bin/env python -# Copyright (C) 2012-2013, The CyanogenMod Project -# (C) 2017, The LineageOS Project -# -# 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. - -from __future__ import print_function - -import base64 -import json -import netrc -import os -import re -import sys -try: - # For python3 - import urllib.error - import urllib.parse - import urllib.request -except ImportError: - # For python2 - import imp - import urllib2 - import urlparse - urllib = imp.new_module('urllib') - urllib.error = urllib2 - urllib.parse = urlparse - urllib.request = urllib2 - -from xml.etree import ElementTree - -product = sys.argv[1] - -if len(sys.argv) > 2: - depsonly = sys.argv[2] -else: - depsonly = None - -try: - device = product[product.index("_") + 1:] -except: - device = product - -if not depsonly: - print("Device %s not found. Attempting to retrieve device repository from LineageOS Github (http://github.com/LineageOS)." % device) - -repositories = [] - -try: - authtuple = netrc.netrc().authenticators("api.github.com") - - if authtuple: - auth_string = ('%s:%s' % (authtuple[0], authtuple[2])).encode() - githubauth = base64.encodestring(auth_string).decode().replace('\n', '') - else: - githubauth = None -except: - githubauth = None - -def add_auth(githubreq): - if githubauth: - githubreq.add_header("Authorization","Basic %s" % githubauth) - -if not depsonly: - githubreq = urllib.request.Request("https://api.github.com/search/repositories?q=%s+user:LineageOS+in:name+fork:true" % device) - add_auth(githubreq) - try: - result = json.loads(urllib.request.urlopen(githubreq).read().decode()) - except urllib.error.URLError: - print("Failed to search GitHub") - sys.exit() - except ValueError: - print("Failed to parse return data from GitHub") - sys.exit() - for res in result.get('items', []): - repositories.append(res) - -local_manifests = r'.repo/local_manifests' -if not os.path.exists(local_manifests): os.makedirs(local_manifests) - -def exists_in_tree(lm, path): - for child in lm.getchildren(): - if child.attrib['path'] == path: - return True - return False - -# in-place prettyprint formatter -def indent(elem, level=0): - i = "\n" + level*" " - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + " " - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - indent(elem, level+1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i - -def get_manifest_path(): - '''Find the current manifest path - In old versions of repo this is at .repo/manifest.xml - In new versions, .repo/manifest.xml includes an include - to some arbitrary file in .repo/manifests''' - - m = ElementTree.parse(".repo/manifest.xml") - try: - m.findall('default')[0] - return '.repo/manifest.xml' - except IndexError: - return ".repo/manifests/{}".format(m.find("include").get("name")) - -def get_default_revision(): - m = ElementTree.parse(get_manifest_path()) - d = m.findall('default')[0] - r = d.get('revision') - return r.replace('refs/heads/', '').replace('refs/tags/', '') - -def get_from_manifest(devicename): - try: - lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for localpath in lm.findall("project"): - if re.search("android_device_.*_%s$" % device, localpath.get("name")): - return localpath.get("path") - - return None - -def is_in_manifest(projectpath): - try: - lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for localpath in lm.findall("project"): - if localpath.get("path") == projectpath: - return True - - # Search in main manifest, too - try: - lm = ElementTree.parse(get_manifest_path()) - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for localpath in lm.findall("project"): - if localpath.get("path") == projectpath: - return True - - # ... and don't forget the lineage snippet - try: - lm = ElementTree.parse(".repo/manifests/snippets/lineage.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for localpath in lm.findall("project"): - if localpath.get("path") == projectpath: - return True - - return False - -def add_to_manifest(repositories, fallback_branch = None): - try: - lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for repository in repositories: - repo_name = repository['repository'] - repo_target = repository['target_path'] - print('Checking if %s is fetched from %s' % (repo_target, repo_name)) - if is_in_manifest(repo_target): - print('LineageOS/%s already fetched to %s' % (repo_name, repo_target)) - continue - - print('Adding dependency: LineageOS/%s -> %s' % (repo_name, repo_target)) - project = ElementTree.Element("project", attrib = { "path": repo_target, - "remote": "github", "name": "LineageOS/%s" % repo_name }) - - if 'branch' in repository: - project.set('revision',repository['branch']) - elif fallback_branch: - print("Using fallback branch %s for %s" % (fallback_branch, repo_name)) - project.set('revision', fallback_branch) - else: - print("Using default branch for %s" % repo_name) - - lm.append(project) - - indent(lm, 0) - raw_xml = ElementTree.tostring(lm).decode() - raw_xml = '<?xml version="1.0" encoding="UTF-8"?>\n' + raw_xml - - f = open('.repo/local_manifests/roomservice.xml', 'w') - f.write(raw_xml) - f.close() - -def fetch_dependencies(repo_path, fallback_branch = None): - print('Looking for dependencies in %s' % repo_path) - dependencies_path = repo_path + '/lineage.dependencies' - syncable_repos = [] - verify_repos = [] - - if os.path.exists(dependencies_path): - dependencies_file = open(dependencies_path, 'r') - dependencies = json.loads(dependencies_file.read()) - fetch_list = [] - - for dependency in dependencies: - if not is_in_manifest(dependency['target_path']): - fetch_list.append(dependency) - syncable_repos.append(dependency['target_path']) - verify_repos.append(dependency['target_path']) - else: - verify_repos.append(dependency['target_path']) - - dependencies_file.close() - - if len(fetch_list) > 0: - print('Adding dependencies to manifest') - add_to_manifest(fetch_list, fallback_branch) - else: - print('%s has no additional dependencies.' % repo_path) - - if len(syncable_repos) > 0: - print('Syncing dependencies') - os.system('repo sync --force-sync %s' % ' '.join(syncable_repos)) - - for deprepo in verify_repos: - fetch_dependencies(deprepo) - -def has_branch(branches, revision): - return revision in [branch['name'] for branch in branches] - -if depsonly: - repo_path = get_from_manifest(device) - if repo_path: - fetch_dependencies(repo_path) - else: - print("Trying dependencies-only mode on a non-existing device tree?") - - sys.exit() - -else: - for repository in repositories: - repo_name = repository['name'] - if re.match(r"^android_device_[^_]*_" + device + "$", repo_name): - print("Found repository: %s" % repository['name']) - - manufacturer = repo_name.replace("android_device_", "").replace("_" + device, "") - - default_revision = get_default_revision() - print("Default revision: %s" % default_revision) - print("Checking branch info") - githubreq = urllib.request.Request(repository['branches_url'].replace('{/branch}', '')) - add_auth(githubreq) - result = json.loads(urllib.request.urlopen(githubreq).read().decode()) - - ## Try tags, too, since that's what releases use - if not has_branch(result, default_revision): - githubreq = urllib.request.Request(repository['tags_url'].replace('{/tag}', '')) - add_auth(githubreq) - result.extend (json.loads(urllib.request.urlopen(githubreq).read().decode())) - - repo_path = "device/%s/%s" % (manufacturer, device) - adding = {'repository':repo_name,'target_path':repo_path} - - fallback_branch = None - if not has_branch(result, default_revision): - if os.getenv('ROOMSERVICE_BRANCHES'): - fallbacks = list(filter(bool, os.getenv('ROOMSERVICE_BRANCHES').split(' '))) - for fallback in fallbacks: - if has_branch(result, fallback): - print("Using fallback branch: %s" % fallback) - fallback_branch = fallback - break - - if not fallback_branch: - print("Default revision %s not found in %s. Bailing." % (default_revision, repo_name)) - print("Branches found:") - for branch in [branch['name'] for branch in result]: - print(branch) - print("Use the ROOMSERVICE_BRANCHES environment variable to specify a list of fallback branches.") - sys.exit() - - add_to_manifest([adding], fallback_branch) - - print("Syncing repository to retrieve project.") - os.system('repo sync --force-sync %s' % repo_path) - print("Repository synced!") - - fetch_dependencies(repo_path, fallback_branch) - print("Done") - sys.exit() - -print("Repository for %s not found in the LineageOS Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device) diff --git a/build/tools/sdat2img.py b/build/tools/sdat2img.py deleted file mode 100755 index 3efb2f78..00000000 --- a/build/tools/sdat2img.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -#==================================================== -# FILE: sdat2img.py -# AUTHORS: xpirt - luxi78 - howellzhu -# DATE: 2016-11-23 16:20:11 CST -#==================================================== - -import sys, os, errno - -__version__ = '1.0' - -if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." - try: - input = raw_input - except NameError: pass - input('Press ENTER to exit...') - sys.exit(1) -else: - print('sdat2img binary - version: %s\n' % __version__) - -try: - TRANSFER_LIST_FILE = str(sys.argv[1]) - NEW_DATA_FILE = str(sys.argv[2]) -except IndexError: - print('\nUsage: sdat2img.py <transfer_list> <system_new_file> [system_img]\n') - print(' <transfer_list>: transfer list file') - print(' <system_new_file>: system new dat file') - print(' [system_img]: output system image\n\n') - print('Visit xda thread for more information.\n') - try: - input = raw_input - except NameError: pass - input('Press ENTER to exit...') - sys.exit() - -try: - OUTPUT_IMAGE_FILE = str(sys.argv[3]) -except IndexError: - OUTPUT_IMAGE_FILE = 'system.img' - -BLOCK_SIZE = 4096 - -def rangeset(src): - src_set = src.split(',') - num_set = [int(item) for item in src_set] - if len(num_set) != num_set[0]+1: - print('Error on parsing following data to rangeset:\n%s' % src) - sys.exit(1) - - return tuple ([ (num_set[i], num_set[i+1]) for i in range(1, len(num_set), 2) ]) - -def parse_transfer_list_file(path): - trans_list = open(TRANSFER_LIST_FILE, 'r') - - # First line in transfer list is the version number - version = int(trans_list.readline()) - - # Second line in transfer list is the total number of blocks we expect to write - new_blocks = int(trans_list.readline()) - - if version >= 2: - # Third line is how many stash entries are needed simultaneously - trans_list.readline() - # Fourth line is the maximum number of blocks that will be stashed simultaneously - trans_list.readline() - - # Subsequent lines are all individual transfer commands - commands = [] - for line in trans_list: - line = line.split(' ') - cmd = line[0] - if cmd in ['erase', 'new', 'zero']: - commands.append([cmd, rangeset(line[1])]) - else: - # Skip lines starting with numbers, they are not commands anyway - if not cmd[0].isdigit(): - print('Command "%s" is not valid.' % cmd) - trans_list.close() - sys.exit(1) - - trans_list.close() - return version, new_blocks, commands - -def main(argv): - version, new_blocks, commands = parse_transfer_list_file(TRANSFER_LIST_FILE) - - if version == 1: - print('Android Lollipop 5.0 detected!\n') - elif version == 2: - print('Android Lollipop 5.1 detected!\n') - elif version == 3: - print('Android Marshmallow 6.0 detected!\n') - elif version == 4: - print('Android Nougat 7.0 detected!\n') - else: - print('Unknown Android version!\n') - - # Don't clobber existing files to avoid accidental data loss - try: - output_img = open(OUTPUT_IMAGE_FILE, 'wb') - except IOError as e: - if e.errno == errno.EEXIST: - print('Error: the output file "{}" already exists'.format(e.filename)) - print('Remove it, rename it, or choose a different file name.') - sys.exit(e.errno) - else: - raise - - new_data_file = open(NEW_DATA_FILE, 'rb') - all_block_sets = [i for command in commands for i in command[1]] - max_file_size = max(pair[1] for pair in all_block_sets)*BLOCK_SIZE - - for command in commands: - if command[0] == 'new': - for block in command[1]: - begin = block[0] - end = block[1] - block_count = end - begin - print('Copying {} blocks into position {}...'.format(block_count, begin)) - - # Position output file - output_img.seek(begin*BLOCK_SIZE) - - # Copy one block at a time - while(block_count > 0): - output_img.write(new_data_file.read(BLOCK_SIZE)) - block_count -= 1 - else: - print('Skipping command %s...' % command[0]) - - # Make file larger if necessary - if(output_img.tell() < max_file_size): - output_img.truncate(max_file_size) - - output_img.close() - new_data_file.close() - print('Done! Output image: %s' % os.path.realpath(output_img.name)) - -if __name__ == '__main__': - main(sys.argv) diff --git a/build/tools/smali/NOTICE b/build/tools/smali/NOTICE deleted file mode 100644 index 76ad9aa7..00000000 --- a/build/tools/smali/NOTICE +++ /dev/null @@ -1,105 +0,0 @@ -The majority of smali/baksmali is written and copyrighted by me (Ben Gruver) -and released under the following license: - -******************************************************************************* -Copyright (c) 2010 Ben Gruver (JesusFreke) -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -******************************************************************************* - - -Unless otherwise stated in the code/commit message, any changes with the -committer of bgruv@google.com or wkal@google.com is copyrighted by -Google Inc. and released under the following license: - -******************************************************************************* -Copyright 2011, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -******************************************************************************* - - -Various portions of the code are taken from the Android Open Source Project, -and are used in accordance with the following license: - -******************************************************************************* -Copyright (C) 2007 The Android Open Source Project - -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. -******************************************************************************* - - -Some parts of the smalidea plugin are based on code from the IDEA project, per the -following license - -******************************************************************************* -Copyright 2000-2014 JetBrains s.r.o. - -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. -******************************************************************************* diff --git a/build/tools/smali/baksmali.jar b/build/tools/smali/baksmali.jar Binary files differdeleted file mode 100644 index e800842d..00000000 --- a/build/tools/smali/baksmali.jar +++ /dev/null diff --git a/build/tools/smali/smali.jar b/build/tools/smali/smali.jar Binary files differdeleted file mode 100644 index 88e00256..00000000 --- a/build/tools/smali/smali.jar +++ /dev/null |