├── .gitignore ├── art ├── icon.psd ├── tile.png ├── tile2.png ├── feature.png ├── feature.psd ├── icon128.png ├── icon16.psd ├── screenshot.png └── screenshot.psd ├── extension ├── icons │ ├── 128.png │ ├── 16.png │ └── 32.png ├── ref-inject-code-search.css ├── options.html ├── manifest.json ├── options.js ├── background.js ├── android-xml-ref.js └── ref-inject-code-search.js ├── makezip.sh ├── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | extension.zip 3 | -------------------------------------------------------------------------------- /art/icon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/icon.psd -------------------------------------------------------------------------------- /art/tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/tile.png -------------------------------------------------------------------------------- /art/tile2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/tile2.png -------------------------------------------------------------------------------- /art/feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/feature.png -------------------------------------------------------------------------------- /art/feature.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/feature.psd -------------------------------------------------------------------------------- /art/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/icon128.png -------------------------------------------------------------------------------- /art/icon16.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/icon16.psd -------------------------------------------------------------------------------- /art/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/screenshot.png -------------------------------------------------------------------------------- /art/screenshot.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/art/screenshot.psd -------------------------------------------------------------------------------- /extension/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/extension/icons/128.png -------------------------------------------------------------------------------- /extension/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/extension/icons/16.png -------------------------------------------------------------------------------- /extension/icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romannurik/AndroidSDKSearchExtension/HEAD/extension/icons/32.png -------------------------------------------------------------------------------- /makezip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | find . -iname \.DS_Store -exec rm {} \; 3 | rm -rf extension.zip 4 | cd extension/ 5 | zip -qr ../extension.zip . 6 | cd .. 7 | zipinfo -l extension.zip 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![No Maintenance Intended](http://unmaintained.tech/badge.svg)](http://unmaintained.tech/) 2 | 3 | Android SDK Search Extension 4 | ============================ 5 | 6 | A Chrome extension that adds an 'ad' omnibox command and view source links for the Android SDK. 7 | 8 | The extension can be downloaded [on the Chrome Web Store](https://chrome.google.com/webstore/detail/android-sdk-search/hgcbffeicehlpmgmnhnkjbjoldkfhoin?hl=en). 9 | 10 | ![Android SDK Search Extension](art/screenshot.png "Android SDK Search Extension") 11 | -------------------------------------------------------------------------------- /extension/ref-inject-code-search.css: -------------------------------------------------------------------------------- 1 | .__asdk_search_extension_link_container__ { 2 | margin-bottom: 8px; 3 | } 4 | 5 | .__asdk_search_extension_link__ { 6 | display: inline-block; 7 | padding: 3px 6px; 8 | border: 2px solid rgba(3, 155, 229, 0.85); 9 | border-radius: 4px; 10 | color: #039BE5; 11 | font-family: Roboto; 12 | font-weight: 700; 13 | font-size: 13px; 14 | line-height: 15px; 15 | } 16 | 17 | .__asdk_search_extension_link__ + .__asdk_search_extension_link__ { 18 | margin-left: 4px; 19 | } 20 | 21 | .__asdk_search_extension_link__:hover { 22 | border-color: #039BE5; 23 | background-color: #039BE5; 24 | color: #fff; 25 | } -------------------------------------------------------------------------------- /extension/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Options 5 | 8 | 9 | 10 | 11 | 12 | Source base URL: 13 |
14 | 18 |
19 | 23 |
24 | 27 | 30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "Android SDK Search", 4 | "description": "Adds an 'ad' omnibox command and view source links for the Android SDK.", 5 | "version": "0.3.16", 6 | "permissions": [ 7 | "tabs", 8 | "*://developer.android.com/*", 9 | "storage" 10 | ], 11 | "icons": { 12 | "16": "icons/16.png", 13 | "32": "icons/32.png", 14 | "128": "icons/128.png" 15 | }, 16 | "omnibox": { 17 | "keyword": "ad" 18 | }, 19 | "content_scripts": [ 20 | { 21 | "matches": [ 22 | "*://developer.android.com/reference/*", 23 | "*://developer.android.com/guide/*" 24 | ], 25 | "js": [ 26 | "ref-inject-code-search.js" 27 | ], 28 | "css": [ 29 | "ref-inject-code-search.css" 30 | ] 31 | } 32 | ], 33 | "background": { 34 | "scripts": ["background.js"] 35 | }, 36 | "options_ui": { 37 | "page": "options.html", 38 | "chrome_style": true 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /extension/options.js: -------------------------------------------------------------------------------- 1 | // Saves options to chrome.local.sync. 2 | function save_options() { 3 | var customUrl = document.getElementById("customUrl").value; 4 | 5 | var url = document.querySelector('input:checked').value; 6 | if (url === 'on') { 7 | url = customUrl; 8 | } 9 | 10 | chrome.storage.local.set({ 11 | baseUrl: url 12 | }, function() { 13 | // Update status to let user know options were saved. 14 | var status = document.getElementById('status'); 15 | status.innerHTML = 'Options saved.'; 16 | setTimeout(function() { 17 | status.textContent = ''; 18 | }, 2000); 19 | }); 20 | } 21 | 22 | function restore_options() { 23 | chrome.storage.local.get({ 24 | baseUrl: 'https://android.googlesource.com' 25 | }, function(items) { 26 | if (items.baseUrl === 'https://android.googlesource.com') { 27 | document.getElementById("googlesource").checked = true; 28 | } else if (items.baseUrl === 'https://github.com') { 29 | document.getElementById("github").checked = true; 30 | } else { 31 | document.getElementById("customCheck").checked = true; 32 | document.getElementById("customUrl").value = items.baseUrl; 33 | } 34 | }); 35 | } 36 | document.addEventListener('DOMContentLoaded', restore_options); 37 | document.getElementById('save').addEventListener('click', 38 | save_options); 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, and 10 | distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by the copyright 13 | owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all other entities 16 | that control, are controlled by, or are under common control with that entity. 17 | For the purposes of this definition, "control" means (i) the power, direct or 18 | indirect, to cause the direction or management of such entity, whether by 19 | contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the 20 | outstanding shares, or (iii) beneficial ownership of such entity. 21 | 22 | "You" (or "Your") shall mean an individual or Legal Entity exercising 23 | permissions granted by this License. 24 | 25 | "Source" form shall mean the preferred form for making modifications, including 26 | but not limited to software source code, documentation source, and configuration 27 | files. 28 | 29 | "Object" form shall mean any form resulting from mechanical transformation or 30 | translation of a Source form, including but not limited to compiled object code, 31 | generated documentation, and conversions to other media types. 32 | 33 | "Work" shall mean the work of authorship, whether in Source or Object form, made 34 | available under the License, as indicated by a copyright notice that is included 35 | in or attached to the work (an example is provided in the Appendix below). 36 | 37 | "Derivative Works" shall mean any work, whether in Source or Object form, that 38 | is based on (or derived from) the Work and for which the editorial revisions, 39 | annotations, elaborations, or other modifications represent, as a whole, an 40 | original work of authorship. For the purposes of this License, Derivative Works 41 | shall not include works that remain separable from, or merely link (or bind by 42 | name) to the interfaces of, the Work and Derivative Works thereof. 43 | 44 | "Contribution" shall mean any work of authorship, including the original version 45 | of the Work and any modifications or additions to that Work or Derivative Works 46 | thereof, that is intentionally submitted to Licensor for inclusion in the Work 47 | by the copyright owner or by an individual or Legal Entity authorized to submit 48 | on behalf of the copyright owner. For the purposes of this definition, 49 | "submitted" means any form of electronic, verbal, or written communication sent 50 | to the Licensor or its representatives, including but not limited to 51 | communication on electronic mailing lists, source code control systems, and 52 | issue tracking systems that are managed by, or on behalf of, the Licensor for 53 | the purpose of discussing and improving the Work, but excluding communication 54 | that is conspicuously marked or otherwise designated in writing by the copyright 55 | owner as "Not a Contribution." 56 | 57 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf 58 | of whom a Contribution has been received by Licensor and subsequently 59 | incorporated within the Work. 60 | 61 | 2. Grant of Copyright License. 62 | 63 | Subject to the terms and conditions of this License, each Contributor hereby 64 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 65 | irrevocable copyright license to reproduce, prepare Derivative Works of, 66 | publicly display, publicly perform, sublicense, and distribute the Work and such 67 | Derivative Works in Source or Object form. 68 | 69 | 3. Grant of Patent License. 70 | 71 | Subject to the terms and conditions of this License, each Contributor hereby 72 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, 73 | irrevocable (except as stated in this section) patent license to make, have 74 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where 75 | such license applies only to those patent claims licensable by such Contributor 76 | that are necessarily infringed by their Contribution(s) alone or by combination 77 | of their Contribution(s) with the Work to which such Contribution(s) was 78 | submitted. If You institute patent litigation against any entity (including a 79 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a 80 | Contribution incorporated within the Work constitutes direct or contributory 81 | patent infringement, then any patent licenses granted to You under this License 82 | for that Work shall terminate as of the date such litigation is filed. 83 | 84 | 4. Redistribution. 85 | 86 | You may reproduce and distribute copies of the Work or Derivative Works thereof 87 | in any medium, with or without modifications, and in Source or Object form, 88 | provided that You meet the following conditions: 89 | 90 | You must give any other recipients of the Work or Derivative Works a copy of 91 | this License; and 92 | You must cause any modified files to carry prominent notices stating that You 93 | changed the files; and 94 | You must retain, in the Source form of any Derivative Works that You distribute, 95 | all copyright, patent, trademark, and attribution notices from the Source form 96 | of the Work, excluding those notices that do not pertain to any part of the 97 | Derivative Works; and 98 | If the Work includes a "NOTICE" text file as part of its distribution, then any 99 | Derivative Works that You distribute must include a readable copy of the 100 | attribution notices contained within such NOTICE file, excluding those notices 101 | that do not pertain to any part of the Derivative Works, in at least one of the 102 | following places: within a NOTICE text file distributed as part of the 103 | Derivative Works; within the Source form or documentation, if provided along 104 | with the Derivative Works; or, within a display generated by the Derivative 105 | Works, if and wherever such third-party notices normally appear. The contents of 106 | the NOTICE file are for informational purposes only and do not modify the 107 | License. You may add Your own attribution notices within Derivative Works that 108 | You distribute, alongside or as an addendum to the NOTICE text from the Work, 109 | provided that such additional attribution notices cannot be construed as 110 | modifying the License. 111 | You may add Your own copyright statement to Your modifications and may provide 112 | additional or different license terms and conditions for use, reproduction, or 113 | distribution of Your modifications, or for any such Derivative Works as a whole, 114 | provided Your use, reproduction, and distribution of the Work otherwise complies 115 | with the conditions stated in this License. 116 | 117 | 5. Submission of Contributions. 118 | 119 | Unless You explicitly state otherwise, any Contribution intentionally submitted 120 | for inclusion in the Work by You to the Licensor shall be under the terms and 121 | conditions of this License, without any additional terms or conditions. 122 | Notwithstanding the above, nothing herein shall supersede or modify the terms of 123 | any separate license agreement you may have executed with Licensor regarding 124 | such Contributions. 125 | 126 | 6. Trademarks. 127 | 128 | This License does not grant permission to use the trade names, trademarks, 129 | service marks, or product names of the Licensor, except as required for 130 | reasonable and customary use in describing the origin of the Work and 131 | reproducing the content of the NOTICE file. 132 | 133 | 7. Disclaimer of Warranty. 134 | 135 | Unless required by applicable law or agreed to in writing, Licensor provides the 136 | Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, 137 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, 138 | including, without limitation, any warranties or conditions of TITLE, 139 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are 140 | solely responsible for determining the appropriateness of using or 141 | redistributing the Work and assume any risks associated with Your exercise of 142 | permissions under this License. 143 | 144 | 8. Limitation of Liability. 145 | 146 | In no event and under no legal theory, whether in tort (including negligence), 147 | contract, or otherwise, unless required by applicable law (such as deliberate 148 | and grossly negligent acts) or agreed to in writing, shall any Contributor be 149 | liable to You for damages, including any direct, indirect, special, incidental, 150 | or consequential damages of any character arising as a result of this License or 151 | out of the use or inability to use the Work (including but not limited to 152 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or 153 | any and all other commercial damages or losses), even if such Contributor has 154 | been advised of the possibility of such damages. 155 | 156 | 9. Accepting Warranty or Additional Liability. 157 | 158 | While redistributing the Work or Derivative Works thereof, You may choose to 159 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or 160 | other liability obligations and/or rights consistent with this License. However, 161 | in accepting such obligations, You may act only on Your own behalf and on Your 162 | sole responsibility, not on behalf of any other Contributor, and only if You 163 | agree to indemnify, defend, and hold each Contributor harmless for any liability 164 | incurred by, or claims asserted against, such Contributor by reason of your 165 | accepting any such warranty or additional liability. 166 | 167 | END OF TERMS AND CONDITIONS 168 | 169 | APPENDIX: How to apply the Apache License to your work 170 | 171 | To apply the Apache License to your work, attach the following boilerplate 172 | notice, with the fields enclosed by brackets "[]" replaced with your own 173 | identifying information. (Don't include the brackets!) The text should be 174 | enclosed in the appropriate comment syntax for the file format. We also 175 | recommend that a file or class name and description of purpose be included on 176 | the same "printed page" as the copyright notice for easier identification within 177 | third-party archives. 178 | 179 | Copyright [yyyy] [name of copyright owner] 180 | 181 | Licensed under the Apache License, Version 2.0 (the "License"); 182 | you may not use this file except in compliance with the License. 183 | You may obtain a copy of the License at 184 | 185 | http://www.apache.org/licenses/LICENSE-2.0 186 | 187 | Unless required by applicable law or agreed to in writing, software 188 | distributed under the License is distributed on an "AS IS" BASIS, 189 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 190 | See the License for the specific language governing permissions and 191 | limitations under the License. 192 | -------------------------------------------------------------------------------- /extension/background.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | var OMNIBOX_MAX_RESULTS = 20; 18 | var REFERENCE_JS_URLS = [ 19 | // per web store policy, don't externally load scripts 20 | 'android-ref.js', // 'd.a.c/reference/lists.js', 21 | 'android-xml-ref.js' 22 | ]; 23 | 24 | 25 | chrome.omnibox.setDefaultSuggestion({ 26 | description: 'Loading Android SDK search data...' 27 | }); 28 | 29 | 30 | /** 31 | * Initialization function that tries to load the SDK reference JS, and upon 32 | * failure, continually attempts to load it every 5 seconds. Once loaded, 33 | * runs onScriptsLoaded to continue extension initialization. 34 | */ 35 | (function init() { 36 | function _success() { 37 | if (!DATA) { 38 | _error('(some script)'); 39 | return; 40 | } 41 | 42 | DATA = DATA.map(processReferenceItem); 43 | DATA = DATA.concat(XML_DATA.map(processXmlItem)); 44 | 45 | console.log('Successfully loaded SDK reference JS.'); 46 | onScriptsLoaded(); 47 | } 48 | 49 | function _error(script) { 50 | console.error('Failed to load ' + script + '. Retrying in 5 seconds.'); 51 | window.setTimeout(init, 5000); 52 | } 53 | 54 | loadScripts(REFERENCE_JS_URLS, _success, _error); 55 | })(); 56 | 57 | 58 | var nextid = 100000; 59 | 60 | 61 | /** 62 | * Creates a standard DATA-like object for something from JD_DATA 63 | */ 64 | function processReferenceItem(item) { 65 | item.type = 'ref'; 66 | return item; 67 | } 68 | 69 | 70 | /** 71 | * Creates a standard DATA-like object for something from JD_DATA 72 | */ 73 | function processDocsItem(item) { 74 | return { 75 | type: 'docs', 76 | id: ++nextid, 77 | label: item.label.replace(/</g, '<').replace(/>/g, '>'), 78 | subLabel: item.type, 79 | link: item.link 80 | }; 81 | } 82 | 83 | 84 | /** 85 | * Creates a standard DATA-like object for something from JD_DATA 86 | */ 87 | function processXmlItem(item) { 88 | item.type = 'ref.xml'; 89 | return item; 90 | } 91 | 92 | 93 | /** 94 | * Attempts to load a set of JS scripts by adding them to the . Provides 95 | * success and error callbacks. 96 | */ 97 | function loadScripts(urls, successFn, errorFn) { 98 | urls = urls || []; 99 | urls = urls.slice(); // clone 100 | 101 | var _loadNext = function() { 102 | var url = urls.shift(); 103 | if (!url) { 104 | successFn(); 105 | return; 106 | } 107 | loadScript(url, _loadNext, errorFn); 108 | }; 109 | 110 | _loadNext(); 111 | } 112 | 113 | 114 | /** 115 | * Attempts to load a JS script by adding it to the . Provides 116 | * success and error callbacks. 117 | */ 118 | function loadScript(url, successFn, errorFn) { 119 | successFn = successFn || function(){}; 120 | errorFn = errorFn || function(){}; 121 | 122 | if (!url) { 123 | errorFn('(no script)'); 124 | return; 125 | } 126 | 127 | var loadComplete = false; 128 | 129 | var headNode = document.getElementsByTagName('head')[0]; 130 | var scriptNode = document.createElement('script'); 131 | scriptNode.type = 'text/javascript'; 132 | scriptNode.src = url; 133 | scriptNode.onload = scriptNode.onreadystatechange = function() { 134 | if ((!scriptNode.readyState || 135 | 'loaded' === scriptNode.readyState || 136 | 'complete' === scriptNode.readyState) 137 | && !loadComplete) { 138 | scriptNode.onload = scriptNode.onreadystatechange = null; 139 | if (headNode && scriptNode.parentNode) { 140 | headNode.removeChild(scriptNode); 141 | } 142 | scriptNode = undefined; 143 | loadComplete = true; 144 | successFn(); 145 | } 146 | } 147 | scriptNode.onerror = function() { 148 | if (!loadComplete) { 149 | loadComplete = true; 150 | errorFn(url); 151 | } 152 | }; 153 | 154 | headNode.appendChild(scriptNode); 155 | } 156 | 157 | 158 | /** 159 | * Second-stage initialization function. This contains all the Omnibox 160 | * setup features. 161 | */ 162 | function onScriptsLoaded() { 163 | chrome.omnibox.setDefaultSuggestion({ 164 | description: 'Search Android SDK docs for %s' 165 | }); 166 | 167 | chrome.omnibox.onInputChanged.addListener( 168 | function(query, suggestFn) { 169 | if (!query) 170 | return; 171 | 172 | suggestFn = suggestFn || function(){}; 173 | query = query.replace(/(^ +)|( +$)/g, ''); 174 | 175 | var queryPartsLower = query.toLowerCase().match(/[^\s]+/g) || []; 176 | 177 | // Filter all classes/packages. 178 | var results = []; 179 | 180 | for (var i = 0; i < DATA.length; i++) { 181 | var result = DATA[i]; 182 | var textLower = (result.label + ' ' + result.subLabel).toLowerCase(); 183 | for (var j = 0; j < queryPartsLower.length; j++) { 184 | if (!queryPartsLower[j]) { 185 | continue; 186 | } 187 | 188 | if (textLower.indexOf(queryPartsLower[j]) >= 0) { 189 | results.push(result); 190 | break; 191 | } 192 | } 193 | } 194 | 195 | // Rank them. 196 | rankResults(results, query); 197 | 198 | console.clear(); 199 | for (var i = 0; i < Math.min(20, results.length); i++) { 200 | console.log(results[i].__resultScore + ' ' + results[i].label); 201 | } 202 | 203 | // Add them as omnibox results, with prettyish formatting 204 | // (highlighting, etc.). 205 | var capitalLetterRE = new RegExp(/[A-Z]/); 206 | var queryLower = query.toLowerCase(); 207 | var queryAlnumDotParts = queryLower.match(/[\&\;\-\w\.]+/g) || ['']; 208 | var queryREs = queryAlnumDotParts.map(function(q) { 209 | return new RegExp('(' + q.replace(/\./g, '\\.') + ')', 'ig'); 210 | }); 211 | 212 | var omniboxResults = []; 213 | for (var i = 0; i < OMNIBOX_MAX_RESULTS && i < results.length; i++) { 214 | var result = results[i]; 215 | 216 | var description = result.label; 217 | var firstCap = description.search(capitalLetterRE); 218 | if (firstCap >= 0 && result.type != 'ref.xml') { 219 | var newDesc; 220 | newDesc = '%{' + description.substring(0, firstCap) + '}%'; 221 | newDesc += description.substring(firstCap); 222 | description = newDesc; 223 | } 224 | 225 | var subDescription = result.subLabel || ''; 226 | if (subDescription) { 227 | description += ' %{(' + subDescription + ')}%'; 228 | } 229 | 230 | for (var j = 0; j < queryREs.length; j++) { 231 | description = description.replace(queryREs[j], '%|$1|%'); 232 | } 233 | 234 | // Remove HTML tags from description since omnibox cannot display them. 235 | description = description.replace(/\/g, '>'); 236 | 237 | // Convert special markers to Omnibox XML 238 | description = description 239 | .replace(/\%\{/g, '') 240 | .replace(/\}\%/g, '') 241 | .replace(/\%\|/g, '') 242 | .replace(/\|\%/g, ''); 243 | 244 | omniboxResults.push({ 245 | content: 'https://developer.android.com/' + result.link, 246 | description: description 247 | }); 248 | } 249 | 250 | suggestFn(omniboxResults); 251 | } 252 | ); 253 | 254 | chrome.omnibox.onInputEntered.addListener(function(text) { 255 | if (text.match(/^https?\:/)) { 256 | navigateToUrl(text); 257 | } else { 258 | navigateToUrl('https://developer.android.com/s/results/?q=' + 259 | encodeURIComponent(text)); 260 | } 261 | }); 262 | } 263 | 264 | 265 | function navigateToUrl(url) { 266 | chrome.tabs.getSelected(null, function(tab) { 267 | chrome.tabs.update(tab.id, {url: url}); 268 | }); 269 | } 270 | 271 | 272 | /** 273 | * Helper function that gets the index of the last occurence of the given 274 | * regex in the given string, or -1 if not found. 275 | */ 276 | function regexFindLast(s, re) { 277 | if (s == '') 278 | return -1; 279 | var l = -1; 280 | var tmp; 281 | while ((tmp = s.search(re)) >= 0) { 282 | if (l < 0) l = 0; 283 | l += tmp; 284 | s = s.substr(tmp + 1); 285 | } 286 | return l; 287 | } 288 | 289 | 290 | /** 291 | * Helper function that counts the occurrences of a given character in 292 | * a given string. 293 | */ 294 | function countChars(s, c) { 295 | var n = 0; 296 | for (var i=0; i= 0) { 349 | // exact part match 350 | var partsAfter = countChars(labelLower.substr(t + 1), '.'); 351 | score *= 60 / (partsAfter + 1); 352 | } else { 353 | t = regexFindLast(labelLower, partialMatchRe); 354 | if (t >= 0) { 355 | // partial match 356 | var partsAfter = countChars(labelLower.substr(t + 1), '.'); 357 | score *= 20 / (partsAfter + 1); 358 | } 359 | } 360 | 361 | if (!result.type.match(/ref/)) { 362 | // downgrade non-reference docs 363 | score /= 1.5; 364 | } 365 | 366 | score /= (1 + order / 2); 367 | 368 | return score; 369 | } 370 | -------------------------------------------------------------------------------- /extension/android-xml-ref.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | var XML_DATA = [ 18 | { label:"AndroidManifest.xml", link:"guide/topics/manifest/manifest-intro.html", extraRank:1 }, 19 | 20 | // Manifest 21 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/action-element.html" }, 22 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/activity-element.html" }, 23 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/activity-alias-element.html" }, 24 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/application-element.html" }, 25 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/category-element.html" }, 26 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/compatible-screens-element.html" }, 27 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/data-element.html" }, 28 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/grant-uri-permission-element.html" }, 29 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/instrumentation-element.html" }, 30 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/intent-filter-element.html" }, 31 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/manifest-element.html" }, 32 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/meta-data-element.html" }, 33 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/path-permission-element.html" }, 34 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/permission-element.html" }, 35 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/permission-group-element.html" }, 36 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/permission-tree-element.html" }, 37 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/provider-element.html" }, 38 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/receiver-element.html" }, 39 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/service-element.html" }, 40 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/supports-gl-texture-element.html" }, 41 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/supports-screens-element.html" }, 42 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/uses-configuration-element.html" }, 43 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/uses-feature-element.html" }, 44 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/uses-library-element.html" }, 45 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/uses-permission-element.html" }, 46 | { subLabel:"AndroidManifest.xml", label:"", link:"guide/topics/manifest/uses-sdk-element.html" }, 47 | 48 | // Animations 49 | { subLabel:"Animation Resources", label:"", link:"guide/topics/graphics/animation.html#declaring-xml" }, 50 | { subLabel:"Animation Resources", label:"", link:"guide/topics/graphics/animation.html#declaring-xml" }, 51 | 52 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#set-element" }, 53 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#set-element" }, 54 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#set-element" }, 55 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#set-element" }, 56 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#set-element" }, 57 | 58 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#animation-list-element" }, 59 | 60 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 61 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 62 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 63 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 64 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 65 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 66 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 67 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 68 | { subLabel:"Animation Resources", label:"", link:"guide/topics/resources/animation-resource.html#Interpolators" }, 69 | 70 | // Drawables 71 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#bitmap-element" }, 72 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#ninepatch-element" }, 73 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#layerlist-element" }, 74 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#selector-element" }, 75 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#levellist-element" }, 76 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#transition-element" }, 77 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#inset-element" }, 78 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#clip-element" }, 79 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#scale-element" }, 80 | 81 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#shape-element" }, 82 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#corners-element" }, 83 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#gradient-element" }, 84 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#padding-element" }, 85 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#size-element" }, 86 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#solid-element" }, 87 | { subLabel:"Drawable Resources", label:"", link:"guide/topics/resources/drawable-resource.html#stroke-element" }, 88 | 89 | // Layout 90 | { subLabel:"Layouts", label:"", link:"guide/topics/fundamentals/fragments.html#Adding" }, 91 | { subLabel:"Layouts", label:"", link:"guide/topics/resources/layout-resource.html#include-element" }, 92 | { subLabel:"Layouts", label:"", link:"guide/topics/resources/layout-resource.html#requestfocus-element" }, 93 | { subLabel:"Layouts", label:"", link:"guide/topics/resources/layout-resource.html#merge-element" }, 94 | 95 | // Menu 96 | { subLabel:"Menu Resources", label:"", link:"guide/topics/resources/menu-resource.html#menu-element" }, 97 | { subLabel:"Menu Resources", label:"", link:"guide/topics/resources/menu-resource.html#group-element" }, 98 | // { subLabel:"Menu Resources", label:"", link:"guide/topics/resources/menu-resource.html#item-element" }, 99 | 100 | // String 101 | { subLabel:"String Resources", label:"", link:"guide/topics/resources/string-resource.html#string-element" }, 102 | { subLabel:"String Resources", label:"", link:"guide/topics/resources/string-resource.html#string-array-element" }, 103 | // { subLabel:"String Resources", label:"", link:"guide/topics/resources/string-resource.html#string-array-item-element" }, 104 | { subLabel:"String Resources", label:"", link:"guide/topics/resources/string-resource.html#plurals-element" }, 105 | // { subLabel:"String Resources", label:"", link:"guide/topics/resources/string-resource.html#plurals-item-element" }, 106 | 107 | // Style 108 | { subLabel:"Style/Theme Resources", label:"