am ea852f6e: am f6b670b7: Merge "Remove more always-true ARCH_ARM_HAVE_ flags."
# Via Android Git Automerger (1) and others
* commit 'ea852f6ed3e9f251eaef4f041fbc0b09229ac924':
Remove more always-true ARCH_ARM_HAVE_ flags.
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 998be2a..a55b241 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -152,12 +152,22 @@
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
+# Start of "K" development!
+$(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/*)
+
# GCC 4.7
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/lib/*.o)
+# Wait, back to some JB development!
+$(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/*)
+
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/core/Makefile b/core/Makefile
index 31a4021..690cfc0 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -921,6 +921,7 @@
$(filter $(TARGET_OUT_DATA)/%,$(tests_MODULES))
endif
+ifneq (true,$(BOARD_DONT_BUILD_USERDATA_IMG))
userdataimage_intermediates := \
$(call intermediates-dir-for,PACKAGING,userdata)
BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img
@@ -946,6 +947,8 @@
userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
$(build-userdataimage-target)
+endif # no BOARD_DONT_BUILD_USERDATA_IMG
+
#######
## data partition tarball
define build-userdatatarball-target
@@ -1238,6 +1241,7 @@
endif # TARGET_DEVICE != generic*
endif # TARGET_PRODUCT != sdk
+ifdef is_tests_build
# -----------------------------------------------------------------
# A zip of the tests that are built when running "make tests".
# This is very similar to BUILT_TARGET_FILES_PACKAGE, but we
@@ -1268,23 +1272,13 @@
$(TARGET_OUT_DATA),$(zip_root)/DATA)
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
-.PHONY: tests-zip-package
-tests-zip-package: $(BUILT_TESTS_ZIP_PACKAGE)
-
-# Target needed by tests build
-.PHONY: tests-build-target
-tests-build-target: $(BUILT_TESTS_ZIP_PACKAGE)
-
-ifneq (,$(filter $(MAKECMDGOALS),tests-build-target))
- $(call dist-for-goals, tests-build-target, \
- $(BUILT_TESTS_ZIP_PACKAGE))
-endif
-
.PHONY: tests
tests: $(BUILT_TESTS_ZIP_PACKAGE)
+
ifneq (,$(filter tests, $(MAKECMDGOALS)))
-$(call dist-for-goals, tests, $(BUILT_TESTS_ZIP_PACKAGE))
+ $(call dist-for-goals, tests, $(BUILT_TESTS_ZIP_PACKAGE))
endif
+endif # is_tests_build
# -----------------------------------------------------------------
# A zip of the symbols directory. Keep the full paths to make it
@@ -1454,7 +1448,6 @@
$(atree_dir)/sdk.atree \
$(sdk_tools_atree_files) \
$(HOST_OUT_EXECUTABLES)/atree \
- $(ALL_HOST_INSTALLED_FILES) \
$(HOST_OUT_EXECUTABLES)/line_endings
INTERNAL_SDK_TARGET := $(sdk_dir)/$(sdk_name).zip
diff --git a/core/base_rules.mk b/core/base_rules.mk
index 5c508cd..494f75b 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -34,11 +34,11 @@
ifneq ($(LOCAL_IS_HOST_MODULE),true)
$(error $(LOCAL_PATH): LOCAL_IS_HOST_MODULE must be "true" or empty, not "$(LOCAL_IS_HOST_MODULE)")
endif
- my_prefix:=HOST_
- my_host:=host-
+ my_prefix := HOST_
+ my_host := host-
else
- my_prefix:=TARGET_
- my_host:=
+ my_prefix := TARGET_
+ my_host :=
endif
###########################################################
@@ -496,10 +496,12 @@
# Define a copy rule to install the module.
# acp and libraries that it uses can't use acp for
# installation; hence, LOCAL_ACP_UNAVAILABLE.
+$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD)
ifneq ($(LOCAL_ACP_UNAVAILABLE),true)
$(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) | $(ACP)
@echo "Install: $@"
$(copy-file-to-new-target)
+ $(PRIVATE_POST_INSTALL_CMD)
else
$(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE)
@echo "Install: $@"
@@ -515,17 +517,6 @@
$(LOCAL_INSTALLED_MODULE) : $(installed_odex)
endif
-
-# All host modules that are not tagged with optional are automatically installed.
-# Save the installed files in ALL_HOST_INSTALLED_FILES.
-ifeq ($(LOCAL_IS_HOST_MODULE),true)
- ALL_HOST_INSTALLED_FILES += $(LOCAL_INSTALLED_MODULE)
- ifneq ($(filter debug eng tests, $(LOCAL_MODULE_TAGS)),)
- $(warning $(LOCAL_MODULE_MAKEFILE): Module "$(LOCAL_MODULE)" has useless module tags: $(filter debug eng tests, $(LOCAL_MODULE_TAGS)). It will be installed anyway.)
- LOCAL_MODULE_TAGS := $(filter-out debug eng tests, $(LOCAL_MODULE_TAGS))
- endif
-endif
-
endif # !LOCAL_UNINSTALLABLE_MODULE
@@ -534,12 +525,17 @@
###########################################################
# If nobody has defined a more specific module for the
-# checked modules, use LOCAL_BUILT_MODULE. This was old
-# behavior, so it should be a safe default.
+# checked modules, use LOCAL_BUILT_MODULE.
ifndef LOCAL_CHECKED_MODULE
- ifndef LOCAL_SDK_VERSION
- LOCAL_CHECKED_MODULE := $(LOCAL_BUILT_MODULE)
- endif
+ LOCAL_CHECKED_MODULE := $(LOCAL_BUILT_MODULE)
+endif
+
+need_compile_java :=
+ifdef java_alternative_checked_module
+ifneq (,$(strip $(all_java_sources)$(full_static_java_libs))$(filter true,$(LOCAL_SOURCE_FILES_ALL_GENERATED)))
+ need_compile_java := true
+ LOCAL_CHECKED_MODULE := $(java_alternative_checked_module)
+endif
endif
# If they request that this module not be checked, then don't.
@@ -596,17 +592,41 @@
# it will default to recursive expansion.
$(foreach tag,$(LOCAL_MODULE_TAGS),\
$(eval ALL_MODULE_TAGS.$(tag) := \
- $(ALL_MODULE_TAGS.$(tag)) \
- $(LOCAL_INSTALLED_MODULE)))
+ $(ALL_MODULE_TAGS.$(tag)) \
+ $(LOCAL_INSTALLED_MODULE)))
# Add this module name to the tag list of each specified tag.
$(foreach tag,$(LOCAL_MODULE_TAGS),\
$(eval ALL_MODULE_NAME_TAGS.$(tag) += $(LOCAL_MODULE)))
###########################################################
+## umbrella targets used to verify builds
+###########################################################
+j_or_n :=
+ifneq (,$(filter EXECUTABLES SHARED_LIBRARIES STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS)))
+j_or_n := native
+else
+ifneq (,$(filter JAVA_LIBRARIES APPS,$(LOCAL_MODULE_CLASS)))
+j_or_n := java
+endif
+endif
+ifdef LOCAL_IS_HOST_MODULE
+h_or_t := host
+else
+h_or_t := target
+endif
+
+ifdef j_or_n
+$(j_or_n) $(h_or_t) $(j_or_n)-$(h_or_t) : $(LOCAL_CHECKED_MODULE)
+ifneq (,$(filter $(LOCAL_MODULE_TAGS),tests))
+$(j_or_n)-$(h_or_t)-tests $(j_or_n)-tests $(h_or_t)-tests : $(LOCAL_CHECKED_MODULE)
+endif
+endif
+
+###########################################################
## NOTICE files
###########################################################
-include $(BUILD_SYSTEM)/notice_files.mk
+include $(BUILD_NOTICE_FILE)
#:vi noexpandtab
diff --git a/core/binary.mk b/core/binary.mk
index 57c85c2..711022e 100644
--- a/core/binary.mk
+++ b/core/binary.mk
@@ -118,7 +118,7 @@
LOCAL_STATIC_LIBRARIES += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES)
endif
-# Add in libcompiler-rt for all regular device builds
+# Add in libcompiler_rt for all regular device builds
ifeq (,$(LOCAL_SDK_VERSION)$(LOCAL_IS_HOST_MODULE)$(WITHOUT_LIBCOMPILER_RT))
LOCAL_STATIC_LIBRARIES += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES)
endif
@@ -126,6 +126,7 @@
my_compiler_dependencies :=
ifeq ($(strip $(LOCAL_CLANG)),true)
LOCAL_CFLAGS += $(CLANG_CONFIG_EXTRA_CFLAGS)
+ LOCAL_ASFLAGS += $(CLANG_CONFIG_EXTRA_ASFLAGS)
LOCAL_LDFLAGS += $(CLANG_CONFIG_EXTRA_LDFLAGS)
my_compiler_dependencies := $(CLANG) $(CLANG_CXX)
endif
@@ -265,6 +266,63 @@
debug_cflags :=
endif
+####################################################
+## Compile RenderScript with reflected C++
+####################################################
+
+renderscript_sources := $(filter %.rs %.fs,$(LOCAL_SRC_FILES))
+
+ifneq (,$(renderscript_sources))
+
+renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources))
+RenderScript_file_stamp := $(intermediates)/RenderScriptCPP.stamp
+renderscript_intermediate := $(intermediates)/renderscript
+
+ifeq ($(LOCAL_RENDERSCRIPT_CC),)
+LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC)
+endif
+
+# Turn on all warnings and warnings as errors for RS compiles.
+# This can be disabled with LOCAL_RENDERSCRIPT_FLAGS := -Wno-error
+renderscript_flags := -Wall -Werror
+renderscript_flags += $(LOCAL_RENDERSCRIPT_FLAGS)
+
+LOCAL_RENDERSCRIPT_INCLUDES := \
+ $(TOPDIR)external/clang/lib/Headers \
+ $(TOPDIR)frameworks/rs/scriptc \
+ $(LOCAL_RENDERSCRIPT_INCLUDES)
+
+ifneq ($(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE),)
+LOCAL_RENDERSCRIPT_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE)
+endif
+
+$(RenderScript_file_stamp): PRIVATE_RS_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES)
+$(RenderScript_file_stamp): PRIVATE_RS_CC := $(LOCAL_RENDERSCRIPT_CC)
+$(RenderScript_file_stamp): PRIVATE_RS_FLAGS := $(renderscript_flags)
+$(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fullpath)
+$(RenderScript_file_stamp): PRIVATE_RS_OUTPUT_DIR := $(renderscript_intermediate)
+$(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC)
+ $(transform-renderscripts-to-cpp-and-bc)
+
+# include the dependency files (.d) generated by llvm-rs-cc.
+renderscript_generated_dep_files := $(addprefix $(renderscript_intermediate)/, \
+ $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources)))))
+-include $(renderscript_generated_dep_files)
+
+LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp)
+
+rs_generated_cpps := $(addprefix \
+ $(renderscript_intermediate)/ScriptC_,$(patsubst %.fs,%.cpp, $(patsubst %.rs,%.cpp, \
+ $(notdir $(renderscript_sources)))))
+
+$(rs_generated_cpps) : $(RenderScript_file_stamp)
+
+LOCAL_C_INCLUDES += $(renderscript_intermediate)
+LOCAL_GENERATED_SOURCES += $(rs_generated_cpps)
+
+endif
+
+
###########################################################
## Stuff source generated from one-off tools
###########################################################
@@ -654,6 +712,7 @@
###########################################################
$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(LOCAL_ASFLAGS)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(LOCAL_CONLYFLAGS)
$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS)
$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(LOCAL_CPPFLAGS)
$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)
diff --git a/core/build_id.mk b/core/build_id.mk
index e954794..40bb35d 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 := OPENMASTER
+BUILD_ID := MASTER
# 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/cleanbuild.mk b/core/cleanbuild.mk
index 1b662b9..b6b95af 100644
--- a/core/cleanbuild.mk
+++ b/core/cleanbuild.mk
@@ -88,7 +88,8 @@
CURRENT_CLEAN_STEPS :=
# Write the new state to the file.
-#
+# Don't write the file if we are running mm/mmm but without a preexisting clean_steps_file.
+ifneq (,$(wildcard $(clean_steps_file))$(filter ||,|$(ONE_SHOT_MAKEFILE)|))
$(shell \
mkdir -p $(dir $(clean_steps_file)) && \
echo "CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)" > \
@@ -96,6 +97,7 @@
echo "CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)" >> \
$(clean_steps_file) \
)
+endif
clean_steps_file :=
INTERNAL_CLEAN_STEPS :=
@@ -191,7 +193,10 @@
$(PRODUCT_OUT)/system \
$(PRODUCT_OUT)/dex_bootjars \
$(PRODUCT_OUT)/obj/JAVA_LIBRARIES \
- $(PRODUCT_OUT)/obj/FAKE
+ $(PRODUCT_OUT)/obj/FAKE \
+ $(PRODUCT_OUT)/obj/EXECUTABLES/adbd_intermediates \
+ $(PRODUCT_OUT)/obj/EXECUTABLES/init_intermediates
+
# The files/dirs to delete during a dataclean, which removes any files
# in the staging and emulator data partitions.
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index dc17ecc..71ac963 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -42,6 +42,7 @@
LOCAL_ASFLAGS:=
LOCAL_CFLAGS:=
LOCAL_CPPFLAGS:=
+LOCAL_CONLYFLAGS:=
LOCAL_RTTI_FLAG:=
LOCAL_C_INCLUDES:=
LOCAL_EXPORT_C_INCLUDE_DIRS:=
@@ -100,7 +101,7 @@
LOCAL_SDK_RES_VERSION:=
LOCAL_NDK_STL_VARIANT:=
LOCAL_EMMA_INSTRUMENT:=
-LOCAL_PROGUARD_ENABLED:= # '',optonly,full,custom,disabled
+LOCAL_PROGUARD_ENABLED:= # '',full,custom,nosystem,disabled
LOCAL_PROGUARD_FLAGS:=
LOCAL_PROGUARD_FLAG_FILES:=
LOCAL_EMMA_COVERAGE_FILTER:=
@@ -110,7 +111,9 @@
LOCAL_RENDERSCRIPT_INCLUDES:=
LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:=
LOCAL_RENDERSCRIPT_CC:=
+LOCAL_RENDERSCRIPT_COMPATIBILITY:=
LOCAL_RENDERSCRIPT_FLAGS:=
+LOCAL_RENDERSCRIPT_SKIP_INSTALL:=
LOCAL_RENDERSCRIPT_TARGET_API:=
LOCAL_BUILD_HOST_DEX:=
LOCAL_DEX_PREOPT:= # '',true,false,nostripping
@@ -128,6 +131,9 @@
LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true
# Don't delete the META_INF dir when merging static Java libraries.
LOCAL_DONT_DELETE_JAR_META_INF:=
+LOCAL_ADDITIONAL_CERTIFICATES:=
+LOCAL_PREBUILT_MODULE_FILE:=
+LOCAL_POST_INSTALL_CMD:=
# Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to
# iterate over thousands of entries every time.
diff --git a/core/combo/HOST_linux-x86.mk b/core/combo/HOST_linux-x86.mk
index 3001f59..4f35ea7 100644
--- a/core/combo/HOST_linux-x86.mk
+++ b/core/combo/HOST_linux-x86.mk
@@ -24,7 +24,9 @@
# Previously the prebiult host toolchain is used only for the sdk build,
# that's why we have "sdk" in the path name.
+ifeq ($(strip $(HOST_TOOLCHAIN_PREFIX)),)
HOST_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk
+endif
# Don't do anything if the toolchain is not there
ifneq (,$(strip $(wildcard $(HOST_TOOLCHAIN_PREFIX)/gcc)))
HOST_CC := $(HOST_TOOLCHAIN_PREFIX)/gcc
diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk
index cb10542..172ed00 100644
--- a/core/combo/TARGET_linux-arm.mk
+++ b/core/combo/TARGET_linux-arm.mk
@@ -53,21 +53,17 @@
TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/arm-linux-androideabi-
endif
-# Only define these if there's actually a gcc in there.
-# The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
-ifneq ($(wildcard $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)),)
- TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)
- TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX)
- TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX)
- TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX)
- TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX)
- TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX)
- ifeq ($(TARGET_BUILD_VARIANT),user)
- TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@
- else
- TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@ && \
- $(TARGET_OBJCOPY) --add-gnu-debuglink=$< $@
- endif
+TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)
+TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX)
+TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX)
+TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX)
+TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX)
+TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX)
+ifeq ($(TARGET_BUILD_VARIANT),user)
+ TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@
+else
+ TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@ && \
+ $(TARGET_OBJCOPY) --add-gnu-debuglink=$< $@
endif
TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined
@@ -117,7 +113,7 @@
# We cannot turn it off blindly since the option is not available
# in gcc-4.4.x. We also want to disable sincos optimization globally
# by turning off the builtin sin function.
-ifneq ($(filter 4.6 4.6.% 4.7 4.7.%, $(shell $(TARGET_CC) --version)),)
+ifneq ($(filter 4.6 4.6.% 4.7 4.7.%, $(TARGET_GCC_VERSION)),)
TARGET_GLOBAL_CFLAGS += -Wno-unused-but-set-variable -fno-builtin-sin \
-fno-strict-volatile-bitfields
endif
@@ -137,6 +133,7 @@
-Wl,-z,relro \
-Wl,-z,now \
-Wl,--warn-shared-textrel \
+ -Wl,--fatal-warnings \
-Wl,--icf=safe \
$(arch_variant_ldflags)
@@ -165,6 +162,8 @@
# any flags which affect libgcc are correctly taken
# into account.
TARGET_LIBGCC := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) -print-libgcc-file-name)
+target_libgcov := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \
+ -print-file-name=libgcov.a)
endif
# Define FDO (Feedback Directed Optimization) options.
@@ -172,8 +171,6 @@
TARGET_FDO_CFLAGS:=
TARGET_FDO_LIB:=
-target_libgcov := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \
- -print-file-name=libgcov.a)
ifneq ($(strip $(BUILD_FDO_INSTRUMENT)),)
# Set BUILD_FDO_INSTRUMENT=true to turn on FDO instrumentation.
# The profile will be generated on /data/local/tmp/profile on the device.
diff --git a/core/combo/TARGET_linux-mips.mk b/core/combo/TARGET_linux-mips.mk
index 6a29564..3df17bb 100644
--- a/core/combo/TARGET_linux-mips.mk
+++ b/core/combo/TARGET_linux-mips.mk
@@ -53,21 +53,17 @@
TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/mipsel-linux-android-
endif
-# Only define these if there's actually a gcc in there.
-# The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
-ifneq ($(wildcard $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)),)
- TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)
- TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX)
- TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX)
- TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX)
- TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX)
- TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX)
- ifeq ($(TARGET_BUILD_VARIANT),user)
- TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@
- else
- TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@ && \
- $(TARGET_OBJCOPY) --add-gnu-debuglink=$< $@
- endif
+TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)
+TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX)
+TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX)
+TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX)
+TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX)
+TARGET_STRIP := $(TARGET_TOOLS_PREFIX)strip$(HOST_EXECUTABLE_SUFFIX)
+ifeq ($(TARGET_BUILD_VARIANT),user)
+ TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@
+else
+ TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip-all $< -o $@ && \
+ $(TARGET_OBJCOPY) --add-gnu-debuglink=$< $@
endif
TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined
@@ -101,7 +97,7 @@
# This warning causes dalvik not to build with gcc 4.6+ and -Werror.
# We cannot turn it off blindly since the option is not available
# in gcc-4.4.x.
-ifneq ($(filter 4.6 4.6.% 4.7 4.7.%, $(shell $(TARGET_CC) --version)),)
+ifneq ($(filter 4.6 4.6.% 4.7 4.7.%, $(TARGET_GCC_VERSION)),)
TARGET_GLOBAL_CFLAGS += -Wno-unused-but-set-variable \
-fno-strict-volatile-bitfields
endif
@@ -152,6 +148,8 @@
ifneq ($(LIBGCC_EH),libgcc_eh.a)
TARGET_LIBGCC += $(LIBGCC_EH)
endif
+target_libgcov := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \
+ --print-file-name=libgcov.a)
endif
# Define FDO (Feedback Directed Optimization) options.
@@ -159,8 +157,6 @@
TARGET_FDO_CFLAGS:=
TARGET_FDO_LIB:=
-target_libgcov := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \
- --print-file-name=libgcov.a)
ifneq ($(strip $(BUILD_FDO_INSTRUMENT)),)
# Set BUILD_FDO_INSTRUMENT=true to turn on FDO instrumentation.
# The profile will be generated on /data/local/tmp/profile on the device.
diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk
index 7884366..a928fe1 100644
--- a/core/combo/arch/arm/armv7-a-neon.mk
+++ b/core/combo/arch/arm/armv7-a-neon.mk
@@ -6,11 +6,13 @@
ARCH_ARM_HAVE_VFP_D32 := true
ARCH_ARM_HAVE_NEON := true
-# Note: Hard coding the 'tune' value here is probably not ideal,
-# and a better solution should be found in the future.
-#
-arch_variant_cflags := \
- -march=armv7-a \
+ifeq ($(strip $(TARGET_CPU_VARIANT)), cortex-a15)
+ arch_variant_cflags := -mcpu=cortex-a15
+else
+ arch_variant_cflags := -march=armv7-a
+endif
+
+arch_variant_cflags += \
-mfloat-abi=softfp \
-mfpu=neon
diff --git a/core/config.mk b/core/config.mk
index dcb9c1f..d8d7871 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -38,13 +38,12 @@
$(TOPDIR)frameworks/native/opengl/include \
$(TOPDIR)frameworks/av/include \
$(TOPDIR)frameworks/base/include \
- $(TOPDIR)frameworks/base/opengl/include \
$(TOPDIR)external/skia/include
SRC_HOST_HEADERS:=$(TOPDIR)tools/include
SRC_LIBRARIES:= $(TOPDIR)libs
SRC_SERVERS:= $(TOPDIR)servers
SRC_TARGET_DIR := $(TOPDIR)build/target
-SRC_API_DIR := $(TOPDIR)frameworks/base/api
+SRC_API_DIR := $(TOPDIR)prebuilts/sdk/api
# Some specific paths to tools
SRC_DROIDDOC_DIR := $(TOPDIR)build/tools/droiddoc
@@ -79,6 +78,7 @@
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk
+BUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk
-include cts/build/config.mk
@@ -281,7 +281,6 @@
AAPT := $(HOST_OUT_EXECUTABLES)/aapt$(HOST_EXECUTABLE_SUFFIX)
AIDL := $(HOST_OUT_EXECUTABLES)/aidl$(HOST_EXECUTABLE_SUFFIX)
PROTOC := $(HOST_OUT_EXECUTABLES)/aprotoc$(HOST_EXECUTABLE_SUFFIX)
-ICUDATA := $(HOST_OUT_EXECUTABLES)/icudata$(HOST_EXECUTABLE_SUFFIX)
SIGNAPK_JAR := $(HOST_OUT_JAVA_LIBRARIES)/signapk$(COMMON_JAVA_PACKAGE_SUFFIX)
MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)
MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)
@@ -302,7 +301,7 @@
PROGUARD := external/proguard/bin/proguard.sh
JAVATAGS := build/tools/java-event-log-tags.py
LLVM_RS_CC := $(HOST_OUT_EXECUTABLES)/llvm-rs-cc$(HOST_EXECUTABLE_SUFFIX)
-LLVM_RS_LINK := $(HOST_OUT_EXECUTABLES)/llvm-rs-link$(HOST_EXECUTABLE_SUFFIX)
+BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat$(HOST_EXECUTABLE_SUFFIX)
DEXOPT := $(HOST_OUT_EXECUTABLES)/dexopt$(HOST_EXECUTABLE_SUFFIX)
DEXPREOPT := dalvik/tools/dex-preopt
LINT := prebuilts/sdk/tools/lint
diff --git a/core/definitions.mk b/core/definitions.mk
index 26fe7b4..cb20d8f 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -55,11 +55,6 @@
# its sub-variables.)
ALL_MODULE_NAME_TAGS:=
-# All host modules are automatically installed (i.e. outside
-# of the product configuration scheme). This is a list of the
-# install targets (LOCAL_INSTALLED_MODULE).
-ALL_HOST_INSTALLED_FILES:=
-
# Full paths to all prebuilt files that will be copied
# (used to make the dependency on acp)
ALL_PREBUILT:=
@@ -801,7 +796,7 @@
endef
###########################################################
-## Commands to compile RenderScript
+## Commands to compile RenderScript to Java
###########################################################
define transform-renderscripts-to-java-and-bc
@@ -818,8 +813,40 @@
$(PRIVATE_RS_FLAGS) \
$(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \
$(PRIVATE_RS_SOURCE_FILES)
-#$(hide) $(LLVM_RS_LINK) \
-# $(PRIVATE_RS_OUTPUT_DIR)/res/raw/*.bc
+$(hide) mkdir -p $(dir $@)
+$(hide) touch $@
+endef
+
+define transform-bc-to-so
+@echo "Renderscript compatibility"
+$(hide) mkdir -p $(dir $@)
+$(hide) $(BCC_COMPAT) -O3 -o $(dir $@)/$(notdir $(<:.bc=.o)) -fPIC -shared \
+ -rt-path $(PRIVATE_LIBCLCORE) $<
+$(hide) $(PRIVATE_CXX) -shared -Wl,-soname,$(notdir $@) -nostdlib \
+ -Wl,-rpath,\$$ORIGIN/../lib \
+ $(dir $@)/$(notdir $(<:.bc=.o)) \
+ $(PRIVATE_COMPILER_RT) \
+ -o $@ -L prebuilts/gcc/ \
+ -L $(TARGET_OUT_INTERMEDIATE_LIBRARIES) $(PRIVATE_LIBPATH) \
+ -lRSSupport -lm
+endef
+
+###########################################################
+## Commands to compile RenderScript to C++
+###########################################################
+
+define transform-renderscripts-to-cpp-and-bc
+@echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
+$(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
+$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/
+$(hide) $(PRIVATE_RS_CC) \
+ -o $(PRIVATE_RS_OUTPUT_DIR)/ \
+ -d $(PRIVATE_RS_OUTPUT_DIR) \
+ -a $@ -MD \
+ -reflect-c++ \
+ $(PRIVATE_RS_FLAGS) \
+ $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \
+ $(PRIVATE_RS_SOURCE_FILES)
$(hide) mkdir -p $(dir $@)
$(hide) touch $@
endef
@@ -930,15 +957,13 @@
$(PRIVATE_TARGET_GLOBAL_CFLAGS) \
$(PRIVATE_ARM_CFLAGS) \
) \
- $(PRIVATE_CFLAGS) \
- $(1) \
- $(PRIVATE_DEBUG_CFLAGS) \
+ $(1) \
-MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
endef
define transform-c-to-o-no-deps
@echo "target $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<"
-$(call transform-c-or-s-to-o-no-deps, )
+$(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS))
endef
define transform-s-to-o-no-deps
@@ -964,7 +989,7 @@
define transform-m-to-o-no-deps
@echo "target ObjC: $(PRIVATE_MODULE) <= $<"
-$(call transform-c-or-s-to-o-no-deps)
+$(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS))
endef
define transform-m-to-o
@@ -1019,15 +1044,13 @@
$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
$(HOST_GLOBAL_CFLAGS) \
) \
- $(PRIVATE_CFLAGS) \
$(1) \
- $(PRIVATE_DEBUG_CFLAGS) \
-MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
endef
define transform-host-c-to-o-no-deps
@echo "host C: $(PRIVATE_MODULE) <= $<"
-$(call transform-host-c-or-s-to-o-no-deps, )
+$(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS))
endef
define transform-host-s-to-o-no-deps
@@ -1051,7 +1074,7 @@
define transform-host-m-to-o-no-deps
@echo "host ObjC: $(PRIVATE_MODULE) <= $<"
-$(call transform-host-c-or-s-to-o-no-deps)
+$(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS))
endef
define transform-host-m-to-o
@@ -1465,11 +1488,11 @@
$(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
$(1) -encoding UTF-8 \
$(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \
- $(if $(findstring true,$(LOCAL_WARNINGS_ENABLE)),$(xlint_unchecked),) \
+ $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
$(2) \
$(addprefix -classpath ,$(strip \
$(call normalize-path-list,$(PRIVATE_ALL_JAVA_LIBRARIES)))) \
- $(if $(findstring true,$(LOCAL_WARNINGS_ENABLE)),$(xlint_unchecked),) \
+ $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
-extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
$(PRIVATE_JAVACFLAGS) \
\@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \
@@ -1513,11 +1536,11 @@
$(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
$(1) -encoding UTF-8 \
$(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \
- $(if $(findstring true,$(LOCAL_WARNINGS_ENABLE)),$(xlint_unchecked),) \
+ $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
$(2) \
$(addprefix -classpath ,$(strip \
$(call normalize-path-list,$(PRIVATE_ALL_JAVA_LIBRARIES) $(PRIVATE_CLASS_INTERMEDIATES_DIR)))) \
- $(if $(findstring true,$(LOCAL_WARNINGS_ENABLE)),$(xlint_unchecked),) \
+ $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
-extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
$(PRIVATE_JAVACFLAGS) \
\@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \
@@ -1616,10 +1639,10 @@
#TODO: update the manifest to point to the dex file
define add-dex-to-package
$(if $(filter classes.dex,$(notdir $(PRIVATE_DEX_FILE))),\
-$(hide) $(AAPT) add -k $@ $(PRIVATE_DEX_FILE),\
+$(hide) zip -qj $@ $(PRIVATE_DEX_FILE),\
$(hide) _adtp_classes_dex=$(dir $(PRIVATE_DEX_FILE))classes.dex; \
cp $(PRIVATE_DEX_FILE) $$_adtp_classes_dex && \
-$(AAPT) add -k $@ $$_adtp_classes_dex && rm -f $$_adtp_classes_dex)
+zip -qj $@ $$_adtp_classes_dex && rm -f $$_adtp_classes_dex)
endef
# Add java resources added by the current module.
@@ -1648,7 +1671,8 @@
define sign-package
$(hide) mv $@ $@.unsigned
$(hide) java -jar $(SIGNAPK_JAR) \
- $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) $@.unsigned $@.signed
+ $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \
+ $(PRIVATE_ADDITIONAL_CERTIFICATES) $@.unsigned $@.signed
$(hide) mv $@.signed $@
endef
@@ -2088,6 +2112,30 @@
$(6): $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp
endef
+## Whether to build from source if prebuilt alternative exists
+###########################################################
+# $(1): module name
+# $(2): LOCAL_PATH
+# Expands to empty string if not from source.
+ifeq (true,$(ANDROID_BUILD_FROM_SOURCE))
+define if-build-from-source
+true
+endef
+else
+define if-build-from-source
+$(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \
+ $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true)
+endef
+endif
+
+# Include makefile $(1) if build from source for module $(2)
+# $(1): the makefile to include
+# $(2): module name
+# $(3): LOCAL_PATH
+define include-if-build-from-source
+$(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1)))
+endef
+
###########################################################
## Other includes
###########################################################
diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk
index 4c51b10..82dd153 100644
--- a/core/dex_preopt.mk
+++ b/core/dex_preopt.mk
@@ -4,7 +4,7 @@
####################################
# TODO: replace it with device's BOOTCLASSPATH
-DEXPREOPT_BOOT_JARS := core:core-junit:bouncycastle:ext:framework:telephony-common:mms-common:android.policy:services:apache-xml
+DEXPREOPT_BOOT_JARS := core:core-junit:bouncycastle:ext:framework:telephony-common:voip-common:mms-common:android.policy:services:apache-xml
DEXPREOPT_BOOT_JARS_MODULES := $(subst :, ,$(DEXPREOPT_BOOT_JARS))
DEXPREOPT_BUILD_DIR := $(OUT_DIR)
diff --git a/core/droiddoc.mk b/core/droiddoc.mk
index 03a5011..f29aaa7 100644
--- a/core/droiddoc.mk
+++ b/core/droiddoc.mk
@@ -22,9 +22,9 @@
LOCAL_IS_HOST_MODULE := $(call true-or-empty,$(LOCAL_IS_HOST_MODULE))
ifeq ($(LOCAL_IS_HOST_MODULE),true)
-my_prefix:=HOST_
+my_prefix := HOST_
else
-my_prefix:=TARGET_
+my_prefix := TARGET_
endif
LOCAL_MODULE_CLASS := $(strip $(LOCAL_MODULE_CLASS))
@@ -152,6 +152,11 @@
else
$(full_target): PRIVATE_ADDITIONAL_HTML_DIR :=
endif
+ifneq ($(strip $(LOCAL_ADDITIONAL_HTML_DIR)),)
+$(full_target): PRIVATE_ADDITIONAL_HTML_DIR := -htmldir2 $(LOCAL_PATH)/$(LOCAL_ADDITIONAL_HTML_DIR)
+else
+$(full_target): PRIVATE_ADDITIONAL_HTML_DIR :=
+endif
# TODO: not clear if this is used any more
$(full_target): PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
diff --git a/core/dumpvar.mk b/core/dumpvar.mk
index 47ac9e2..92bf6af 100644
--- a/core/dumpvar.mk
+++ b/core/dumpvar.mk
@@ -98,6 +98,7 @@
$(info TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))
$(info TARGET_ARCH=$(TARGET_ARCH))
$(info TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))
+$(info TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))
$(info HOST_ARCH=$(HOST_ARCH))
$(info HOST_OS=$(HOST_OS))
$(info HOST_OS_EXTRA=$(HOST_OS_EXTRA))
diff --git a/core/envsetup.mk b/core/envsetup.mk
index 2ad6801..7ede47d 100644
--- a/core/envsetup.mk
+++ b/core/envsetup.mk
@@ -114,10 +114,10 @@
# variables that we need in order to locate the output files.
include $(BUILD_SYSTEM)/product_config.mk
-build_variant := $(filter-out user userdebug eng tests,$(TARGET_BUILD_VARIANT))
+build_variant := $(filter-out eng user userdebug,$(TARGET_BUILD_VARIANT))
ifneq ($(build_variant)-$(words $(TARGET_BUILD_VARIANT)),-1)
$(warning bad TARGET_BUILD_VARIANT: $(TARGET_BUILD_VARIANT))
-$(error must be empty or one of: user userdebug eng tests)
+$(error must be empty or one of: eng user userdebug)
endif
# ---------------------------------------------------------------
diff --git a/core/executable.mk b/core/executable.mk
index d6f383b..52bf0cb 100644
--- a/core/executable.mk
+++ b/core/executable.mk
@@ -12,6 +12,17 @@
LOCAL_MODULE_SUFFIX := $(TARGET_EXECUTABLE_SUFFIX)
endif
+$(call target-executable-hook)
+
+skip_build_from_source :=
+ifdef LOCAL_PREBUILT_MODULE_FILE
+ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH)))
+include $(BUILD_PREBUILT)
+skip_build_from_source := true
+endif
+endif
+
+ifndef skip_build_from_source
####################################################
## Add profiling libraries if aprof is turned
####################################################
@@ -61,3 +72,5 @@
$(linked_module): $(my_target_crtbegin_dynamic_o) $(all_objects) $(all_libraries) $(my_target_crtend_o)
$(transform-o-to-executable)
endif
+
+endif # skip_build_from_source
diff --git a/core/host_executable.mk b/core/host_executable.mk
index 93d3f10..ab0f8f3 100644
--- a/core/host_executable.mk
+++ b/core/host_executable.mk
@@ -13,7 +13,21 @@
LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX)
endif
+$(call host-executable-hook)
+
+skip_build_from_source :=
+ifdef LOCAL_PREBUILT_MODULE_FILE
+ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH)))
+include $(BUILD_PREBUILT)
+skip_build_from_source := true
+endif
+endif
+
+ifndef skip_build_from_source
+
include $(BUILD_SYSTEM)/binary.mk
$(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries)
$(transform-host-o-to-executable)
+
+endif # skip_build_from_source
diff --git a/core/host_java_library.mk b/core/host_java_library.mk
index 91942dc..d6a688f 100644
--- a/core/host_java_library.mk
+++ b/core/host_java_library.mk
@@ -43,10 +43,15 @@
$(built_dex)
LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src
+# See comment in java.mk
+java_alternative_checked_module := $(full_classes_compiled_jar)
+
endif # LOCAL_BUILD_HOST_DEX
include $(BUILD_SYSTEM)/base_rules.mk
+java_alternative_checked_module :=
+
# The layers file allows you to enforce a layering between java packages.
# Run build/tools/java-layers.py for more details.
layers_file := $(addprefix $(LOCAL_PATH)/, $(LOCAL_JAVA_LAYERS_FILE))
diff --git a/core/host_shared_library.mk b/core/host_shared_library.mk
index 65e8258..a29e14c 100644
--- a/core/host_shared_library.mk
+++ b/core/host_shared_library.mk
@@ -22,6 +22,18 @@
$(error $(LOCAL_PATH): Cannot set module stem for a library)
endif
+$(call host-shared-library-hook)
+
+skip_build_from_source :=
+ifdef LOCAL_PREBUILT_MODULE_FILE
+ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH)))
+include $(BUILD_PREBUILT)
+skip_build_from_source := true
+endif
+endif
+
+ifndef skip_build_from_source
+
# Put the built modules of all shared libraries in a common directory
# to simplify the link line.
OVERRIDE_BUILT_MODULE_PATH := $(HOST_OUT_INTERMEDIATE_LIBRARIES)
@@ -30,3 +42,5 @@
$(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) $(LOCAL_ADDITIONAL_DEPENDENCIES)
$(transform-host-o-to-shared-lib)
+
+endif # skip_build_from_source
diff --git a/core/java.mk b/core/java.mk
index 65c9be9..e5f5dba 100644
--- a/core/java.mk
+++ b/core/java.mk
@@ -139,6 +139,7 @@
# Because names of the java files from RenderScript are unknown until the
# .rs file(s) are compiled, we have to depend on a timestamp file.
RenderScript_file_stamp :=
+rs_compatibility_jni_libs :=
ifneq ($(renderscript_sources),)
renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources))
RenderScript_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/RenderScript.stamp
@@ -195,6 +196,47 @@
$(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC)
$(transform-renderscripts-to-java-and-bc)
+# Now LOCAL_RENDERSCRIPT_COMPATIBILITY only supports arm
+ifneq ($(TARGET_ARCH),arm)
+LOCAL_RENDERSCRIPT_COMPATIBILITY :=
+endif
+ifneq ($(LOCAL_RENDERSCRIPT_COMPATIBILITY),)
+bc_files := $(patsubst %.fs,%.bc, $(patsubst %.rs,%.bc, $(notdir $(renderscript_sources))))
+rs_generated_bc := $(addprefix \
+ $(renderscript_intermediate)/res/raw/, $(bc_files))
+
+rs_compatibility_jni_libs := $(addprefix \
+ $(renderscript_intermediate)/lib, \
+ $(patsubst %.bc,%.so, $(bc_files)))
+
+$(rs_generated_bc) : $(RenderScript_file_stamp)
+
+ifeq (,$(TARGET_BUILD_APPS))
+rs_built_clcore := $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libclcore.bc_intermediates/libclcore.bc
+rs_extra_libpath :=
+rs_compiler_rt := $(call intermediates-dir-for,STATIC_LIBRARIES,libcompiler_rt)/libcompiler_rt.a
+else
+rs_built_clcore := prebuilts/sdk/renderscript/lib/libclcore.bc
+rs_extra_libpath := -L prebuilts/ndk/8/platforms/android-9/arch-arm/usr/lib
+rs_compiler_rt := prebuilts/sdk/renderscript/lib/libcompiler_rt.a
+endif # TARGET_BUILD_APPS
+rs_support_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRSSupport.so
+rs_jni_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/librsjni.so
+LOCAL_JNI_SHARED_LIBRARIES += libRSSupport librsjni
+
+$(rs_compatibility_jni_libs): $(RenderScript_file_stamp)
+$(rs_compatibility_jni_libs): $(BCC_COMPAT) $(rs_built_clcore)
+$(rs_compatibility_jni_libs): $(rs_support_lib) $(rs_jni_lib) $(rs_compiler_rt)
+$(rs_compatibility_jni_libs): PRIVATE_CXX := $(TARGET_CXX)
+$(rs_compatibility_jni_libs): PRIVATE_LIBCLCORE := $(rs_built_clcore)
+$(rs_compatibility_jni_libs): PRIVATE_COMPILER_RT := $(rs_compiler_rt)
+$(rs_compatibility_jni_libs): PRIVATE_LIBPATH := $(rs_extra_libpath)
+$(rs_compatibility_jni_libs): $(renderscript_intermediate)/lib%.so: \
+ $(renderscript_intermediate)/res/raw/%.bc
+ $(transform-bc-to-so)
+
+endif
+
# include the dependency files (.d) generated by llvm-rs-cc.
renderscript_generated_dep_files := $(addprefix $(renderscript_intermediate)/, \
$(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources)))))
@@ -205,6 +247,12 @@
LOCAL_RESOURCE_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript/res $(LOCAL_RESOURCE_DIR)
endif
+# All of the rules after full_classes_compiled_jar are very unlikely
+# to fail except for bugs in their respective tools. If you would
+# like to run these rules, add the "all" modifier goal to the make
+# command line.
+java_alternative_checked_module := $(full_classes_compiled_jar)
+
# TODO: It looks like the only thing we need from base_rules is
# all_java_sources. See if we can get that by adding a
# common_java.mk, and moving the include of base_rules.mk to
@@ -214,6 +262,31 @@
include $(BUILD_SYSTEM)/base_rules.mk
#######################################
+java_alternative_checked_module :=
+
+# Install the RS compatibility libraries to /system/lib/ if necessary
+ifdef rs_compatibility_jni_libs
+installed_rs_compatibility_jni_libs := $(addprefix $(TARGET_OUT_SHARED_LIBRARIES)/,\
+ $(notdir $(rs_compatibility_jni_libs)))
+# Provide a way to skip sources included in multiple projects.
+ifdef LOCAL_RENDERSCRIPT_SKIP_INSTALL
+skip_install_rs_libs := $(patsubst %.rs,%.so, \
+ $(addprefix $(TARGET_OUT_SHARED_LIBRARIES)/lib, \
+ $(notdir $(LOCAL_RENDERSCRIPT_SKIP_INSTALL))))
+installed_rs_compatibility_jni_libs := \
+ $(filter-out $(skip_install_rs_libs),$(installed_rs_compatibility_jni_libs))
+endif
+ifneq (,$(strip $(installed_rs_compatibility_jni_libs)))
+$(installed_rs_compatibility_jni_libs) : $(TARGET_OUT_SHARED_LIBRARIES)/lib%.so : \
+ $(renderscript_intermediate)/lib%.so
+ @echo "Install RS compatibility library: $@"
+ $(hide) mkdir -p $(dir $@) && cp -f $< $@
+
+# Install them only if the current module is installed.
+$(LOCAL_INSTALLED_MODULE) : $(installed_rs_compatibility_jni_libs)
+endif
+endif
+
# We use intermediates.COMMON because the classes.jar/.dex files will be
# common even if LOCAL_BUILT_MODULE isn't.
#
@@ -230,7 +303,8 @@
# If the module includes java code (i.e., it's not framework-res), compile it.
full_classes_jar :=
built_dex :=
-ifneq (,$(strip $(all_java_sources)$(full_static_java_libs))$(filter true,$(LOCAL_SOURCE_FILES_ALL_GENERATED)))
+# need_compile_java is set in base_rules.mk
+ifeq ($(need_compile_java),true)
# If LOCAL_BUILT_MODULE_STEM wasn't overridden by our caller,
# full_classes_jar will be the same module as LOCAL_BUILT_MODULE.
@@ -258,6 +332,7 @@
# Run build/tools/java-layers.py for more details.
layers_file := $(addprefix $(LOCAL_PATH)/, $(LOCAL_JAVA_LAYERS_FILE))
$(full_classes_compiled_jar): PRIVATE_JAVA_LAYERS_FILE := $(layers_file)
+$(full_classes_compiled_jar): PRIVATE_WARNINGS_ENABLE := $(LOCAL_WARNINGS_ENABLE)
# Compile the java files to a .jar file.
# This intentionally depends on java_sources, not all_java_sources.
@@ -271,15 +346,6 @@
$(proto_java_sources_file_stamp) $(LOCAL_ADDITIONAL_DEPENDENCIES)
$(transform-java-to-classes.jar)
-# All of the rules after full_classes_compiled_jar are very unlikely
-# to fail except for bugs in their respective tools. If you would
-# like to run these rules, add the "all" modifier goal to the make
-# command line.
-# This overwrites the value defined in base_rules.mk. That's a little
-# dirty. It's preferable to set LOCAL_CHECKED_MODULE, but this has to
-# be done after the inclusion of base_rules.mk.
-ALL_MODULES.$(LOCAL_MODULE).CHECKED := $(full_classes_compiled_jar)
-
$(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g
# Run jarjar if necessary, otherwise just copy the file.
@@ -327,9 +393,10 @@
# Proguard doesn't like a class in both library and the jar to be processed.
proguard_full_java_libs := $(filter-out $(full_static_java_libs),$(full_java_libs))
proguard_flags := $(addprefix -libraryjars ,$(proguard_full_java_libs)) \
- -include $(BUILD_SYSTEM)/proguard.flags \
-forceprocessing \
-printmapping $(proguard_dictionary)
+ifneq ($(LOCAL_PROGUARD_ENABLED),nosystem)
+proguard_flags += -include $(BUILD_SYSTEM)/proguard.flags
ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
proguard_flags += -include $(BUILD_SYSTEM)/proguard.emma.flags
endif
@@ -337,23 +404,13 @@
ifneq ($(strip $(LOCAL_INSTRUMENTATION_FOR)$(filter tests,$(LOCAL_MODULE_TAGS))$(filter android.test.runner,$(LOCAL_JAVA_LIBRARIES))),)
proguard_flags := $(proguard_flags) -include $(BUILD_SYSTEM)/proguard_tests.flags
endif # test package
+endif # LOCAL_PROGUARD_ENABLED is not nosystem
ifneq ($(LOCAL_PROGUARD_ENABLED),)
-ifeq ($(LOCAL_PROGUARD_ENABLED),full)
- # full
-else
-ifeq ($(LOCAL_PROGUARD_ENABLED),optonly)
- # optonly
- proguard_flags += -dontobfuscate
-else
-ifeq ($(LOCAL_PROGUARD_ENABLED),custom)
- # custom
-else
+ifeq ($(filter full custom nosystem, $(LOCAL_PROGUARD_ENABLED)),)
$(warning while processing: $(LOCAL_MODULE))
$(error invalid value for LOCAL_PROGUARD_ENABLED: $(LOCAL_PROGUARD_ENABLED))
-endif # custom
-endif # optonly
-endif # full
+endif # not a legal value
endif # LOCAL_PROGUARD_ENABLED
proguard_flag_files := $(addprefix $(LOCAL_PATH)/, $(LOCAL_PROGUARD_FLAG_FILES))
diff --git a/core/java_library.mk b/core/java_library.mk
index 6392108..62b16c3 100644
--- a/core/java_library.mk
+++ b/core/java_library.mk
@@ -73,7 +73,7 @@
else # !LOCAL_IS_STATIC_JAVA_LIBRARY
$(common_javalib.jar): PRIVATE_DEX_FILE := $(built_dex)
-$(common_javalib.jar) : $(built_dex) $(java_resource_sources) | $(AAPT)
+$(common_javalib.jar) : $(built_dex) $(java_resource_sources)
@echo "target Jar: $(PRIVATE_MODULE) ($@)"
$(create-empty-package)
$(add-dex-to-package)
@@ -106,7 +106,7 @@
@mkdir -p $(dir $@)
$(call dexpreopt-one-file,$<,$@)
-$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) $(AAPT)
+$(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP)
$(call copy-file-to-target)
ifneq (nostripping,$(LOCAL_DEX_PREOPT))
$(call dexpreopt-remove-classes.dex,$@)
diff --git a/core/llvm_config.mk b/core/llvm_config.mk
index 0308b28..2018e31 100644
--- a/core/llvm_config.mk
+++ b/core/llvm_config.mk
@@ -15,16 +15,17 @@
CLANG_CONFIG_EXTRA_CFLAGS := \
-D__compiler_offsetof=__builtin_offsetof \
- -Dnan=__builtin_nan \
CLANG_CONFIG_UNKNOWN_CFLAGS := \
-funswitch-loops
ifeq ($(TARGET_ARCH),arm)
- CLANG_CONFIG_EXTRA_CFLAGS += \
+ CLANG_CONFIG_EXTRA_ASFLAGS += \
-target arm-linux-androideabi \
-nostdlibinc \
- -B$(TARGET_TOOLCHAIN_ROOT)/arm-linux-androideabi/bin \
+ -B$(TARGET_TOOLCHAIN_ROOT)/arm-linux-androideabi/bin
+ CLANG_CONFIG_EXTRA_CFLAGS += \
+ $(CLANG_CONFIG_EXTRA_ASFLAGS) \
-mllvm -arm-enable-ehabi
CLANG_CONFIG_EXTRA_LDFLAGS += \
-target arm-linux-androideabi \
@@ -40,10 +41,11 @@
-Wa,--noexecstack
endif
ifeq ($(TARGET_ARCH),mips)
- CLANG_CONFIG_EXTRA_CFLAGS += \
+ CLANG_CONFIG_EXTRA_ASFLAGS += \
-target mipsel-linux-androideabi \
-nostdlibinc \
-B$(TARGET_TOOLCHAIN_ROOT)/mipsel-linux-android/bin
+ CLANG_CONFIG_EXTRA_CFLAGS += $(CLANG_CONFIG_EXTRA_ASFLAGS)
CLANG_CONFIG_EXTRA_LDFLAGS += \
-target mipsel-linux-androideabi \
-B$(TARGET_TOOLCHAIN_ROOT)/mipsel-linux-android/bin
@@ -62,10 +64,11 @@
-mtune=mips32
endif
ifeq ($(TARGET_ARCH),x86)
- CLANG_CONFIG_EXTRA_CFLAGS += \
+ CLANG_CONFIG_EXTRA_ASFLAGS += \
-target i686-linux-android \
-nostdlibinc \
-B$(TARGET_TOOLCHAIN_ROOT)/i686-linux-android/bin
+ CLANG_CONFIG_EXTRA_CFLAGS += $(CLANG_CONFIG_EXTRA_ASFLAGS)
CLANG_CONFIG_EXTRA_LDFLAGS += \
-target i686-linux-android \
-B$(TARGET_TOOLCHAIN_ROOT)/i686-linux-android/bin
@@ -93,11 +96,14 @@
$(call clang-flags-subst,-Wno-psabi,)
$(call clang-flags-subst,-Wno-unused-but-set-variable,)
-ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS := -faddress-sanitizer
+# clang does not support -mcpu=cortex-a15 yet - fall back to armv7-a for now
+$(call clang-flags-subst,-mcpu=cortex-a15,-march=armv7-a)
+
+ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS := -fsanitize=address
ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS := -Wl,-u,__asan_preinit
ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES := libdl libasan_preload
ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES := libasan
# This allows us to use the superset of functionality that compiler-rt
# provides to Clang (for supporting features like -ftrapv).
-COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES := libcompiler-rt-extras
+COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES := libcompiler_rt-extras
diff --git a/core/main.mk b/core/main.mk
index 0c70d92..b401ed2 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -84,6 +84,24 @@
# be generated correctly
include $(BUILD_SYSTEM)/cleanbuild.mk
+# These targets are going to delete stuff, don't bother including
+# the whole directory tree if that's all we're going to do
+ifeq ($(MAKECMDGOALS),clean)
+dont_bother := true
+endif
+ifeq ($(MAKECMDGOALS),clobber)
+dont_bother := true
+endif
+ifeq ($(MAKECMDGOALS),dataclean)
+dont_bother := true
+endif
+ifeq ($(MAKECMDGOALS),installclean)
+dont_bother := true
+endif
+
+# Include the google-specific config
+-include vendor/google/build/config.mk
+
VERSION_CHECK_SEQUENCE_NUMBER := 3
-include $(OUT_DIR)/versions_checked.mk
ifneq ($(VERSION_CHECK_SEQUENCE_NUMBER),$(VERSIONS_CHECKED))
@@ -215,8 +233,8 @@
ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),)
$(info ***************************************************************)
$(info ***************************************************************)
-$(info Do not pass '$(filter user userdebug eng tests,$(MAKECMDGOALS))' on \
- the make command line.)
+$(info Do not pass '$(filter user userdebug eng,$(MAKECMDGOALS))' on \
+ the make command line.)
$(info Set TARGET_BUILD_VARIANT in buildspec.mk, or use lunch or)
$(info choosecombo.)
$(info ***************************************************************)
@@ -323,12 +341,6 @@
endif
endif
-## tests ##
-
-ifeq ($(TARGET_BUILD_VARIANT),tests)
-tags_to_install := debug eng tests
-endif
-
## sdk ##
ifdef is_sdk_build
@@ -393,21 +405,6 @@
$(INTERNAL_MODIFIER_TARGETS): $(DEFAULT_GOAL)
endif
-# These targets are going to delete stuff, don't bother including
-# the whole directory tree if that's all we're going to do
-ifeq ($(MAKECMDGOALS),clean)
-dont_bother := true
-endif
-ifeq ($(MAKECMDGOALS),clobber)
-dont_bother := true
-endif
-ifeq ($(MAKECMDGOALS),dataclean)
-dont_bother := true
-endif
-ifeq ($(MAKECMDGOALS),installclean)
-dont_bother := true
-endif
-
# Bring in all modules that need to be built.
ifneq ($(dont_bother),true)
@@ -579,16 +576,14 @@
product_FILES :=
endif
-# When modules are tagged with debug eng or tests, they are installed
-# for those variants regardless of what the product spec says.
-debug_MODULES := $(sort \
- $(call get-tagged-modules,debug) \
- $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG)) \
- )
eng_MODULES := $(sort \
$(call get-tagged-modules,eng) \
$(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG)) \
)
+debug_MODULES := $(sort \
+ $(call get-tagged-modules,debug) \
+ $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG)) \
+ )
tests_MODULES := $(sort \
$(call get-tagged-modules,tests) \
$(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_TESTS)) \
@@ -635,7 +630,7 @@
# TODO: Should we do this for all builds and not just the sdk?
$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES), \
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
- $(warning $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES has nothing to install!)))
+ $(error $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES has nothing to install!)))
$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG), \
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(warning $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES_DEBUG has nothing to install!)))
@@ -647,9 +642,6 @@
$(warning $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES_TESTS has nothing to install!)))
endif
-# Install all of the host modules
-modules_to_install += $(sort $(modules_to_install) $(ALL_HOST_INSTALLED_FILES))
-
# build/core/Makefile contains extra stuff that we don't want to pollute this
# top-level makefile with. It expects that ALL_DEFAULT_INSTALLED_MODULES
# contains everything that's built during the current make, but it also further
@@ -733,6 +725,20 @@
.PHONY: bootimage
bootimage: $(INSTALLED_BOOTIMAGE_TARGET)
+# phony target that include any targets in $(ALL_MODULES)
+.PHONY: all_modules
+ifndef BUILD_MODULES_IN_PATHS
+all_modules: $(ALL_MODULES)
+else
+# BUILD_MODULES_IN_PATHS is a list of paths relative to the top of the tree
+module_path_patterns := $(foreach p, $(BUILD_MODULES_IN_PATHS),\
+ $(if $(filter %/,$(p)),$(p)%,$(p)/%))
+my_all_modules := $(sort $(foreach m, $(ALL_MODULES),$(if $(filter\
+ $(module_path_patterns), $(addsuffix /,$(ALL_MODULES.$(m).PATH))),$(m))))
+all_modules: $(my_all_modules)
+endif
+
+
# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: files \
@@ -809,13 +815,8 @@
endif # TARGET_BUILD_APPS
endif # droid in $(MAKECMDGOALS)
-
.PHONY: droid
-# phony target that include any targets in $(ALL_MODULES)
-.PHONY: all_modules
-all_modules: $(ALL_MODULES)
-
.PHONY: docs
docs: $(ALL_DOCS)
@@ -830,6 +831,21 @@
)
endif
+# umbrella targets to assit engineers in verifying builds
+.PHONY: java native target host java-host java-target native-host native-target \
+ java-host-tests java-target-tests native-host-tests native-target-tests \
+ java-tests native-tests host-tests target-tests
+# some synonyms
+.PHONY: host-java target-java host-native target-native \
+ target-java-tests target-native-tests
+host-java : java-host
+target-java : java-target
+host-native : native-host
+target-native : native-target
+target-java-tests : java-target-tests
+target-native-tests : native-target-tests
+
+
.PHONY: lintall
.PHONY: samplecode
diff --git a/core/native_test.mk b/core/native_test.mk
index ebe5edf..12cf4af 100644
--- a/core/native_test.mk
+++ b/core/native_test.mk
@@ -4,12 +4,16 @@
###########################################
LOCAL_CFLAGS += -DGTEST_OS_LINUX_ANDROID -DGTEST_HAS_STD_STRING
+
+LOCAL_C_INCLUDES += external/gtest/include
+LOCAL_STATIC_LIBRARIES += libgtest libgtest_main
+
+ifndef LOCAL_SDK_VERSION
LOCAL_C_INCLUDES += bionic \
bionic/libstdc++/include \
- external/gtest/include \
external/stlport/stlport
-LOCAL_STATIC_LIBRARIES += libgtest libgtest_main
LOCAL_SHARED_LIBRARIES += libstlport
+endif
ifndef LOCAL_MODULE_PATH
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
diff --git a/core/notice_files.mk b/core/notice_files.mk
index ee50394..2c0a3d3 100644
--- a/core/notice_files.mk
+++ b/core/notice_files.mk
@@ -4,11 +4,21 @@
notice_file:=$(strip $(wildcard $(LOCAL_PATH)/NOTICE))
-ifeq ($(LOCAL_MODULE_CLASS),NONE)
- # We ignore NOTICE files for modules of type NONE.
+ifeq ($(LOCAL_MODULE_CLASS),GYP)
+ # We ignore NOTICE files for modules of type GYP.
notice_file :=
endif
+ifeq ($(LOCAL_MODULE_CLASS),NOTICE_FILES)
+# If this is a NOTICE-only module, we don't include base_rule.mk,
+# so my_prefix is not set at this point.
+ifeq ($(LOCAL_IS_HOST_MODULE),true)
+ my_prefix := HOST_
+else
+ my_prefix := TARGET_
+endif
+endif
+
ifdef notice_file
# This relies on the name of the directory in PRODUCT_OUT matching where
diff --git a/core/package.mk b/core/package.mk
index 358caee..c0bc7d8 100644
--- a/core/package.mk
+++ b/core/package.mk
@@ -191,6 +191,8 @@
endif # EMMA_INSTRUMENT_STATIC
endif # LOCAL_EMMA_INSTRUMENT
+rs_compatibility_jni_libs :=
+
#################################
include $(BUILD_SYSTEM)/java.mk
#################################
@@ -324,6 +326,12 @@
$(addsuffix $(so_suffix), \
$(LOCAL_JNI_SHARED_LIBRARIES)))
+# Include RS dynamically-generated libraries as well
+# Keep this ifneq, as the += otherwise adds spaces that need to be stripped.
+ifneq ($(rs_compatibility_jni_libs),)
+jni_shared_libraries += $(rs_compatibility_jni_libs)
+endif
+
# App explicitly requires the prebuilt NDK libstlport_shared.so.
# libstlport_shared.so should never go to the system image.
# Instead it should be packaged into the apk.
@@ -376,6 +384,9 @@
PACKAGES.$(LOCAL_PACKAGE_NAME).PRIVATE_KEY := $(private_key)
PACKAGES.$(LOCAL_PACKAGE_NAME).CERTIFICATE := $(certificate)
+$(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(foreach c,\
+ $(LOCAL_ADDITIONAL_CERTIFICATES), $(c).x509.pem $(c).pk8)
+
# Define the rule to build the actual package.
$(LOCAL_BUILT_MODULE): $(AAPT) | $(ZIPALIGN)
ifdef LOCAL_DEX_PREOPT
diff --git a/core/pathmap.mk b/core/pathmap.mk
index 4aec521..27f42d4 100644
--- a/core/pathmap.mk
+++ b/core/pathmap.mk
@@ -51,6 +51,7 @@
system-core:system/core/include \
audio-effects:system/media/audio_effects/include \
audio-utils:system/media/audio_utils/include \
+ audio-route:system/media/audio_route/include \
wilhelm:frameworks/wilhelm/include \
wilhelm-ut:frameworks/wilhelm/src/ut \
speex:external/speex/include
@@ -97,7 +98,6 @@
wifi \
keystore \
icu4j \
- voip \
)
#
diff --git a/core/pdk_config.mk b/core/pdk_config.mk
index 894b626..afa5b74 100644
--- a/core/pdk_config.mk
+++ b/core/pdk_config.mk
@@ -47,6 +47,7 @@
target/common/obj/JAVA_LIBRARIES/framework_intermediates \
target/common/obj/JAVA_LIBRARIES/android.test.runner_intermediates \
target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates \
+ target/common/obj/JAVA_LIBRARIES/voip-common_intermediates \
target/common/obj/JAVA_LIBRARIES/mms-common_intermediates
# not java libraries
PDK_PLATFORM_JAVA_ZIP_CONTENTS := \
@@ -109,6 +110,7 @@
# Copy with the last-modified time preserved, never follow symbolic links.
$(PRODUCT_OUT)/% : $(_pdk_fusion_intermediates)/% $(_pdk_fusion_stamp)
@mkdir -p $(dir $@)
+ $(hide) rm -rf $@
$(hide) cp -fpPR $< $@
ifeq (true,$(TARGET_BUILD_PDK_JAVA_PLATFORM))
diff --git a/core/prebuilt.mk b/core/prebuilt.mk
index 31ea0e0..46771e4 100644
--- a/core/prebuilt.mk
+++ b/core/prebuilt.mk
@@ -16,10 +16,16 @@
$(error dont use LOCAL_PREBUILT_JAVA_LIBRARIES anymore LOCAL_PATH=$(LOCAL_PATH))
endif
-ifdef LOCAL_IS_HOST_MODULE
- my_prefix:=HOST_
+ifdef LOCAL_PREBUILT_MODULE_FILE
+my_prebuilt_src_file := $(LOCAL_PREBUILT_MODULE_FILE)
else
- my_prefix:=TARGET_
+my_prebuilt_src_file := $(LOCAL_PATH)/$(LOCAL_SRC_FILES)
+endif
+
+ifdef LOCAL_IS_HOST_MODULE
+ my_prefix := HOST_
+else
+ my_prefix := TARGET_
endif
ifeq (SHARED_LIBRARIES,$(LOCAL_MODULE_CLASS))
# Put the built targets of all shared libraries in a common directory
@@ -27,14 +33,15 @@
OVERRIDE_BUILT_MODULE_PATH := $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)
endif
-# Deal with the OSX library timestamp issue when installing
-# a prebuilt simulator library.
ifneq ($(filter STATIC_LIBRARIES SHARED_LIBRARIES,$(LOCAL_MODULE_CLASS)),)
prebuilt_module_is_a_library := true
else
prebuilt_module_is_a_library :=
endif
+# Install the shared libraries if necessary
+LOCAL_REQUIRED_MODULES += $(LOCAL_SHARED_LIBRARIES)
+
# Don't install static libraries by default.
ifndef LOCAL_UNINSTALLABLE_MODULE
ifeq (STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS))
@@ -73,7 +80,7 @@
endif
$(LOCAL_BUILT_MODULE) : | $(intermediates)/export_includes
-endif
+endif # prebuilt_module_is_a_library
endif
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
@@ -95,7 +102,7 @@
ifneq ($(filter APPS,$(LOCAL_MODULE_CLASS)),)
# It is now a build error to add a prebuilt .apk without
# specifying a key for it.
- $(error No LOCAL_CERTIFICATE specified for prebuilt "$(LOCAL_SRC_FILES)")
+ $(error No LOCAL_CERTIFICATE specified for prebuilt "$(my_prebuilt_src_file)")
endif
else ifeq ($(LOCAL_CERTIFICATE),PRESIGNED)
# The magic string "PRESIGNED" means this package is already checked
@@ -123,21 +130,21 @@
ifneq ($(filter APPS,$(LOCAL_MODULE_CLASS)),)
ifeq ($(LOCAL_CERTIFICATE),PRESIGNED)
# Ensure that presigned .apks have been aligned.
-$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ZIPALIGN)
+$(built_module) : $(my_prebuilt_src_file) | $(ZIPALIGN)
$(transform-prebuilt-to-target-with-zipalign)
else
# Sign and align non-presigned .apks.
-$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR)
+$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR)
$(transform-prebuilt-to-target)
$(sign-package)
$(align-package)
endif
else
ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),)
-$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES)
+$(built_module) : $(my_prebuilt_src_file)
$(transform-prebuilt-to-target-strip-comments)
else
-$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ACP)
+$(built_module) : $(my_prebuilt_src_file) | $(ACP)
$(transform-prebuilt-to-target)
ifneq ($(prebuilt_module_is_a_library),)
ifneq ($(LOCAL_IS_HOST_MODULE),)
@@ -157,7 +164,7 @@
common_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE),,COMMON)/classes.jar
common_javalib_jar := $(dir $(common_classes_jar))javalib.jar
-$(common_classes_jar) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ACP)
+$(common_classes_jar) : $(my_prebuilt_src_file) | $(ACP)
$(transform-prebuilt-to-target)
$(common_javalib_jar) : $(common_classes_jar) | $(ACP)
diff --git a/core/product.mk b/core/product.mk
index b934826..bbd0c31 100644
--- a/core/product.mk
+++ b/core/product.mk
@@ -209,6 +209,7 @@
_product_stash_var_list := $(_product_var_list) \
TARGET_ARCH \
TARGET_ARCH_VARIANT \
+ TARGET_CPU_VARIANT \
TARGET_BOARD_PLATFORM \
TARGET_BOARD_PLATFORM_GPU \
TARGET_BOARD_KERNEL_HEADERS \
diff --git a/core/product_config.mk b/core/product_config.mk
index e05907d..bfbdf78 100644
--- a/core/product_config.mk
+++ b/core/product_config.mk
@@ -82,7 +82,7 @@
# These are the valid values of TARGET_BUILD_VARIANT. Also, if anything else is passed
# as the variant in the PRODUCT-$TARGET_BUILD_PRODUCT-$TARGET_BUILD_VARIANT form,
# it will be treated as a goal, and the eng variant will be used.
-INTERNAL_VALID_VARIANTS := user userdebug eng tests
+INTERNAL_VALID_VARIANTS := user userdebug eng
# ---------------------------------------------------------------
# Provide "PRODUCT-<prodname>-<goal>" targets, which lets you build
@@ -109,6 +109,10 @@
# The variant they want
TARGET_BUILD_VARIANT := $(word 2,$(product_goals))
+ ifeq ($(TARGET_BUILD_VARIANT),tests)
+ $(error "tests" has been deprecated as a build variant. Use it as a build goal instead.)
+ endif
+
# The build server wants to do make PRODUCT-dream-installclean
# which really means TARGET_PRODUCT=dream make installclean.
ifneq ($(filter-out $(INTERNAL_VALID_VARIANTS),$(TARGET_BUILD_VARIANT)),)
@@ -119,11 +123,6 @@
default_goal_substitution := $(DEFAULT_GOAL)
endif
- # For tests build, only build tests-build-target
- ifeq (tests,$(TARGET_BUILD_VARIANT))
- default_goal_substitution := tests-build-target
- endif
-
# Replace the PRODUCT-* goal with the build goal that it refers to.
# Note that this will ensure that it appears in the same relative
# position, in case it matters.
diff --git a/core/shared_library.mk b/core/shared_library.mk
index 97442f7..10012df 100644
--- a/core/shared_library.mk
+++ b/core/shared_library.mk
@@ -20,6 +20,17 @@
$(error $(LOCAL_PATH): Cannot set module stem for a library)
endif
+$(call target-shared-library-hook)
+
+skip_build_from_source :=
+ifdef LOCAL_PREBUILT_MODULE_FILE
+ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH)))
+include $(BUILD_PREBUILT)
+skip_build_from_source := true
+endif
+endif
+
+ifndef skip_build_from_source
####################################################
## Add profiling libraries if aprof is turned
####################################################
@@ -68,3 +79,5 @@
$(LOCAL_ADDITIONAL_DEPENDENCIES) \
$(my_target_crtbegin_so_o) $(my_target_crtend_so_o)
$(transform-o-to-shared-lib)
+
+endif # skip_build_from_source
diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk
index 24b3428..1c91975 100644
--- a/core/tasks/apicheck.mk
+++ b/core/tasks/apicheck.mk
@@ -54,7 +54,7 @@
# SDK version.
$(eval $(call check-api, \
checkapi-current, \
- $(SRC_API_DIR)/current.txt, \
+ frameworks/base/api/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 \
@@ -68,6 +68,6 @@
.PHONY: update-api
update-api: $(INTERNAL_PLATFORM_API_FILE) | $(ACP)
@echo Copying current.txt
- $(hide) $(ACP) $(INTERNAL_PLATFORM_API_FILE) $(SRC_API_DIR)/current.txt
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_API_FILE) frameworks/base/api/current.txt
endif
diff --git a/core/version_defaults.mk b/core/version_defaults.mk
index 9330465..ceb550f 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.2.2.2.2.2.2.2.2
+ PLATFORM_VERSION := JellyBeanMR2
endif
ifeq "" "$(PLATFORM_SDK_VERSION)"
@@ -59,7 +59,7 @@
ifeq "" "$(PLATFORM_VERSION_CODENAME)"
# This is the current development code-name, if the build is not a final
# release build. If this is a final release build, it is simply "REL".
- PLATFORM_VERSION_CODENAME := AOSP
+ PLATFORM_VERSION_CODENAME := JellyBeanMR2
endif
ifeq "" "$(DEFAULT_APP_TARGET_SDK)"
diff --git a/envsetup.sh b/envsetup.sh
index b4199b0..3ec8e1a 100644
--- a/envsetup.sh
+++ b/envsetup.sh
@@ -2,11 +2,13 @@
cat <<EOF
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- lunch: lunch <product_name>-<build_variant>
-- tapas: tapas [<App1> <App2> ...] [arm|x86|mips] [eng|userdebug|user]
+- tapas: tapas [<App1> <App2> ...] [arm|x86|mips|armv5] [eng|userdebug|user]
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
-- mm: Builds all of the modules in the current directory.
-- mmm: Builds all of the modules in the supplied directories.
+- mm: Builds all of the modules in the current directory, but not their dependencies.
+- mmm: Builds all of the modules in the supplied directories, but not their dependencies.
+- mma: Builds all of the modules in the current directory, and their dependencies.
+- mmma: Builds all of the modules in the supplied directories, and their dependencies.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
@@ -538,9 +540,9 @@
# Run tapas with one ore more app names (from LOCAL_PACKAGE_NAME)
function tapas()
{
- local arch=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips)$'))
+ local arch=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(arm|x86|mips|armv5)$'))
local variant=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$'))
- local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips)$'))
+ local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng|arm|x86|mips|armv5)$'))
if [ $(echo $arch | wc -w) -gt 1 ]; then
echo "tapas: Error: Multiple build archs supplied: $arch"
@@ -555,6 +557,7 @@
case $arch in
x86) product=full_x86;;
mips) product=full_mips;;
+ armv5) product=generic_armv5;;
esac
if [ -z "$variant" ]; then
variant=eng
@@ -602,7 +605,7 @@
{
T=$(gettop)
if [ "$T" ]; then
- make -C $T $@
+ make -C $T -f build/core/main.mk $@
else
echo "Couldn't locate the top of the tree. Try setting TOP."
fi
@@ -642,7 +645,7 @@
elif [ ! "$M" ]; then
echo "Couldn't locate a makefile from the current directory."
else
- ONE_SHOT_MAKEFILE=$M make -C $T all_modules $@
+ ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk all_modules $@
fi
fi
}
@@ -689,12 +692,61 @@
fi
fi
done
- ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS $MODULES $ARGS
+ ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS
else
echo "Couldn't locate the top of the tree. Try setting TOP."
fi
}
+function mma()
+{
+ if [ -f build/core/envsetup.mk -a -f Makefile ]; then
+ make $@
+ else
+ T=$(gettop)
+ if [ ! "$T" ]; then
+ echo "Couldn't locate the top of the tree. Try setting TOP."
+ fi
+ local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'`
+ make -C $T -f build/core/main.mk $@ all_modules BUILD_MODULES_IN_PATHS="$MY_PWD"
+ fi
+}
+
+function mmma()
+{
+ T=$(gettop)
+ if [ "$T" ]; then
+ local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')
+ local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')
+ local MY_PWD=`PWD= /bin/pwd`
+ if [ "$MY_PWD" = "$T" ]; then
+ MY_PWD=
+ else
+ MY_PWD=`echo $MY_PWD|sed 's:'$T'/::'`
+ fi
+ local DIR=
+ local MODULE_PATHS=
+ local ARGS=
+ for DIR in $DIRS ; do
+ if [ -d $DIR ]; then
+ if [ "$MY_PWD" = "" ]; then
+ MODULE_PATHS="$MODULE_PATHS $DIR"
+ else
+ MODULE_PATHS="$MODULE_PATHS $MY_PWD/$DIR"
+ fi
+ else
+ case $DIR in
+ showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";;
+ *) echo "Couldn't find directory $DIR"; return 1;;
+ esac
+ fi
+ done
+ make -C $T -f build/core/main.mk $DASH_ARGS $ARGS all_modules BUILD_MODULES_IN_PATHS="$MODULE_PATHS"
+ else
+ echo "Couldn't locate the top of the tree. Try setting TOP."
+ fi
+}
+
function croot()
{
T=$(gettop)
@@ -771,13 +823,24 @@
PORT=":5039"
fi
- local PID
- local PROG="$3"
- if [ "$PROG" ] ; then
- if [[ "$PROG" =~ ^[0-9]+$ ]] ; then
- PID="$3"
- else
+ local PID="$3"
+ if [ "$PID" ] ; then
+ if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
PID=`pid $3`
+ if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then
+ # that likely didn't work because of returning multiple processes
+ # try again, filtering by root processes (don't contain colon)
+ PID=`adb shell ps | grep $3 | grep -v ":" | awk '{print $2}'`
+ if [[ ! "$PID" =~ ^[0-9]+$ ]]
+ then
+ echo "Couldn't resolve '$3' to single PID"
+ return 1
+ else
+ echo ""
+ echo "WARNING: multiple processes matching '$3' observed, using root process"
+ echo ""
+ fi
+ fi
fi
adb forward "tcp$PORT" "tcp$PORT"
adb shell gdbserver $PORT --attach $PID &
@@ -787,7 +850,7 @@
echo "If you haven't done so already, do this first on the device:"
echo " gdbserver $PORT /system/bin/$EXE"
echo " or"
- echo " gdbserver $PORT --attach $PID"
+ echo " gdbserver $PORT --attach <PID>"
echo ""
fi
diff --git a/tools/bin2asm/Android.mk b/target/board/generic_armv5/AndroidBoard.mk
similarity index 72%
rename from tools/bin2asm/Android.mk
rename to target/board/generic_armv5/AndroidBoard.mk
index 4522a20..7daff27 100644
--- a/tools/bin2asm/Android.mk
+++ b/target/board/generic_armv5/AndroidBoard.mk
@@ -1,4 +1,5 @@
-# Copyright (C) 2008 The Android Open Source Project
+#
+# Copyright (C) 2011 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.
@@ -11,14 +12,6 @@
# 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.
+#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- icudata.c
-
-LOCAL_MODULE := icudata
-
-include $(BUILD_HOST_EXECUTABLE)
-
+-include build/target/board/generic/AndroidBoard.mk
diff --git a/tools/bin2asm/Android.mk b/target/board/generic_armv5/BoardConfig.mk
similarity index 68%
copy from tools/bin2asm/Android.mk
copy to target/board/generic_armv5/BoardConfig.mk
index 4522a20..95fb559 100644
--- a/tools/bin2asm/Android.mk
+++ b/target/board/generic_armv5/BoardConfig.mk
@@ -1,4 +1,5 @@
-# Copyright (C) 2008 The Android Open Source Project
+#
+# Copyright (C) 2011 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.
@@ -11,14 +12,13 @@
# 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.
+#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
+include build/target/board/generic/BoardConfig.mk
-LOCAL_SRC_FILES := \
- icudata.c
+TARGET_ARCH_VARIANT := armv5te
+TARGET_CPU_ABI := armeabi
+TARGET_CPU_ABI2 :=
+ARCH_ARM_HAVE_TLS_REGISTER := false
-LOCAL_MODULE := icudata
-
-include $(BUILD_HOST_EXECUTABLE)
-
+WITH_DEXPREOPT := false
diff --git a/target/board/generic_armv5/README.txt b/target/board/generic_armv5/README.txt
new file mode 100644
index 0000000..25d590a
--- /dev/null
+++ b/target/board/generic_armv5/README.txt
@@ -0,0 +1,5 @@
+The "generic_armv5" product defines a non-hardware-specific target
+without a kernel or bootloader.
+
+It is not a product "base class"; no other products inherit
+from it or use it in any way.
diff --git a/tools/bin2asm/Android.mk b/target/board/generic_armv5/device.mk
similarity index 72%
copy from tools/bin2asm/Android.mk
copy to target/board/generic_armv5/device.mk
index 4522a20..7c4aaf2 100644
--- a/tools/bin2asm/Android.mk
+++ b/target/board/generic_armv5/device.mk
@@ -1,4 +1,5 @@
-# Copyright (C) 2008 The Android Open Source Project
+#
+# Copyright (C) 2011 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.
@@ -11,14 +12,6 @@
# 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.
+#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- icudata.c
-
-LOCAL_MODULE := icudata
-
-include $(BUILD_HOST_EXECUTABLE)
-
+include build/target/board/generic/device.mk
diff --git a/target/board/generic_armv5/system.prop b/target/board/generic_armv5/system.prop
new file mode 100644
index 0000000..137a0f9
--- /dev/null
+++ b/target/board/generic_armv5/system.prop
@@ -0,0 +1,6 @@
+#
+# system.prop for generic sdk
+#
+
+rild.libpath=/system/lib/libreference-ril.so
+rild.libargs=-d /dev/ttyS0
diff --git a/target/product/AndroidProducts.mk b/target/product/AndroidProducts.mk
index 5206aa1..b0e22e1 100644
--- a/target/product/AndroidProducts.mk
+++ b/target/product/AndroidProducts.mk
@@ -35,6 +35,7 @@
ifneq ($(TARGET_BUILD_APPS),)
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/full.mk \
+ $(LOCAL_DIR)/generic_armv5.mk \
$(LOCAL_DIR)/full_x86.mk \
$(LOCAL_DIR)/full_mips.mk
else
diff --git a/target/product/base.mk b/target/product/base.mk
index 68fed42..a90a7f0 100644
--- a/target/product/base.mk
+++ b/target/product/base.mk
@@ -79,7 +79,6 @@
libutils \
libvisualizer \
libvorbisidec \
- libwebcore \
libwpa_client \
mediaserver \
monkey \
@@ -102,7 +101,7 @@
system_server \
tc \
vdc \
- vold
+ vold \
+ webview
$(call inherit-product, $(SRC_TARGET_DIR)/product/embedded.mk)
-
diff --git a/target/product/core.mk b/target/product/core.mk
index e10dc31..ddeec0b 100644
--- a/target/product/core.mk
+++ b/target/product/core.mk
@@ -40,6 +40,7 @@
PicoTts \
SettingsProvider \
SharedStorageBackup \
+ Shell \
TelephonyProvider \
UserDictionaryProvider \
VpnDialogs \
@@ -108,6 +109,7 @@
libstagefright_soft_amrwbenc \
libstagefright_soft_flacenc \
libstagefright_soft_g711dec \
+ libstagefright_soft_gsmdec \
libstagefright_soft_h264dec \
libstagefright_soft_h264enc \
libstagefright_soft_mp3dec \
@@ -115,6 +117,7 @@
libstagefright_soft_mpeg4enc \
libstagefright_soft_vorbisdec \
libstagefright_soft_vpxdec \
+ libstagefright_soft_vpxenc \
libstagefright_soft_rawdec \
libvariablespeed \
libwebrtc_audio_preprocessing \
@@ -128,6 +131,7 @@
lint \
uiautomator \
telephony-common \
+ voip-common \
mms-common
# SELinux packages
diff --git a/target/product/embedded.mk b/target/product/embedded.mk
index 7f681b1..0830101 100644
--- a/target/product/embedded.mk
+++ b/target/product/embedded.mk
@@ -50,7 +50,6 @@
libstdc++ \
libstlport \
libsurfaceflinger \
- libsurfaceflinger_client \
libsurfaceflinger_ddmconnection \
libsysutils \
libthread_db \
diff --git a/tools/bin2asm/Android.mk b/target/product/generic_armv5.mk
similarity index 61%
copy from tools/bin2asm/Android.mk
copy to target/product/generic_armv5.mk
index 4522a20..daa321a 100644
--- a/tools/bin2asm/Android.mk
+++ b/target/product/generic_armv5.mk
@@ -1,4 +1,5 @@
-# Copyright (C) 2008 The Android Open Source Project
+#
+# Copyright (C) 2011 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.
@@ -11,14 +12,14 @@
# 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.
+#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
+# This is a generic product that isn't specialized for a specific device.
+# It includes the base Android platform.
-LOCAL_SRC_FILES := \
- icudata.c
+$(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk)
-LOCAL_MODULE := icudata
-
-include $(BUILD_HOST_EXECUTABLE)
-
+# Overrides
+PRODUCT_BRAND := generic_armv5
+PRODUCT_DEVICE := generic_armv5
+PRODUCT_NAME := generic_armv5
diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk
index 5bdc596..b901104 100644
--- a/target/product/generic_no_telephony.mk
+++ b/target/product/generic_no_telephony.mk
@@ -35,6 +35,7 @@
Launcher2 \
Music \
MusicFX \
+ OneTimeInitializer \
Provision \
Phone \
QuickSearchBox \
@@ -85,6 +86,7 @@
$(call inherit-product-if-exists, external/lohit-fonts/fonts.mk)
$(call inherit-product-if-exists, external/naver-fonts/fonts.mk)
$(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk)
+$(call inherit-product-if-exists, frameworks/webview/chromium/chromium.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk)
# Overrides
diff --git a/target/product/mini.mk b/target/product/mini.mk
index b69c917..bcaab92 100644
--- a/target/product/mini.mk
+++ b/target/product/mini.mk
@@ -61,6 +61,7 @@
MediaProvider \
PackageInstaller \
SettingsProvider \
+ Shell \
TelephonyProvider \
UserDictionaryProvider \
abcc \
@@ -128,6 +129,7 @@
libstagefright_soft_amrwbenc \
libstagefright_soft_flacenc \
libstagefright_soft_g711dec \
+ libstagefright_soft_gsmdec \
libstagefright_soft_h264dec \
libstagefright_soft_h264enc \
libstagefright_soft_mp3dec \
@@ -142,15 +144,16 @@
libz \
lint \
mdnsd \
- mms-common \
network \
pand \
requestsync \
screencap \
sdptool \
sensorservice \
+ lint \
telephony-common \
- wpa_supplicant
+ voip-common \
+ mms-common
PRODUCT_COPY_FILES += \
system/core/rootdir/init.usb.rc:root/init.usb.rc \
diff --git a/target/product/telephony.mk b/target/product/telephony.mk
index 89ed20a..da1497d 100644
--- a/target/product/telephony.mk
+++ b/target/product/telephony.mk
@@ -18,6 +18,7 @@
# to products that have telephony hardware.
PRODUCT_PACKAGES := \
+ Dialer \
Mms \
rild
diff --git a/tools/bin2asm/data b/tools/bin2asm/data
deleted file mode 100644
index 3be865f..0000000
--- a/tools/bin2asm/data
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Convert a data file into a .S file suitable for assembly.
- * This reads from stdin and writes to stdout and takes a single
- * argument for the name of the symbol in the assembly file.
- */
-
-#include <stdio.h>
-
-int main(int argc, char *argv[]) {
- unsigned char buf[4096];
- size_t amt;
- size_t i;
- int col = 0;
- char *name = argv[1];
-
- printf("\
-#ifdef __APPLE_CC__\n\
-/*\n\
- * The mid-2007 version of gcc that ships with Macs requires a\n\
- * comma on the .section line, but the rest of the world thinks\n\
- * that's a syntax error. It also wants globals to be explicitly\n\
- * prefixed with \"_\" as opposed to modern gccs that do the\n\
- * prefixing for you.\n\
- */\n\
-.globl _%s\n\
- .section .rodata,\n\
- .align 8\n\
-_%s:\n\
-#else\n\
-.globl %s\n\
- .section .rodata\n\
- .align 8\n\
-%s:\n\
-#endif\n\
-", name, name, name, name);
-
- while (! feof(stdin)) {
- amt = fread(buf, 1, sizeof(buf), stdin);
- for (i = 0; i < amt; i++) {
- printf((col == 0) ? ".byte %3d" : ",%3d", buf[i]);
- col++;
- if (col == 16) {
- printf("\n");
- col = 0;
- }
- }
- }
-
- if (col != 0) {
- printf("\n");
- }
-}
diff --git a/tools/bin2asm/icudata.c b/tools/bin2asm/icudata.c
deleted file mode 100644
index ecd1b4b..0000000
--- a/tools/bin2asm/icudata.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Convert a data file into a .S file suitable for assembly.
- * This reads from stdin and writes to stdout and takes a single
- * argument for the name of the symbol in the assembly file.
- */
-
-#include <stdio.h>
-
-int main(int argc, char *argv[]) {
- unsigned char buf[4096];
- size_t amt;
- size_t i;
- int col = 0;
- char *name;
-
- if (argc != 2) {
- fprintf(stderr, "usage: %s NAME < DAT_FILE > ASM_FILE\n", argv[0]);
- for (i=0; i<argc; i++) {
- fprintf(stderr, " '%s'", argv[i]);
- }
- fprintf(stderr, "\n");
- return 1;
- }
-
- name = argv[1];
-
- printf("\
-#ifdef __APPLE_CC__\n\
-/*\n\
- * The mid-2007 version of gcc that ships with Macs requires a\n\
- * comma on the .section line, but the rest of the world thinks\n\
- * that's a syntax error. It also wants globals to be explicitly\n\
- * prefixed with \"_\" as opposed to modern gccs that do the\n\
- * prefixing for you.\n\
- */\n\
-.globl _%s\n\
- .section .rodata,\n\
- .align 8\n\
-_%s:\n\
-#else\n\
-.globl %s\n\
- .section .rodata\n\
- .align 8\n\
-%s:\n\
-#endif\n\
-", name, name, name, name);
-
- while (! feof(stdin)) {
- amt = fread(buf, 1, sizeof(buf), stdin);
- for (i = 0; i < amt; i++) {
- if (col == 0) {
- printf(".byte ");
- }
- printf("0x%02x", buf[i]);
- col++;
- if (col == 16) {
- printf("\n");
- col = 0;
- } else if (col % 4 == 0) {
- printf(", ");
- } else {
- printf(",");
- }
- }
- }
-
- if (col != 0) {
- printf("\n");
- }
-
- return 0;
-}
diff --git a/tools/droiddoc/templates-pdk/assets/android-developer-core.css b/tools/droiddoc/templates-pdk/assets/android-developer-core.css
index bb4f806..c4fffaa 100644
--- a/tools/droiddoc/templates-pdk/assets/android-developer-core.css
+++ b/tools/droiddoc/templates-pdk/assets/android-developer-core.css
@@ -16,59 +16,6 @@
border: 0;
}
-.rebox {
- background:#daf3fc;
- margin-bottom:1.5em;
- -moz-border-radius:5px;
- -webkit-border-radius:5px;
-}
-.rebox.lil p img {
- display:block;
- margin-bottom:2em;
-}
-
-.rebox .p {
- padding:1.5em;
- line-height:1.25em;
-}
-
-.p-r {
- padding-right:1.5em;
-}
-
-.rebox h2, .rebox h3 {
- font-size:16px;
- color:#fff;
- display:block;
- background:url('/assets/images/rebox-gradient.gif') no-repeat center bottom #95c0d0;
- padding:.5em .5em .5em .75em;
- -moz-border-radius-topright:5px;
- -moz-border-radius-topleft:5px;
- -webkit-border-top-right-radius:5px;
- -webkit-border-top-left-radius:5px;
-}
-
-.rebox.lil {
-}
-.rebox.lil img {
- float:left;
- margin:0 1em 0 0;
- padding:0 0 3em 0;
-}
-
-.rebox.green {
- background:#d4e9a9;
-}
-
-.rebox.green h2, .rebox.green h3 {
- background:url('images/rebox-gradient-green.gif') no-repeat center bottom #aaca46;
- font-weight:bold;
-}
-
-.rebox.green a:link, .rebox.green a:visited {
- color:#360;
-}
-
/* BASICS */
html, body {
@@ -81,38 +28,38 @@
color:#000;
font-size:13px;
color:#333;
- background-image:url(images/bg_fade.jpg);
+ background-image:url(images/bg_fade.jpg);
background-repeat:repeat-x;
}
-a, a code {
+a, a code {
color:#006699;
-}
-
+}
a:active,
-a:active code {
+a:active code {
color:#f00;
}
a:visited,
-a:visited code {
+a:visited code {
color:#006699;
}
input, select,
-textarea, option {
+textarea, option, label {
font-family:inherit;
font-size:inherit;
padding:0;
margin:0;
+ vertical-align:middle;
}
option {
padding:0 4px;
}
-p {
+p, form {
padding:0;
margin:0 0 1em;
}
@@ -160,7 +107,7 @@
padding:0;
}
-dt {
+dt {
margin:0;
padding:0;
}
@@ -182,7 +129,9 @@
margin:.5em 0 0 1em;
}
-dd pre, dd table, dd img {
+dd pre,
+#jd-content dd table,
+#jd-content dd img {
margin:1em 0 0 1em;
}
@@ -228,6 +177,10 @@
background-color:#dee8f1;
}
+td > p:last-child {
+ margin:0;
+}
+
hr.blue {
background-color:#DDF0F2;
border:none;
@@ -235,10 +188,16 @@
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; */
+ background:transparent url(images/preliminary.png) repeat scroll 0 0; */
margin:0;
position:relative;
width:100%;
@@ -248,7 +207,7 @@
height: 114px;
position:relative;
z-index:100;
- min-width:576px;
+ min-width:675px; /* min width for the tabs, before they wrap */
padding:0 10px;
border-bottom:3px solid #94b922;
}
@@ -259,7 +218,6 @@
#headerLeft img{
height:50px;
- width:349px;
}
#headerRight {
@@ -270,9 +228,10 @@
}
/* Tabs in the header */
+
#header ul {
list-style: none;
- margin: 7px 0 0;
+ margin: 7px 0 0;
padding: 0;
height: 29px;
}
@@ -313,14 +272,13 @@
display:none;
}
-/* TAB HIGHLIGHTING */
+/* tab highlighting */
+
.home #home-link a,
-.community #community-link a,
-.porting #porting-link a,
-.source #source-link a,
-.about #about-link a,
-.downloads #downloads-link a,
-.compatibility #compatibility-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;
@@ -331,14 +289,10 @@
}
.home #home-link a:hover,
-.community #community-link a:hover,
-.home #home-link a:hover,
-.community #community-link a:hover,
-.porting #porting-link a:hover,
-.source #source-link a:hover,
-.about #about-link a:hover,
-.downloads #downloads-link a:hover,
-.compatibility #compatibility-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;
@@ -368,7 +322,7 @@
margin:15px 10px 0 0;
}
-/* main */
+/* MAIN BODY */
#mainBodyFluid {
margin: 20px 10px;
@@ -391,7 +345,7 @@
}
#mainBodyFixed h2,
-#mainBodyFluid h2 {
+#mainBodyFluid h2 {
color:#336666;
font-size:1.25em;
margin: 0;
@@ -399,7 +353,7 @@
}
#mainBodyFixed h1,
-#mainBodyFluid h1 {
+#mainBodyFluid h1 {
color:#435A6E;
font-size:1.7em;
margin: 1em 0;
@@ -407,7 +361,7 @@
#mainBodyFixed .green,
#mainBodyFluid .green,
-#jd-content .green {
+#jd-content .green {
color:#7BB026;
background-color:none;
}
@@ -415,13 +369,13 @@
#mainBodyLeft {
float: left;
width: 600px;
- margin-right: 20px;
+ margin-right: 20px;
color: #333;
position:relative;
}
div.indent {
- margin-left: 40px;
+ margin-left: 40px;
margin-right: 70px;
}
@@ -464,6 +418,10 @@
text-align:left;
}
+#mainBodyRight td p {
+ margin:0 0 1em 0;
+}
+
#mainBodyRight .blueBorderBox {
border:5px solid #ddf0f2;
padding:18px 18px 18px 18px;
@@ -493,7 +451,8 @@
clear: both;
}
-/* Footer */
+/* FOOTER */
+
#footer {
float: left;
width:90%;
@@ -521,99 +480,8 @@
color:#006699;
}
-#homeBottom td {
- border:0px solid #666;
- padding: 8px 18px 8px 18px;
-}
-
-#homeBottom table {
- width: 100%;
-}
-
-
-#homeBottom {
- padding: 0px 0px 0px 0px;
- float: left;
- width: 585px;
- height: 165px;
- background-image:url(images/home/bg_home_bottom.jpg);
- background-repeat: no-repeat;
-}
-
-.groupTable {
- width: 100%;
-}
-
-.groupTable th {
- padding: 10px;
- color: #ffffff;
- background-color: #6D8293;
- border: 2px solid #fff;
-}
-
-.groupTable td {
- padding: 10px;
- color: #333333;
- background-color: #d9d9d9;
- border: 2px solid #fff;
-}
-
-.groupTable .evenRow td {
- background-color: #ededed;
-}
-
-span.BigBlue {
- color:#336666;
- font-size:1.25em;
- margin: 0em 0em 0em 0em;
- padding-bottom:.5em;
- font-weight: bold;
-}
-
-span.emBlue {
- color: #336666;
- font-style:italic;
-}
-
-.pageTable {
- width: 95%;
- border: none;
-}
-
-.pageTable img {
-vertical-align: bottom;
-}
-
-.pageTable td {
- border: none;
-}
-
-.pageTable td.leftNav {
- width: 100px;
-}
-
-.greenBox {
- margin: 10px 30px 10px 30px;
- padding: 10px 20px 10px 20px;
- background-color: #EBF3DB;
- width: 75%;
-}
-
-.blueBox {
- margin: 10px 30px 10px 30px;
- padding: 10px 20px 10px 20px;
- background-color: #DDF0F2;
- width: 75%;
-}
-
-.blueHR {
- margin: 10px 30px 10px 30px;
- height: 5px;
- background-color: #DDF0F2;
- width: 75%;
-}
-
/* SEARCH FILTER */
+
#search_autocomplete {
color:#aaa;
}
@@ -658,7 +526,7 @@
padding-right: 6px;
padding-top: 1px;
padding-bottom: 1px;
- font-size: .8em;
+ font-size: 0.81em;
border: none;
margin: 0;
line-height: 1.05em;
@@ -724,7 +592,7 @@
.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,
#leftSearchControl a b {
color:#006699;
}
@@ -780,6 +648,7 @@
#doc-content .gsc-tabHeader {
padding: 3px 6px;
position:relative;
+ width:auto;
}
#doc-content .gsc-tabHeader.gsc-tabhActive {
@@ -800,7 +669,7 @@
padding: 0px 0px 0px 0px;
float: left;
width: 584px;
- height: 580px;
+ height: 627px;
position:relative;
}
@@ -810,7 +679,7 @@
#homeTitle {
padding:15px 15px 0;
- height:30px;
+ height:30px;
}
#homeTitle h2 {
@@ -845,8 +714,8 @@
}
#carouselMain {
- background: url(images/home/bg_home_carousel_board.png) 0 0 no-repeat;
- height:auto;
+ background: url(images/home/bg_home_carousel_board.png) 0 0 no-repeat;
+ height:auto;
padding: 25px 21px 0;
overflow:hidden;
position:relative;
@@ -858,19 +727,19 @@
}
#carouselMain .bulletinDesc h3 {
- margin:0;
- padding:0;
+ margin:0;
+ padding:0;
}
#carouselMain .bulletinDesc p {
- margin:0;
- padding:0.7em 0 0;
+ 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;
+ background: url(images/home/bg_home_carousel_wheel.png) 0 0 no-repeat;
+ padding-top:40px;
+ height:150px;
}
.clearer { clear:both; }
@@ -889,17 +758,17 @@
margin:35px 10px 0 0;
}
a.arrow-left-off,
-a#arrow-left.arrow-left-off:hover {
+a#arrow-left.arrow-left-off:hover {
background-position:0 0;
}
-a.arrow-right-off,
-a#arrow-right.arrow-right-off:hover {
+a.arrow-right-off,
+a#arrow-right.arrow-right-off:hover {
background-position:-42px 0;
}
-a#arrow-left:hover {
+a#arrow-left:hover {
background-position:0 -42px;
}
-a#arrow-right:hover {
+a#arrow-right:hover {
background-position:-42px -42px;
}
a.arrow-left-on {
@@ -919,17 +788,17 @@
width:100%;
}
-div#list-clip {
- height:110px;
+div#list-clip {
+ height:110px;
width:438px;
- overflow:hidden;
- position:relative;
- float:left;
+ overflow:hidden;
+ position:relative;
+ float:left;
}
-div#app-list {
- left:0;
- z-index:1;
+div#app-list {
+ left:0;
+ z-index:1;
position:absolute;
margin:11px 0 0;
_margin-top:13px;
@@ -958,14 +827,14 @@
top:-4px;
}
-#app-list img {
+#app-list img {
width:90px;
height:70px;
margin:0;
}
-#app-list a.selected,
-#app-list a:active.selected,
+#app-list a.selected,
+#app-list a:active.selected,
#app-list a:hover.selected {
background:#A4C639;
color:#fff;
@@ -973,12 +842,12 @@
text-decoration:none;
}
-#app-list a:hover,
+#app-list a:hover,
#app-list a:active {
background:#ff9900;
}
-#app-list a:hover span,
+#app-list a:hover span,
#app-list a:active span {
text-decoration:underline;
}
@@ -992,7 +861,7 @@
/*IE6*/
* html #app-list a { zoom: 1; margin:0 24px 0 15px;}
-* html #list-clip {
+* html #list-clip {
width:430px !important;
}
@@ -1270,6 +1139,7 @@
#mainBodyRight ul.videoPreviews h3 {
padding:0;
margin:0;
+ font-size:100%;
}
#mainBodyRight ul.videoPreviews a {
@@ -1287,11 +1157,40 @@
}
#mainBodyRight ul.videoPreviews p {
- line-height:1.2em;
+ line-height:1.2em;
padding:0;
margin:4px 0 0 130px;
}
#mainBodyRight ul.videoPreviews img {
- margin-top:5px;
+ 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; }
}
diff --git a/tools/droiddoc/templates-pdk/assets/android-developer-docs.css b/tools/droiddoc/templates-pdk/assets/android-developer-docs.css
index bc9e98b..b8b9c71 100644
--- a/tools/droiddoc/templates-pdk/assets/android-developer-docs.css
+++ b/tools/droiddoc/templates-pdk/assets/android-developer-docs.css
@@ -34,10 +34,6 @@
font-size:12px;
}
-#side-nav.not-resizable {
- background:url('images/sidenav-rule.png') no-repeat 243px 0;
-}
-
#resize-packages-nav {
/* keeps the resize handle below the h-scroll handle */
height:270px;
@@ -65,18 +61,19 @@
}
#side-nav ul ul {
- margin: .35em 0 0 0;
+ margin: .5em 0 0 0;
padding: 0;
}
#side-nav li {
padding:0;
- line-height:16px;
- white-space:nowrap;
+ 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;
@@ -84,6 +81,7 @@
}
#side-nav li a {
+ display: inline-block; /* needed to apply padding to line-wraps */
text-decoration:none;
padding: 0 0 0 18px;
zoom:1;
@@ -385,6 +383,21 @@
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;
@@ -393,13 +406,16 @@
}
div#naMessage div {
+ z-index:99;
width:450px;
position:fixed;
margin:50px 0;
padding:4em 4em 3em;
background:#FFF;
- background:rgba(255,255,255,0.7);
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; }
@@ -521,16 +537,24 @@
}
#jd-content h3 {
- font-size:1.2em;
- color:#222;
- padding: .75em 0 .65em 0;
- margin:0;
+ font-size:1.3em;
+ color:#3a3a3a;
+ padding: 0;
+ margin: 1.5em 0 .65em 0;
}
#jd-content h4 {
font-size:1.1em;
- margin-bottom:.5em;
- color:#222;
+ 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 {
@@ -553,7 +577,7 @@
#jd-content li img,
#jd-content dd img {
- margin:.5em 0 0 1em;
+ margin:.5em 0 .5em 1em;
}
.nolist {
@@ -682,6 +706,18 @@
width:auto;
}
+div.design-announce {
+ border-top:1px solid #33B5E5;
+ border-bottom:1px solid #33B5E5;
+ 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;
@@ -692,22 +728,6 @@
-webkit-border-radius:5px;
}
-.toggle-content-toggleme {
- display:none;
-}
-
-.toggle-content-button {
- font-size:.9em;
- line-height:.9em;
- text-decoration:none;
- position:relative;
- top:5px;
-}
-
-.toggle-content-button:hover {
- text-decoration:underline;
-}
-
div.special p {
margin: .5em 0 0 0;
}
@@ -730,39 +750,62 @@
padding:0;
}
-p.note, p.caution, p.warning {
+#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 {
+p.special-note,
+div.special-note {
background-color:#EBF3DB;
padding:10px 20px;
margin:0 0 1em;
}
-p.note {
+p.note,
+div.note {
border-color: #99aacc;
}
-p.warning {
+p.warning,
+div.warning {
border-color: #aa0033;
}
-p.caution {
+p.caution,
+div.caution {
border-color: #ffcf00;
}
-p.warning b, p.warning strong {
- font-weight: bold;
-}
-
-li p.note, li p.warning {
+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;
@@ -791,13 +834,19 @@
padding-left:1em;
}
-.new {
+.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 {
@@ -832,6 +881,27 @@
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 {
@@ -894,20 +964,6 @@
padding:0 10px;
}
-#qv-extra #rule {
- padding: 0 10px;
- margin: 0;
-}
-
-#qv-sub-rule {
- padding: 6px 20px;
- margin: 0;
-}
-
-#qv-sub-rule p {
- margin: 0;
-}
-
#jd-content #qv h2 {
font-size:1.05em;
font-weight:bold;
@@ -920,6 +976,21 @@
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 */
@@ -943,7 +1014,7 @@
}
.sidebox p {
- margin-bottom: .25em;
+ margin-bottom: .75em;
}
.sidebox ul {
@@ -978,6 +1049,142 @@
/* 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 {
@@ -1054,7 +1261,7 @@
margin: 0;
padding: 0;
}
-
+
ol.toc li li {
padding: 0;
margin: 0 0 0 1em;
@@ -1181,6 +1388,76 @@
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,
@@ -1216,7 +1493,7 @@
float: right;
}
-
+
/* JQUERY RESIZABLE STYLES */
.ui-resizable { position: relative; }
.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; }
@@ -1252,7 +1529,7 @@
#body-content {
position:inherit;
}
-
+
#doc-content {
margin-left:0 !important;
height:auto !important;
diff --git a/tools/droiddoc/templates-pdk/assets/android-developer-docs.js b/tools/droiddoc/templates-pdk/assets/android-developer-docs.js
index 59c4192..5fc7e09 100644
--- a/tools/droiddoc/templates-pdk/assets/android-developer-docs.js
+++ b/tools/droiddoc/templates-pdk/assets/android-developer-docs.js
@@ -10,7 +10,9 @@
var nav_pref;
var toRoot;
var isMobile = false; // true if mobile, so we can adjust some layout
+var isIE6 = false; // true if IE6
+// TODO: use $(document).ready instead
function addLoadEvent(newfun) {
var current = window.onload;
if (typeof window.onload != 'function') {
@@ -23,18 +25,26 @@
}
}
-var agent = navigator['userAgent'];
-if ((agent.indexOf("Mobile") != -1) ||
- (agent.indexOf("BlackBerry") != -1) ||
- (agent.indexOf("Mini") != -1)) {
+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;
addLoadEvent(mobileSetup);
+// If not a mobile browser, set the onresize event for IE6, and others
+} else if (agent.indexOf("msie 6") != -1) {
+ isIE6 = true;
+ addLoadEvent(function() {
+ window.onresize = resizeAll;
+ });
+} else {
+ addLoadEvent(function() {
+ window.onresize = resizeHeight;
+ });
}
-addLoadEvent(function() {
-window.onresize = resizeAll;
-});
-
function mobileSetup() {
$("body").css({'overflow':'auto'});
$("html").css({'overflow':'auto'});
@@ -53,6 +63,11 @@
document.getElementsByTagName("head")[0].appendChild(lists);
} );
+addLoadEvent( function() {
+ $("pre:not(.no-pretty-print)").addClass("prettyprint");
+ prettyPrint();
+} );
+
function setToRoot(root) {
toRoot = root;
// note: toRoot also used by carousel.js
@@ -60,8 +75,12 @@
function restoreWidth(navWidth) {
var windowWidth = $(window).width() + "px";
- content.css({marginLeft:parseInt(navWidth) + 6 + "px", //account for 6px-wide handle-bar
- width:parseInt(windowWidth) - parseInt(navWidth) - 6 + "px"});
+ content.css({marginLeft:parseInt(navWidth) + 6 + "px"}); //account for 6px-wide handle-bar
+
+ if (isIE6) {
+ content.css({width:parseInt(windowWidth) - parseInt(navWidth) - 6 + "px"}); // necessary in order for scrollbars to be visible
+ }
+
sidenav.css({width:navWidth});
resizePackagesNav.css({width:navWidth});
classesNav.css({width:navWidth});
@@ -99,15 +118,15 @@
}
function writeCookie(cookie, val, section, expiration) {
- if (!val) return;
+ if (val==undefined) return;
section = section == null ? "_" : "_"+section+"_";
if (expiration == null) {
var date = new Date();
date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
expiration = date.toGMTString();
}
- document.cookie = cookie_namespace+section+cookie+"="+val+"; expires="+expiration+"; path=/";
-}
+ document.cookie = cookie_namespace + section + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+}
function init() {
$("#side-nav").css({position:"absolute",left:0});
@@ -117,20 +136,26 @@
sidenav = $("#side-nav");
devdocNav = $("#devdoc-nav");
+ var cookiePath = "";
if (location.href.indexOf("/reference/") != -1) {
- var cookiePath = "reference_";
+ cookiePath = "reference_";
} else if (location.href.indexOf("/guide/") != -1) {
- var cookiePath = "guide_";
+ cookiePath = "guide_";
+ } else if (location.href.indexOf("/sdk/") != -1) {
+ cookiePath = "sdk_";
+ } else if ((location.href.indexOf("/resources/") != -1) ||
+ (location.href.indexOf("/training/") != -1)) {
+ cookiePath = "resources_";
}
if (!isMobile) {
- $("#resize-packages-nav").resizable({handles: "s", resize: function(e, ui) { resizeHeight(); } });
- $(".side-nav-resizable").resizable({handles: "e", resize: function(e, ui) { resizeWidth(); } });
+ $("#resize-packages-nav").resizable({handles: "s", resize: function(e, ui) { resizePackagesHeight(); } });
+ $("#side-nav").resizable({handles: "e", resize: function(e, ui) { resizeWidth(); } });
var cookieWidth = readCookie(cookiePath+'width');
var cookieHeight = readCookie(cookiePath+'height');
if (cookieWidth) {
restoreWidth(cookieWidth);
- } else if ($(".side-nav-resizable").length) {
+ } else if ($("#side-nav").length) {
resizeWidth();
}
if (cookieHeight) {
@@ -140,81 +165,224 @@
}
}
- if (devdocNav.length) { // only dev guide and sdk
- highlightNav(location.href);
+ if (devdocNav.length) { // only dev guide, resources, and sdk
+ tryPopulateResourcesNav();
+ highlightNav(location.href);
}
}
+function tryPopulateResourcesNav() {
+ var sampleList = $('#devdoc-nav-sample-list');
+ var articleList = $('#devdoc-nav-article-list');
+ var tutorialList = $('#devdoc-nav-tutorial-list');
+ var topicList = $('#devdoc-nav-topic-list');
+
+ if (!topicList.length || !ANDROID_TAGS || !ANDROID_RESOURCES)
+ return;
+
+ var topics = [];
+ for (var topic in ANDROID_TAGS['topic']) {
+ topics.push({name:topic,title:ANDROID_TAGS['topic'][topic]});
+ }
+ topics.sort(function(x,y){ return (x.title < y.title) ? -1 : 1; });
+ for (var i = 0; i < topics.length; i++) {
+ topicList.append(
+ $('<li>').append(
+ $('<a>')
+ .attr('href', toRoot + "resources/browser.html?tag=" + topics[i].name)
+ .append($('<span>')
+ .addClass('en')
+ .html(topics[i].title)
+ )
+ )
+ );
+ }
+
+ var _renderResourceList = function(tag, listNode) {
+ var resources = [];
+ var tags;
+ var resource;
+ var i, j;
+ for (i = 0; i < ANDROID_RESOURCES.length; i++) {
+ resource = ANDROID_RESOURCES[i];
+ tags = resource.tags || [];
+ var hasTag = false;
+ for (j = 0; j < tags.length; j++)
+ if (tags[j] == tag) {
+ hasTag = true;
+ break;
+ }
+ if (!hasTag)
+ continue;
+ resources.push(resource);
+ }
+ //resources.sort(function(x,y){ return (x.title.en < y.title.en) ? -1 : 1; });
+ for (i = 0; i < resources.length; i++) {
+ resource = resources[i];
+ var listItemNode = $('<li>').append(
+ $('<a>')
+ .attr('href', toRoot + "resources/" + resource.path)
+ .append($('<span>')
+ .addClass('en')
+ .html(resource.title.en)
+ )
+ );
+ tags = resource.tags || [];
+ for (j = 0; j < tags.length; j++) {
+ if (tags[j] == 'new') {
+ listItemNode.get(0).innerHTML += ' <span class="new">new!</span>';
+ break;
+ } else if (tags[j] == 'updated') {
+ listItemNode.get(0).innerHTML += ' <span class="new">updated!</span>';
+ break;
+ }
+ }
+ listNode.append(listItemNode);
+ }
+ };
+
+ _renderResourceList('sample', sampleList);
+ _renderResourceList('article', articleList);
+ _renderResourceList('tutorial', tutorialList);
+}
+
function highlightNav(fullPageName) {
- fullPageName = fullPageName.replace(/^https?:\/\//, '');
var lastSlashPos = fullPageName.lastIndexOf("/");
- var firstSlashPos = fullPageName.indexOf("/");
+ var firstSlashPos;
+ if (fullPageName.indexOf("/guide/") != -1) {
+ firstSlashPos = fullPageName.indexOf("/guide/");
+ } else if (fullPageName.indexOf("/sdk/") != -1) {
+ firstSlashPos = fullPageName.indexOf("/sdk/");
+ } else if (fullPageName.indexOf("/resources/") != -1) {
+ firstSlashPos = fullPageName.indexOf("/resources/");
+ } else if (fullPageName.indexOf("/training/") != -1) {
+ firstSlashPos = fullPageName.indexOf("/training/");
+ }
if (lastSlashPos == (fullPageName.length - 1)) { // if the url ends in slash (add 'index.html')
fullPageName = fullPageName + "index.html";
}
- var htmlPos = fullPageName.lastIndexOf(".html", fullPageName.length);
- var pathPageName = fullPageName.slice(firstSlashPos, htmlPos + 5);
+
+ // get the path and page name from the URL (such as 'guide/topics/graphics/index.html')
+ var htmlPos = fullPageName.indexOf(".html");
+ var pathPageName = fullPageName.slice(firstSlashPos, htmlPos + 5); // +5 advances past ".html"
+ // find instances of the page name in the side nav
var link = $("#devdoc-nav a[href$='"+ pathPageName+"']");
- if ((link.length == 0) && (fullPageName.indexOf("/guide/") != -1)) {
-// if there's no match, then let's backstep through the directory until we find an index.html page that matches our ancestor directories (only for dev guide)
+ // if there's no match, then let's backstep through the directory until we find an index.html
+ // page that matches our ancestor directories (only for dev guide and resources)
+ if ((link.length == 0) && ((fullPageName.indexOf("/guide/") != -1) ||
+ (fullPageName.indexOf("/resources/") != -1))) {
lastBackstep = pathPageName.lastIndexOf("/");
while (link.length == 0) {
backstepDirectory = pathPageName.lastIndexOf("/", lastBackstep);
- link = $("#devdoc-nav a[href$='"+ pathPageName.slice(0, backstepDirectory + 1)+"index.html']");
+ link = $("#devdoc-nav a[href$='"+ pathPageName.slice(0, backstepDirectory +
+ 1)+"index.html']");
lastBackstep = pathPageName.lastIndexOf("/", lastBackstep - 1);
if (lastBackstep == 0) break;
}
}
+
+ // add 'selected' to the <li> or <div> that wraps this <a>
link.parent().addClass('selected');
- if (link.parent().parent().is(':hidden')) {
- toggle(link.parent().parent().parent(), false);
- } else if (link.parent().parent().hasClass('toggle-list')) {
- toggle(link.parent().parent(), false);
+
+ // if we're in a toggleable root link (<li class=toggle-list><div><a>)
+ if (link.parent().parent().hasClass('toggle-list')) {
+ toggle(link.parent().parent(), false); // open our own list
+ // then also check if we're in a third-level nested list that's toggleable
+ if (link.parent().parent().parent().is(':hidden')) {
+ toggle(link.parent().parent().parent().parent(), false); // open the super parent list
+ }
+ }
+ // if we're in a normal nav link (<li><a>) and the parent <ul> is hidden
+ else if (link.parent().parent().is(':hidden')) {
+ toggle(link.parent().parent().parent(), false); // open the parent list
+ // then also check if the parent list is also nested in a hidden list
+ if (link.parent().parent().parent().parent().is(':hidden')) {
+ toggle(link.parent().parent().parent().parent().parent(), false); // open the super parent list
+ }
}
}
-function resizeHeight() {
+/* Resize the height of the nav panels in the reference,
+ * and save the new size to a cookie */
+function resizePackagesHeight() {
var windowHeight = ($(window).height() - HEADER_HEIGHT);
- var swapperHeight = windowHeight - 13;
- $("#swapper").css({height:swapperHeight + "px"});
- sidenav.css({height:windowHeight + "px"});
- content.css({height:windowHeight + "px"});
+ var swapperHeight = windowHeight - 13; // move 13px for swapper link at the bottom
resizePackagesNav.css({maxHeight:swapperHeight + "px"});
classesNav.css({height:swapperHeight - parseInt(resizePackagesNav.css("height")) + "px"});
+
+ $("#swapper").css({height:swapperHeight + "px"});
$("#packages-nav").css({height:parseInt(resizePackagesNav.css("height")) - 6 + "px"}); //move 6px for handle
- devdocNav.css({height:sidenav.css("height")});
- $("#nav-tree").css({height:swapperHeight + "px"});
-
+
var basePath = getBaseUri(location.pathname);
var section = basePath.substring(1,basePath.indexOf("/",1));
writeCookie("height", resizePackagesNav.css("height"), section, null);
}
+/* Resize the height of the side-nav and doc-content divs,
+ * which creates the frame effect */
+function resizeHeight() {
+ var docContent = $("#doc-content");
+
+ // Get the window height and always resize the doc-content and side-nav divs
+ var windowHeight = ($(window).height() - HEADER_HEIGHT);
+ docContent.css({height:windowHeight + "px"});
+ $("#side-nav").css({height:windowHeight + "px"});
+
+ var href = location.href;
+ // If in the reference docs, also resize the "swapper", "classes-nav", and "nav-tree" divs
+ if (href.indexOf("/reference/") != -1) {
+ var swapperHeight = windowHeight - 13;
+ $("#swapper").css({height:swapperHeight + "px"});
+ $("#classes-nav").css({height:swapperHeight - parseInt(resizePackagesNav.css("height")) + "px"});
+ $("#nav-tree").css({height:swapperHeight + "px"});
+
+ // Also resize the "devdoc-nav" div
+ } else if ($("#devdoc-nav").length) {
+ $("#devdoc-nav").css({height:sidenav.css("height")});
+ }
+
+ // Hide the "Go to top" link if there's no vertical scroll
+ if ( parseInt($("#jd-content").css("height")) <= parseInt(docContent.css("height")) ) {
+ $("a[href='#top']").css({'display':'none'});
+ } else {
+ $("a[href='#top']").css({'display':'inline'});
+ }
+}
+
+/* Resize the width of the "side-nav" and the left margin of the "doc-content" div,
+ * which creates the resizable side bar */
function resizeWidth() {
var windowWidth = $(window).width() + "px";
+ var sidenav = $("#side-nav");
if (sidenav.length) {
var sidenavWidth = sidenav.css("width");
} else {
var sidenavWidth = 0;
}
- content.css({marginLeft:parseInt(sidenavWidth) + 6 + "px", //account for 6px-wide handle-bar
- width:parseInt(windowWidth) - parseInt(sidenavWidth) - 6 + "px"});
+ content.css({marginLeft:parseInt(sidenavWidth) + 6 + "px"}); //account for 6px-wide handle-bar
+
+ if (isIE6) {
+ content.css({width:parseInt(windowWidth) - parseInt(sidenavWidth) - 6 + "px"}); // necessary in order to for scrollbars to be visible
+ }
+
resizePackagesNav.css({width:sidenavWidth});
classesNav.css({width:sidenavWidth});
$("#packages-nav").css({width:sidenavWidth});
-
- var basePath = getBaseUri(location.pathname);
- var section = basePath.substring(1,basePath.indexOf("/",1));
- writeCookie("width", sidenavWidth, section, null);
+
+ if (sidenav.length) { // Must check if the nav exists because IE6 calls resizeWidth() from resizeAll() for all pages
+ var basePath = getBaseUri(location.pathname);
+ var section = basePath.substring(1,basePath.indexOf("/",1));
+ section = section.indexOf("training") != -1 ? "resources" : section;
+ writeCookie("width", sidenavWidth, section, null);
+ }
}
+/* For IE6 only,
+ * because it can't properly perform auto width for "doc-content" div,
+ * avoiding this for all browsers provides better performance */
function resizeAll() {
- if (!isMobile) {
- resizeHeight();
- if ($(".side-nav-resizable").length) {
- resizeWidth();
- }
- }
+ resizeHeight();
+ resizeWidth();
}
function getBaseUri(uri) {
@@ -262,11 +430,13 @@
writeCookie("lastpage", path, "reference", null);
} else if (path.indexOf("/guide/") != -1) {
writeCookie("lastpage", path, "guide", null);
+ } else if ((path.indexOf("/resources/") != -1) || (path.indexOf("/training/") != -1)) {
+ writeCookie("lastpage", path, "resources", null);
}
});
function toggle(obj, slide) {
- var ul = $("ul", obj);
+ var ul = $("ul:first", obj);
var li = ul.parent();
if (li.hasClass("closed")) {
if (slide) {
@@ -288,7 +458,7 @@
function buildToggleLists() {
$(".toggle-list").each(
function(i) {
- $("div", this).append("<a class='toggle-img' href='#' title='show pages' onClick='toggle(this.parentNode.parentNode, true); return false;'></a>");
+ $("div:first", this).append("<a class='toggle-img' href='#' title='show pages' onClick='toggle(this.parentNode.parentNode, true); return false;'></a>");
$(this).addClass("closed");
});
}
@@ -339,63 +509,37 @@
if (navObj.is(':visible')) {
var selected = $(".selected", navObj);
if (selected.length == 0) return;
- if (selected.is("div")) selected = selected.parent();
+ if (selected.is("div")) selected = selected.parent(); // when the selected item is a parent
var scrolling = document.getElementById(nav);
var navHeight = navObj.height();
var offsetTop = selected.position().top;
- if (selected.parent().parent().is(".toggle-list")) offsetTop += selected.parent().parent().position().top;
- if(offsetTop > navHeight - 92) {
- scrolling.scrollTop = offsetTop - navHeight + 92;
+
+ // handle nested items
+ if (selected.parent().parent().is(".toggle-list")) {
+ selected = selected.parent().parent();
+ // handle second level nested items
+ if (selected.parent().parent().is(".toggle-list")) {
+ selected = selected.parent().parent();
+ }
+ offsetTop += selected.position().top;
+ }
+
+ // 180px from the bottom of the list is the threshold
+ if(offsetTop > navHeight - 180) {
+ scrolling.scrollTop = offsetTop - navHeight + 180;
}
}
}
-function toggleAllInherited(linkObj, expand) {
- var a = $(linkObj);
- var table = $(a.parent().parent().parent());
- 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;
-}
-
-function toggleAllSummaryInherited(linkObj) {
- var a = $(linkObj);
- var content = $(a.parent().parent().parent());
- var toggles = $(".toggle-all", 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;
-}
-
-
function changeTabLang(lang) {
var nodes = $("#header-tabs").find("."+lang);
- for (i=0; i < nodes.length; i++) { // for each node in this language
+ for (i=0; i < nodes.length; i++) { // for each node in this language
var node = $(nodes[i]);
- node.siblings().css("display","none"); // hide all siblings
- if (node.not(":empty").length != 0) { //if this languages node has a translation, show it
+ node.siblings().css("display","none"); // hide all siblings
+ if (node.not(":empty").length != 0) { //if this languages node has a translation, show it
node.css("display","inline");
- } else { //otherwise, show English instead
+ } else { //otherwise, show English instead
node.css("display","none");
node.siblings().filter(".en").css("display","inline");
}
@@ -404,12 +548,12 @@
function changeNavLang(lang) {
var nodes = $("#side-nav").find("."+lang);
- for (i=0; i < nodes.length; i++) { // for each node in this language
+ for (i=0; i < nodes.length; i++) { // for each node in this language
var node = $(nodes[i]);
- node.siblings().css("display","none"); // hide all siblings
- if (node.not(":empty").length != 0) { // if this languages node has a translation, show it
+ node.siblings().css("display","none"); // hide all siblings
+ if (node.not(":empty").length != 0) { // if this languages node has a translation, show it
node.css("display","inline");
- } else { // otherwise, show English instead
+ } else { // otherwise, show English instead
node.css("display","none");
node.siblings().filter(".en").css("display","inline");
}
@@ -449,16 +593,22 @@
}
+/* 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 button = $(obj);
- var div = $(obj.parentNode);
+ var div = $(obj.parentNode.parentNode);
var toggleMe = $(".toggle-content-toggleme",div);
- if (button.hasClass("show")) {
+ if (div.hasClass("closed")) { // if it's closed, open it
toggleMe.slideDown();
- button.removeClass("show").addClass("hide");
- } else {
- toggleMe.slideUp();
- button.removeClass("hide").addClass("show");
+ $(".toggle-content-text", obj).toggle();
+ div.removeClass("closed").addClass("open");
+ $(".toggle-content-img", 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", obj).toggle();
+ div.removeClass("open").addClass("closed");
+ $(".toggle-content-img", div).attr("title", "show").attr("src", toRoot + "assets/images/triangle-closed.png");
+ });
}
- $("span", button).toggle();
+ return false;
}
diff --git a/tools/droiddoc/templates-pdk/assets/android-developer-reference.js b/tools/droiddoc/templates-pdk/assets/android-developer-reference.js
index daddde0..ba47d4d 100644
--- a/tools/droiddoc/templates-pdk/assets/android-developer-reference.js
+++ b/tools/droiddoc/templates-pdk/assets/android-developer-reference.js
@@ -5,6 +5,7 @@
var API_LEVEL_ENABLED_COOKIE = "api_level_enabled";
var API_LEVEL_COOKIE = "api_level";
var minLevel = 1;
+var maxLevel = 1;
function toggleApiLevelSelector(checkbox) {
var date = new Date();
@@ -23,9 +24,9 @@
}
function buildApiLevelSelector() {
- var maxLevel = SINCE_DATA.length;
+ maxLevel = SINCE_DATA.length;
var userApiLevelEnabled = readCookie(API_LEVEL_ENABLED_COOKIE);
- var userApiLevel = readCookie(API_LEVEL_COOKIE);
+ var userApiLevel = parseInt(readCookie(API_LEVEL_COOKIE));
userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default
if (userApiLevelEnabled == 0) {
@@ -34,41 +35,47 @@
$("#apiLevelCheckbox").attr("checked","checked");
$("#api-level-toggle label").removeClass("disabled");
}
-
- minLevel = $("body").attr("class");
+
+ minLevel = parseInt($("body").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() {
- var maxLevel = SINCE_DATA.length;
+ maxLevel = SINCE_DATA.length;
var userApiLevelEnabled = readCookie(API_LEVEL_ENABLED_COOKIE);
var selectedLevel = maxLevel;
-
+
if (userApiLevelEnabled == 0) {
toggleVisisbleApis(selectedLevel, "body");
} else {
- selectedLevel = $("#apiLevelSelector option:selected").val();
+ selectedLevel = parseInt($("#apiLevelSelector option:selected").val());
toggleVisisbleApis(selectedLevel, "body");
-
+
var date = new Date();
date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
var expiration = date.toGMTString();
writeCookie(API_LEVEL_COOKIE, selectedLevel, null, expiration);
}
-
+
if (selectedLevel < minLevel) {
var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
$("#naMessage").show().html("<div><p><strong>This " + thing + " is not available with API Level " + selectedLevel + ".</strong></p>"
- + "<p>To use this " + thing + ", your application must specify API Level " + minLevel + " or higher in its manifest "
+ + "<p>To use this " + thing + ", your application must specify API Level \"" + $("body").attr("class") + "\" or higher in its manifest "
+ "and be compiled against a version of the Android library that supports an equal or higher API Level. To reveal this "
+ "document, change the value of the API Level filter above.</p>"
+ "<p><a href='" +toRoot+ "guide/appendix/api-levels.html'>What is the API Level?</a></p></div>");
@@ -86,7 +93,21 @@
var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
- if (apiLevel > selectedLevel) obj.addClass("absent").attr("title","Requires API Level "+apiLevel+" or higher");
+ 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");
else obj.removeClass("absent").removeAttr("title");
});
}
@@ -184,7 +205,7 @@
}
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");
diff --git a/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.css b/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.css
new file mode 100644
index 0000000..a454caa
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.css
@@ -0,0 +1,31 @@
+/* Resource Browser */
+
+#resource-browser-results .no-results {
+ font-style: italic;
+ display: none;
+}
+
+#resource-browser-results .result {
+ position: relative;
+ padding-left: 84px;
+ background: transparent none no-repeat scroll 4px 12px;
+ border-bottom: 1px solid #ddd;
+}
+
+#resource-browser-results .tagged-article {
+ background-image: url(images/resource-article.png);
+}
+
+#resource-browser-results .tagged-sample {
+ background-image: url(images/resource-sample.png);
+}
+
+#resource-browser-results .tagged-tutorial {
+ background-image: url(images/resource-tutorial.png);
+}
+
+#resource-browser-results .resource-meta {
+ margin-top: -1em;
+ font-size: 0.85em;
+ font-weight: normal;
+}
diff --git a/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.js b/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.js
new file mode 100644
index 0000000..dc65aa2
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.js
@@ -0,0 +1,235 @@
+(function() { // anonymize
+
+var allTags = {};
+var loadedResults = [];
+
+/**
+ * Initialization code run upon the DOM being ready.
+ */
+$(document).ready(function() {
+ // Parse page query parameters.
+ var params = parseParams(document.location.search);
+ params.tag = params.tag ? makeArray(params.tag) : null;
+
+ // Load tag and resource dataset.
+ loadTags();
+ loadResources();
+
+ showResults(params);
+
+ // Watch for keypresses in the keyword filter textbox, and update
+ // search results to reflect the keyword filter.
+ $('#resource-browser-keyword-filter').keyup(function() {
+ // Filter results on screen by keyword.
+ var keywords = $(this).val().split(/\s+/g);
+ for (var i = 0; i < loadedResults.length; i++) {
+ var hide = false;
+ for (var j = 0; j < keywords.length; j++) {
+ if (!resultMatchesKeyword(loadedResults[i].result, keywords[j])) {
+ hide = true;
+ break;
+ }
+ }
+
+ loadedResults[i].node[hide ? 'hide' : 'show']();
+ }
+ });
+});
+
+/**
+ * Returns whether or not the given search result contains the given keyword.
+ */
+function resultMatchesKeyword(result, keyword) {
+ keyword = keyword.toLowerCase();
+ if (result.title &&
+ result.title.en.toLowerCase().indexOf(keyword) >= 0)
+ return true;
+ else if (result.description &&
+ result.description.en.toLowerCase().indexOf(keyword) >= 0)
+ return true;
+ else if (result.topicsHtml &&
+ result.topicsHtml.replace(/\<.*?\>/g,'').toLowerCase().indexOf(keyword) >= 0)
+ return true;
+ return false;
+}
+
+/**
+ * Populates the allTags array with tag data from the ANDROID_TAGS
+ * variable in the resource data JS file.
+ */
+function loadTags() {
+ for (var tagClass in ANDROID_TAGS) {
+ for (var tag in ANDROID_TAGS[tagClass]) {
+ allTags[tag] = {
+ displayTag: ANDROID_TAGS[tagClass][tag],
+ tagClass: tagClass
+ };
+ }
+ }
+}
+
+/**
+ * Massage the ANDROID_RESOURCES resource list in the resource data JS file.
+ */
+function loadResources() {
+ for (var i = 0; i < ANDROID_RESOURCES.length; i++) {
+ var resource = ANDROID_RESOURCES[i];
+
+ // Convert the tags array to a tags hash for easier querying.
+ resource.tagsHash = {};
+ for (var j = 0; j < resource.tags.length; j++)
+ resource.tagsHash[resource.tags[j]] = true;
+
+ // Determine the type and topics of the resource by inspecting its tags.
+ resource.topics = [];
+ for (tag in resource.tagsHash)
+ if (tag in allTags) {
+ if (allTags[tag].tagClass == 'type') {
+ resource.type = tag;
+ } else if (allTags[tag].tagClass == 'topic') {
+ resource.topics.push(tag);
+ }
+ }
+
+ // Add a humanized topics list string.
+ resource.topicsHtml = humanizeList(resource.topics, function(item) {
+ return '<strong>' + allTags[item].displayTag + '</strong>';
+ });
+ }
+}
+
+/**
+ * Loads resources for the given query parameters.
+ */
+function showResults(params) {
+ loadedResults = [];
+ $('#resource-browser-search-params').empty();
+ $('#resource-browser-results').empty();
+
+ var i, j;
+ var searchTags = [];
+ if (params.tag) {
+ for (i = 0; i < params.tag.length; i++) {
+ var tag = params.tag[i];
+ if (tag.toLowerCase() in allTags) {
+ searchTags.push(tag.toLowerCase());
+ }
+ }
+ }
+
+ if (searchTags.length) {
+ // Show query params.
+ var taggedWithHtml = ['Showing technical resources tagged with '];
+ taggedWithHtml.push(humanizeList(searchTags, function(item) {
+ return '<strong>' + allTags[item].displayTag + '</strong>';
+ }));
+ $('#resource-browser-search-params').html(taggedWithHtml.join('') + ':');
+ } else {
+ $('#resource-browser-search-params').html('Showing all technical resources:');
+ }
+
+ var results = [];
+
+ // Create the list of resources to show.
+ for (i = 0; i < ANDROID_RESOURCES.length; i++) {
+ var resource = ANDROID_RESOURCES[i];
+ var skip = false;
+
+ if (searchTags.length) {
+ for (j = 0; j < searchTags.length; j++)
+ if (!(searchTags[j] in resource.tagsHash)) {
+ skip = true;
+ break;
+ }
+
+ if (skip)
+ continue;
+
+ results.push(resource);
+ continue;
+ }
+
+ results.push(resource);
+ }
+
+ // Format and show the list of resource results.
+ if (results.length) {
+ $('#resource-browser-results .no-results').hide();
+ for (i = 0; i < results.length; i++) {
+ var result = results[i];
+ var resultJqNode = $(tmpl('tmpl_resource_browser_result', result));
+ for (tag in result.tagsHash)
+ resultJqNode.addClass('tagged-' + tag);
+ $('#resource-browser-results').append(resultJqNode);
+
+ loadedResults.push({ node: resultJqNode, result: result });
+ }
+ } else {
+ $('#resource-browser-results .no-results').show();
+ }
+}
+
+/**
+ * Formats the given array into a human readable, English string, ala
+ * 'a, b and c', with an optional item formatter/wrapper function.
+ */
+function humanizeList(arr, itemFormatter) {
+ itemFormatter = itemFormatter || function(o){ return o; };
+ arr = arr || [];
+
+ var out = [];
+ for (var i = 0; i < arr.length; i++) {
+ out.push(itemFormatter(arr[i]) +
+ ((i < arr.length - 2) ? ', ' : '') +
+ ((i == arr.length - 2) ? ' and ' : ''));
+ }
+
+ return out.join('');
+}
+
+/**
+ * Parses a parameter string, i.e. foo=1&bar=2 into
+ * a dictionary object.
+ */
+function parseParams(paramStr) {
+ var params = {};
+ paramStr = paramStr.replace(/^[?#]/, '');
+
+ var pairs = paramStr.split('&');
+ for (var i = 0; i < pairs.length; i++) {
+ var p = pairs[i].split('=');
+ var key = p[0] ? decodeURIComponent(p[0]) : p[0];
+ var val = p[1] ? decodeURIComponent(p[1]) : p[1];
+ if (val === '0')
+ val = 0;
+ if (val === '1')
+ val = 1;
+
+ if (key in params) {
+ // Handle array values.
+ params[key] = makeArray(params[key]);
+ params[key].push(val);
+ } else {
+ params[key] = val;
+ }
+ }
+
+ return params;
+}
+
+/**
+ * Returns the argument as a single-element array, or the argument itself
+ * if it's already an array.
+ */
+function makeArray(o) {
+ if (!o)
+ return [];
+
+ if (typeof o === 'object' && 'splice' in o) {
+ return o;
+ } else {
+ return [o];
+ }
+}
+
+})();
diff --git a/tools/droiddoc/templates-pdk/assets/customizations.js b/tools/droiddoc/templates-pdk/assets/customizations.js
new file mode 100644
index 0000000..5258902
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/customizations.js
@@ -0,0 +1,14 @@
+function showApiWarning(thing, selectedLevel, minLevel) {
+ if (selectedLevel < minLevel) {
+ $("#naMessage").show().html("<div><p><strong>This " + thing + " is not available with API Level " + selectedLevel + ".</strong></p>"
+ + "<p>To use this " + thing + ", your application must specify API Level " + minLevel + " or higher in its manifest "
+ + "and be compiled against a version of the Android library that supports an equal or higher API Level. To reveal this "
+ + "document, change the value of the API Level filter above.</p>"
+ + "<p><a href='" +toRoot+ "guide/appendix/api-levels.html'>What is the API Level?</a></p></div>");
+ } else {
+ $("#naMessage").hide();
+ }
+}
+
+// Direct searches to search.html
+HAS_SEARCH_PAGE = true;
diff --git a/tools/droiddoc/templates-pdk/assets/design/callout.png b/tools/droiddoc/templates-pdk/assets/design/callout.png
new file mode 100644
index 0000000..5d49f34
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/callout.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/default.css b/tools/droiddoc/templates-pdk/assets/design/default.css
new file mode 100644
index 0000000..c568424
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/default.css
@@ -0,0 +1,676 @@
+/* color definitions */
+/* 16 column layout */
+/* clearfix idiom */
+/* common mixins */
+/* page layout + top-level styles */
+::-webkit-selection,
+::-moz-selection,
+::selection {
+ background-color: #0099cc;
+ color: #fff; }
+
+html, body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background: #eee none no-repeat fixed top left;
+ background-image: -webkit-gradient(linear, 100% 0%, 100% 100%, from(#dddddd), color-stop(25%, #f2f2f2), color-stop(75%, #f2f2f2), to(#dddddd));
+ background-image: -moz-linear-gradient(top, #dddddd, #f2f2f2, #f2f2f2, #dddddd);
+ -webkit-font-smoothing: antialiased;
+ /* prevent subpixel antialiasing, which thickens the text */
+ /* text-rendering: optimizeLegibility; */
+ /* turned off ligatures due to bug 5945455 */ }
+
+body {
+ color: #555555;
+ font: 14px/20px Roboto, sans-serif;
+ font-weight: 400; }
+
+#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 {
+ width: 160px; }
+
+#nav.fixed {
+ position: fixed;
+ top: 40px; }
+
+#content {
+ width: 760px;
+ float: left; }
+
+a,
+a:visited {
+ color: #333333; }
+
+a:hover,
+acronym:hover {
+ color: #7aa1b0 !important; }
+
+a:focus,
+a:active {
+ color: #33b5e5 !important; }
+
+img {
+ border: none; }
+
+ul {
+ margin: 0;
+ padding: 0; }
+
+strong {
+ font-weight: 500; }
+
+em {
+ font-style: italic; }
+
+code {
+ font-family: Courier New, monospace; }
+
+acronym {
+ border-bottom: 1px dotted #555555;
+ cursor: help; }
+
+acronym:hover {
+ border-bottom-color: #7aa1b0; }
+
+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; }
+ .layout-content-row:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden; }
+ * 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.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;
+ line-height: 10px; }
+ #nav a {
+ color: #555555;
+ text-decoration: none; }
+ #nav li.selected > a,
+ #nav li.selected .nav-section-header a {
+ font-weight: 500;
+ color: #0099cc !important; }
+ #nav .nav-section-header {
+ position: relative;
+ padding: 10px;
+ margin-bottom: 1px;
+ /* section header links */ }
+ #nav .nav-section-header a {
+ color: #333333;
+ font-weight: 500;
+ text-transform: uppercase; }
+ #nav .nav-section-header:after {
+ content: '';
+ background: transparent url(disclosure_down.png) no-repeat scroll top left;
+ width: 10px;
+ height: 10px;
+ display: block;
+ position: absolute;
+ top: 10px;
+ right: 10px; }
+ #nav .nav-section-header.empty:after {
+ display: none; }
+ #nav li.expanded .nav-section-header {
+ background: rgba(0, 0, 0, 0.05); }
+ #nav li.expanded .nav-section-header:after {
+ content: '';
+ background: transparent url(disclosure_up.png) no-repeat scroll top left;
+ width: 10px;
+ height: 10px; }
+ #nav > li > ul {
+ height: 0;
+ overflow: hidden;
+ margin-bottom: 0; }
+ #nav > li > ul.animate-height {
+ -webkit-transition: height 0.25s ease-in;
+ -moz-transition: height 0.25s ease-in;
+ transition: height 0.25s ease-in; }
+ #nav > li > ul li {
+ padding: 10px 10px 11px 10px; }
+ #nav > li.expanded > ul {
+ height: auto; }
+ #nav > li.expanded > ul li {
+ background: rgba(0, 0, 0, 0.03); }
+ #nav #back-dac-section {
+ padding: 10px;
+ border-top: 1px solid #ddd; }
+ #nav #back-dac-section a {
+ color: #333333;
+ font-weight: 500;
+ text-transform: uppercase; }
+
+/* content header */
+.content-header {
+ border-bottom: 1px solid #33b5e5;
+ height: 30px; }
+ .content-header h2 {
+ border-bottom: 0; }
+ .content-header.just-links {
+ border-bottom: 0; }
+
+.content-footer {
+ border-top: 1px solid #33b5e5;
+ margin-top: 10px;
+ height: 30px; }
+
+.paging-links {
+ position: relative; }
+ .paging-links a {
+ position: absolute;
+ font-size: 14px;
+ line-height: 30px;
+ color: #555555;
+ text-decoration: none;
+ text-transform: uppercase; }
+ .paging-links .prev-page-link {
+ display: none;
+ left: -5px; }
+ .paging-links .prev-page-link:before {
+ content: '';
+ background: transparent url(disclosure_left.png) no-repeat scroll top left;
+ width: 10px;
+ height: 10px;
+ display: inline-block;
+ margin-right: 5px; }
+ .paging-links .next-page-link {
+ display: none;
+ right: 10px; }
+ .paging-links .next-page-link:after {
+ content: '';
+ background: transparent url(disclosure_right.png) no-repeat scroll top left;
+ width: 10px;
+ height: 10px;
+ display: inline-block;
+ margin-left: 5px; }
+
+/* content body */
+@-webkit-keyframes glowheader {
+ from {
+ background-color: #33b5e5;
+ color: #000;
+ border-bottom-color: #000; }
+
+ to {
+ background-color: transparent;
+ color: #33b5e5;
+ border-bottom-color: #33b5e5; } }
+
+@-moz-keyframes glowheader {
+ from {
+ background-color: #33b5e5;
+ color: #000;
+ border-bottom-color: #000; }
+
+ to {
+ background-color: transparent;
+ color: #33b5e5;
+ border-bottom-color: #33b5e5; } }
+
+@keyframes glowheader {
+ from {
+ background-color: #33b5e5;
+ color: #000;
+ border-bottom-color: #000; }
+
+ to {
+ background-color: transparent;
+ color: #33b5e5;
+ border-bottom-color: #33b5e5; } }
+
+#content p,
+#content ul,
+#content ol,
+#content h3 {
+ margin: 0 10px 10px 10px; }
+#content h2 {
+ padding-left: 10px;
+ padding-right: 10px;
+ margin-bottom: 10px;
+ font-size: 16px;
+ line-height: 30px;
+ font-weight: 500;
+ color: #33b5e5;
+ border-bottom: 1px solid #33b5e5;
+ height: 30px; }
+ #content h2: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; }
+#content hr {
+ border: 0;
+ border-bottom: 1px solid #33b5e5;
+ margin-bottom: 20px; }
+#content h3 {
+ color: #33b5e5;
+ text-transform: uppercase;
+ font-size: 14px;
+ line-height: 20px;
+ font-weight: 500; }
+#content h4 {
+ margin: 0 10px;
+ color: #333333;
+ font-weight: 500;
+ font-size: 14px;
+ line-height: 20px; }
+#content strong {
+ color: #333333; }
+#content ul li,
+#content ol li {
+ margin-left: 20px; }
+ #content ul li h4,
+ #content ol li h4 {
+ margin: 0; }
+ #content ul li p,
+ #content ol li p {
+ margin-left: 0; }
+#content ul li {
+ list-style-type: square;
+ list-style-type: none;
+ position: relative; }
+ #content ul li:before {
+ content: '\2022';
+ font-family: verdana;
+ font-size: 14px;
+ line-height: 20px;
+ position: absolute;
+ left: -20px;
+ top: -1px; }
+#content ol {
+ counter-reset: item; }
+ #content ol li {
+ font-size: 14px;
+ line-height: 20px;
+ list-style-type: none;
+ position: relative; }
+ #content ol li:before {
+ content: counter(item) ". ";
+ counter-increment: item;
+ position: absolute;
+ left: -20px;
+ top: 0; }
+ #content ol li.value-1:before {
+ content: "1. "; }
+ #content ol li.value-2:before {
+ content: "2. "; }
+ #content ol li.value-3:before {
+ content: "3. "; }
+ #content ol li.value-4:before {
+ content: "4. "; }
+ #content ol li.value-5:before {
+ content: "5. "; }
+ #content ol li.value-6:before {
+ content: "6. "; }
+ #content ol li.value-7:before {
+ content: "7. "; }
+ #content ol li.value-8:before {
+ content: "8. "; }
+ #content ol li.value-9:before {
+ content: "9. "; }
+ #content ol li.value-10:before {
+ content: "10. "; }
+#content .with-callouts ol li {
+ list-style-position: inside;
+ margin-left: 0; }
+ #content .with-callouts ol li:before {
+ position: static;
+ display: inline;
+ left: 0;
+ float: left;
+ width: 17px;
+ color: #33b5e5;
+ font-weight: 500; }
+
+/* special list items */
+li.no-bullet {
+ list-style-type: none !important; }
+
+#content li.with-icon {
+ position: relative;
+ margin-left: 40px;
+ min-height: 30px; }
+ #content li.with-icon p {
+ margin-left: 0 !important; }
+ #content li.with-icon:before {
+ position: absolute;
+ left: -40px;
+ top: 0;
+ content: '';
+ width: 30px;
+ height: 30px; }
+ #content li.with-icon.tablet:before {
+ background-image: url(ico_phone_tablet.png); }
+ #content li.with-icon.web:before {
+ background-image: url(ico_web.png); }
+ #content li.with-icon.checklist:before {
+ background-image: url(ico_checklist.png); }
+ #content li.with-icon.action:before {
+ background-image: url(ico_action.png); }
+ #content li.with-icon.use:before {
+ background-image: url(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(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 10px;
+ 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(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-port-span-9 {
+ background: transparent url(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(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; }
+
+/* landing page disclosures */
+.landing-page-link {
+ text-decoration: none;
+ font-weight: 500;
+ color: #333333; }
+ .landing-page-link:after {
+ content: '';
+ background: transparent url(disclosure_right.png) no-repeat scroll top left;
+ 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(ico_movie_inline.png) no-repeat scroll top left;
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ margin-right: 8px; }
+ .video-instructions:after {
+ content: 'Click to replay movie.'; }
+
+/* download buttons */
+.download-button {
+ display: block;
+ margin-bottom: 5px;
+ text-decoration: none;
+ background-color: #33b5e5;
+ 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: #0099cc;
+ 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: #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; }
+ .ui-table thead th {
+ font-weight: 600; }
+ .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(ico_wrong.png); }
+ .do-dont-label.good {
+ background-image: url(ico_good.png); }
diff --git a/tools/droiddoc/templates-pdk/assets/design/default.js b/tools/droiddoc/templates-pdk/assets/design/default.js
new file mode 100644
index 0000000..b306573
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/default.js
@@ -0,0 +1,188 @@
+$(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').find('a[href="' + pagePath + '"]');
+ if ($selNavLink.length) {
+ $selListItem = $selNavLink.closest('li');
+
+ $selListItem.addClass('selected');
+ $selListItem.closest('li.nav-section').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 li.nav-section').click(function() {
+ if ($(this).hasClass('expanded')) {
+ return;
+ }
+
+ // hide other
+ var $old = $('#nav li.nav-section.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-section-header').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/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_land_span13.png b/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_land_span13.png
new file mode 100644
index 0000000..bab6aca
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_land_span13.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_port_span5.png b/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_port_span5.png
new file mode 100644
index 0000000..bdccc2f
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_port_span5.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_port_span9.png b/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_port_span9.png
new file mode 100644
index 0000000..5e0135b
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/device_galaxynexus_blank_port_span9.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/disclosure_down.png b/tools/droiddoc/templates-pdk/assets/design/disclosure_down.png
new file mode 100644
index 0000000..4b3ff4d
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/disclosure_down.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/disclosure_left.png b/tools/droiddoc/templates-pdk/assets/design/disclosure_left.png
new file mode 100644
index 0000000..607845e
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/disclosure_left.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/disclosure_right.png b/tools/droiddoc/templates-pdk/assets/design/disclosure_right.png
new file mode 100644
index 0000000..f3bceb1
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/disclosure_right.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/disclosure_up.png b/tools/droiddoc/templates-pdk/assets/design/disclosure_up.png
new file mode 100644
index 0000000..5ff6d9d
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/disclosure_up.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_action.png b/tools/droiddoc/templates-pdk/assets/design/ico_action.png
new file mode 100644
index 0000000..30e4cc7
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_action.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_good.png b/tools/droiddoc/templates-pdk/assets/design/ico_good.png
new file mode 100644
index 0000000..afebe1c
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_good.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_movie_inline.png b/tools/droiddoc/templates-pdk/assets/design/ico_movie_inline.png
new file mode 100644
index 0000000..7cfb5c5
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_movie_inline.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_phone_tablet.png b/tools/droiddoc/templates-pdk/assets/design/ico_phone_tablet.png
new file mode 100644
index 0000000..003b876
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_phone_tablet.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_use.png b/tools/droiddoc/templates-pdk/assets/design/ico_use.png
new file mode 100644
index 0000000..9d868b3
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_use.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_web.png b/tools/droiddoc/templates-pdk/assets/design/ico_web.png
new file mode 100644
index 0000000..0848e3c
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_web.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/ico_wrong.png b/tools/droiddoc/templates-pdk/assets/design/ico_wrong.png
new file mode 100644
index 0000000..b7d04ce
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/ico_wrong.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/design/open_new_page.png b/tools/droiddoc/templates-pdk/assets/design/open_new_page.png
new file mode 100644
index 0000000..6197e3a
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/design/open_new_page.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/favicon.ico b/tools/droiddoc/templates-pdk/assets/favicon.ico
deleted file mode 100644
index d8884b7..0000000
--- a/tools/droiddoc/templates-pdk/assets/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/Android_Dev_Lab_l.png b/tools/droiddoc/templates-pdk/assets/images/home/Android_Dev_Lab_l.png
index 8259981..3c04f24 100644
--- a/tools/droiddoc/templates-pdk/assets/images/home/Android_Dev_Lab_l.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/Android_Dev_Lab_l.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/GDC2011.png b/tools/droiddoc/templates-pdk/assets/images/home/GDC2011.png
new file mode 100644
index 0000000..82ce918
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/GDC2011.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/GTV_icon_large.png b/tools/droiddoc/templates-pdk/assets/images/home/GTV_icon_large.png
new file mode 100644
index 0000000..72d54ad
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/GTV_icon_large.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/GTV_icon_small.png b/tools/droiddoc/templates-pdk/assets/images/home/GTV_icon_small.png
new file mode 100644
index 0000000..3da1699
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/GTV_icon_small.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/IO-logo-2011.png b/tools/droiddoc/templates-pdk/assets/images/home/IO-logo-2011.png
new file mode 100644
index 0000000..4a28447
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/IO-logo-2011.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/adc2_l.png b/tools/droiddoc/templates-pdk/assets/images/home/adc2_l.png
index ac51a1e..0b101a4 100644
--- a/tools/droiddoc/templates-pdk/assets/images/home/adc2_l.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/adc2_l.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/adc2_s.png b/tools/droiddoc/templates-pdk/assets/images/home/adc2_s.png
index 9cbfd4e..0d36bdb 100644
--- a/tools/droiddoc/templates-pdk/assets/images/home/adc2_s.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/adc2_s.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/devphone-large.png b/tools/droiddoc/templates-pdk/assets/images/home/devphone-large.png
old mode 100755
new mode 100644
index 6221e0a..0db0f6c
--- a/tools/droiddoc/templates-pdk/assets/images/home/devphone-large.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/devphone-large.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/devphone-small.png b/tools/droiddoc/templates-pdk/assets/images/home/devphone-small.png
old mode 100755
new mode 100644
index b8487f5..e10bfa9
--- a/tools/droiddoc/templates-pdk/assets/images/home/devphone-small.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/devphone-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/froyo-android.png b/tools/droiddoc/templates-pdk/assets/images/home/froyo-android.png
index 84ec5ec..c63f7f0 100644
--- a/tools/droiddoc/templates-pdk/assets/images/home/froyo-android.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/froyo-android.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/gdc-logo.png b/tools/droiddoc/templates-pdk/assets/images/home/gdc-logo.png
index 85617b8..5fb53fb 100644
--- a/tools/droiddoc/templates-pdk/assets/images/home/gdc-logo.png
+++ b/tools/droiddoc/templates-pdk/assets/images/home/gdc-logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/gingerdroid.png b/tools/droiddoc/templates-pdk/assets/images/home/gingerdroid.png
new file mode 100644
index 0000000..8399d84
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/gingerdroid.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/google-plus-small.png b/tools/droiddoc/templates-pdk/assets/images/home/google-plus-small.png
new file mode 100644
index 0000000..5bb7d7a
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/google-plus-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/google-plus.png b/tools/droiddoc/templates-pdk/assets/images/home/google-plus.png
new file mode 100644
index 0000000..90871e1
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/google-plus.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/honeycomb-android.png b/tools/droiddoc/templates-pdk/assets/images/home/honeycomb-android.png
new file mode 100644
index 0000000..6cc5031
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/honeycomb-android.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/home/ics-android.png b/tools/droiddoc/templates-pdk/assets/images/home/ics-android.png
new file mode 100644
index 0000000..be62ca8
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/home/ics-android.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/icon_design.png b/tools/droiddoc/templates-pdk/assets/images/icon_design.png
new file mode 100644
index 0000000..c12907c
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/icon_design.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/icon_market.jpg b/tools/droiddoc/templates-pdk/assets/images/icon_market.jpg
old mode 100755
new mode 100644
index 225e727..0fbb197
--- a/tools/droiddoc/templates-pdk/assets/images/icon_market.jpg
+++ b/tools/droiddoc/templates-pdk/assets/images/icon_market.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/icon_play.png b/tools/droiddoc/templates-pdk/assets/images/icon_play.png
new file mode 100644
index 0000000..8bfdc7b
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/icon_play.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/rebox-gradient.gif b/tools/droiddoc/templates-pdk/assets/images/rebox-gradient.gif
deleted file mode 100644
index 124e844..0000000
--- a/tools/droiddoc/templates-pdk/assets/images/rebox-gradient.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-article.png b/tools/droiddoc/templates-pdk/assets/images/resource-article.png
new file mode 100644
index 0000000..416493f
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-article.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-big-article.png b/tools/droiddoc/templates-pdk/assets/images/resource-big-article.png
new file mode 100644
index 0000000..7273275
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-big-article.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-big-sample.png b/tools/droiddoc/templates-pdk/assets/images/resource-big-sample.png
new file mode 100644
index 0000000..59b6b68
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-big-sample.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-big-tutorial.png b/tools/droiddoc/templates-pdk/assets/images/resource-big-tutorial.png
new file mode 100644
index 0000000..c32e89a
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-big-tutorial.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-big-video.png b/tools/droiddoc/templates-pdk/assets/images/resource-big-video.png
new file mode 100644
index 0000000..59d46a0
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-big-video.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-sample.png b/tools/droiddoc/templates-pdk/assets/images/resource-sample.png
new file mode 100644
index 0000000..f7a411c
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-sample.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-tutorial.png b/tools/droiddoc/templates-pdk/assets/images/resource-tutorial.png
new file mode 100644
index 0000000..10a14fe
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-tutorial.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/resource-video.png b/tools/droiddoc/templates-pdk/assets/images/resource-video.png
new file mode 100644
index 0000000..8fd5cae
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/resource-video.png
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/right_off.jpg b/tools/droiddoc/templates-pdk/assets/images/right_off.jpg
new file mode 100755
index 0000000..17d2efe
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/right_off.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/right_on.jpg b/tools/droiddoc/templates-pdk/assets/images/right_on.jpg
new file mode 100755
index 0000000..baa2af1
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/right_on.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/slide_1.jpg b/tools/droiddoc/templates-pdk/assets/images/slide_1.jpg
new file mode 100755
index 0000000..6d75be1
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/slide_1.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/slide_2.jpg b/tools/droiddoc/templates-pdk/assets/images/slide_2.jpg
new file mode 100755
index 0000000..aa994c2
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/slide_2.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/slide_3.jpg b/tools/droiddoc/templates-pdk/assets/images/slide_3.jpg
new file mode 100755
index 0000000..b04deb3
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/slide_3.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/slide_large_1.jpg b/tools/droiddoc/templates-pdk/assets/images/slide_large_1.jpg
new file mode 100755
index 0000000..a992e92
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/slide_large_1.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/slide_large_2.jpg b/tools/droiddoc/templates-pdk/assets/images/slide_large_2.jpg
new file mode 100755
index 0000000..9af63f4
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/slide_large_2.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/images/slide_large_3.jpg b/tools/droiddoc/templates-pdk/assets/images/slide_large_3.jpg
new file mode 100755
index 0000000..fcf236c
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/images/slide_large_3.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-pdk/assets/jquery-1.6.2.min.js b/tools/droiddoc/templates-pdk/assets/jquery-1.6.2.min.js
new file mode 100644
index 0000000..8cdc80e
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/jquery-1.6.2.min.js
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
\ No newline at end of file
diff --git a/tools/droiddoc/templates-pdk/assets/microtemplate.js b/tools/droiddoc/templates-pdk/assets/microtemplate.js
new file mode 100644
index 0000000..ada1235
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/microtemplate.js
@@ -0,0 +1,35 @@
+// Simple JavaScript Templating
+// John Resig - http://ejohn.org/ - MIT Licensed
+(function(){
+ var cache = {};
+
+ this.tmpl = function tmpl(str, data){
+ // Figure out if we're getting a template, or if we need to
+ // load the template - and be sure to cache the result.
+ var fn = !/\W/.test(str) ?
+ cache[str] = cache[str] ||
+ tmpl(document.getElementById(str).innerHTML) :
+
+ // Generate a reusable function that will serve as a template
+ // generator (and which will be cached).
+ new Function("obj",
+ "var p=[],print=function(){p.push.apply(p,arguments);};" +
+
+ // Introduce the data as local variables using with(){}
+ "with(obj){p.push('" +
+
+ // Convert the template into pure JavaScript
+ str
+ .replace(/[\r\t\n]/g, " ")
+ .split("<%").join("\t")
+ .replace(/((^|%>)[^\t]*)'/g, "$1\r")
+ .replace(/\t=(.*?)%>/g, "',$1,'")
+ .split("\t").join("');")
+ .split("%>").join("p.push('")
+ .split("\r").join("\\'")
+ + "');}return p.join('');");
+
+ // Provide some basic currying to the user
+ return data ? fn( data ) : fn;
+ };
+})();
\ No newline at end of file
diff --git a/tools/droiddoc/templates-pdk/assets/placeholder b/tools/droiddoc/templates-pdk/assets/placeholder
deleted file mode 100644
index e69de29..0000000
--- a/tools/droiddoc/templates-pdk/assets/placeholder
+++ /dev/null
diff --git a/tools/droiddoc/templates-pdk/assets/yui-3.3.0-reset-min.css b/tools/droiddoc/templates-pdk/assets/yui-3.3.0-reset-min.css
new file mode 100644
index 0000000..00c3892
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/assets/yui-3.3.0-reset-min.css
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}
\ No newline at end of file
diff --git a/tools/droiddoc/templates-pdk/components/left_nav.cs b/tools/droiddoc/templates-pdk/components/left_nav.cs
deleted file mode 100644
index a6d0ae3..0000000
--- a/tools/droiddoc/templates-pdk/components/left_nav.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-<?cs def:custom_left_nav() ?>
- <?cs if:doc.hidenav != "true" ?>
- <?cs if:doc.type == "source" ?>
- <?cs call:source_nav() ?>
- <?cs elif:doc.type == "porting" ?>
- <?cs call:porting_nav() ?>
- <?cs elif:doc.type == "compatibility" ?>
- <?cs call:compatibility_nav() ?>
- <?cs elif:doc.type == "community" ?>
- <?cs call:community_nav() ?>
- <?cs elif:doc.type == "about" ?>
- <?cs call:about_nav() ?>
- <?cs /if ?>
- <?cs /if ?>
-<?cs /def ?>
diff --git a/tools/droiddoc/templates-pdk/components/masthead.cs b/tools/droiddoc/templates-pdk/components/masthead.cs
index cab58d7..e11c63c 100644
--- a/tools/droiddoc/templates-pdk/components/masthead.cs
+++ b/tools/droiddoc/templates-pdk/components/masthead.cs
@@ -4,24 +4,7 @@
<div id="headerLeft">
<a href="<?cs var:toroot?>" tabindex="-1"><img
src="<?cs var:toroot ?>assets/images/open_source.png" alt="Android Open Source Project" /></a>
- <ul class="<?cs if:home ?>home<?cs
- elif:doc.type == "source" ?>source<?cs
- elif:doc.type == "porting" ?>porting<?cs
- elif:doc.type == "compatibility" ?>compatibility<?cs
- elif:doc.type == "community" ?>community<?cs
- elif:doc.type == "about" ?>about<?cs /if ?>">
- <li id="home-link"><a href="<?cs var:toroot ?>index.html"><span>Home</span></a></li>
- <li id="source-link"><a href="<?cs var:toroot ?>source/index.html"
- onClick="return loadLast('source')"><span>Source</span></a></li>
- <li id="porting-link"><a href="<?cs var:toroot ?>porting/index.html"
- onClick="return loadLast('porting')"><span>Porting</span></a></li>
- <li id="compatibility-link"><a href="<?cs var:toroot ?>compatibility/index.html"
- onClick="return loadLast('compatibility')"><span>Compatibility</span></a></li>
- <li id="community-link"><a href="<?cs var:toroot ?>community/index.html"
- onClick="return loadLast('community')"><span>Community</span></a></li>
- <li id="about-link"><a href="<?cs var:toroot ?>about/index.html"
- onClick="return loadLast('about')"><span>About</span></a></li>
- </ul>
+
</div>
<div id="headerRight">
<div id="headerLinks">
@@ -33,4 +16,4 @@
</div>
</div><!-- headerRight -->
</div><!-- header --><?cs
-/def ?><?cs # custom_masthead ?>
+/def ?><?cs # custom_masthead ?>
\ No newline at end of file
diff --git a/tools/droiddoc/templates-pdk/customizations.cs b/tools/droiddoc/templates-pdk/customizations.cs
index b0f90a7..e4fbbb9 100644
--- a/tools/droiddoc/templates-pdk/customizations.cs
+++ b/tools/droiddoc/templates-pdk/customizations.cs
@@ -1,26 +1,18 @@
-<?cs # This file defines custom definitions for the masthead (logo, searchbox, tabs, etc) and
-left nav (toc) that gets placed on all pages, for the open source site. See also the components/
-directory. ?>
-
-<?cs def:community_nav() ?>
+<?cs
+def:sdk_nav() ?>
<div class="g-section g-tpl-240" id="body-content">
- <div class="g-unit g-first side-nav-resizable" id="side-nav">
+ <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
<div id="devdoc-nav"><?cs
- include:"../../../../development/pdk/docs/community/community_toc.cs" ?>
+ include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
- <script>
- addLoadEvent(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
- </div>
<?cs /def ?>
-<?cs def:about_nav() ?>
+<?cs
+def:resources_tab_nav() ?>
<div class="g-section g-tpl-240" id="body-content">
- <div class="g-unit g-first side-nav-resizable" id="side-nav">
- <div id="devdoc-nav"><?cs
- include:"../../../../development/pdk/docs/about/about_toc.cs" ?>
+ <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
+ <div id="devdoc-nav"><?cs
+ include:"../../../../frameworks/base/docs/html/resources/resources_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
@@ -28,13 +20,13 @@
scrollIntoView("devdoc-nav");
});
</script>
- </div>
<?cs /def ?>
-<?cs def:porting_nav() ?>
+<?cs
+def:guide_nav() ?>
<div class="g-section g-tpl-240" id="body-content">
- <div class="g-unit g-first side-nav-resizable" id="side-nav">
- <div id="devdoc-nav"><?cs
- include:"../../../../development/pdk/docs/porting/porting_toc.cs" ?>
+ <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
+ <div id="devdoc-nav"><?cs
+ include:"../../../../vendor/pdk/data/google/docs/guide/guide_toc.cs" ?>
</div>
</div> <!-- end side-nav -->
<script>
@@ -42,50 +34,123 @@
scrollIntoView("devdoc-nav");
});
</script>
- </div>
<?cs /def ?>
-<?cs def:source_nav() ?>
- <div class="g-section g-tpl-240" id="body-content">
- <div class="g-unit g-first side-nav-resizable" id="side-nav">
- <div id="devdoc-nav"><?cs
- include:"../../../../development/pdk/docs/source/source_toc.cs" ?>
- </div>
- </div> <!-- end side-nav -->
- <script>
- addLoadEvent(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
- </div>
-<?cs /def ?>
-<?cs def:compatibility_nav() ?>
- <div class="g-section g-tpl-240" id="body-content">
- <div class="g-unit g-first side-nav-resizable" id="side-nav">
- <div id="devdoc-nav"><?cs
- include:"../../../../development/pdk/docs/compatibility/compatibility_toc.cs" ?>
- </div>
- </div> <!-- end side-nav -->
- <script>
- addLoadEvent(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
- </div>
-<?cs /def ?>
-<?cs def:custom_cc_copyright() ?>
+<?cs
+def:design_nav() ?>
+ <?cs include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?>
<?cs /def ?>
-<?cs def:custom_copyright() ?>
-<?cs /def ?>
+<?cs # The default side navigation for the reference docs ?><?cs
+def:default_left_nav() ?>
+ <div class="g-section g-tpl-240" id="body-content">
+ <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
+ <div id="swapper">
+ <div id="nav-panels">
+ <div id="resize-packages-nav">
+ <div id="packages-nav">
+ <div id="index-links"><nobr>
+ <a href="<?cs var:toroot ?>reference/packages.html" <?cs if:(page.title == "Package Index") ?>class="selected"<?cs /if ?> >Package Index</a> |
+ <a href="<?cs var:toroot ?>reference/classes.html" <?cs if:(page.title == "Class Index") ?>class="selected"<?cs /if ?>>Class Index</a></nobr>
+ </div>
+ <ul>
+ <?cs call:package_link_list(docs.packages) ?>
+ </ul><br/>
+ </div> <!-- end packages -->
+ </div> <!-- end resize-packages -->
+ <div id="classes-nav"><?cs
+ if:subcount(class.package) ?>
+ <ul>
+ <?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("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 ?>
+ <script>
+ /*addLoadEvent(maxPackageHeight);*/
+ </script>
+ <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">
+ <div id="index-links"><nobr>
+ <a href="<?cs var:toroot ?>reference/packages.html" <?cs if:(page.title == "Package Index") ?>class="selected"<?cs /if ?> >Package Index</a> |
+ <a href="<?cs var:toroot ?>reference/classes.html" <?cs if:(page.title == "Class Index") ?>class="selected"<?cs /if ?>>Class Index</a></nobr>
+ </div>
+ </div><!-- end nav-tree -->
+ </div><!-- end swapper -->
+ </div> <!-- end side-nav -->
+ <script>
+ if (!isMobile) {
+ $("<a href='#' id='nav-swap' onclick='swapNav();return false;' style='font-size:10px;line-height:9px;margin-left:1em;text-decoration:none;'><span id='tree-link'>Use Tree Navigation</span><span id='panel-link' style='display:none'>Use Panel Navigation</span></a>").appendTo("#side-nav");
+ chooseDefaultNav();
+ if ($("#nav-tree").is(':visible')) {
+ init_default_navtree("<?cs var:toroot ?>");
+ } else {
+ addLoadEvent(function() {
+ scrollIntoView("packages-nav");
+ scrollIntoView("classes-nav");
+ });
+ }
+ $("#swapper").css({borderBottom:"2px solid #aaa"});
+ } else {
+ swapNav(); // tree view should be used on mobile
+ }
+ </script><?cs
+/def ?>
+
+<?cs
+def:custom_left_nav() ?><?cs
+ if:guide ?><?cs
+ call:guide_nav() ?><?cs
+ elif:resources ?><?cs
+ call:resources_tab_nav() ?><?cs
+ elif:sdk ?><?cs
+ call:sdk_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="http://www.android.com/terms.html">Site Terms of Service</a> -
- <a href="http://www.android.com/privacy.html">Privacy Policy</a>
+ <a href="http://www.google.com/intl/en/policies/" target="_blank">Privacy & Terms</a> -
+ <a href="http://www.android.com/branding.html" target="_blank">Brand Guidelines</a> -
+ <a
+href="http://code.google.com/p/android/issues/entry?template=Developer%20Documentation"
+target="_blank">Report Document Issues</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 /def ?>
+<?cs # appears on the right side of the blue bar at the bottom off every page ?><?cs
+def:custom_buildinfo() ?>
+ Android <?cs var:sdk.version ?> r<?cs var:sdk.rel.id ?> - <?cs var:page.now ?>
+<?cs /def ?>
\ No newline at end of file
diff --git a/tools/droiddoc/templates-pdk/docpage.cs b/tools/droiddoc/templates-pdk/docpage.cs
new file mode 100644
index 0000000..c9ced96
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/docpage.cs
@@ -0,0 +1,108 @@
+<?cs include:"doctype.cs" ?>
+<?cs include:"macros.cs" ?>
+<html>
+<?cs include:"head_tag.cs" ?>
+<body class="gc-documentation" itemscope itemtype="http://schema.org/Article">
+<?cs include:"header.cs" ?>
+
+<div class="g-unit" id="doc-content"><a name="top"></a>
+
+<div id="jd-header" class="guide-header">
+ <span class="crumb" itemprop="breadcrumb">
+ <?cs if:parent.link ?>
+ <a href="<?cs var:parent.link ?>"><?cs var:parent.title ?></a>:
+ <?cs else ?>
+ <?cs /if ?>
+ </span>
+<h1 itemprop="name"><?cs var:page.title ?></h1>
+</div>
+
+ <?cs # THIS IS THE MAIN DOC CONTENT ?>
+ <div id="jd-content">
+
+ <?cs if:trainingnavtop ?>
+ <div class="training-nav-top">
+
+ <?cs if:next.link ?>
+ <?cs if:startpage ?>
+ <div class="training-nav-button-next">
+ <a href="<?cs var:next.link ?>">
+ Get started
+ <span style="font-size:1.2em">›</span>
+ <span class="training-nav-button-title"><?cs var:next.title ?></span>
+ </a>
+ </div>
+
+ <?cs else ?><?cs # if not startpage ?>
+
+ <div class="training-nav-button-next">
+ <a href="<?cs var:next.link ?>">
+ Next lesson
+ <span style="font-size:1.2em">›</span>
+ <span class="training-nav-button-title"><?cs var:next.title ?></span>
+ </a>
+ </div>
+ <?cs /if ?><?cs # end if/else startpage ?>
+
+ <?cs /if ?><?cs # end if next.link ?>
+
+ <?cs if:previous.link ?>
+ <div class="training-nav-button-previous">
+ <a href="<?cs var:previous.link ?>">
+ <span style="font-size:1.2em">‹</span>
+ Previous lesson
+ <span class="training-nav-button-title"><?cs var:previous.title ?></span>
+ </a>
+ </div>
+
+ <?cs /if ?><?cs # end if previous.link ?>
+
+ </div><!-- end training-nav-top -->
+ <?cs /if ?><?cs # end if trainingnavtop ?>
+
+
+ <div class="jd-descr" itemprop="articleBody">
+ <?cs call:tag_list(root.descr) ?>
+ </div>
+
+ <?cs if:!startpage && (previous.link || next.link) ?>
+ <div class="training-nav-bottom">
+ <?cs if:next.link ?>
+ <div class="training-nav-button-next">
+ <a href="<?cs var:next.link ?>">
+ Next lesson
+ <span style="font-size:1.2em">›</span>
+ <br/><span class="training-nav-button-title"><?cs var:next.title ?></span>
+ </a>
+ </div>
+ <?cs /if ?>
+
+ <?cs if:previous.link ?>
+ <div class="training-nav-button-previous">
+ <a href="<?cs var:previous.link ?>">
+ <span style="font-size:1.2em">‹</span>
+ Previous lesson
+ <br/><span class="training-nav-button-title"><?cs var:previous.title ?></span>
+ </a>
+ </div>
+ <?cs /if ?>
+ </div> <!-- end training-nav -->
+ <?cs /if ?>
+
+ <a href="#top" style="float:right">↑ Go to top</a>
+ <?cs if:parent.link ?>
+ <p><a href="<?cs var:parent.link ?>">← Back to <?cs var:parent.title ?></a></p>
+ <?cs /if ?>
+
+ </div> <!-- end jd-content -->
+
+<?cs include:"footer.cs" ?>
+</div><!-- end doc-content -->
+
+<?cs include:"trailer.cs" ?>
+
+</body>
+</html>
+
+
+
diff --git a/tools/droiddoc/templates-pdk/footer.cs b/tools/droiddoc/templates-pdk/footer.cs
index bb82c8d..ce6caa4 100644
--- a/tools/droiddoc/templates-pdk/footer.cs
+++ b/tools/droiddoc/templates-pdk/footer.cs
@@ -1,19 +1,3 @@
<div id="footer">
-<?cs if:reference||guide ?>
- <div id="copyright">
- <?cs call:custom_copyright() ?>
- </div>
- <div id="build_info">
- <?cs call:custom_buildinfo() ?>
- </div>
-<?cs elif:!hide_license_footer ?>
- <div id="copyright">
- <?cs call:custom_cc_copyright() ?>
- </div>
-<?cs /if ?>
- <div id="footerlinks">
- <?cs call:custom_footerlinks() ?>
- </div>
-
</div> <!-- end footer -->
diff --git a/tools/droiddoc/templates-pdk/head_tag.cs b/tools/droiddoc/templates-pdk/head_tag.cs
index cccbb14..0ecda7b 100644
--- a/tools/droiddoc/templates-pdk/head_tag.cs
+++ b/tools/droiddoc/templates-pdk/head_tag.cs
@@ -1,41 +1,35 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<link rel="shortcut icon" type="image/x-icon" href="<?cs var:toroot ?>assets/favicon.ico" />
+<?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 ?>favicon.ico" />
<title><?cs
if:page.title ?><?cs
- var:page.title ?><?cs
- if:sdk.version ?> (<?cs
- var:sdk.version ?>)<?cs
- /if ?> | <?cs
- /if ?>Android Open Source</title>
-<link href="<?cs var:toroot ?>assets/android-developer-docs-devguide.css" rel="stylesheet" type="text/css" />
-<!-- <link href="<?cs var:toroot ?>assets-pdk/pdk-local.css" rel="stylesheet" type="text/css" /> -->
+ var:page.title ?> | <?cs
+ /if ?>Android Developers</title><?cs
+if:guide||sdk||resources ?>
+<link href="<?cs var:toroot ?>assets/android-developer-docs-devguide.css" rel="stylesheet" type="text/css" /><?cs
+else ?>
+<link href="<?cs var:toroot ?>assets/android-developer-docs.css" rel="stylesheet" type="text/css" /><?cs
+/if ?>
<script src="<?cs var:toroot ?>assets/search_autocomplete.js" type="text/javascript"></script>
<script src="<?cs var:toroot ?>assets/jquery-resizable.min.js" type="text/javascript"></script>
<script src="<?cs var:toroot ?>assets/android-developer-docs.js" type="text/javascript"></script>
+<script src="<?cs var:toroot ?>assets/prettify.js" type="text/javascript"></script>
<script type="text/javascript">
setToRoot("<?cs var:toroot ?>");
-</script>
-<script type="text/javascript">
- function resizeDoxFrameHeight() {
- if(document.getElementById && !(document.all)) {
- height= document.getElementById('doxygen').contentDocument.body.scrollHeight + 20;
- document.getElementById('doxygen').style.height = height+"pt";
- }
- else if(document.all) {
- height= document.frames('doxygen').document.body.scrollHeight + 20;
- document.all.doxygen.style.height = height;
- }
-}
-</script>
-<script type="text/javascript">
- jQuery(document).ready(function() {
- jQuery("pre").addClass("prettyprint");
- });
-</script>
+</script><?cs
+if:reference ?>
+<script src="<?cs var:toroot ?>assets/android-developer-reference.js" type="text/javascript"></script>
+<script src="<?cs var:toroot ?>navtree_data.js" type="text/javascript"></script><?cs
+/if ?><?cs
+if:resources ?>
+<script src="<?cs var:toroot ?>resources/resources-data.js" type="text/javascript"></script><?cs
+/if ?>
<noscript>
<style type="text/css">
- body{overflow:auto;}
+ html,body{overflow:auto;}
#body-content{position:relative; top:0;}
#doc-content{overflow:visible;border-left:3px solid #666;}
#side-nav{padding:0;}
@@ -43,4 +37,4 @@
#resize-packages-nav{border-bottom:3px solid #666;}
</style>
</noscript>
-</head>
+</head>
\ No newline at end of file
diff --git a/tools/droiddoc/templates-pdk/header_tabs.cs b/tools/droiddoc/templates-pdk/header_tabs.cs
new file mode 100644
index 0000000..496f276
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/header_tabs.cs
@@ -0,0 +1,89 @@
+<ul id="header-tabs" class="<?cs
+ if:reference ?>reference<?cs
+ elif:guide ?>guide<?cs
+ elif:sdk ?>sdk<?cs
+ elif:home ?>home<?cs
+ elif:resources ?>resources<?cs
+ elif:videos ?>videos<?cs /if ?>">
+
+ <li id="home-link"><a href="<?cs var:toroot ?><?cs
+ if:android.whichdoc != "online" ?>offline.html<?cs
+ else ?>index.html<?cs /if ?>">
+ <?cs if:!sdk.redirect ?>
+ <span class="en">Home</span>
+ <span style="display:none" class="de">Startseite</span>
+ <span style="display:none" class="es"></span>
+ <span style="display:none" class="fr"></span>
+ <span style="display:none" class="it"></span>
+ <span style="display:none" class="ja">ホーム</span>
+ <span style="display:none" class="zh-CN">主页</span>
+ <span style="display:none" class="zh-TW">首頁</span>
+ <?cs /if ?>
+ </a></li>
+ <li id="sdk-link"><a href="<?cs var:toroot ?>sdk/index.html">
+ <span class="en">SDK</span>
+ </a></li>
+ <li id="guide-link"><a href="<?cs var:toroot ?>guide/index.html" onClick="return loadLast('guide')">
+ <?cs if:!sdk.redirect ?>
+ <span class="en">Dev Guide</span>
+ <span style="display:none" class="de">Handbuch</span>
+ <span style="display:none" class="es">Guía</span>
+ <span style="display:none" class="fr">Guide</span>
+ <span style="display:none" class="it">Guida</span>
+ <span style="display:none" class="ja">開発ガイド</span>
+ <span style="display:none" class="zh-CN">开发人员指南</span>
+ <span style="display:none" class="zh-TW">開發指南</span>
+ <?cs /if ?>
+ </a></li>
+ <li id="reference-link"><a href="<?cs var:toroot ?>reference/packages.html" onClick="return loadLast('reference')">
+ <?cs if:!sdk.redirect ?>
+ <span class="en">Reference</span>
+ <span style="display:none" class="de">Referenz</span>
+ <span style="display:none" class="es">Referencia</span>
+ <span style="display:none" class="fr">Référence</span>
+ <span style="display:none" class="it">Riferimento</span>
+ <span style="display:none" class="ja">リファレンス</span>
+ <span style="display:none" class="zh-CN">参考</span>
+ <span style="display:none" class="zh-TW">參考資料</span>
+ <?cs /if ?>
+ </a></li>
+ <li id="resources-link"><a href="<?cs var:toroot ?>resources/index.html" onClick="return loadLast('resources')">
+ <?cs if:!sdk.redirect ?>
+ <span class="en">Resources</span>
+ <span style="display:none" class="de"></span>
+ <span style="display:none" class="es"></span>
+ <span style="display:none" class="fr"></span>
+ <span style="display:none" class="it"></span>
+ <span style="display:none" class="ja"></span>
+ <span style="display:none" class="zh-CN"></span>
+ <span style="display:none" class="zh-TW"></span>
+ <?cs /if ?>
+ </a></li>
+ <li id="videos-link"><a href="<?cs var:toroot ?>videos/index.html" onClick="return loadLast('videos')">
+ <?cs if:!sdk.redirect ?>
+ <span class="en">Videos</span>
+ <span style="display:none" class="de"></span>
+ <span style="display:none" class="es"></span>
+ <span style="display:none" class="fr"></span>
+ <span style="display:none" class="it"></span>
+ <span style="display:none" class="ja">ビデオ</span>
+ <span style="display:none" class="zh-CN"></span>
+ <span style="display:none" class="zh-TW"></span>
+ <?cs /if ?>
+ </a></li>
+ <li><a href="http://android-developers.blogspot.com" onClick="return requestAppendHL(this.href)">
+ <?cs if:!sdk.redirect ?>
+ <span class="en">Blog</span>
+ <span style="display:none" class="de"></span>
+ <span style="display:none" class="es"></span>
+ <span style="display:none" class="fr"></span>
+ <span style="display:none" class="it"></span>
+ <span style="display:none" class="ja">ブログ</span>
+ <span style="display:none" class="zh-CN">博客</span>
+ <span style="display:none" class="zh-TW">網誌</span>
+ <?cs /if ?>
+ </a></li>
+
+
+
+</ul>
diff --git a/tools/droiddoc/templates-pdk/sampleindex.cs b/tools/droiddoc/templates-pdk/sampleindex.cs
new file mode 100644
index 0000000..81ba68c
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/sampleindex.cs
@@ -0,0 +1,53 @@
+<?cs include:"doctype.cs" ?>
+<?cs include:"macros.cs" ?>
+<?cs set:resources="true" ?>
+<html>
+<?cs include:"head_tag.cs" ?>
+<?cs include:"header.cs" ?>
+<body class="gc-documentation">
+
+
+<a name="top"></a>
+<div class="g-unit" id="doc-content">
+ <div id="jd-header" class="guide-header">
+ <span class="crumb">
+ <a href="<?cs var:toroot ?>resources/browser.html?tag=sample">Sample Code</a> >
+ </span>
+ <h1><?cs var:page.title ?></h1>
+ </div>
+
+<div id="jd-content">
+<p><a href="../index.html">← Back</a></p>
+
+<?cs var:summary ?>
+
+ <?cs if:subcount(subdirs) ?>
+ <h2>Subdirectories</h2>
+ <ul class="nolist">
+ <?cs each:dir=subdirs ?>
+ <li><a href="<?cs var:dir.name ?>/index.html"><?cs
+ var:dir.name ?>/</a></li>
+ <?cs /each ?>
+ </ul>
+ <?cs /if ?>
+
+ <?cs if:subcount(files) ?>
+ <h2>Files</h2>
+ <ul class="nolist">
+ <?cs each:file=files ?>
+ <li><a href="<?cs var:file.href ?>"><?cs
+ var:file.name ?></a></li>
+ <?cs /each ?>
+ </ul>
+ <?cs /if ?>
+
+</div><!-- end jd-content -->
+
+<?cs include:"footer.cs" ?>
+
+</div><!-- end doc-content -->
+
+<?cs include:"trailer.cs" ?>
+
+</body>
+</html>
diff --git a/tools/droiddoc/templates-pdk/sdkpage.cs b/tools/droiddoc/templates-pdk/sdkpage.cs
new file mode 100644
index 0000000..f6c7cfa
--- /dev/null
+++ b/tools/droiddoc/templates-pdk/sdkpage.cs
@@ -0,0 +1,256 @@
+<?cs include:"doctype.cs" ?>
+<?cs include:"macros.cs" ?>
+<html>
+<?cs if:sdk.redirect ?>
+ <head>
+ <title>Redirecting...</title>
+ <meta http-equiv="refresh" content="0;url=<?cs var:toroot ?>sdk/<?cs
+ if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
+ else ?>index.html<?cs /if ?>">
+ <link href="<?cs var:toroot ?>assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+ </head>
+<?cs else ?>
+ <?cs include:"head_tag.cs" ?>
+<?cs /if ?>
+<body class="gc-documentation" itemscope itemtype="http://schema.org/CreativeWork">
+<a name="top"></a>
+<?cs call:custom_masthead() ?>
+
+<?cs call:sdk_nav() ?>
+
+<?cs if:sdk.redirect ?>
+
+<div class="g-unit">
+ <div id="jd-content">
+ <p>Redirecting to
+ <a href="<?cs var:toroot ?>sdk/<?cs
+ if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
+ else ?>index.html<?cs /if ?>"><?cs
+ if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
+ else ?>Download the SDK<?cs /if ?>
+ </a> ...</p>
+
+<?cs else ?>
+<?cs # else, if NOT redirect ...
+#
+#
+# The following is for SDK/NDK pages
+#
+#
+?>
+
+<div class="g-unit" id="doc-content" >
+ <div id="jd-header" class="guide-header" >
+ <span class="crumb"> </span>
+ <h1 itemprop="name"><?cs if:android.whichdoc == "online" ?>Download the <?cs /if ?><?cs
+var:page.title ?></h1>
+ </div>
+
+ <div id="jd-content" itemprop="description">
+
+<?cs if:sdk.not_latest_version ?>
+ <div class="special">
+ <p><strong>This is NOT the current Android SDK release.</strong></p>
+ <p><a href="/sdk/index.html">Download the current Android SDK</a></p>
+ </div>
+<?cs /if ?>
+
+
+<?cs if:ndk ?>
+<?cs #
+#
+#
+#
+#
+#
+#
+# the following is for the NDK
+#
+# (nested in if/else redirect)
+#
+#
+#
+#
+?>
+
+<p>The Android NDK is a companion tool to the Android SDK that lets you build
+performance-critical portions of your apps in native code. It provides headers and
+libraries that allow you to build activities, handle user input, use hardware sensors,
+access application resources, and more, when programming in C or C++. If you write
+native code, your applications are still packaged into an .apk file and they still run
+inside of a virtual machine on the device. The fundamental Android application model
+does not change.</p>
+
+<p>Using native code does not result in an automatic performance increase,
+but always increases application complexity. If you have not run into any limitations
+using the Android framework APIs, you probably do not need the NDK. Read <a
+href="<?cs var:toroot ?>sdk/ndk/overview.html">What is the NDK?</a> for more information about what
+the NDK offers and whether it will be useful to you.
+</p>
+<p>
+The NDK is designed for use <em>only</em> in conjunction with the
+Android SDK. If you have not already installed and setup the <a
+href="http://developer.android.com/sdk/index.html">Android SDK</a>, please
+do so before downloading the NDK.
+</p>
+
+ <table class="download">
+ <tr>
+ <th>Platform</th>
+ <th>Package</th>
+ <th>Size</th>
+ <th>MD5 Checksum</th>
+ </tr>
+ <tr>
+ <td>Windows</td>
+ <td>
+ <a href="http://dl.google.com/android/ndk/<?cs var:ndk.win_download ?>"><?cs var:ndk.win_download ?></a>
+ </td>
+ <td><?cs var:ndk.win_bytes ?> bytes</td>
+ <td><?cs var:ndk.win_checksum ?></td>
+ </tr>
+ <tr class="alt-color">
+ <td>Mac OS X (intel)</td>
+ <td>
+ <a href="http://dl.google.com/android/ndk/<?cs var:ndk.mac_download ?>"><?cs var:ndk.mac_download ?></a>
+ </td>
+ <td><?cs var:ndk.mac_bytes ?> bytes</td>
+ <td><?cs var:ndk.mac_checksum ?></td>
+ </tr>
+ <tr>
+ <td>Linux 32/64-bit (x86)</td>
+ <td>
+ <a href="http://dl.google.com/android/ndk/<?cs var:ndk.linux_download ?>"><?cs var:ndk.linux_download ?></a>
+ </td>
+ <td><?cs var:ndk.linux_bytes ?> bytes</td>
+ <td><?cs var:ndk.linux_checksum ?></td>
+ </tr>
+ </table>
+
+ <?cs else ?>
+<?cs # end if NDK ...
+#
+#
+#
+#
+#
+#
+# the following is for the SDK
+#
+# (nested in if/else redirect and if/else NDK)
+#
+#
+#
+#
+?>
+ <?cs if:android.whichdoc == "online" ?>
+
+ <p>Welcome Developers! If you are new to the Android SDK, please read the steps below, for an
+overview of how to set up the SDK. </p>
+
+ <p>If you're already using the Android SDK, you should
+update to the latest tools or platform using the <em>Android SDK and AVD Manager</em>, rather than
+downloading a new SDK starter package. See <a
+href="<?cs var:toroot ?>sdk/adding-components.html">Adding SDK Components</a>.</p>
+
+ <table class="download">
+ <tr>
+ <th>Platform</th>
+ <th>Package</th>
+ <th>Size</th>
+ <th>MD5 Checksum</th>
+ </tr>
+ <tr>
+ <td rowspan="2">Windows</td>
+ <td>
+ <a onclick="onDownload(this)" href="http://dl.google.com/android/<?cs var:sdk.win_download
+?>"><?cs var:sdk.win_download ?></a>
+ </td>
+ <td><?cs var:sdk.win_bytes ?> bytes</td>
+ <td><?cs var:sdk.win_checksum ?></td>
+ </tr>
+ <tr>
+ <!-- blank TD from Windows rowspan -->
+ <td>
+ <a onclick="onDownload(this)" href="http://dl.google.com/android/<?cs var:sdk.win_installer
+?>"><?cs var:sdk.win_installer ?></a> (Recommended)
+ </td>
+ <td><?cs var:sdk.win_installer_bytes ?> bytes</td>
+ <td><?cs var:sdk.win_installer_checksum ?></td>
+ </tr>
+ <tr class="alt-color">
+ <td>Mac OS X (intel)</td>
+ <td>
+ <a onclick="onDownload(this)" href="http://dl.google.com/android/<?cs var:sdk.mac_download
+?>"><?cs var:sdk.mac_download ?></a>
+ </td>
+ <td><?cs var:sdk.mac_bytes ?> bytes</td>
+ <td><?cs var:sdk.mac_checksum ?></td>
+ </tr>
+ <tr>
+ <td>Linux (i386)</td>
+ <td>
+ <a onclick="onDownload(this)" href="http://dl.google.com/android/<?cs var:sdk.linux_download
+?>"><?cs var:sdk.linux_download ?></a>
+ </td>
+ <td><?cs var:sdk.linux_bytes ?> bytes</td>
+ <td><?cs var:sdk.linux_checksum ?></td>
+ </tr>
+ </table>
+
+
+<div id="next-steps" style="display:none">
+ <p><b><em><span id="filename"></span></em> is now downloading. Follow the steps below to
+get started.</b></p>
+</div>
+
+<script type="text/javascript">
+function onDownload(link) {
+ $("#filename").text($(link).html());
+ $("#next-steps").show();
+}
+</script>
+ <?cs else ?> <?cs # end if online ?>
+
+ <?cs if:sdk.preview ?><?cs # it's preview offline docs ?>
+ <p>Welcome developers! We are pleased to provide you with a preview SDK for the upcoming
+ Android 3.0 release, to give you a head-start on developing applications for it.
+ </p>
+
+ <p>See the <a
+ href="<?cs var:toroot ?>sdk/preview/start.html">Getting Started</a> document for more information
+ about how to set up the preview SDK and get started.</p>
+ <style type="text/css">
+ .non-preview { display:none; }
+ </style>
+
+ <?cs else ?><?cs # it's normal offline docs ?>
+ <style type="text/css">
+ p.offline-message { display:block; }
+ p.online-message { display:none; }
+ </style>
+ <?cs /if ?>
+
+ <?cs /if ?> <?cs # end if/else online ?>
+
+<?cs /if ?> <?cs # end if/else NDK ?>
+
+<?cs /if ?> <?cs # end if/else redirect ?>
+
+<?cs call:tag_list(root.descr) ?>
+
+</div><!-- end jd-content -->
+
+<?cs if:!sdk.redirect ?>
+<?cs include:"footer.cs" ?>
+<?cs /if ?>
+
+</div><!-- end g-unit -->
+
+<?cs include:"trailer.cs" ?>
+
+</body>
+</html>
+
+
+
diff --git a/tools/releasetools/img_from_target_files b/tools/releasetools/img_from_target_files
index 002e6e6..3a52342 100755
--- a/tools/releasetools/img_from_target_files
+++ b/tools/releasetools/img_from_target_files
@@ -55,6 +55,12 @@
def AddUserdata(output_zip):
"""Create an empty userdata image and store it in output_zip."""
+ image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict,
+ "data")
+ # If no userdata_size is provided, skip userdata.img.
+ if not image_props.get("partition_size"):
+ return
+
print "creating userdata.img..."
# The name of the directory it is making an image out of matters to
@@ -65,8 +71,6 @@
os.mkdir(user_dir)
img = tempfile.NamedTemporaryFile()
- image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict,
- "data")
fstab = OPTIONS.info_dict["fstab"]
if fstab:
image_props["fs_type" ] = fstab["/data"].fs_type