am ddde20b6: Merge "fix android build number in footer of gms and gcm reference" into jb-mr1-dev

* commit 'ddde20b67c521fbd7ad090f7a1e4ab3f69865b4f':
  fix android build number in footer of gms and gcm reference
diff --git a/CleanSpec.mk b/CleanSpec.mk
index f4d45ff..59b7d68 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -150,6 +150,8 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*)
 
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
+
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
 # ************************************************
diff --git a/core/build_id.mk b/core/build_id.mk
index cfff307..09f1779 100644
--- a/core/build_id.mk
+++ b/core/build_id.mk
@@ -23,7 +23,7 @@
 # (like "TC1-RC5").  It must be a single word, and is
 # capitalized by convention.
 #
-BUILD_ID := JB_MR1
+BUILD_ID := JB_MR1.1
 
 # DISPLAY_BUILD_NUMBER should only be set for development branches,
 # If set, the BUILD_NUMBER (cl) is appended to the BUILD_ID for
diff --git a/core/definitions.mk b/core/definitions.mk
index 06db960..4f4e583 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -2064,6 +2064,29 @@
 endef
 
 ###########################################################
+## API Check
+###########################################################
+
+# eval this to define a rule that runs apicheck.
+#
+# Args:
+#    $(1)  target
+#    $(2)  stable api file
+#    $(3)  api file to be tested
+#    $(4)  arguments for apicheck
+#    $(5)  command to run if apicheck failed
+#    $(6)  target dependent on this api check
+#    $(7)  additional dependencies
+define check-api
+$(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp: $(2) $(3) $(APICHECK) $(7)
+	@echo "Checking API:" $(1)
+	$(hide) ( $(APICHECK_COMMAND) $(4) $(2) $(3) || ( $(5) ; exit 38 ) )
+	$(hide) mkdir -p $$(dir $$@)
+	$(hide) touch $$@
+$(6): $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp
+endef
+
+###########################################################
 ## Other includes
 ###########################################################
 
diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk
index 8d9928e..2c1300b 100644
--- a/core/tasks/apicheck.mk
+++ b/core/tasks/apicheck.mk
@@ -22,58 +22,48 @@
 
 .PHONY: checkapi
 
-# eval this to define a rule that runs apicheck.
-#
-# Args:
-#    $(1)  target
-#    $(2)  stable api file
-#    $(3)  api file to be tested
-#    $(4)  arguments for apicheck
-#    $(5)  command to run if apicheck failed
-define check-api
-$(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp: $(2) $(3) $(APICHECK)
-	@echo "Checking API:" $(1)
-	$(hide) ( $(APICHECK_COMMAND) $(4) $(2) $(3) || ( $(5) ; exit 38 ) )
-	$(hide) mkdir -p $$(dir $$@)
-	$(hide) touch $$@
-checkapi: $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp
-endef
-
 # Run the checkapi rules by default.
 droidcore: checkapi
 
 last_released_sdk_version := $(lastword $(call numerically_sort, \
-            $(filter-out $(SRC_API_DIR)/current, \
+            $(filter-out current, \
                 $(patsubst $(SRC_API_DIR)/%.txt,%, $(wildcard $(SRC_API_DIR)/*.txt)) \
              )\
         ))
 
 # INTERNAL_PLATFORM_API_FILE is the one build by droiddoc.
+# Note that since INTERNAL_PLATFORM_API_FILE is the byproduct of api-stubs module,
+# (See frameworks/base/Android.mk)
+# we need to add api-stubs as additional dependency of the api check.
 
 # Check that the API we're building hasn't broken the last-released
 # SDK version.
 $(eval $(call check-api, \
-	checkapi-last, \
-	$(SRC_API_DIR)/$(last_released_sdk_version).txt, \
-	$(INTERNAL_PLATFORM_API_FILE), \
-	-hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 \
-	-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
-	-error 16 -error 17 -error 18 , \
-	cat $(BUILD_SYSTEM)/apicheck_msg_last.txt \
-	))
+    checkapi-last, \
+    $(SRC_API_DIR)/$(last_released_sdk_version).txt, \
+    $(INTERNAL_PLATFORM_API_FILE), \
+    -hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 \
+    -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
+    -error 16 -error 17 -error 18 , \
+    cat $(BUILD_SYSTEM)/apicheck_msg_last.txt, \
+    checkapi, \
+    $(call doc-timestamp-for,api-stubs) \
+    ))
 
 # Check that the API we're building hasn't changed from the not-yet-released
 # SDK version.
 $(eval $(call check-api, \
-	checkapi-current, \
-	$(SRC_API_DIR)/current.txt, \
-	$(INTERNAL_PLATFORM_API_FILE), \
-	-error 2 -error 3 -error 4 -error 5 -error 6 \
-	-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
-	-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
-	-error 25 , \
-	cat $(BUILD_SYSTEM)/apicheck_msg_current.txt \
-	))
+    checkapi-current, \
+    $(SRC_API_DIR)/current.txt, \
+    $(INTERNAL_PLATFORM_API_FILE), \
+    -error 2 -error 3 -error 4 -error 5 -error 6 \
+    -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
+    -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
+    -error 25 , \
+    cat $(BUILD_SYSTEM)/apicheck_msg_current.txt, \
+    checkapi, \
+    $(call doc-timestamp-for,api-stubs) \
+    ))
 
 .PHONY: update-api
 update-api: $(INTERNAL_PLATFORM_API_FILE) | $(ACP)
diff --git a/core/version_defaults.mk b/core/version_defaults.mk
index fb1f361..e3ba14f 100644
--- a/core/version_defaults.mk
+++ b/core/version_defaults.mk
@@ -41,7 +41,7 @@
   # which is the version that we reveal to the end user.
   # Update this value when the platform version changes (rather
   # than overriding it somewhere else).  Can be an arbitrary string.
-  PLATFORM_VERSION := 4.2.1
+  PLATFORM_VERSION := 4.2.2
 endif
 
 ifeq "" "$(PLATFORM_SDK_VERSION)"
diff --git a/target/product/core.mk b/target/product/core.mk
index 831298a..1d62eb8 100644
--- a/target/product/core.mk
+++ b/target/product/core.mk
@@ -37,7 +37,6 @@
     KeyChain \
     MediaProvider \
     PackageInstaller \
-    PhotoTable \
     PicoTts \
     SettingsProvider \
     SharedStorageBackup \
diff --git a/target/product/full_base.mk b/target/product/full_base.mk
index 2c24b1a..b2e3189 100644
--- a/target/product/full_base.mk
+++ b/target/product/full_base.mk
@@ -37,7 +37,8 @@
     MagicSmokeWallpapers \
     NoiseField \
     PhaseBeam \
-    VisualizationWallpapers
+    VisualizationWallpapers \
+    PhotoTable
 
 # Additional settings used in all AOSP builds
 PRODUCT_PROPERTY_OVERRIDES := \
diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk
index f139cbd..5bdc596 100644
--- a/target/product/generic_no_telephony.mk
+++ b/target/product/generic_no_telephony.mk
@@ -26,7 +26,7 @@
     Calendar \
     CertInstaller \
     DrmProvider \
-    Email2 \
+    Email \
     Exchange2 \
     FusedLocation \
     Gallery2 \
diff --git a/target/product/large_emu_hw.mk b/target/product/large_emu_hw.mk
index 27ebc96..8a070b1 100644
--- a/target/product/large_emu_hw.mk
+++ b/target/product/large_emu_hw.mk
@@ -27,7 +27,7 @@
     Calendar \
     CertInstaller \
     DrmProvider \
-    Email2 \
+    Email \
     Exchange2 \
     Gallery2 \
     LatinIME \
diff --git a/target/product/mini.mk b/target/product/mini.mk
index 76d4511..b69c917 100644
--- a/target/product/mini.mk
+++ b/target/product/mini.mk
@@ -218,7 +218,7 @@
 PRODUCT_PACKAGES += \
     TestingCamera \
     Home \
-    DummySystemUI \
-    DummySettings \
+    SystemUI \
+    Settings \
     libsurfaceflinger_ddmconnection
 
diff --git a/target/product/sdk.mk b/target/product/sdk.mk
index 88fc2f3..6f56bb5 100644
--- a/target/product/sdk.mk
+++ b/target/product/sdk.mk
@@ -20,7 +20,7 @@
 PRODUCT_PACKAGES := \
 	Calculator \
 	DeskClock \
-	Email2 \
+	Email \
 	Exchange2 \
 	FusedLocation \
 	Gallery \
diff --git a/tools/droiddoc/templates-sdk/assets/css/default.css b/tools/droiddoc/templates-sdk/assets/css/default.css
index de47705..6753c69 100644
--- a/tools/droiddoc/templates-sdk/assets/css/default.css
+++ b/tools/droiddoc/templates-sdk/assets/css/default.css
@@ -1094,7 +1094,7 @@
 dd ul,
 dd ol,
 dd dl {
-  margin:10px 0 0;
+  margin-top:10px;
 }
 li p,
 li pre,
@@ -3969,7 +3969,7 @@
 .jspPane {
   position: absolute;
   overflow: hidden;
-  width:auto !important; /* to avoid cut-off api names in reference in horiz scroll */
+  width:100% !important; /* to avoid cut-off api names in reference in horiz scroll */
 }
 
 .jspVerticalBar {
diff --git a/tools/droiddoc/templates-sdk/assets/js/docs.js b/tools/droiddoc/templates-sdk/assets/js/docs.js
index eec97b2..1b878b3 100644
--- a/tools/droiddoc/templates-sdk/assets/js/docs.js
+++ b/tools/droiddoc/templates-sdk/assets/js/docs.js
@@ -6,11 +6,16 @@
 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 *********/
 
@@ -142,6 +147,9 @@
     }
   }
 
+  // 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
@@ -169,9 +177,8 @@
   // highlight Develop tab
   } else if ($("body").hasClass("develop") || $("body").hasClass("google")) {
     $("#header li.develop a").addClass("selected");
-
     // In Develop docs, also highlight appropriate sub-tab
-    var rootDir = pagePath.substring(1,pagePath.indexOf('/', 1));
+    var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1));
     if (rootDir == "training") {
       $("#nav-x li.training a").addClass("selected");
     } else if (rootDir == "guide") {
@@ -194,21 +201,16 @@
     $("#header li.distribute a").addClass("selected");
   }
 
+  // set global variable so we can highlight the sidenav a bit later (such as for google reference)
+  // and highlight the sidenav
+  mPagePath = pagePath;
+  highlightSidenav();
 
-  // select current page in sidenav and header, and set up prev/next links if they exist
+  // set up prev/next links if they exist
   var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]');
   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();
-    });
 
     // set up prev links
     var $prevLink = [];
@@ -586,6 +588,24 @@
 // END of the onload event
 
 
+function highlightSidenav() {
+  // select current page in sidenav and header, and set up prev/next links if they exist
+  var $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 toggleFullscreen(enable) {
   var delay = 20;
@@ -1509,6 +1529,12 @@
 var ROW_COUNT_GOOGLE = 15;          // max number of results in list
 var gGoogleListLength = 0;
 
+function onSuggestionClick(link) {
+  // When user clicks a suggested document, track it
+  _gaq.push(['_trackEvent', 'Suggestion Click', 'clicked: ' + $(link).text(),
+            'from: ' + $("#search_autocomplete").val()]);
+}
+
 function set_item_selected($li, selected)
 {
     if (selected) {
@@ -1538,7 +1564,7 @@
         $(this).addClass('jd-selected');
         gSelectedIndex = $('#search_filtered li').index(this);
     });
-    $li.append('<a></a>');
+    $li.append("<a onclick='onSuggestionClick(this)'></a>");
     $li.attr('class','show-item');
     return $li;
 }
@@ -1892,6 +1918,11 @@
     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);
 
@@ -1970,6 +2001,17 @@
   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() {
+      _gaq.push(['_trackEvent', 'Google Click', 'clicked: ' + $(this).text(),
+                'from: ' + $("#search_autocomplete").val()]);
+    });
+  });
+}
+
 
 function getQuery(hash) {
   var queryParts = hash.split('=');
@@ -2295,7 +2337,13 @@
 }
 
 function init_default_navtree(toroot) {
-  init_navtree("tree-list", toroot, NAVTREE_DATA);
+  // 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();
@@ -2352,7 +2400,6 @@
   me.node.depth = 0;
 
   get_google_node(me, me.node);
-
 }
 
 function new_google_node(me, mom, text, link, children_data, api_level)
@@ -2424,15 +2471,30 @@
 function showGoogleRefTree() {
   init_default_google_navtree(toRoot);
   init_default_gcm_navtree(toRoot);
-  resizeNav();
 }
 
 function init_default_google_navtree(toroot) {
-  init_google_navtree("gms-tree-list", toroot, GMS_NAVTREE_DATA);
+  // 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) {
-  init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA);
+  // 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();
+      }
+  });
 }
 
 /* TOGGLE INHERITED MEMBERS */
diff --git a/tools/droiddoc/templates-sdk/components/masthead.cs b/tools/droiddoc/templates-sdk/components/masthead.cs
index 9f19906..ba1d382 100644
--- a/tools/droiddoc/templates-sdk/components/masthead.cs
+++ b/tools/droiddoc/templates-sdk/components/masthead.cs
@@ -1,4 +1,6 @@
 <?cs def:custom_masthead() ?>
+<a name="top"></a>
+<?cs if:!devsite ?><?cs # leave out the global header for devsite; it's in devsite template ?>
     <!-- Header -->
     <div id="header">
         <div class="wrap" id="header-wrap">
@@ -60,11 +62,8 @@
         <li><a href="http://source.android.com">Android Open Source Project</a></li>
       </ul>
       
-<?cs ############ TODO: Remove when we're happy with Devsite ############# ?>
-      <?cs # Use differenc lang switcher for devsite and gae server ?>
-      <?cs if:devsite ?>
-      <div class="header">Language</div>
-      <?cs elif:android.whichdoc == "online" ?>
+      <?cs # Include language switcher only in online docs ?>
+      <?cs if:android.whichdoc == "online" ?>
         <div class="header">Language</div>
           <div id="language" class="locales">
             <select name="language" onChange="changeLangPref(this.value, true)">
@@ -83,7 +82,7 @@
             //-->
         </script>
       <?cs /if ?>
-      <?cs # End of devsite vs. gae version of lang switcher ?>
+      <?cs # End of lang switcher ?>
 
 
       <br class="clearfix" />
@@ -194,8 +193,7 @@
   </div>
     
     
-    
-<?cs if:training || guide || reference || tools || develop || google ?>
+  <?cs if:training || guide || reference || tools || develop || google ?>
     <!-- Secondary x-nav -->
     <div id="nav-x">
         <div class="wrap">
@@ -240,6 +238,10 @@
         
     </div>
     <!-- /Sendondary x-nav -->
+  <?cs /if ?>
+
 <?cs /if ?>
+<?cs # end if/else !devsite ?>
+
   <?cs 
 /def ?>
diff --git a/tools/droiddoc/templates-sdk/docpage.cs b/tools/droiddoc/templates-sdk/docpage.cs
index 3e5c24f..b6d808d 100644
--- a/tools/droiddoc/templates-sdk/docpage.cs
+++ b/tools/droiddoc/templates-sdk/docpage.cs
@@ -9,7 +9,6 @@
   elif:distribute ?>distribute<?cs
   /if ?><?cs
   if:page.trainingcourse ?> trainingcourse<?cs /if ?>" itemscope itemtype="http://schema.org/Article">
-<a name="top"></a>
 <?cs include:"header.cs" ?>
 
 <div <?cs if:fullpage
diff --git a/tools/droiddoc/templates-sdk/head_tag.cs b/tools/droiddoc/templates-sdk/head_tag.cs
index d84a3be..9778389 100644
--- a/tools/droiddoc/templates-sdk/head_tag.cs
+++ b/tools/droiddoc/templates-sdk/head_tag.cs
@@ -1,4 +1,18 @@
 <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
+      ?><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">
 <?cs if:page.metaDescription ?>
 <meta name="Description" content="<?cs var:page.metaDescription ?>">
@@ -30,19 +44,9 @@
 /if ?>
 <script type="text/javascript">
   var toRoot = "<?cs var:toroot ?>";
-  <?cs if:devsite ?>
-  var devsite = true;
-  <?cs else ?>
-  var devsite = false;
-  <?cs /if ?>
+  var devsite = <?cs if:devsite ?>true<?cs else ?>false<?cs /if ?>;
 </script>
 <script src="<?cs var:toroot ?>assets/js/docs.js" type="text/javascript"></script>
-<?cs if:reference.gms || reference.gcm || google?>
-<script src="<?cs var:toroot ?>gms_navtree_data.js" async type="text/javascript"></script>
-<script src="<?cs var:toroot ?>gcm_navtree_data.js" async type="text/javascript"></script>
-<?cs elif:reference ?>
-<script src="<?cs var:toroot ?>navtree_data.js" async type="text/javascript"></script>
-<?cs /if ?>
 
 <script type="text/javascript">
   var _gaq = _gaq || [];
diff --git a/tools/droiddoc/templates-sdk/sdkpage.cs b/tools/droiddoc/templates-sdk/sdkpage.cs
index decfd26..3ebf697 100644
--- a/tools/droiddoc/templates-sdk/sdkpage.cs
+++ b/tools/droiddoc/templates-sdk/sdkpage.cs
@@ -83,31 +83,58 @@
       <th>MD5 Checksum</th>
   </tr>
   <tr>
-    <td>Windows</td>
+    <td>Windows 32-bit</td>
     <td>
   <a onClick="return onDownload(this)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.win_download ?>"><?cs var:ndk.win_download ?></a>
+     href="http://dl.google.com/android/ndk/<?cs var:ndk.win32_download ?>"><?cs var:ndk.win32_download ?></a>
     </td>
-    <td><?cs var:ndk.win_bytes ?> bytes</td>
-    <td><?cs var:ndk.win_checksum ?></td>
+    <td><?cs var:ndk.win32_bytes ?> bytes</td>
+    <td><?cs var:ndk.win32_checksum ?></td>
   </tr>
   <tr>
-    <td>Mac OS X (intel)</td>
+    <td>Windows 64-bit</td>
     <td>
   <a onClick="return onDownload(this)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac_download ?>"><?cs var:ndk.mac_download ?></a>
+     href="http://dl.google.com/android/ndk/<?cs var:ndk.win64_download ?>"><?cs var:ndk.win64_download ?></a>
     </td>
-    <td><?cs var:ndk.mac_bytes ?> bytes</td>
-    <td><?cs var:ndk.mac_checksum ?></td>
+    <td><?cs var:ndk.win64_bytes ?> bytes</td>
+    <td><?cs var:ndk.win64_checksum ?></td>
   </tr>
   <tr>
-    <td>Linux 32/64-bit (x86)</td>
+    <td>Mac OS X 32-bit</td>
     <td>
   <a onClick="return onDownload(this)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux_download ?>"><?cs var:ndk.linux_download ?></a>
+     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac32_download ?>"><?cs var:ndk.mac32_download ?></a>
     </td>
-    <td><?cs var:ndk.linux_bytes ?> bytes</td>
-    <td><?cs var:ndk.linux_checksum ?></td>
+    <td><?cs var:ndk.mac32_bytes ?> bytes</td>
+    <td><?cs var:ndk.mac32_checksum ?></td>
+  </tr>
+  <tr>
+    <td>Mac OS X 64-bit</td>
+    <td>
+  <a onClick="return onDownload(this)"
+     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac64_download ?>"><?cs var:ndk.mac64_download ?></a>
+    </td>
+    <td><?cs var:ndk.mac64_bytes ?> bytes</td>
+    <td><?cs var:ndk.mac64_checksum ?></td>
+  </tr>
+  <tr>
+    <td>Linux 32-bit (x86)</td>
+    <td>
+  <a onClick="return onDownload(this)"
+     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux32_download ?>"><?cs var:ndk.linux32_download ?></a>
+    </td>
+    <td><?cs var:ndk.linux32_bytes ?> bytes</td>
+    <td><?cs var:ndk.linux32_checksum ?></td>
+  </tr>
+  <tr>
+    <td>Linux 64-bit (x86)</td>
+    <td>
+  <a onClick="return onDownload(this)"
+     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux64_download ?>"><?cs var:ndk.linux64_download ?></a>
+    </td>
+    <td><?cs var:ndk.linux64_bytes ?> bytes</td>
+    <td><?cs var:ndk.linux64_checksum ?></td>
   </tr>
   </table>
   
@@ -262,7 +289,7 @@
       <th>MD5 Checksum</th>
   </tr>
   <tr>
-    <td rowspan="2">Windows</td>
+    <td rowspan="2">Windows<br>32 &amp; 64-bit</td>
     <td>
   <a onclick="return onDownload(this)" href="http://dl.google.com/android/<?cs var:sdk.win_download
 ?>"><?cs var:sdk.win_download ?></a>
@@ -281,7 +308,7 @@
     <td><?cs var:sdk.win_installer_checksum ?></td>
   </tr>
   <tr>
-    <td>Mac OS X</td>
+    <td><nobr>Mac OS X</nobr><br>32 &amp; 64-bit</td>
     <td>
   <a onclick="return onDownload(this)" id="mac-tools" href="http://dl.google.com/android/<?cs
 var:sdk.mac_download
@@ -291,7 +318,7 @@
     <td><?cs var:sdk.mac_checksum ?></td>
   </tr>
   <tr>
-    <td>Linux</td>
+    <td>Linux<br>32 &amp; 64-bit</td>
     <td>
   <a onclick="return onDownload(this)" id="linux-tools" href="http://dl.google.com/android/<?cs
 var:sdk.linux_download