Merge commit 'd54f8c2d1b4d88db84465fee93aa29103ca32078' into HEAD

Change-Id: I3cf53f083dee277a450dac36b011bc83180f6294
This commit is contained in:
The Android Open Source Project 2013-12-05 12:59:39 -08:00
commit 722581a598
19 changed files with 212 additions and 57 deletions

View file

@ -205,6 +205,9 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*)
# 4.4.1
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************

View file

@ -1262,6 +1262,7 @@ ifdef PRODUCT_EXTRA_RECOVERY_KEYS
endif
$(hide) echo 'mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)' >> $(zip_root)/META/misc_info.txt
$(hide) echo "use_set_metadata=1" >> $(zip_root)/META/misc_info.txt
$(hide) echo "update_rename_support=1" >> $(zip_root)/META/misc_info.txt
$(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt)
@# Zip everything up, preserving symlinks
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)

View file

@ -15,7 +15,9 @@ endif
$(foreach header,$(LOCAL_COPY_HEADERS), \
$(eval _chFrom := $(LOCAL_PATH)/$(header)) \
$(eval _chTo := \
$($(my_prefix)OUT_HEADERS)/$(LOCAL_COPY_HEADERS_TO)/$(notdir $(header))) \
$(if $(LOCAL_COPY_HEADERS_TO),\
$($(my_prefix)OUT_HEADERS)/$(LOCAL_COPY_HEADERS_TO)/$(notdir $(header)),\
$($(my_prefix)OUT_HEADERS)/$(notdir $(header)))) \
$(eval $(call copy-one-header,$(_chFrom),$(_chTo))) \
$(eval all_copied_headers: $(_chTo)) \
)

View file

@ -23,6 +23,7 @@ PRODUCT_PACKAGES += \
android.test.runner \
app_process \
applypatch \
blkid \
bmgr \
bugreport \
content \

View file

@ -33,6 +33,8 @@ PRODUCT_PACKAGES += \
bu \
com.android.location.provider \
com.android.location.provider.xml \
com.android.media.remotedisplay \
com.android.media.remotedisplay.xml \
drmserver \
framework-res \
installd \

View file

@ -49,6 +49,9 @@ PRODUCT_PROPERTY_OVERRIDES := \
# Put en_US first in the list, so make it default.
PRODUCT_LOCALES := en_US
# Include drawables for all densities
PRODUCT_AAPT_CONFIG := normal hdpi xhdpi xxhdpi
# Get some sounds
$(call inherit-product-if-exists, frameworks/base/data/sounds/AllAudio.mk)

View file

@ -393,6 +393,17 @@ video.with-shadow {
#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;
@ -860,7 +871,40 @@ scroll top left;
.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;
}
/* landing page disclosures */
.landing-page-link {
@ -1123,6 +1167,9 @@ 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;
}
@ -2105,16 +2152,15 @@ pre {
border: solid 1px #ddd;
background: #f7f7f7;
}
.str { color: #080; }
.str { color: #800; } /* Code string */
.kwd { color: #008; }
.com { color: #800; }
.typ { color: #606; }
.lit { color: #066; }
.pun { color: #660; }
.pln { color: #000; }
.tag { color: #008; }
.atn { color: #828; }
.atv { color: #080; }
.atv { color: #800; } /* XML string */
.dec { color: #606; }
/* --------------------------------------------------------------------------
@ -2450,13 +2496,12 @@ Lightbox
background-position: -10px 0;
}
/* --------------------------------------------------------------------------
Styles for samples project trees and code browsing in resources tab
*/
#codesample-wrapper {
width:1000px;
width:100000px; /* super wide to contain floats, but doesn't cause scroll */
overflow:visible;
}
pre#codesample-block {
@ -2465,6 +2510,9 @@ pre#codesample-block {
background:transparent;
border:none;
}
pre#codesample-block a.number {
display:none;
}
pre#codesample-block .code-line:hover {
background:#e7e7e7;
}
@ -2823,7 +2871,9 @@ div.design-announce p {
}
/* 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;
@ -2832,11 +2882,15 @@ a.notice-designers {
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;
@ -2847,24 +2901,41 @@ 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:14px;
font-weight:normal;
font-size:13px;
line-height:18px;
font-weight:bold;
text-transform:uppercase;
color:#000 !important;
margin:0;
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:16px;
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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View file

@ -241,7 +241,7 @@ false; // navigate across topic boundaries only in design docs
var training = $(".next-class-link").length; // decides whether to provide "next class" link
var isCrossingBoundary = false;
if ($selListItem.hasClass('nav-section')) {
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)');
@ -262,12 +262,17 @@ false; // navigate across topic boundaries only in design docs
} else {
// jump to the next topic in this section (if it exists)
$nextLink = $selListItem.next('li').find('a:eq(0)');
if (!$nextLink.length) {
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.nav-section').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; });
}
}
}
}
@ -285,10 +290,11 @@ false; // navigate across topic boundaries only in design docs
$('.next-page-link').attr('href','')
.removeClass("hide").addClass("disabled")
.click(function() { return false; });
$('.next-class-link').attr('href',$nextLink.attr('href'))
.removeClass("hide").append($nextLink.html());
$('.next-class-link').find('.new').empty();
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");
}
@ -567,7 +573,7 @@ function initExpandableNavItems(rootTag) {
} else {
/* show me */
// first hide all other siblings
var $others = $('li.nav-section.expanded', $(this).closest('ul'));
var $others = $('li.nav-section.expanded', $(this).closest('ul')).not('.sticky');
$others.removeClass('expanded').children('ul').slideUp(250);
// now expand me
@ -2156,12 +2162,6 @@ google.setOnLoadCallback(function(){
// when an event on the browser history occurs (back, forward, load) requery hash and do search
$(window).hashchange( function(){
// Handle hash changes in the samples browser
if ($("body").hasClass("samples") && location.href.indexOf("/samples/index.html") != -1) {
showSamples();
highlightSidenav();
resizeNav();
}
// Exit if the hash isn't a search query or there's an error in the query
if ((location.hash.indexOf("q=") == -1) || (query == "undefined")) {
// If the results pane is open, close it.
@ -2382,7 +2382,8 @@ function toggleVisisbleApis(selectedLevel, context) {
// 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");
+ apiLevel + "\" or higher. To reveal, change the target API level "
+ "above the left navigation.");
}
else obj.removeClass("absent").removeAttr("title");
});
@ -2710,6 +2711,9 @@ function init_google_navtree2(navtree_id, data)
$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);
}
@ -2722,9 +2726,11 @@ function new_google_node2(node_data)
var $li = $('<li>');
var $a;
if (node_data[NODE_HREF] != null) {
$a = $('<a href="' + toRoot + node_data[NODE_HREF] + '">' + linkText + '</a>');
$a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >'
+ linkText + '</a>');
} else {
$a = $('<a href="#" onclick="return false;">' + linkText + '/</a>');
$a = $('<a href="#" onclick="return false;" title="' + linkText + '" >'
+ linkText + '/</a>');
}
var $childUl = $('<ul>');
if (node_data[NODE_CHILDREN] != null) {
@ -2791,9 +2797,18 @@ function init_default_samples_navtree(toroot) {
$.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();
}
}
});
}
@ -2943,10 +2958,31 @@ function selectText(element) {
range.moveToElementText(element);
range.select();
} else if (window.getSelection) { //all others
selection = window.getSelection();
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);
}

View file

@ -214,7 +214,8 @@ def:default_left_nav() ?>
<a class="totop" href="#top" data-g-event="left-nav-top">to top</a>
<div id="api-nav-header">
<div id="api-level-toggle">
<label for="apiLevelCheckbox" class="disabled">API level: </label>
<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() -->
@ -239,7 +240,7 @@ def:default_left_nav() ?>
<div id="packages-nav" class="scroll-pane">
<ul>
<?cs call:package_link_list(docs.packages) ?>
<?cs call:package_link_list(docs.packages) ?>
</ul><br/>
</div> <!-- end packages-nav -->

View file

@ -19,11 +19,9 @@
&#124; <a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/project.html">Project</a>
&#124; <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip">Download</a>
</div><!-- end sum-details-links -->
<div class="api-level">
Other info
</div>
</div> <!-- end api-info-block -->
</div><!-- end sum-details-links -->
</div><!-- end breadcurmb block -->
<div id="jd-header" style="border:0;">
@ -57,11 +55,6 @@
<pre id="codesample-block"><?cs var:fileContents ?></pre>
</div>
<h3 id="file-location" style="clear:left">Source file location</h3>
<p>The file containing the source code shown below is located in the corresponding directory in
<code>&lt;sdk&gt;/samples/android-&lt;version&gt;/...</code></p>
<!-- end file contents -->
<script type="text/javascript">
initCodeLineNumbers();
@ -74,11 +67,6 @@
# else, this means it's offline docs,
so don't show src links (we dont have the pages!) ?>
<p>You can find the source code for this sample in your SDK at:</p>
<p style="margin-left:2em">
<code><em>&lt;sdk&gt;</em>/samples/android-<em>&lt;version&gt;</em>/</code>
</p>
<?cs /if ?><?cs # end if/else online docs ?>
</div> <!-- end jd-content -->

View file

@ -23,9 +23,7 @@
&#124; <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip">Download</a>
</div><!-- end sum-details-links -->
<div class="api-level">
Other info
</div>
</div><!-- end breadcurmb block -->
<h1 itemprop="name"><?cs var:projectDir ?></h1>
@ -79,11 +77,6 @@
# else, this means it's offline docs,
so don't show src links (we dont have the pages!) ?>
<p>You can find the source code for this sample in your SDK at:</p>
<p style="margin-left:2em">
<code><em>&lt;sdk&gt;</em>/samples/android-<em>&lt;version&gt;</em>/</code>
</p>
<?cs /if ?><?cs # end if/else online docs ?>
</div> <!-- end jd-content -->

View file

@ -184,6 +184,11 @@ class EdifyGenerator(object):
cmd = "delete(" + ",\0".join(['"%s"' % (i,) for i in file_list]) + ");"
self.script.append(self._WordWrap(cmd))
def RenameFile(self, srcfile, tgtfile):
"""Moves a file from one location to another."""
if self.info.get("update_rename_support", False):
self.script.append('rename("%s", "%s");' % (srcfile, tgtfile))
def ApplyPatch(self, srcfile, tgtfile, tgtsize, tgtsha1, *patchpairs):
"""Apply binary patches (in *patchpairs) to the given srcfile to
produce tgtfile (which may be "-" to indicate overwriting the

View file

@ -108,6 +108,31 @@ def IsRegular(info):
symlink."""
return (info.external_attr >> 28) == 010
def ClosestFileMatch(src, tgtfiles, existing):
"""Returns the closest file match between a source file and list
of potential matches. The exact filename match is preferred,
then the sha1 is searched for, and finally a file with the same
basename is evaluated. Rename support in the updater-binary is
required for the latter checks to be used."""
result = tgtfiles.get("path:" + src.name)
if result is not None:
return result
if not OPTIONS.target_info_dict.get("update_rename_support", False):
return None
if src.size < 1000:
return None
result = tgtfiles.get("sha1:" + src.sha1)
if result is not None and existing.get(result.name) is None:
return result
result = tgtfiles.get("file:" + src.name.split("/")[-1])
if result is not None and existing.get(result.name) is None:
return result
return None
class Item:
"""Items represent the metadata (user, group, mode) of files and
directories in the system image."""
@ -514,11 +539,27 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
verbatim_targets = []
patch_list = []
diffs = []
renames = {}
largest_source_size = 0
matching_file_cache = {}
for fn in source_data.keys():
sf = source_data[fn]
assert fn == sf.name
matching_file_cache["path:" + fn] = sf
# Only allow eligability for filename/sha matching
# if there isn't a perfect path match.
if target_data.get(sf.name) is None:
matching_file_cache["file:" + fn.split("/")[-1]] = sf
matching_file_cache["sha:" + sf.sha1] = sf
for fn in sorted(target_data.keys()):
tf = target_data[fn]
assert fn == tf.name
sf = source_data.get(fn, None)
sf = ClosestFileMatch(tf, matching_file_cache, renames)
if sf is not None and sf.name != tf.name:
print "File has moved from " + sf.name + " to " + tf.name
renames[sf.name] = tf
if sf is None or fn in OPTIONS.require_verbatim:
# This file should be included verbatim
@ -531,7 +572,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
# File is different; consider sending as a patch
diffs.append(common.Difference(tf, sf))
else:
# Target file identical to source.
# Target file data identical to source (may still be renamed)
pass
common.ComputeDifferences(diffs)
@ -543,8 +584,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
tf.AddToZip(output_zip)
verbatim_targets.append((tf.name, tf.size))
else:
common.ZipWriteStr(output_zip, "patch/" + tf.name + ".p", d)
patch_list.append((tf.name, tf, sf, tf.size, common.sha1(d).hexdigest()))
common.ZipWriteStr(output_zip, "patch/" + sf.name + ".p", d)
patch_list.append((sf.name, tf, sf, tf.size, common.sha1(d).hexdigest()))
largest_source_size = max(largest_source_size, sf.size)
source_fp = GetBuildProp("ro.build.fingerprint", OPTIONS.source_info_dict)
@ -626,7 +667,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
script.Print("Removing unneeded files...")
script.DeleteFiles(["/"+i[0] for i in verbatim_targets] +
["/"+i for i in sorted(source_data)
if i not in target_data] +
if i not in target_data and
i not in renames] +
["/system/recovery.img"])
script.ShowProgress(0.8, 0)
@ -713,6 +755,13 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
script.Print("Unpacking new recovery...")
script.UnpackPackageDir("recovery", "/system")
if len(renames) > 0:
script.Print("Renaming files...")
for src in renames:
print "Renaming " + src + " to " + renames[src].name
script.RenameFile(src, renames[src].name)
script.Print("Symlinks and permissions...")
# Create all the symlinks that don't already exist, or point to