Merge change 23415 into eclair
* changes:
Open some methods on PrefereneManager to allow others use the inflater.
diff --git a/Android.mk b/Android.mk
index 97f012c..138ff09 100644
--- a/Android.mk
+++ b/Android.mk
@@ -367,13 +367,13 @@
## SDK version identifiers used in the published docs
# major[.minor] version for current SDK. (full releases only)
-framework_docs_SDK_VERSION:=1.5
+framework_docs_SDK_VERSION:=1.6
# release version (ie "Release x") (full releases only)
-framework_docs_SDK_REL_ID:=3
+framework_docs_SDK_REL_ID:=1
# name of current SDK directory (full releases only)
framework_docs_SDK_CURRENT_DIR:=$(framework_docs_SDK_VERSION)_r$(framework_docs_SDK_REL_ID)
# flag to build offline docs for a preview release
-framework_docs_SDK_PREVIEW:=true
+framework_docs_SDK_PREVIEW:=0
framework_docs_LOCAL_DROIDDOC_OPTIONS += \
-hdf sdk.version $(framework_docs_SDK_VERSION) \
diff --git a/api/4.xml b/api/4.xml
index 49f5271..bca9816 100644
--- a/api/4.xml
+++ b/api/4.xml
@@ -4123,6 +4123,17 @@
visibility="public"
>
</field>
+<field name="includeInGlobalSearch"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843374"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="indeterminate"
type="int"
transient="false"
@@ -6191,6 +6202,17 @@
visibility="public"
>
</field>
+<field name="queryAfterZeroResults"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843394"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="radioButtonStyle"
type="int"
transient="false"
@@ -6686,6 +6708,17 @@
visibility="public"
>
</field>
+<field name="searchSettingsDescription"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843402"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="searchSuggestAuthority"
type="int"
transient="false"
@@ -6741,6 +6774,17 @@
visibility="public"
>
</field>
+<field name="searchSuggestThreshold"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843373"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="secondaryProgress"
type="int"
transient="false"
@@ -21158,6 +21202,17 @@
visibility="public"
>
</field>
+<field name="INTENT_ACTION_WEB_SEARCH_SETTINGS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.search.action.WEB_SEARCH_SETTINGS""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="MENU_KEY"
type="char"
transient="false"
@@ -21191,6 +21246,17 @@
visibility="public"
>
</field>
+<field name="SHORTCUT_MIME_TYPE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""vnd.android.cursor.item/vnd.android.search.suggest""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="SUGGEST_COLUMN_FORMAT"
type="java.lang.String"
transient="false"
@@ -21279,6 +21345,28 @@
visibility="public"
>
</field>
+<field name="SUGGEST_COLUMN_SHORTCUT_ID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""suggest_shortcut_id""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""suggest_spinner_while_refreshing""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="SUGGEST_COLUMN_TEXT_1"
type="java.lang.String"
transient="false"
@@ -21312,6 +21400,17 @@
visibility="public"
>
</field>
+<field name="SUGGEST_NEVER_MAKE_SHORTCUT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""_-1""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="SUGGEST_URI_PATH_QUERY"
type="java.lang.String"
transient="false"
@@ -21323,6 +21422,17 @@
visibility="public"
>
</field>
+<field name="SUGGEST_URI_PATH_SHORTCUT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""search_suggest_shortcut""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="USER_QUERY"
type="java.lang.String"
transient="false"
diff --git a/api/current.xml b/api/current.xml
index 3e616a4..a122bd9d 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -4695,6 +4695,17 @@
visibility="public"
>
</field>
+<field name="killAfterRestore"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843420"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="label"
type="int"
transient="false"
@@ -6477,6 +6488,17 @@
visibility="public"
>
</field>
+<field name="restoreNeedsApplication"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843421"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="right"
type="int"
transient="false"
@@ -7504,7 +7526,7 @@
type="int"
transient="false"
volatile="false"
- value="16843415"
+ value="16843419"
static="true"
final="true"
deprecated="not deprecated"
@@ -8589,7 +8611,7 @@
visibility="public"
>
</field>
-<field name="wallpaperActivityCloseEnterAnimation"
+<field name="wallpaperCloseEnterAnimation"
type="int"
transient="false"
volatile="false"
@@ -8600,7 +8622,7 @@
visibility="public"
>
</field>
-<field name="wallpaperActivityCloseExitAnimation"
+<field name="wallpaperCloseExitAnimation"
type="int"
transient="false"
volatile="false"
@@ -8611,7 +8633,51 @@
visibility="public"
>
</field>
-<field name="wallpaperActivityOpenEnterAnimation"
+<field name="wallpaperIntraCloseEnterAnimation"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843417"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="wallpaperIntraCloseExitAnimation"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843418"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="wallpaperIntraOpenEnterAnimation"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843415"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="wallpaperIntraOpenExitAnimation"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843416"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="wallpaperOpenEnterAnimation"
type="int"
transient="false"
volatile="false"
@@ -8622,7 +8688,7 @@
visibility="public"
>
</field>
-<field name="wallpaperActivityOpenExitAnimation"
+<field name="wallpaperOpenExitAnimation"
type="int"
transient="false"
volatile="false"
@@ -17351,6 +17417,21 @@
visibility="public"
>
</method>
+<method name="getRunningServiceControlPanel"
+ return="android.app.PendingIntent"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="service" type="android.content.ComponentName">
+</parameter>
+<exception name="SecurityException" type="java.lang.SecurityException">
+</exception>
+</method>
<method name="getRunningServices"
return="java.util.List<android.app.ActivityManager.RunningServiceInfo>"
abstract="false"
@@ -17920,6 +18001,39 @@
visibility="public"
>
</field>
+<field name="REASON_PROVIDER_IN_USE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="REASON_SERVICE_IN_USE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="REASON_UNKNOWN"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="importance"
type="int"
transient="false"
@@ -17930,6 +18044,36 @@
visibility="public"
>
</field>
+<field name="importanceReasonCode"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="importanceReasonComponent"
+ type="android.content.ComponentName"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="importanceReasonPid"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="lru"
type="int"
transient="false"
@@ -18039,6 +18183,50 @@
visibility="public"
>
</field>
+<field name="FLAG_FOREGROUND"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLAG_PERSISTENT_PROCESS"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="8"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLAG_STARTED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLAG_SYSTEM_PROCESS"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="4"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="activeSince"
type="long"
transient="false"
@@ -18059,6 +18247,26 @@
visibility="public"
>
</field>
+<field name="clientLabel"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="clientPackage"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="crashCount"
type="int"
transient="false"
@@ -18069,6 +18277,16 @@
visibility="public"
>
</field>
+<field name="flags"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="foreground"
type="boolean"
transient="false"
@@ -18139,6 +18357,16 @@
visibility="public"
>
</field>
+<field name="uid"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
</class>
<class name="ActivityManager.RunningTaskInfo"
extends="java.lang.Object"
@@ -34126,6 +34354,17 @@
visibility="public"
>
</field>
+<field name="EXTRA_CHANGED_COMPONENT_NAME"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.intent.extra.changed_component_name""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="EXTRA_DATA_REMOVED"
type="java.lang.String"
transient="false"
@@ -64966,6 +65205,39 @@
<parameter name="key" type="java.lang.String">
</parameter>
</method>
+<method name="getAntibanding"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getColorEffect"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getFlashMode"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getInt"
return="int"
abstract="false"
@@ -64979,6 +65251,39 @@
<parameter name="key" type="java.lang.String">
</parameter>
</method>
+<method name="getJpegQuality"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getJpegThumbnailQuality"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getJpegThumbnailSize"
+ return="android.hardware.Camera.Size"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getPictureFormat"
return="int"
abstract="false"
@@ -65034,6 +65339,138 @@
visibility="public"
>
</method>
+<method name="getSceneMode"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedAntibanding"
+ return="java.util.List<java.lang.String>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedColorEffects"
+ return="java.util.List<java.lang.String>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedFlashModes"
+ return="java.util.List<java.lang.String>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedPictureFormats"
+ return="java.util.List<java.lang.Integer>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedPictureSizes"
+ return="java.util.List<android.hardware.Camera.Size>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedPreviewFormats"
+ return="java.util.List<java.lang.Integer>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedPreviewFrameRates"
+ return="java.util.List<java.lang.Integer>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedPreviewSizes"
+ return="java.util.List<android.hardware.Camera.Size>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedSceneModes"
+ return="java.util.List<java.lang.String>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSupportedWhiteBalance"
+ return="java.util.List<java.lang.String>"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getWhiteBalance"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="remove"
return="void"
abstract="false"
@@ -65047,6 +65484,17 @@
<parameter name="key" type="java.lang.String">
</parameter>
</method>
+<method name="removeGpsData"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="set"
return="void"
abstract="false"
@@ -65077,6 +65525,138 @@
<parameter name="value" type="int">
</parameter>
</method>
+<method name="setAntibanding"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="antibanding" type="java.lang.String">
+</parameter>
+</method>
+<method name="setColorEffect"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="java.lang.String">
+</parameter>
+</method>
+<method name="setFlashMode"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="java.lang.String">
+</parameter>
+</method>
+<method name="setGpsAltitude"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="altitude" type="double">
+</parameter>
+</method>
+<method name="setGpsLatitude"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="latitude" type="double">
+</parameter>
+</method>
+<method name="setGpsLongitude"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="longitude" type="double">
+</parameter>
+</method>
+<method name="setGpsTimestamp"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="timestamp" type="long">
+</parameter>
+</method>
+<method name="setJpegQuality"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="quality" type="int">
+</parameter>
+</method>
+<method name="setJpegThumbnailQuality"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="quality" type="int">
+</parameter>
+</method>
+<method name="setJpegThumbnailSize"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+</method>
<method name="setPictureFormat"
return="void"
abstract="false"
@@ -65146,6 +65726,45 @@
<parameter name="height" type="int">
</parameter>
</method>
+<method name="setRotation"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="rotation" type="int">
+</parameter>
+</method>
+<method name="setSceneMode"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="java.lang.String">
+</parameter>
+</method>
+<method name="setWhiteBalance"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="java.lang.String">
+</parameter>
+</method>
<method name="unflatten"
return="void"
abstract="false"
@@ -65159,6 +65778,446 @@
<parameter name="flattened" type="java.lang.String">
</parameter>
</method>
+<field name="ANTIBANDING_50HZ"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""50hz""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ANTIBANDING_60HZ"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""60hz""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ANTIBANDING_AUTO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""auto""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ANTIBANDING_OFF"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""off""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_AQUA"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""aqua""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_BLACKBOARD"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""blackboard""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_MONO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""mono""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_NEGATIVE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""negative""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_NONE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""none""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_POSTERIZE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""posterize""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_SEPIA"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""sepia""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_SOLARIZE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""solarize""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EFFECT_WHITEBOARD"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""whiteboard""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLASH_MODE_AUTO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""auto""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLASH_MODE_OFF"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""off""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLASH_MODE_ON"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""on""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="FLASH_MODE_RED_EYE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""red-eye""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_ACTION"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""action""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_AUTO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""auto""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_BEACH"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""beach""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_CANDLELIGHT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""candlelight""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_FIREWORKS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""fireworks""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_LANDSCAPE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""landscape""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_NIGHT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""night""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_NIGHT_PORTRAIT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""night-portrait""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_PARTY"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""party""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_PORTRAIT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""portrait""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_SNOW"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""snow""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_SPORTS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""sports""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_STEADYPHOTO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""steadyphoto""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_SUNSET"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""sunset""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCENE_MODE_THEATRE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""theatre""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_AUTO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""auto""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_CLOUDY_DAYLIGHT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""cloudy-daylight""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_DAYLIGHT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""daylight""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_FLUORESCENT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""fluorescent""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_INCANDESCENT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""incandescent""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_SHADE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""shade""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_TWILIGHT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""twilight""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="WHITE_BALANCE_WARM_FLUORESCENT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""warm-fluorescent""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
</class>
<interface name="Camera.PictureCallback"
abstract="true"
@@ -97544,6 +98603,8 @@
deprecated="not deprecated"
visibility="public"
>
+<implements name="android.os.Parcelable">
+</implements>
<constructor name="Debug.MemoryInfo"
type="android.os.Debug.MemoryInfo"
static="false"
@@ -97552,6 +98613,55 @@
visibility="public"
>
</constructor>
+<method name="describeContents"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="readFromParcel"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="source" type="android.os.Parcel">
+</parameter>
+</method>
+<method name="writeToParcel"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="dest" type="android.os.Parcel">
+</parameter>
+<parameter name="flags" type="int">
+</parameter>
+</method>
+<field name="CREATOR"
+ type="android.os.Parcelable.Creator"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="dalvikPrivateDirty"
type="int"
transient="false"
@@ -111135,6 +112245,17 @@
visibility="public"
>
</constructor>
+<field name="ACTION_ACCESSIBILITY_SETTINGS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value=""android.settings.ACCESSIBILITY_SETTINGS""
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="ACTION_AIRPLANE_MODE_SETTINGS"
type="java.lang.String"
transient="false"
@@ -117279,6 +118400,17 @@
visibility="public"
>
</method>
+<method name="hasIccCard"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="isNetworkRoaming"
return="boolean"
abstract="false"
@@ -167386,6 +168518,171 @@
<parameter name="url" type="java.lang.String">
</parameter>
</method>
+<field name="ERROR_AUTHENTICATION"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-4"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_BAD_URL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-12"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_CONNECT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-6"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_FAILED_SSL_HANDSHAKE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-11"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_FILE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-13"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_FILE_NOT_FOUND"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-14"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_HOST_LOOKUP"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_IO"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-7"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_PROXY_AUTHENTICATION"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-5"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_REDIRECT_LOOP"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-9"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_TIMEOUT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-8"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_TOO_MANY_REQUESTS"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-15"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_UNKNOWN"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_UNSUPPORTED_AUTH_SCHEME"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ERROR_UNSUPPORTED_SCHEME"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-10"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
</class>
<class name="WebViewDatabase"
extends="java.lang.Object"
@@ -270994,7 +272291,7 @@
return="boolean"
abstract="false"
native="false"
- synchronized="true"
+ synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
@@ -271020,7 +272317,7 @@
return="boolean"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -271044,7 +272341,7 @@
return="java.util.Set<java.util.Map.Entry<K, V>>"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -271079,7 +272376,7 @@
return="java.util.Set<K>"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -271164,7 +272461,7 @@
return="java.util.Collection<V>"
abstract="false"
native="false"
- synchronized="false"
+ synchronized="true"
static="false"
final="false"
deprecated="not deprecated"
@@ -271539,7 +272836,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="s" type="int">
+<parameter name="initialCapacity" type="int">
</parameter>
</constructor>
<constructor name="LinkedHashMap"
@@ -271549,9 +272846,9 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="s" type="int">
+<parameter name="initialCapacity" type="int">
</parameter>
-<parameter name="lf" type="float">
+<parameter name="loadFactor" type="float">
</parameter>
</constructor>
<constructor name="LinkedHashMap"
@@ -271561,11 +272858,11 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="s" type="int">
+<parameter name="initialCapacity" type="int">
</parameter>
-<parameter name="lf" type="float">
+<parameter name="loadFactor" type="float">
</parameter>
-<parameter name="order" type="boolean">
+<parameter name="accessOrder" type="boolean">
</parameter>
</constructor>
<constructor name="LinkedHashMap"
@@ -271575,7 +272872,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="m" type="java.util.Map<? extends K, ? extends V>">
+<parameter name="map" type="java.util.Map<? extends K, ? extends V>">
</parameter>
</constructor>
<method name="removeEldestEntry"
diff --git a/cmds/bugreport/Android.mk b/cmds/bugreport/Android.mk
new file mode 100644
index 0000000..631c219
--- /dev/null
+++ b/cmds/bugreport/Android.mk
@@ -0,0 +1,14 @@
+ifneq ($(TARGET_SIMULATOR),true)
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= bugreport.c
+
+LOCAL_MODULE:= bugreport
+
+LOCAL_SHARED_LIBRARIES := libcutils
+
+include $(BUILD_EXECUTABLE)
+
+endif
diff --git a/cmds/bugreport/bugreport.c b/cmds/bugreport/bugreport.c
new file mode 100644
index 0000000..4a0b511
--- /dev/null
+++ b/cmds/bugreport/bugreport.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <cutils/properties.h>
+#include <cutils/sockets.h>
+
+int main(int argc, char *argv[]) {
+ char buffer[65536];
+ int i, s;
+
+ /* start the dumpstate service */
+ property_set("ctl.start", "dumpstate");
+
+ /* socket will not be available until service starts */
+ for (i = 0; i < 10; i++) {
+ s = socket_local_client("dumpstate",
+ ANDROID_SOCKET_NAMESPACE_RESERVED,
+ SOCK_STREAM);
+ if (s >= 0)
+ break;
+ /* try again in 1 second */
+ sleep(1);
+ }
+
+ if (s < 0) {
+ fprintf(stderr, "Failed to connect to dumpstate service\n");
+ exit(1);
+ }
+
+ while (1) {
+ int length = read(s, buffer, sizeof(buffer));
+ if (length <= 0)
+ break;
+ fwrite(buffer, 1, length, stdout);
+ }
+
+ close(s);
+ return 0;
+}
diff --git a/cmds/dumpstate/Android.mk b/cmds/dumpstate/Android.mk
index f61d7ec..f8b37a8 100644
--- a/cmds/dumpstate/Android.mk
+++ b/cmds/dumpstate/Android.mk
@@ -11,7 +11,7 @@
include $(BUILD_EXECUTABLE)
-COMMANDS = dumpcrash bugreport
+COMMANDS = dumpcrash
SYMLINKS := $(addprefix $(TARGET_OUT_EXECUTABLES)/,$(COMMANDS))
$(SYMLINKS): DUMPSTATE_BINARY := dumpstate
$(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index 18713e9..c211b47 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -20,10 +20,12 @@
#include <unistd.h>
#include <sys/stat.h>
#include <limits.h>
+#include <errno.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/resource.h>
+#include <cutils/sockets.h>
#include "private/android_filesystem_config.h"
#include "dumpstate.h"
@@ -34,6 +36,8 @@
static struct tm now;
+static void dump_kernel_log(const char *path, const char *title) ;
+
/* dumps the current system state to stdout */
static void dumpstate(int full) {
if (full) {
@@ -101,8 +105,12 @@
DUMP("/data/system/packages.xml");
PRINT("------ PACKAGE UID ERRORS ------");
DUMP("/data/system/uiderrors.txt");
- PRINT("------ LAST KERNEL LOG ------");
- DUMP("/data/last_kmsg");
+
+ dump_kernel_log("/data/dontpanic/last_kmsg", "RAMCONSOLE");
+ dump_kernel_log("/data/dontpanic/apanic_console",
+ "PANIC CONSOLE");
+ dump_kernel_log("/data/dontpanic/apanic_threads",
+ "PANIC THREADS");
}
PRINT("========================================================");
PRINT("== build.prop");
@@ -157,11 +165,11 @@
int main(int argc, char *argv[]) {
int dumpcrash = check_command_name(argv[0], "dumpcrash");
- int bugreport = check_command_name(argv[0], "bugreport");
int add_date = 0;
char* outfile = 0;
int vibrate = 0;
int compress = 0;
+ int socket = 0;
int c, fd, vibrate_fd, fds[2];
char path[PATH_MAX];
pid_t pid;
@@ -173,31 +181,32 @@
get_time(&now);
- if (bugreport) {
- do {
- c = getopt(argc, argv, "do:vz");
- if (c == EOF)
+ do {
+ c = getopt(argc, argv, "do:svz");
+ if (c == EOF)
+ break;
+ switch (c) {
+ case 'd':
+ add_date = 1;
break;
- switch (c) {
- case 'd':
- add_date = 1;
- break;
- case 'o':
- outfile = optarg;
- break;
- case 'v':
- vibrate = 1;
- break;
- case 'z':
- compress = 1;
- break;
- case '?':
- fprintf(stderr, "%s: invalid option -%c\n",
- argv[0], optopt);
- exit(1);
- }
- } while (1);
- }
+ case 'o':
+ outfile = optarg;
+ break;
+ case 'v':
+ vibrate = 1;
+ break;
+ case 'z':
+ compress = 1;
+ break;
+ case 's':
+ socket = 1;
+ break;
+ case '?':
+ fprintf(stderr, "%s: invalid option -%c\n",
+ argv[0], optopt);
+ exit(1);
+ }
+ } while (1);
/* open vibrator before switching user */
if (vibrate) {
@@ -207,14 +216,40 @@
} else
vibrate_fd = -1;
+#if 0
/* switch to non-root user and group */
setgroups(sizeof(groups)/sizeof(groups[0]), groups);
setuid(AID_SHELL);
+#endif
/* make it safe to use both printf and STDOUT_FILENO */
setvbuf(stdout, 0, _IONBF, 0);
- if (outfile) {
+ if (socket) {
+ struct sockaddr addr;
+ socklen_t alen;
+
+ int s = android_get_control_socket("dumpstate");
+ if (s < 0) {
+ fprintf(stderr, "could not open dumpstate socket\n");
+ exit(1);
+ }
+ if (listen(s, 4) < 0) {
+ fprintf(stderr, "could not listen on dumpstate socket\n");
+ exit(1);
+ }
+
+ alen = sizeof(addr);
+ fd = accept(s, &addr, &alen);
+ if (fd < 0) {
+ fprintf(stderr, "could not accept dumpstate socket\n");
+ exit(1);
+ }
+
+ /* redirect stdout to the socket */
+ dup2(fd, STDOUT_FILENO);
+ close(fd);
+ } else if (outfile) {
if (strlen(outfile) > sizeof(path) - 100)
exit(1);
@@ -295,3 +330,21 @@
return 0;
}
+static void dump_kernel_log(const char *path, const char *title)
+
+{
+ printf("------ KERNEL %s LOG ------\n", title);
+ if (access(path, R_OK) < 0)
+ printf("%s: %s\n", path, strerror(errno));
+ else {
+ struct stat sbuf;
+
+ if (stat(path, &sbuf) < 0)
+ printf("%s: stat failed (%s)\n", path, strerror(errno));
+ else
+ printf("Harvested %s", ctime(&sbuf.st_ctime));
+
+ DUMP(path);
+ }
+}
+
diff --git a/cmds/stagefright/Android.mk b/cmds/stagefright/Android.mk
index ef67611..51a0649 100644
--- a/cmds/stagefright/Android.mk
+++ b/cmds/stagefright/Android.mk
@@ -24,6 +24,7 @@
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
+ SineSource.cpp \
record.cpp
LOCAL_SHARED_LIBRARIES := \
diff --git a/cmds/stagefright/JPEGSource.cpp b/cmds/stagefright/JPEGSource.cpp
index a7994ed..4e9ca4e 100644
--- a/cmds/stagefright/JPEGSource.cpp
+++ b/cmds/stagefright/JPEGSource.cpp
@@ -102,7 +102,7 @@
meta->setCString(kKeyMIMEType, "image/jpeg");
meta->setInt32(kKeyWidth, mWidth);
meta->setInt32(kKeyHeight, mHeight);
- meta->setInt32(kKeyCompressedSize, mSize);
+ meta->setInt32(kKeyMaxInputSize, mSize);
return meta;
}
diff --git a/cmds/stagefright/SineSource.cpp b/cmds/stagefright/SineSource.cpp
new file mode 100644
index 0000000..3c25a7f
--- /dev/null
+++ b/cmds/stagefright/SineSource.cpp
@@ -0,0 +1,100 @@
+#include "SineSource.h"
+
+#include <math.h>
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+SineSource::SineSource(int32_t sampleRate, int32_t numChannels)
+ : mStarted(false),
+ mSampleRate(sampleRate),
+ mNumChannels(numChannels),
+ mPhase(0),
+ mGroup(NULL) {
+ CHECK(numChannels == 1 || numChannels == 2);
+}
+
+SineSource::~SineSource() {
+ if (mStarted) {
+ stop();
+ }
+}
+
+status_t SineSource::start(MetaData *params) {
+ CHECK(!mStarted);
+
+ mGroup = new MediaBufferGroup;
+ mGroup->add_buffer(new MediaBuffer(kBufferSize));
+
+ mPhase = 0;
+ mStarted = true;
+
+ return OK;
+}
+
+status_t SineSource::stop() {
+ CHECK(mStarted);
+
+ delete mGroup;
+ mGroup = NULL;
+
+ mStarted = false;
+
+ return OK;
+}
+
+sp<MetaData> SineSource::getFormat() {
+ sp<MetaData> meta = new MetaData;
+ meta->setCString(kKeyMIMEType, "audio/raw");
+ meta->setInt32(kKeyChannelCount, mNumChannels);
+ meta->setInt32(kKeySampleRate, mSampleRate);
+
+ return meta;
+}
+
+status_t SineSource::read(
+ MediaBuffer **out, const ReadOptions *options) {
+ *out = NULL;
+
+ MediaBuffer *buffer;
+ status_t err = mGroup->acquire_buffer(&buffer);
+
+ if (err != OK) {
+ return err;
+ }
+
+ size_t frameSize = mNumChannels * sizeof(int16_t);
+ size_t numFramesPerBuffer = buffer->size() / frameSize;
+
+ int16_t *ptr = (int16_t *)buffer->data();
+
+ const double k = kFrequency / mSampleRate * (2.0 * M_PI);
+
+ double x = mPhase * k;
+ for (size_t i = 0; i < numFramesPerBuffer; ++i) {
+ int16_t amplitude = (int16_t)(32767.0 * sin(x));
+
+ *ptr++ = amplitude;
+ if (mNumChannels == 2) {
+ *ptr++ = amplitude;
+ }
+
+ x += k;
+ }
+
+ buffer->meta_data()->setInt32(kKeyTimeUnits, mPhase);
+ buffer->meta_data()->setInt32(kKeyTimeScale, mSampleRate);
+
+ mPhase += numFramesPerBuffer;
+
+ buffer->set_range(0, numFramesPerBuffer * frameSize);
+
+ *out = buffer;
+
+ return OK;
+}
+
+} // namespace android
diff --git a/cmds/stagefright/SineSource.h b/cmds/stagefright/SineSource.h
new file mode 100644
index 0000000..76ab669
--- /dev/null
+++ b/cmds/stagefright/SineSource.h
@@ -0,0 +1,39 @@
+#ifndef SINE_SOURCE_H_
+
+#define SINE_SOURCE_H_
+
+#include <media/stagefright/MediaSource.h>
+
+namespace android {
+
+struct MediaBufferGroup;
+
+struct SineSource : public MediaSource {
+ SineSource(int32_t sampleRate, int32_t numChannels);
+
+ virtual status_t start(MetaData *params);
+ virtual status_t stop();
+
+ virtual sp<MetaData> getFormat();
+
+ virtual status_t read(
+ MediaBuffer **out, const ReadOptions *options = NULL);
+
+protected:
+ virtual ~SineSource();
+
+private:
+ enum { kBufferSize = 8192 };
+ static const double kFrequency = 500.0;
+
+ bool mStarted;
+ int32_t mSampleRate;
+ int32_t mNumChannels;
+ size_t mPhase;
+
+ MediaBufferGroup *mGroup;
+};
+
+} // namespace android
+
+#endif // SINE_SOURCE_H_
diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp
index 4b44761..81a1c0a 100644
--- a/cmds/stagefright/record.cpp
+++ b/cmds/stagefright/record.cpp
@@ -14,7 +14,10 @@
* limitations under the License.
*/
+#include "SineSource.h"
+
#include <binder/ProcessState.h>
+#include <media/stagefright/AudioPlayer.h>
#include <media/stagefright/CameraSource.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaDebug.h>
@@ -24,9 +27,11 @@
#include <media/stagefright/MmapSource.h>
#include <media/stagefright/OMXClient.h>
#include <media/stagefright/OMXCodec.h>
+#include <media/MediaPlayerInterface.h>
using namespace android;
+#if 0
class DummySource : public MediaSource {
public:
DummySource(int width, int height)
@@ -45,11 +50,6 @@
return meta;
}
- virtual status_t getMaxSampleSize(size_t *max_size) {
- *max_size = mSize;
- return OK;
- }
-
virtual status_t start(MetaData *params) {
return OK;
}
@@ -158,7 +158,7 @@
OMXCodec::Create(
client.interface(), enc_meta, true /* createEncoder */, decoder);
-#if 1
+#if 0
sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4");
writer->addSource(enc_meta, encoder);
writer->start();
@@ -204,4 +204,60 @@
return 0;
}
+#else
+int main(int argc, char **argv) {
+ android::ProcessState::self()->startThreadPool();
+
+ OMXClient client;
+ CHECK_EQ(client.connect(), OK);
+
+ const int32_t kSampleRate = 22050;
+ const int32_t kNumChannels = 2;
+ sp<MediaSource> audioSource = new SineSource(kSampleRate, kNumChannels);
+
+#if 0
+ sp<MediaPlayerBase::AudioSink> audioSink;
+ AudioPlayer *player = new AudioPlayer(audioSink);
+ player->setSource(audioSource);
+ player->start();
+
+ sleep(10);
+
+ player->stop();
+#endif
+
+ sp<MetaData> encMeta = new MetaData;
+ encMeta->setCString(kKeyMIMEType, 1 ? "audio/3gpp" : "audio/mp4a-latm");
+ encMeta->setInt32(kKeySampleRate, kSampleRate);
+ encMeta->setInt32(kKeyChannelCount, kNumChannels);
+ encMeta->setInt32(kKeyMaxInputSize, 8192);
+
+ sp<MediaSource> encoder =
+ OMXCodec::Create(client.interface(), encMeta, true, audioSource);
+
+ encoder->start();
+
+ int32_t n = 0;
+ status_t err;
+ MediaBuffer *buffer;
+ while ((err = encoder->read(&buffer)) == OK) {
+ printf(".");
+ fflush(stdout);
+
+ buffer->release();
+ buffer = NULL;
+
+ if (++n == 10000) {
+ break;
+ }
+ }
+ printf("$\n");
+
+ encoder->stop();
+
+ client.disconnect();
+
+ return 0;
+}
+#endif
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 54c6a0c..a0b83fb 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -97,6 +97,9 @@
if (gReproduceBug == 1 && numFrames == 40) {
printf("seeking past the end now.");
options.setSeekTo(0x7fffffffL);
+ } else if (gReproduceBug == 2 && numFrames == 40) {
+ printf("seeking to 5 secs.");
+ options.setSeekTo(5000000);
}
}
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 5ed8941..8cfb758 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -1397,7 +1397,7 @@
Log.v(TAG, "current IMSI=" + imsi + "; stored IMSI=" + storedImsi);
}
- if (!imsi.equals(storedImsi) && !"initial".equals(storedImsi)) {
+ if (!imsi.equals(storedImsi) && !TextUtils.isEmpty(storedImsi)) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "wiping all passwords and authtokens");
}
diff --git a/core/java/android/accounts/Constants.java b/core/java/android/accounts/Constants.java
index 8736f41..15b1773 100644
--- a/core/java/android/accounts/Constants.java
+++ b/core/java/android/accounts/Constants.java
@@ -52,7 +52,7 @@
/**
* Action sent as a broadcast Intent by the AccountsService
* when accounts are added to and/or removed from the device's
- * database, or when the primary account is changed.
+ * database.
*/
public static final String LOGIN_ACCOUNTS_CHANGED_ACTION =
"android.accounts.LOGIN_ACCOUNTS_CHANGED";
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 07520c9d..af73112 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -289,6 +289,11 @@
public int pid;
/**
+ * The UID that owns this service.
+ */
+ public int uid;
+
+ /**
* The name of the process this service runs in.
*/
public String process;
@@ -299,7 +304,7 @@
public boolean foreground;
/**
- * The time when the service was first made activity, either by someone
+ * The time when the service was first made active, either by someone
* starting or binding to it.
*/
public long activeSince;
@@ -332,6 +337,48 @@
*/
public long restarting;
+ /**
+ * Bit for {@link #flags}: set if this service has been
+ * explicitly started.
+ */
+ public static final int FLAG_STARTED = 1<<0;
+
+ /**
+ * Bit for {@link #flags}: set if the service has asked to
+ * run as a foreground process.
+ */
+ public static final int FLAG_FOREGROUND = 1<<1;
+
+ /**
+ * Bit for {@link #flags): set if the service is running in a
+ * core system process.
+ */
+ public static final int FLAG_SYSTEM_PROCESS = 1<<2;
+
+ /**
+ * Bit for {@link #flags): set if the service is running in a
+ * persistent process.
+ */
+ public static final int FLAG_PERSISTENT_PROCESS = 1<<3;
+
+ /**
+ * Running flags.
+ */
+ public int flags;
+
+ /**
+ * For special services that are bound to by system code, this is
+ * the package that holds the binding.
+ */
+ public String clientPackage;
+
+ /**
+ * For special services that are bound to by system code, this is
+ * a string resource providing a user-visible label for who the
+ * client is.
+ */
+ public int clientLabel;
+
public RunningServiceInfo() {
}
@@ -342,6 +389,7 @@
public void writeToParcel(Parcel dest, int flags) {
ComponentName.writeToParcel(service, dest);
dest.writeInt(pid);
+ dest.writeInt(uid);
dest.writeString(process);
dest.writeInt(foreground ? 1 : 0);
dest.writeLong(activeSince);
@@ -350,11 +398,15 @@
dest.writeInt(crashCount);
dest.writeLong(lastActivityTime);
dest.writeLong(restarting);
+ dest.writeInt(this.flags);
+ dest.writeString(clientPackage);
+ dest.writeInt(clientLabel);
}
public void readFromParcel(Parcel source) {
service = ComponentName.readFromParcel(source);
pid = source.readInt();
+ uid = source.readInt();
process = source.readString();
foreground = source.readInt() != 0;
activeSince = source.readLong();
@@ -363,6 +415,9 @@
crashCount = source.readInt();
lastActivityTime = source.readLong();
restarting = source.readLong();
+ flags = source.readInt();
+ clientPackage = source.readString();
+ clientLabel = source.readInt();
}
public static final Creator<RunningServiceInfo> CREATOR = new Creator<RunningServiceInfo>() {
@@ -401,6 +456,22 @@
}
/**
+ * Returns a PendingIntent you can start to show a control panel for the
+ * given running service. If the service does not have a control panel,
+ * null is returned.
+ */
+ public PendingIntent getRunningServiceControlPanel(ComponentName service)
+ throws SecurityException {
+ try {
+ return ActivityManagerNative.getDefault()
+ .getRunningServiceControlPanel(service);
+ } catch (RemoteException e) {
+ // System dead, we will be dead too soon!
+ return null;
+ }
+ }
+
+ /**
* Information you can retrieve about the available memory through
* {@link ActivityManager#getMemoryInfo}.
*/
@@ -666,8 +737,51 @@
*/
public int lru;
+ /**
+ * Constant for {@link #importanceReasonCode}: nothing special has
+ * been specified for the reason for this level.
+ */
+ public static final int REASON_UNKNOWN = 0;
+
+ /**
+ * Constant for {@link #importanceReasonCode}: one of the application's
+ * content providers is being used by another process. The pid of
+ * the client process is in {@link #importanceReasonPid} and the
+ * target provider in this process is in
+ * {@link #importanceReasonComponent}.
+ */
+ public static final int REASON_PROVIDER_IN_USE = 1;
+
+ /**
+ * Constant for {@link #importanceReasonCode}: one of the application's
+ * content providers is being used by another process. The pid of
+ * the client process is in {@link #importanceReasonPid} and the
+ * target provider in this process is in
+ * {@link #importanceReasonComponent}.
+ */
+ public static final int REASON_SERVICE_IN_USE = 2;
+
+ /**
+ * The reason for {@link #importance}, if any.
+ */
+ public int importanceReasonCode;
+
+ /**
+ * For the specified values of {@link #importanceReasonCode}, this
+ * is the process ID of the other process that is a client of this
+ * process. This will be 0 if no other process is using this one.
+ */
+ public int importanceReasonPid;
+
+ /**
+ * For the specified values of {@link #importanceReasonCode}, this
+ * is the name of the component that is being used in this process.
+ */
+ public ComponentName importanceReasonComponent;
+
public RunningAppProcessInfo() {
importance = IMPORTANCE_FOREGROUND;
+ importanceReasonCode = REASON_UNKNOWN;
}
public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
@@ -686,6 +800,9 @@
dest.writeStringArray(pkgList);
dest.writeInt(importance);
dest.writeInt(lru);
+ dest.writeInt(importanceReasonCode);
+ dest.writeInt(importanceReasonPid);
+ ComponentName.writeToParcel(importanceReasonComponent, dest);
}
public void readFromParcel(Parcel source) {
@@ -694,6 +811,9 @@
pkgList = source.readStringArray();
importance = source.readInt();
lru = source.readInt();
+ importanceReasonCode = source.readInt();
+ importanceReasonPid = source.readInt();
+ importanceReasonComponent = ComponentName.readFromParcel(source);
}
public static final Creator<RunningAppProcessInfo> CREATOR =
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index d14ec15..4ed152e 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -29,6 +29,7 @@
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Debug;
import android.os.Parcelable;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
@@ -509,6 +510,15 @@
return true;
}
+ case GET_RUNNING_SERVICE_CONTROL_PANEL_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ ComponentName comp = ComponentName.CREATOR.createFromParcel(data);
+ PendingIntent pi = getRunningServiceControlPanel(comp);
+ reply.writeNoException();
+ PendingIntent.writePendingIntentOrNullToParcel(pi, reply);
+ return true;
+ }
+
case START_SERVICE_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder b = data.readStrongBinder();
@@ -940,13 +950,6 @@
return true;
}
- case SYSTEM_READY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- systemReady();
- reply.writeNoException();
- return true;
- }
-
case HANDLE_APPLICATION_ERROR_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder app = data.readStrongBinder();
@@ -1107,6 +1110,25 @@
reply.writeNoException();
return true;
}
+
+ case GET_PROCESS_MEMORY_INFO_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ int pid = data.readInt();
+ Debug.MemoryInfo mi = new Debug.MemoryInfo();
+ getProcessMemoryInfo(pid, mi);
+ reply.writeNoException();
+ mi.writeToParcel(reply, 0);
+ return true;
+ }
+
+ case KILL_APPLICATION_PROCESS_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ String processName = data.readString();
+ int uid = data.readInt();
+ killApplicationProcess(processName, uid);
+ reply.writeNoException();
+ return true;
+ }
}
return super.onTransact(code, data, reply, flags);
@@ -1621,6 +1643,21 @@
reply.recycle();
}
+ public PendingIntent getRunningServiceControlPanel(ComponentName service)
+ throws RemoteException
+ {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ service.writeToParcel(data, 0);
+ mRemote.transact(GET_RUNNING_SERVICE_CONTROL_PANEL_TRANSACTION, data, reply, 0);
+ reply.readException();
+ PendingIntent res = PendingIntent.readPendingIntentOrNullFromParcel(reply);
+ data.recycle();
+ reply.recycle();
+ return res;
+ }
+
public ComponentName startService(IApplicationThread caller, Intent service,
String resolvedType) throws RemoteException
{
@@ -2228,16 +2265,6 @@
data.recycle();
reply.recycle();
}
- public void systemReady() throws RemoteException
- {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IActivityManager.descriptor);
- mRemote.transact(SYSTEM_READY_TRANSACTION, data, reply, 0);
- reply.readException();
- data.recycle();
- reply.recycle();
- }
public boolean testIsSystemReady()
{
/* this base class version is never called */
@@ -2424,6 +2451,31 @@
data.recycle();
reply.recycle();
}
+
+ public void getProcessMemoryInfo(int pid, Debug.MemoryInfo outInfo)
+ throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeInt(pid);
+ mRemote.transact(GET_PROCESS_MEMORY_INFO_TRANSACTION, data, reply, 0);
+ reply.readException();
+ outInfo.readFromParcel(reply);
+ data.recycle();
+ reply.recycle();
+ }
+
+ public void killApplicationProcess(String processName, int uid) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeString(processName);
+ data.writeInt(uid);
+ mRemote.transact(KILL_APPLICATION_PROCESS_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
private IBinder mRemote;
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1e915b4..2877aec 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -68,6 +68,7 @@
import com.android.internal.os.BinderInternal;
import com.android.internal.os.RuntimeInit;
+import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.util.ArrayUtils;
import org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl;
@@ -87,6 +88,8 @@
import java.util.TimeZone;
import java.util.regex.Pattern;
+import dalvik.system.SamplingProfiler;
+
final class IntentReceiverLeaked extends AndroidRuntimeException {
public IntentReceiverLeaked(String msg) {
super(msg);
@@ -126,7 +129,7 @@
private static final int LOG_ON_PAUSE_CALLED = 30021;
private static final int LOG_ON_RESUME_CALLED = 30022;
-
+
public static final ActivityThread currentActivityThread() {
return (ActivityThread)sThreadLocal.get();
}
@@ -314,7 +317,7 @@
public ApplicationInfo getApplicationInfo() {
return mApplicationInfo;
}
-
+
public boolean isSecurityViolation() {
return mSecurityViolation;
}
@@ -322,7 +325,7 @@
/**
* Gets the array of shared libraries that are listed as
* used by the given package.
- *
+ *
* @param packageName the name of the package (note: not its
* file name)
* @return null-ok; the array of shared libraries, each one
@@ -350,7 +353,7 @@
* result is a single string with the names of the libraries
* separated by colons, or <code>null</code> if both lists
* were <code>null</code> or empty.
- *
+ *
* @param list1 null-ok; the first list
* @param list2 null-ok; the second list
* @return null-ok; the combination
@@ -378,7 +381,7 @@
if (dupCheck && ArrayUtils.contains(list1, s)) {
continue;
}
-
+
if (first) {
first = false;
} else {
@@ -390,7 +393,7 @@
return result.toString();
}
-
+
public ClassLoader getClassLoader() {
synchronized (this) {
if (mClassLoader != null) {
@@ -428,7 +431,7 @@
if ((mSharedLibraries != null) ||
(instrumentationLibs != null)) {
- zip =
+ zip =
combineLibs(mSharedLibraries, instrumentationLibs)
+ ':' + zip;
}
@@ -485,9 +488,9 @@
if (mApplication != null) {
return mApplication;
}
-
+
Application app = null;
-
+
String appClass = mApplicationInfo.className;
if (forceDefaultAppClass || (appClass == null)) {
appClass = "android.app.Application";
@@ -510,7 +513,7 @@
mActivityThread.mAllApplications.add(app);
return mApplication = app;
}
-
+
public void removeContextRegistrations(Context context,
String who, String what) {
HashMap<BroadcastReceiver, ReceiverDispatcher> rmap =
@@ -643,7 +646,7 @@
final static class InnerReceiver extends IIntentReceiver.Stub {
final WeakReference<ReceiverDispatcher> mDispatcher;
final ReceiverDispatcher mStrongRef;
-
+
InnerReceiver(ReceiverDispatcher rd, boolean strong) {
mDispatcher = new WeakReference<ReceiverDispatcher>(rd);
mStrongRef = strong ? rd : null;
@@ -661,7 +664,7 @@
}
}
}
-
+
final IIntentReceiver.Stub mIIntentReceiver;
final BroadcastReceiver mReceiver;
final Context mContext;
@@ -770,7 +773,7 @@
BroadcastReceiver getIntentReceiver() {
return mReceiver;
}
-
+
IIntentReceiver getIIntentReceiver() {
return mIIntentReceiver;
}
@@ -901,7 +904,7 @@
private static class InnerConnection extends IServiceConnection.Stub {
final WeakReference<ServiceDispatcher> mDispatcher;
-
+
InnerConnection(ServiceDispatcher sd) {
mDispatcher = new WeakReference<ServiceDispatcher>(sd);
}
@@ -913,7 +916,7 @@
}
}
}
-
+
private final HashMap<ComponentName, ConnectionInfo> mActiveConnections
= new HashMap<ComponentName, ConnectionInfo>();
@@ -965,7 +968,7 @@
IServiceConnection getIServiceConnection() {
return mIServiceConnection;
}
-
+
int getFlags() {
return mFlags;
}
@@ -1191,7 +1194,7 @@
+ " mode=" + backupMode + "}";
}
}
-
+
private static final class CreateServiceData {
IBinder token;
ServiceInfo info;
@@ -1271,10 +1274,10 @@
private static final String HEAP_COLUMN = "%17s %8s %8s %8s %8s";
private static final String ONE_COUNT_COLUMN = "%17s %8d";
private static final String TWO_COUNT_COLUMNS = "%17s %8d %17s %8d";
-
+
// Formatting for checkin service - update version if row format changes
private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 1;
-
+
public final void schedulePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges) {
queueOrSendMessage(
@@ -1343,7 +1346,7 @@
synchronized (mRelaunchingActivities) {
mRelaunchingActivities.add(r);
}
-
+
queueOrSendMessage(H.RELAUNCH_ACTIVITY, r, configChanges);
}
@@ -1463,6 +1466,10 @@
queueOrSendMessage(H.EXIT_APPLICATION, null);
}
+ public final void scheduleSuicide() {
+ queueOrSendMessage(H.SUICIDE, null);
+ }
+
public void requestThumbnail(IBinder token) {
queueOrSendMessage(H.REQUEST_THUMBNAIL, token);
}
@@ -1510,7 +1517,7 @@
throws RemoteException {
receiver.performReceive(intent, resultCode, dataStr, extras, ordered);
}
-
+
public void scheduleLowMemory() {
queueOrSendMessage(H.LOW_MEMORY, null);
}
@@ -1526,7 +1533,7 @@
} catch (RemoteException e) {
}
}
-
+
public void profilerControl(boolean start, String path, ParcelFileDescriptor fd) {
ProfilerControlData pcd = new ProfilerControlData();
pcd.path = path;
@@ -1545,7 +1552,11 @@
Log.w(TAG, "Failed setting process group to " + group, e);
}
}
-
+
+ public void getMemoryInfo(Debug.MemoryInfo outInfo) {
+ Debug.getMemoryInfo(outInfo);
+ }
+
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
long nativeMax = Debug.getNativeHeapSize() / 1024;
@@ -1581,7 +1592,7 @@
long sqliteAllocated = SQLiteDebug.getHeapAllocatedSize() / 1024;
SQLiteDebug.PagerStats stats = new SQLiteDebug.PagerStats();
SQLiteDebug.getPagerStats(stats);
-
+
// Check to see if we were called by checkin server. If so, print terse format.
boolean doCheckinFormat = false;
if (args != null) {
@@ -1589,79 +1600,79 @@
if ("-c".equals(arg)) doCheckinFormat = true;
}
}
-
+
// For checkin, we print one long comma-separated list of values
if (doCheckinFormat) {
// NOTE: if you change anything significant below, also consider changing
// ACTIVITY_THREAD_CHECKIN_VERSION.
- String processName = (mBoundApplication != null)
+ String processName = (mBoundApplication != null)
? mBoundApplication.processName : "unknown";
-
+
// Header
pw.print(ACTIVITY_THREAD_CHECKIN_VERSION); pw.print(',');
pw.print(Process.myPid()); pw.print(',');
pw.print(processName); pw.print(',');
-
+
// Heap info - max
pw.print(nativeMax); pw.print(',');
pw.print(dalvikMax); pw.print(',');
pw.print("N/A,");
pw.print(nativeMax + dalvikMax); pw.print(',');
-
+
// Heap info - allocated
pw.print(nativeAllocated); pw.print(',');
pw.print(dalvikAllocated); pw.print(',');
pw.print("N/A,");
pw.print(nativeAllocated + dalvikAllocated); pw.print(',');
-
+
// Heap info - free
pw.print(nativeFree); pw.print(',');
pw.print(dalvikFree); pw.print(',');
pw.print("N/A,");
pw.print(nativeFree + dalvikFree); pw.print(',');
-
+
// Heap info - proportional set size
pw.print(memInfo.nativePss); pw.print(',');
pw.print(memInfo.dalvikPss); pw.print(',');
pw.print(memInfo.otherPss); pw.print(',');
pw.print(memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss); pw.print(',');
-
+
// Heap info - shared
- pw.print(nativeShared); pw.print(',');
- pw.print(dalvikShared); pw.print(',');
- pw.print(otherShared); pw.print(',');
+ pw.print(nativeShared); pw.print(',');
+ pw.print(dalvikShared); pw.print(',');
+ pw.print(otherShared); pw.print(',');
pw.print(nativeShared + dalvikShared + otherShared); pw.print(',');
-
+
// Heap info - private
- pw.print(nativePrivate); pw.print(',');
+ pw.print(nativePrivate); pw.print(',');
pw.print(dalvikPrivate); pw.print(',');
pw.print(otherPrivate); pw.print(',');
pw.print(nativePrivate + dalvikPrivate + otherPrivate); pw.print(',');
-
+
// Object counts
pw.print(viewInstanceCount); pw.print(',');
pw.print(viewRootInstanceCount); pw.print(',');
pw.print(appContextInstanceCount); pw.print(',');
pw.print(activityInstanceCount); pw.print(',');
-
+
pw.print(globalAssetCount); pw.print(',');
pw.print(globalAssetManagerCount); pw.print(',');
pw.print(binderLocalObjectCount); pw.print(',');
pw.print(binderProxyObjectCount); pw.print(',');
-
+
pw.print(binderDeathObjectCount); pw.print(',');
pw.print(openSslSocketCount); pw.print(',');
-
+
// SQL
pw.print(sqliteAllocated); pw.print(',');
- pw.print(stats.databaseBytes / 1024); pw.print(',');
+ pw.print(stats.databaseBytes / 1024); pw.print(',');
pw.print(stats.numPagers); pw.print(',');
pw.print((stats.totalBytes - stats.referencedBytes) / 1024); pw.print(',');
pw.print(stats.referencedBytes / 1024); pw.print('\n');
-
+
return;
}
-
+
// otherwise, show human-readable format
printRow(pw, HEAP_COLUMN, "", "native", "dalvik", "other", "total");
printRow(pw, HEAP_COLUMN, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax);
@@ -1694,7 +1705,7 @@
printRow(pw, ONE_COUNT_COLUMN, "Death Recipients:", binderDeathObjectCount);
printRow(pw, ONE_COUNT_COLUMN, "OpenSSL Sockets:", openSslSocketCount);
-
+
// SQLite mem info
pw.println(" ");
pw.println(" SQL");
@@ -1703,7 +1714,7 @@
printRow(pw, TWO_COUNT_COLUMNS, "numPagers:", stats.numPagers, "inactivePageKB:",
(stats.totalBytes - stats.referencedBytes) / 1024);
printRow(pw, ONE_COUNT_COLUMN, "activePageKB:", stats.referencedBytes / 1024);
-
+
// Asset details.
String assetAlloc = AssetManager.getAssetAllocations();
if (assetAlloc != null) {
@@ -1719,6 +1730,10 @@
}
private final class H extends Handler {
+ private H() {
+ SamplingProfiler.getInstance().setEventThread(mLooper.getThread());
+ }
+
public static final int LAUNCH_ACTIVITY = 100;
public static final int PAUSE_ACTIVITY = 101;
public static final int PAUSE_ACTIVITY_FINISHING= 102;
@@ -1748,7 +1763,8 @@
public static final int RELAUNCH_ACTIVITY = 126;
public static final int PROFILER_CONTROL = 127;
public static final int CREATE_BACKUP_AGENT = 128;
- public static final int DESTROY_BACKUP_AGENT = 129;
+ public static final int DESTROY_BACKUP_AGENT = 129;
+ public static final int SUICIDE = 130;
String codeToString(int code) {
if (localLOGV) {
switch (code) {
@@ -1782,6 +1798,7 @@
case PROFILER_CONTROL: return "PROFILER_CONTROL";
case CREATE_BACKUP_AGENT: return "CREATE_BACKUP_AGENT";
case DESTROY_BACKUP_AGENT: return "DESTROY_BACKUP_AGENT";
+ case SUICIDE: return "SUICIDE";
}
}
return "(unknown)";
@@ -1801,6 +1818,7 @@
} break;
case PAUSE_ACTIVITY:
handlePauseActivity((IBinder)msg.obj, false, msg.arg1 != 0, msg.arg2);
+ maybeSnapshot();
break;
case PAUSE_ACTIVITY_FINISHING:
handlePauseActivity((IBinder)msg.obj, true, msg.arg1 != 0, msg.arg2);
@@ -1843,6 +1861,7 @@
break;
case RECEIVER:
handleReceiver((ReceiverData)msg.obj);
+ maybeSnapshot();
break;
case CREATE_SERVICE:
handleCreateService((CreateServiceData)msg.obj);
@@ -1858,6 +1877,7 @@
break;
case STOP_SERVICE:
handleStopService((IBinder)msg.obj);
+ maybeSnapshot();
break;
case REQUEST_THUMBNAIL:
handleRequestThumbnail((IBinder)msg.obj);
@@ -1890,6 +1910,18 @@
case DESTROY_BACKUP_AGENT:
handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);
break;
+ case SUICIDE:
+ {
+ Process.killProcess(Process.myPid());
+ }
+ break;
+ }
+ }
+
+ void maybeSnapshot() {
+ if (mBoundApplication != null) {
+ SamplingProfilerIntegration.writeSnapshot(
+ mBoundApplication.processName);
}
}
}
@@ -1932,13 +1964,13 @@
final private String mResDir;
final private float mScale;
final private int mHash;
-
+
ResourcesKey(String resDir, float scale) {
mResDir = resDir;
mScale = scale;
mHash = mResDir.hashCode() << 2 + (int) (mScale * 2);
}
-
+
@Override
public int hashCode() {
return mHash;
@@ -1989,7 +2021,7 @@
final ArrayList<ActivityRecord> mRelaunchingActivities
= new ArrayList<ActivityRecord>();
Configuration mPendingConfiguration = null;
-
+
// These can be accessed by multiple threads; mPackages is the lock.
// XXX For now we keep around information about all packages we have
// seen, not removing entries from this map.
@@ -2124,7 +2156,7 @@
return false;
}
}
-
+
ActivityThread() {
}
@@ -2157,11 +2189,11 @@
public Application getApplication() {
return mInitialApplication;
}
-
+
public String getProcessName() {
return mBoundApplication.processName;
}
-
+
public ApplicationContext getSystemContext() {
synchronized (this) {
if (mSystemContext == null) {
@@ -2216,7 +2248,7 @@
}
return aInfo;
}
-
+
public final Activity startActivityNow(Activity parent, String id,
Intent intent, ActivityInfo activityInfo, IBinder token, Bundle state,
Object lastNonConfigurationInstance) {
@@ -2299,7 +2331,7 @@
r.packageInfo = getPackageInfo(aInfo.applicationInfo,
Context.CONTEXT_INCLUDE_CODE);
}
-
+
ComponentName component = r.intent.getComponent();
if (component == null) {
component = r.intent.resolveActivity(
@@ -2331,7 +2363,7 @@
try {
Application app = r.packageInfo.makeApplication(false);
-
+
if (localLOGV) Log.v(TAG, "Performing launch of " + r);
if (localLOGV) Log.v(
TAG, r + ": app=" + app
@@ -2350,7 +2382,7 @@
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstance,
r.lastNonConfigurationChildInstances, config);
-
+
if (customIntent != null) {
activity.mIntent = customIntent;
}
@@ -2488,7 +2520,7 @@
}
}
}
-
+
private final void handleNewIntent(NewIntentData data) {
performNewIntents(data.token, data.intents);
}
@@ -2526,7 +2558,7 @@
try {
Application app = packageInfo.makeApplication(false);
-
+
if (localLOGV) Log.v(
TAG, "Performing receive of " + data.intent
+ ": app=" + app
@@ -2583,7 +2615,7 @@
+ " already exists");
return;
}
-
+
BackupAgent agent = null;
String classname = data.appInfo.backupAgentName;
if (classname == null) {
@@ -2637,7 +2669,7 @@
// Tear down a BackupAgent
private final void handleDestroyBackupAgent(CreateBackupAgentData data) {
if (DEBUG_BACKUP) Log.v(TAG, "handleDestroyBackupAgent: " + data);
-
+
PackageInfo packageInfo = getPackageInfoNoCheck(data.appInfo);
String packageName = packageInfo.mPackageName;
BackupAgent agent = mBackupAgents.get(packageName);
@@ -2842,9 +2874,9 @@
}
r.activity.performResume();
- EventLog.writeEvent(LOG_ON_RESUME_CALLED,
+ EventLog.writeEvent(LOG_ON_RESUME_CALLED,
r.activity.getComponentName().getClassName());
-
+
r.paused = false;
r.stopped = false;
if (r.activity.mStartedActivity) {
@@ -2880,7 +2912,7 @@
final int forwardBit = isForward ?
WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
-
+
// If the window hasn't yet been added to the window manager,
// and this guy didn't finish itself or start another activity,
// then go ahead and add the window.
@@ -2999,7 +3031,7 @@
if (userLeaving) {
performUserLeavingActivity(r);
}
-
+
r.activity.mConfigChangeFlags |= configChanges;
Bundle state = performPauseActivity(token, finished, true);
@@ -3176,7 +3208,7 @@
+ " win=" + r.window);
updateVisibility(r, show);
-
+
// Tell activity manager we have been stopped.
try {
ActivityManagerNative.getDefault().activityStopped(
@@ -3292,7 +3324,7 @@
try {
r.activity.mCalled = false;
mInstrumentation.callActivityOnPause(r.activity);
- EventLog.writeEvent(LOG_ON_PAUSE_CALLED,
+ EventLog.writeEvent(LOG_ON_PAUSE_CALLED,
r.activity.getComponentName().getClassName());
if (!r.activity.mCalled) {
throw new SuperNotCalledException(
@@ -3349,7 +3381,7 @@
+ ": " + e.toString(), e);
}
}
-
+
}
try {
r.activity.mCalled = false;
@@ -3431,7 +3463,7 @@
unscheduleGcIdler();
Configuration changedConfig = null;
-
+
// First: make sure we have the most recent configuration and most
// recent version of the activity, or skip it if some previous call
// had taken a more recent version.
@@ -3448,38 +3480,38 @@
N--;
}
}
-
+
if (tmp == null) {
return;
}
-
+
if (mPendingConfiguration != null) {
changedConfig = mPendingConfiguration;
mPendingConfiguration = null;
}
}
-
+
// If there was a pending configuration change, execute it first.
if (changedConfig != null) {
handleConfigurationChanged(changedConfig);
}
-
+
ActivityRecord r = mActivities.get(tmp.token);
if (localLOGV) Log.v(TAG, "Handling relaunch of " + r);
if (r == null) {
return;
}
-
+
r.activity.mConfigChangeFlags |= configChanges;
Intent currentIntent = r.activity.mIntent;
-
+
Bundle savedState = null;
if (!r.paused) {
savedState = performPauseActivity(r.token, false, true);
}
-
+
handleDestroyActivity(r.token, false, configChanges, true);
-
+
r.activity = null;
r.window = null;
r.hideForNow = false;
@@ -3503,7 +3535,7 @@
if (savedState != null) {
r.state = savedState;
}
-
+
handleLaunchActivity(r, currentIntent);
}
@@ -3533,7 +3565,7 @@
boolean allActivities, Configuration newConfig) {
ArrayList<ComponentCallbacks> callbacks
= new ArrayList<ComponentCallbacks>();
-
+
if (mActivities.size() > 0) {
Iterator<ActivityRecord> it = mActivities.values().iterator();
while (it.hasNext()) {
@@ -3574,10 +3606,10 @@
for (int i=0; i<N; i++) {
callbacks.add(mAllApplications.get(i));
}
-
+
return callbacks;
}
-
+
private final void performConfigurationChanged(
ComponentCallbacks cb, Configuration config) {
// Only for Activity objects, check that they actually call up to their
@@ -3587,18 +3619,18 @@
if (activity != null) {
activity.mCalled = false;
}
-
+
boolean shouldChangeConfig = false;
if ((activity == null) || (activity.mCurrentConfig == null)) {
shouldChangeConfig = true;
} else {
-
+
// If the new config is the same as the config this Activity
// is already running with then don't bother calling
// onConfigurationChanged
int diff = activity.mCurrentConfig.diff(config);
if (diff != 0) {
-
+
// If this activity doesn't handle any of the config changes
// then don't bother calling onConfigurationChanged as we're
// going to destroy it.
@@ -3607,10 +3639,10 @@
}
}
}
-
+
if (shouldChangeConfig) {
cb.onConfigurationChanged(config);
-
+
if (activity != null) {
if (!activity.mCalled) {
throw new SuperNotCalledException(
@@ -3624,17 +3656,17 @@
}
final void handleConfigurationChanged(Configuration config) {
-
+
synchronized (mRelaunchingActivities) {
if (mPendingConfiguration != null) {
config = mPendingConfiguration;
mPendingConfiguration = null;
}
}
-
+
ArrayList<ComponentCallbacks> callbacks
= new ArrayList<ComponentCallbacks>();
-
+
synchronized(mPackages) {
if (mConfiguration == null) {
mConfiguration = new Configuration();
@@ -3669,10 +3701,10 @@
}
}
}
-
+
callbacks = collectComponentCallbacksLocked(false, config);
}
-
+
final int N = callbacks.size();
for (int i=0; i<N; i++) {
performConfigurationChanged(callbacks.get(i), config);
@@ -3684,7 +3716,7 @@
if (r == null || r.activity == null) {
return;
}
-
+
performConfigurationChanged(r.activity, mConfiguration);
}
@@ -3707,7 +3739,7 @@
Debug.stopMethodTracing();
}
}
-
+
final void handleLowMemory() {
ArrayList<ComponentCallbacks> callbacks
= new ArrayList<ComponentCallbacks>();
@@ -3715,7 +3747,7 @@
synchronized(mPackages) {
callbacks = collectComponentCallbacksLocked(true, null);
}
-
+
final int N = callbacks.size();
for (int i=0; i<N; i++) {
callbacks.get(i).onLowMemory();
@@ -3726,7 +3758,7 @@
int sqliteReleased = SQLiteDatabase.releaseMemory();
EventLog.writeEvent(SQLITE_MEM_RELEASED_EVENT_LOG_TAG, sqliteReleased);
}
-
+
// Ask graphics to free up as much as possible (font/image caches)
Canvas.freeCaches();
@@ -3773,7 +3805,7 @@
== 0) {
Bitmap.setDefaultDensity(DisplayMetrics.DENSITY_DEFAULT);
}
-
+
if (data.debugMode != IApplicationThread.DEBUG_OFF) {
// XXX should have option to change the port.
Debug.changeDebugPort(8100);
@@ -4198,6 +4230,8 @@
}
public static final void main(String[] args) {
+ SamplingProfilerIntegration.start();
+
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
@@ -4213,8 +4247,11 @@
thread.detach();
String name;
- if (thread.mInitialApplication != null) name = thread.mInitialApplication.getPackageName();
- else name = "<unknown>";
+ if (thread.mInitialApplication != null) {
+ name = thread.mInitialApplication.getPackageName();
+ } else {
+ name = "<unknown>";
+ }
Log.i(TAG, "Main thread of " + name + " is now exiting");
}
}
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index ad64465..928981d 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -26,6 +26,7 @@
import android.content.res.Configuration;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Debug;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.IBinder;
@@ -257,6 +258,13 @@
return true;
}
+ case SCHEDULE_SUICIDE_TRANSACTION:
+ {
+ data.enforceInterface(IApplicationThread.descriptor);
+ scheduleSuicide();
+ return true;
+ }
+
case REQUEST_THUMBNAIL_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
@@ -370,6 +378,16 @@
scheduleDestroyBackupAgent(appInfo);
return true;
}
+
+ case GET_MEMORY_INFO_TRANSACTION:
+ {
+ data.enforceInterface(IApplicationThread.descriptor);
+ Debug.MemoryInfo mi = new Debug.MemoryInfo();
+ getMemoryInfo(mi);
+ reply.writeNoException();
+ mi.writeToParcel(reply, 0);
+ return true;
+ }
}
return super.onTransact(code, data, reply, flags);
@@ -641,7 +659,15 @@
IBinder.FLAG_ONEWAY);
data.recycle();
}
-
+
+ public final void scheduleSuicide() throws RemoteException {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(IApplicationThread.descriptor);
+ mRemote.transact(SCHEDULE_SUICIDE_TRANSACTION, data, null,
+ IBinder.FLAG_ONEWAY);
+ data.recycle();
+ }
+
public final void requestThumbnail(IBinder token)
throws RemoteException {
Parcel data = Parcel.obtain();
@@ -756,5 +782,16 @@
IBinder.FLAG_ONEWAY);
data.recycle();
}
+
+ public void getMemoryInfo(Debug.MemoryInfo outInfo) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IApplicationThread.descriptor);
+ mRemote.transact(GET_MEMORY_INFO_TRANSACTION, data, reply, 0);
+ reply.readException();
+ outInfo.readFromParcel(reply);
+ data.recycle();
+ reply.recycle();
+ }
}
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 35d1004..1b96af9 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.ComponentName;
+import android.content.ContextWrapper;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
@@ -801,14 +802,31 @@
// associate search with owner activity if possible (otherwise it will default to
// global search).
- final ComponentName appName = mOwnerActivity == null ? null
- : mOwnerActivity.getComponentName();
+ final ComponentName appName = getAssociatedActivity();
final boolean globalSearch = (appName == null);
searchManager.startSearch(null, false, appName, null, globalSearch);
dismiss();
return true;
}
+ /**
+ * @return The activity associated with this dialog, or null if there is no assocaited activity.
+ */
+ private ComponentName getAssociatedActivity() {
+ Activity activity = mOwnerActivity;
+ Context context = getContext();
+ while (activity == null && context != null) {
+ if (context instanceof Activity) {
+ activity = (Activity) context; // found it!
+ } else {
+ context = (context instanceof ContextWrapper) ?
+ ((ContextWrapper) context).getBaseContext() : // unwrap one level
+ null; // done
+ }
+ }
+ return activity == null ? null : activity.getComponentName();
+ }
+
/**
* Request that key events come to this dialog. Use this if your
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index c3e7224..a937c11 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -30,6 +30,7 @@
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
+import android.os.Debug;
import android.os.RemoteException;
import android.os.IBinder;
import android.os.IInterface;
@@ -125,13 +126,15 @@
public void finishOtherInstances(IBinder token, ComponentName className) throws RemoteException;
/* oneway */
public void reportThumbnail(IBinder token,
- Bitmap thumbnail, CharSequence description) throws RemoteException;
+ Bitmap thumbnail, CharSequence description) throws RemoteException;
public ContentProviderHolder getContentProvider(IApplicationThread caller,
- String name) throws RemoteException;
+ String name) throws RemoteException;
public void removeContentProvider(IApplicationThread caller,
- String name) throws RemoteException;
+ String name) throws RemoteException;
public void publishContentProviders(IApplicationThread caller,
- List<ContentProviderHolder> providers) throws RemoteException;
+ List<ContentProviderHolder> providers) throws RemoteException;
+ public PendingIntent getRunningServiceControlPanel(ComponentName service)
+ throws RemoteException;
public ComponentName startService(IApplicationThread caller, Intent service,
String resolvedType) throws RemoteException;
public int stopService(IApplicationThread caller, Intent service,
@@ -157,6 +160,7 @@
throws RemoteException;
public void backupAgentCreated(String packageName, IBinder agent) throws RemoteException;
public void unbindBackupAgent(ApplicationInfo appInfo) throws RemoteException;
+ public void killApplicationProcess(String processName, int uid) throws RemoteException;
public boolean startInstrumentation(ComponentName className, String profileFile,
int flags, Bundle arguments, IInstrumentationWatcher watcher)
@@ -231,7 +235,6 @@
// Special low-level communication with activity manager.
public void startRunning(String pkg, String cls, String action,
String data) throws RemoteException;
- public void systemReady() throws RemoteException;
// Returns 1 if the user wants to debug.
public int handleApplicationError(IBinder app,
int flags, /* 1 == can debug */
@@ -272,6 +275,9 @@
public void closeSystemDialogs(String reason) throws RemoteException;
+ public void getProcessMemoryInfo(int pid, Debug.MemoryInfo outInfo)
+ throws RemoteException;
+
/*
* Private non-Binder interfaces
*/
@@ -363,7 +369,7 @@
int PUBLISH_CONTENT_PROVIDERS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+29;
int SET_PERSISTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+30;
int FINISH_SUB_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+31;
- int SYSTEM_READY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+32;
+ int GET_RUNNING_SERVICE_CONTROL_PANEL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+32;
int START_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+33;
int STOP_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+34;
int BIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+35;
@@ -428,4 +434,6 @@
int START_ACTIVITY_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94;
int KILL_APPLICATION_WITH_UID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95;
int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96;
+ int GET_PROCESS_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+97;
+ int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98;
}
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index 6faaa34..8dda898 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -25,6 +25,7 @@
import android.content.pm.ServiceInfo;
import android.content.res.Configuration;
import android.os.Bundle;
+import android.os.Debug;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.IBinder;
@@ -82,6 +83,7 @@
IInstrumentationWatcher testWatcher, int debugMode, boolean restrictedBackupMode,
Configuration config, Map<String, IBinder> services) throws RemoteException;
void scheduleExit() throws RemoteException;
+ void scheduleSuicide() throws RemoteException;
void requestThumbnail(IBinder token) throws RemoteException;
void scheduleConfigurationChanged(Configuration config) throws RemoteException;
void updateTimeZone() throws RemoteException;
@@ -97,6 +99,7 @@
void profilerControl(boolean start, String path, ParcelFileDescriptor fd)
throws RemoteException;
void setSchedulingGroup(int group) throws RemoteException;
+ void getMemoryInfo(Debug.MemoryInfo outInfo) throws RemoteException;
String descriptor = "android.app.IApplicationThread";
@@ -130,4 +133,6 @@
int SET_SCHEDULING_GROUP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+28;
int SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+29;
int SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+30;
+ int GET_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+31;
+ int SCHEDULE_SUICIDE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+32;
}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index f776452..f474f06 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -745,7 +745,7 @@
return true;
}
- if (keyCode == KeyEvent.KEYCODE_SEARCH) {
+ if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() < 1) {
// If the search key is pressed, toggle between global and in-app search. If we are
// currently doing global search and there is no in-app search context to toggle to,
// just don't do anything.
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 7669306..dbe080b 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -29,6 +29,8 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -58,9 +60,25 @@
private IWallpaperManager mService;
private Bitmap mWallpaper;
- Globals() {
+ private static final int MSG_CLEAR_WALLPAPER = 1;
+
+ private final Handler mHandler;
+
+ Globals(Looper looper) {
IBinder b = ServiceManager.getService(Context.WALLPAPER_SERVICE);
mService = IWallpaperManager.Stub.asInterface(b);
+ mHandler = new Handler(looper) {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_CLEAR_WALLPAPER:
+ synchronized (this) {
+ mWallpaper = null;
+ }
+ break;
+ }
+ }
+ };
}
public void onWallpaperChanged() {
@@ -69,9 +87,7 @@
* to null so if the user requests the wallpaper again then we'll
* fetch it.
*/
- synchronized (this) {
- mWallpaper = null;
- }
+ mHandler.sendEmptyMessage(MSG_CLEAR_WALLPAPER);
}
public Bitmap peekWallpaperBitmap(Context context) {
@@ -170,17 +186,17 @@
private static Object mSync = new Object();
private static Globals sGlobals;
- static Globals getGlobals() {
+ static void initGlobals(Looper looper) {
synchronized (mSync) {
if (sGlobals == null) {
- sGlobals = new Globals();
+ sGlobals = new Globals(looper);
}
- return sGlobals;
}
}
/*package*/ WallpaperManager(Context context, Handler handler) {
mContext = context;
+ initGlobals(context.getMainLooper());
}
/**
@@ -193,7 +209,7 @@
/** @hide */
public IWallpaperManager getIWallpaperManager() {
- return getGlobals().mService;
+ return sGlobals.mService;
}
/**
@@ -218,7 +234,7 @@
* null pointer if these is none.
*/
public Drawable peekDrawable() {
- Bitmap bm = getGlobals().peekWallpaperBitmap(mContext);
+ Bitmap bm = sGlobals.peekWallpaperBitmap(mContext);
return bm != null ? new BitmapDrawable(mContext.getResources(), bm) : null;
}
@@ -237,7 +253,7 @@
try {
Resources resources = mContext.getResources();
/* Set the wallpaper to the default values */
- ParcelFileDescriptor fd = getGlobals().mService.setWallpaper(
+ ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(
"res:" + resources.getResourceName(resid));
if (fd != null) {
FileOutputStream fos = null;
@@ -266,7 +282,7 @@
*/
public void setBitmap(Bitmap bitmap) throws IOException {
try {
- ParcelFileDescriptor fd = getGlobals().mService.setWallpaper(null);
+ ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null);
if (fd == null) {
return;
}
@@ -297,7 +313,7 @@
*/
public void setStream(InputStream data) throws IOException {
try {
- ParcelFileDescriptor fd = getGlobals().mService.setWallpaper(null);
+ ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null);
if (fd == null) {
return;
}
@@ -339,7 +355,7 @@
*/
public int getDesiredMinimumWidth() {
try {
- return getGlobals().mService.getWidthHint();
+ return sGlobals.mService.getWidthHint();
} catch (RemoteException e) {
// Shouldn't happen!
return 0;
@@ -362,7 +378,7 @@
*/
public int getDesiredMinimumHeight() {
try {
- return getGlobals().mService.getHeightHint();
+ return sGlobals.mService.getHeightHint();
} catch (RemoteException e) {
// Shouldn't happen!
return 0;
@@ -379,7 +395,7 @@
*/
public void suggestDesiredDimensions(int minimumWidth, int minimumHeight) {
try {
- getGlobals().mService.setDimensionHints(minimumWidth, minimumHeight);
+ sGlobals.mService.setDimensionHints(minimumWidth, minimumHeight);
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 6bd2a5a..8975fe2 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -312,7 +312,7 @@
BluetoothServerSocket socket = new BluetoothServerSocket(
BluetoothSocket.TYPE_RFCOMM, true, true, channel);
try {
- socket.mSocket.bindListenNative();
+ socket.mSocket.bindListen();
} catch (IOException e) {
try {
socket.close();
@@ -334,7 +334,7 @@
BluetoothServerSocket socket = new BluetoothServerSocket(
BluetoothSocket.TYPE_RFCOMM, false, false, port);
try {
- socket.mSocket.bindListenNative();
+ socket.mSocket.bindListen();
} catch (IOException e) {
try {
socket.close();
@@ -356,7 +356,7 @@
BluetoothServerSocket socket = new BluetoothServerSocket(
BluetoothSocket.TYPE_SCO, false, false, -1);
try {
- socket.mSocket.bindListenNative();
+ socket.mSocket.bindListen();
} catch (IOException e) {
try {
socket.close();
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 0a71961..0ec3243 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -266,6 +266,33 @@
return BluetoothError.ERROR_IPC;
}
+ /**
+ * Get trust state of a remote device.
+ * @hide
+ */
+ public boolean getTrustState() {
+ try {
+ return sService.getTrustState(mAddress);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return false;
+ }
+
+ /**
+ * Set trust state for a remote device.
+ * @param value the trust state value (true or false)
+ * @hide
+ */
+ public boolean setTrust(boolean value) {
+ try {
+ return sService.setTrust(mAddress, value);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ }
+ return false;
+ }
+
/** @hide */
public int getBluetoothClass() {
try {
diff --git a/core/java/android/bluetooth/BluetoothInputStream.java b/core/java/android/bluetooth/BluetoothInputStream.java
index c060f32..03af953 100644
--- a/core/java/android/bluetooth/BluetoothInputStream.java
+++ b/core/java/android/bluetooth/BluetoothInputStream.java
@@ -37,7 +37,7 @@
* Return number of bytes available before this stream will block.
*/
public int available() throws IOException {
- return mSocket.availableNative();
+ return mSocket.available();
}
public void close() throws IOException {
@@ -57,7 +57,7 @@
*/
public int read() throws IOException {
byte b[] = new byte[1];
- int ret = mSocket.readNative(b, 0, 1);
+ int ret = mSocket.read(b, 0, 1);
if (ret == 1) {
return (int)b[0] & 0xff;
} else {
@@ -93,6 +93,6 @@
if ((offset | length) < 0 || length > b.length - offset) {
throw new ArrayIndexOutOfBoundsException("invalid offset or length");
}
- return mSocket.readNative(b, offset, length);
+ return mSocket.read(b, offset, length);
}
}
diff --git a/core/java/android/bluetooth/BluetoothOutputStream.java b/core/java/android/bluetooth/BluetoothOutputStream.java
index 7e2ead4..62242a2 100644
--- a/core/java/android/bluetooth/BluetoothOutputStream.java
+++ b/core/java/android/bluetooth/BluetoothOutputStream.java
@@ -53,7 +53,7 @@
public void write(int oneByte) throws IOException {
byte b[] = new byte[1];
b[0] = (byte)oneByte;
- mSocket.writeNative(b, 0, 1);
+ mSocket.write(b, 0, 1);
}
/**
@@ -82,6 +82,6 @@
if ((offset | count) < 0 || count > b.length - offset) {
throw new IndexOutOfBoundsException("invalid offset or length");
}
- mSocket.writeNative(b, offset, count);
+ mSocket.write(b, offset, count);
}
}
diff --git a/core/java/android/bluetooth/BluetoothServerSocket.java b/core/java/android/bluetooth/BluetoothServerSocket.java
index e653c23..b650841 100644
--- a/core/java/android/bluetooth/BluetoothServerSocket.java
+++ b/core/java/android/bluetooth/BluetoothServerSocket.java
@@ -47,6 +47,7 @@
* operations and close the socket.
*/
public final class BluetoothServerSocket implements Closeable {
+
/*package*/ final BluetoothSocket mSocket;
/**
@@ -88,7 +89,7 @@
* timeout
*/
public BluetoothSocket accept(int timeout) throws IOException {
- return mSocket.acceptNative(timeout);
+ return mSocket.accept(timeout);
}
/**
@@ -97,6 +98,6 @@
* throw an IOException.
*/
public void close() throws IOException {
- mSocket.closeNative();
+ mSocket.close();
}
}
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index eae0f37..ccbe23e 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -21,6 +21,8 @@
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
/**
* A connected or connecting Bluetooth socket.
*
@@ -63,7 +65,14 @@
private final BluetoothInputStream mInputStream;
private final BluetoothOutputStream mOutputStream;
- private int mSocketData; /* used by native code only */
+ /** prevents all native calls after destroyNative() */
+ private boolean mClosed;
+
+ /** protects mClosed */
+ private final ReentrantReadWriteLock mLock;
+
+ /** used by native code only */
+ private int mSocketData;
/**
* Construct a BluetoothSocket.
@@ -95,6 +104,8 @@
}
mInputStream = new BluetoothInputStream(this);
mOutputStream = new BluetoothOutputStream(this);
+ mClosed = false;
+ mLock = new ReentrantReadWriteLock();
}
/**
@@ -132,7 +143,13 @@
* @throws IOException on error, for example connection failure
*/
public void connect() throws IOException {
- connectNative();
+ mLock.readLock().lock();
+ try {
+ if (mClosed) throw new IOException("socket closed");
+ connectNative();
+ } finally {
+ mLock.readLock().unlock();
+ }
}
/**
@@ -141,7 +158,24 @@
* throw an IOException.
*/
public void close() throws IOException {
- closeNative();
+ // abort blocking operations on the socket
+ mLock.readLock().lock();
+ try {
+ if (mClosed) return;
+ abortNative();
+ } finally {
+ mLock.readLock().unlock();
+ }
+
+ // all native calls are guarenteed to immediately return after
+ // abortNative(), so this lock should immediatley acquire
+ mLock.writeLock().lock();
+ try {
+ mClosed = true;
+ destroyNative();
+ } finally {
+ mLock.writeLock().unlock();
+ }
}
/**
@@ -174,14 +208,64 @@
return mOutputStream;
}
+ /*package*/ void bindListen() throws IOException {
+ mLock.readLock().lock();
+ try {
+ if (mClosed) throw new IOException("socket closed");
+ bindListenNative();
+ } finally {
+ mLock.readLock().unlock();
+ }
+ }
+
+ /*package*/ BluetoothSocket accept(int timeout) throws IOException {
+ mLock.readLock().lock();
+ try {
+ if (mClosed) throw new IOException("socket closed");
+ return acceptNative(timeout);
+ } finally {
+ mLock.readLock().unlock();
+ }
+ }
+
+ /*package*/ int available() throws IOException {
+ mLock.readLock().lock();
+ try {
+ if (mClosed) throw new IOException("socket closed");
+ return availableNative();
+ } finally {
+ mLock.readLock().unlock();
+ }
+ }
+
+ /*package*/ int read(byte[] b, int offset, int length) throws IOException {
+ mLock.readLock().lock();
+ try {
+ if (mClosed) throw new IOException("socket closed");
+ return readNative(b, offset, length);
+ } finally {
+ mLock.readLock().unlock();
+ }
+ }
+
+ /*package*/ int write(byte[] b, int offset, int length) throws IOException {
+ mLock.readLock().lock();
+ try {
+ if (mClosed) throw new IOException("socket closed");
+ return writeNative(b, offset, length);
+ } finally {
+ mLock.readLock().unlock();
+ }
+ }
+
private native void initSocketNative() throws IOException;
private native void initSocketFromFdNative(int fd) throws IOException;
private native void connectNative() throws IOException;
- /*package*/ native void bindListenNative() throws IOException;
- /*package*/ native BluetoothSocket acceptNative(int timeout) throws IOException;
- /*package*/ native int availableNative() throws IOException;
- /*package*/ native int readNative(byte[] b, int offset, int length) throws IOException;
- /*package*/ native int writeNative(byte[] b, int offset, int length) throws IOException;
- /*package*/ native void closeNative() throws IOException;
+ private native void bindListenNative() throws IOException;
+ private native BluetoothSocket acceptNative(int timeout) throws IOException;
+ private native int availableNative() throws IOException;
+ private native int readNative(byte[] b, int offset, int length) throws IOException;
+ private native int writeNative(byte[] b, int offset, int length) throws IOException;
+ private native void abortNative() throws IOException;
private native void destroyNative() throws IOException;
}
diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl
index 9e05a87..a11ceac 100644
--- a/core/java/android/bluetooth/IBluetooth.aidl
+++ b/core/java/android/bluetooth/IBluetooth.aidl
@@ -58,4 +58,6 @@
boolean setPairingConfirmation(in String address, boolean confirm);
boolean cancelPairingUserInput(in String address);
+ boolean setTrust(in String address, in boolean value);
+ boolean getTrustState(in String address);
}
diff --git a/core/java/android/content/AbstractThreadedSyncAdapter.java b/core/java/android/content/AbstractThreadedSyncAdapter.java
index 1edcb0a..6d870da 100644
--- a/core/java/android/content/AbstractThreadedSyncAdapter.java
+++ b/core/java/android/content/AbstractThreadedSyncAdapter.java
@@ -19,6 +19,8 @@
import android.accounts.Account;
import android.os.Bundle;
import android.os.Process;
+import android.os.NetStat;
+import android.util.EventLog;
import java.util.concurrent.atomic.AtomicInteger;
@@ -45,6 +47,7 @@
/** Kernel event log tag. Also listed in data/etc/event-log-tags. */
public static final int LOG_SYNC_DETAILS = 2743;
+ private static final String TAG = "Sync";
private final boolean mAutoInitialize;
/**
@@ -127,6 +130,8 @@
private final String mAuthority;
private final Account mAccount;
private final Bundle mExtras;
+ private long mInitialTxBytes;
+ private long mInitialRxBytes;
private SyncThread(String name, SyncContext syncContext, String authority,
Account account, Bundle extras) {
@@ -145,6 +150,9 @@
}
SyncResult syncResult = new SyncResult();
+ int uid = Process.myUid();
+ mInitialTxBytes = NetStat.getUidTxBytes(uid);
+ mInitialRxBytes = NetStat.getUidRxBytes(uid);
ContentProviderClient provider = null;
try {
provider = mContext.getContentResolver().acquireContentProviderClient(mAuthority);
@@ -162,6 +170,8 @@
if (!isCanceled()) {
mSyncContext.onFinished(syncResult);
}
+ logSyncDetails(NetStat.getUidTxBytes(uid) - mInitialTxBytes,
+ NetStat.getUidRxBytes(uid) - mInitialRxBytes, syncResult);
// synchronize so that the assignment will be seen by other threads
// that also synchronize accesses to mSyncThread
synchronized (mSyncThreadLock) {
@@ -196,4 +206,18 @@
*/
public abstract void performSync(Account account, Bundle extras,
String authority, ContentProviderClient provider, SyncResult syncResult);
+
+ /**
+ * Logs details on the sync.
+ * Normally this will be overridden by a subclass that will provide
+ * provider-specific details.
+ *
+ * @param bytesSent number of bytes the sync sent over the network
+ * @param bytesReceived number of bytes the sync received over the network
+ * @param result The SyncResult object holding info on the sync
+ */
+ protected void logSyncDetails(long bytesSent, long bytesReceived, SyncResult result) {
+ EventLog.writeEvent(SyncAdapter.LOG_SYNC_DETAILS, TAG, bytesSent, bytesReceived, "");
+ }
+
}
\ No newline at end of file
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 59529be..e8b2984 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -923,6 +923,16 @@
* get*ArrayListExtra can have either a {@link #EXTRA_TEXT} or {@link
* #EXTRA_STREAM} field, containing the data to be sent.
* <p>
+ * Multiple types are supported, and receivers should handle mixed types
+ * whenever possible. The right way for the receiver to check them is to
+ * use the content resolver on each URI. The intent sender should try to
+ * put the most concrete mime type in the intent type, but it can fall
+ * back to {@literal <type>/*} or {@literal *}/* as needed.
+ * <p>
+ * e.g. if you are sending image/jpg and image/jpg, the intent's type can
+ * be image/jpg, but if you are sending image/jpg and image/png, then the
+ * intent's type should be image/*.
+ * <p>
* Optional standard extras, which may be interpreted by some recipients as
* appropriate, are: {@link #EXTRA_EMAIL}, {@link #EXTRA_CC},
* {@link #EXTRA_BCC}, {@link #EXTRA_SUBJECT}.
@@ -1267,6 +1277,8 @@
* enabled or disabled. The data contains the name of the package.
* <ul>
* <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
+ * <li> {@link #EXTRA_CHANGED_COMPONENT_NAME} containing the class name of the changed component.
+ * <li> {@link #EXTRA_DONT_KILL_APP} containing boolean field to override the default action of restarting the application.
* </ul>
*
* <p class="note">This is a protected intent that can only be sent
@@ -2034,6 +2046,32 @@
public static final String EXTRA_REMOTE_INTENT_TOKEN =
"android.intent.extra.remote_intent_token";
+ /**
+ * Used as an int extra field in {@link android.content.Intent#ACTION_PACKAGE_CHANGED}
+ * intent to supply the name of the component that changed.
+ *
+ */
+ public static final String EXTRA_CHANGED_COMPONENT_NAME =
+ "android.intent.extra.changed_component_name";
+
+ /**
+ * @hide
+ * Magic extra system code can use when binding, to give a label for
+ * who it is that has bound to a service. This is an integer giving
+ * a framework string resource that can be displayed to the user.
+ */
+ public static final String EXTRA_CLIENT_LABEL =
+ "android.intent.extra.client_label";
+
+ /**
+ * @hide
+ * Magic extra system code can use when binding, to give a PendingIntent object
+ * that can be launched for the user to disable the system's use of this
+ * service.
+ */
+ public static final String EXTRA_CLIENT_INTENT =
+ "android.intent.extra.client_intent";
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Intent flags (see mFlags variable).
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 15144a2..6d27bc7 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -148,6 +148,9 @@
private volatile boolean mSyncPollInitialized;
private final PendingIntent mSyncAlarmIntent;
private final PendingIntent mSyncPollAlarmIntent;
+ // Synchronized on "this". Instead of using this directly one should instead call
+ // its accessor, getConnManager().
+ private ConnectivityManager mConnManagerDoNotUseDirectly;
private final SyncAdaptersCache mSyncAdapters;
@@ -174,6 +177,7 @@
private BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (!mFactoryTest) {
+ mBootCompleted = true;
AccountManager.get(mContext).addOnAccountsUpdatedListener(SyncManager.this,
mSyncHandler, true /* updateImmediately */);
}
@@ -280,6 +284,18 @@
private final boolean mFactoryTest;
+ private volatile boolean mBootCompleted = false;
+
+ private ConnectivityManager getConnectivityManager() {
+ synchronized (this) {
+ if (mConnManagerDoNotUseDirectly == null) {
+ mConnManagerDoNotUseDirectly = (ConnectivityManager)mContext.getSystemService(
+ Context.CONNECTIVITY_SERVICE);
+ }
+ return mConnManagerDoNotUseDirectly;
+ }
+ }
+
public SyncManager(Context context, boolean factoryTest) {
mFactoryTest = factoryTest;
@@ -528,6 +544,13 @@
Bundle extras, long delay, boolean onlyThoseWithUnkownSyncableState) {
boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
+ if (!mBootCompleted) {
+ if (isLoggable) {
+ Log.v(TAG, "suppressing scheduleSync() since boot hasn't completed");
+ }
+ return;
+ }
+
if (!isSyncEnabled()) {
if (isLoggable) {
Log.v(TAG, "not syncing because sync is disabled");
@@ -536,6 +559,14 @@
return;
}
+ if (!getConnectivityManager().getBackgroundDataSetting()) {
+ if (isLoggable) {
+ Log.v(TAG, "not syncing because background data usage isn't allowed");
+ }
+ setStatusText("Sync is disabled.");
+ return;
+ }
+
if (mAccounts == null) setStatusText("The accounts aren't known yet.");
if (!mDataConnectionIsConnected) setStatusText("No data connection");
if (mStorageIsLow) setStatusText("Memory low");
@@ -602,6 +633,8 @@
if (hasSyncAdapter) syncableAuthorities.add(requestedAuthority);
}
+ final boolean masterSyncAutomatically = mSyncStorageEngine.getMasterSyncAutomatically();
+
for (String authority : syncableAuthorities) {
for (Account account : accounts) {
int isSyncable = mSyncStorageEngine.getIsSyncable(account, authority);
@@ -618,22 +651,36 @@
if (!syncAdapterInfo.type.supportsUploading() && uploadOnly) {
continue;
}
+
// make this an initialization sync if the isSyncable state is unknown
Bundle extrasCopy = extras;
+ long delayCopy = delay;
if (isSyncable < 0) {
extrasCopy = new Bundle(extras);
extrasCopy.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true);
+ delayCopy = -1; // expedite this
+ } else {
+ final boolean syncAutomatically = masterSyncAutomatically
+ && mSyncStorageEngine.getSyncAutomatically(account, authority);
+ boolean syncAllowed = manualSync || syncAutomatically;
+ if (!syncAllowed) {
+ if (isLoggable) {
+ Log.d(TAG, "scheduleSync: sync of " + account + ", " + authority
+ + " is not allowed, dropping request");
+ continue;
+ }
+ }
}
if (isLoggable) {
Log.v(TAG, "scheduleSync:"
- + " delay " + delay
+ + " delay " + delayCopy
+ ", source " + source
+ ", account " + account
+ ", authority " + authority
+ ", extras " + extrasCopy);
}
scheduleSyncOperation(
- new SyncOperation(account, source, authority, extrasCopy, delay));
+ new SyncOperation(account, source, authority, extrasCopy, delayCopy));
}
}
}
@@ -1017,6 +1064,10 @@
Intent intent = new Intent();
intent.setAction("android.content.SyncAdapter");
intent.setComponent(info.componentName);
+ intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
+ com.android.internal.R.string.sync_binding_label);
+ intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
+ mContext, 0, new Intent(Settings.ACTION_SYNC_SETTINGS), 0));
return mContext.bindService(intent, this, Context.BIND_AUTO_CREATE);
}
@@ -1591,9 +1642,8 @@
// found that is runnable (not disabled, etc). If that one is ready to run then
// start it, otherwise just get out.
SyncOperation op;
- final ConnectivityManager connManager = (ConnectivityManager)
- mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- final boolean backgroundDataUsageAllowed = connManager.getBackgroundDataSetting();
+ final boolean backgroundDataUsageAllowed =
+ getConnectivityManager().getBackgroundDataSetting();
synchronized (mSyncQueue) {
while (true) {
op = mSyncQueue.head();
@@ -1989,6 +2039,7 @@
private void sendSyncStateIntent() {
Intent syncStateIntent = new Intent(Intent.ACTION_SYNC_STATE_CHANGED);
+ syncStateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
syncStateIntent.putExtra("active", mNeedSyncActiveNotification);
syncStateIntent.putExtra("failing", mNeedSyncErrorNotification);
mContext.sendBroadcast(syncStateIntent);
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index 3ff13ae..df3d241 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -54,14 +54,14 @@
/**
* Singleton that tracks the sync data and overall sync
* history on the device.
- *
+ *
* @hide
*/
public class SyncStorageEngine extends Handler {
private static final String TAG = "SyncManager";
private static final boolean DEBUG = false;
private static final boolean DEBUG_FILE = false;
-
+
// @VisibleForTesting
static final long MILLIS_IN_4WEEKS = 1000L * 60 * 60 * 24 * 7 * 4;
@@ -104,24 +104,24 @@
public static final String MESG_CANCELED = "canceled";
public static final int MAX_HISTORY = 15;
-
+
private static final int MSG_WRITE_STATUS = 1;
private static final long WRITE_STATUS_DELAY = 1000*60*10; // 10 minutes
-
+
private static final int MSG_WRITE_STATISTICS = 2;
private static final long WRITE_STATISTICS_DELAY = 1000*60*30; // 1/2 hour
private static final boolean SYNC_ENABLED_DEFAULT = false;
-
+
public static class PendingOperation {
final Account account;
final int syncSource;
final String authority;
final Bundle extras; // note: read-only.
-
+
int authorityId;
byte[] flatExtras;
-
+
PendingOperation(Account account, int source,
String authority, Bundle extras) {
this.account = account;
@@ -139,17 +139,17 @@
this.authorityId = other.authorityId;
}
}
-
+
static class AccountInfo {
final Account account;
final HashMap<String, AuthorityInfo> authorities =
new HashMap<String, AuthorityInfo>();
-
+
AccountInfo(Account account) {
this.account = account;
}
}
-
+
public static class AuthorityInfo {
final Account account;
final String authority;
@@ -165,7 +165,7 @@
syncable = -1; // default to "unknown"
}
}
-
+
public static class SyncHistoryItem {
int authorityId;
int historyId;
@@ -177,69 +177,69 @@
long downstreamActivity;
String mesg;
}
-
+
public static class DayStats {
public final int day;
public int successCount;
public long successTime;
public int failureCount;
public long failureTime;
-
+
public DayStats(int day) {
this.day = day;
}
}
-
+
// Primary list of all syncable authorities. Also our global lock.
private final SparseArray<AuthorityInfo> mAuthorities =
new SparseArray<AuthorityInfo>();
-
+
private final HashMap<Account, AccountInfo> mAccounts =
new HashMap<Account, AccountInfo>();
private final ArrayList<PendingOperation> mPendingOperations =
new ArrayList<PendingOperation>();
-
+
private ActiveSyncInfo mActiveSync;
-
+
private final SparseArray<SyncStatusInfo> mSyncStatus =
new SparseArray<SyncStatusInfo>();
-
+
private final ArrayList<SyncHistoryItem> mSyncHistory =
new ArrayList<SyncHistoryItem>();
-
+
private final RemoteCallbackList<ISyncStatusObserver> mChangeListeners
= new RemoteCallbackList<ISyncStatusObserver>();
-
+
// We keep 4 weeks of stats.
private final DayStats[] mDayStats = new DayStats[7*4];
private final Calendar mCal;
private int mYear;
private int mYearInDays;
-
+
private final Context mContext;
private static volatile SyncStorageEngine sSyncStorageEngine = null;
-
+
/**
* This file contains the core engine state: all accounts and the
* settings for them. It must never be lost, and should be changed
* infrequently, so it is stored as an XML file.
*/
private final AtomicFile mAccountInfoFile;
-
+
/**
* This file contains the current sync status. We would like to retain
* it across boots, but its loss is not the end of the world, so we store
* this information as binary data.
*/
private final AtomicFile mStatusFile;
-
+
/**
* This file contains sync statistics. This is purely debugging information
* so is written infrequently and can be thrown away at any time.
*/
private final AtomicFile mStatisticsFile;
-
+
/**
* This file contains the pending sync operations. It is a binary file,
* which must be updated every time an operation is added or removed,
@@ -248,16 +248,16 @@
private final AtomicFile mPendingFile;
private static final int PENDING_FINISH_TO_WRITE = 4;
private int mNumPendingFinished = 0;
-
+
private int mNextHistoryId = 0;
private boolean mMasterSyncAutomatically = true;
-
+
private SyncStorageEngine(Context context) {
mContext = context;
sSyncStorageEngine = this;
-
+
mCal = Calendar.getInstance(TimeZone.getTimeZone("GMT+0"));
-
+
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
File syncDir = new File(systemDir, "sync");
@@ -265,7 +265,7 @@
mStatusFile = new AtomicFile(new File(syncDir, "status.bin"));
mPendingFile = new AtomicFile(new File(syncDir, "pending.bin"));
mStatisticsFile = new AtomicFile(new File(syncDir, "stats.bin"));
-
+
readAccountInfoLocked();
readStatusLocked();
readPendingOperationsLocked();
@@ -302,19 +302,19 @@
}
}
}
-
+
public void addStatusChangeListener(int mask, ISyncStatusObserver callback) {
synchronized (mAuthorities) {
mChangeListeners.register(callback, mask);
}
}
-
+
public void removeStatusChangeListener(ISyncStatusObserver callback) {
synchronized (mAuthorities) {
mChangeListeners.unregister(callback);
}
}
-
+
private void reportChange(int which) {
ArrayList<ISyncStatusObserver> reports = null;
synchronized (mAuthorities) {
@@ -332,9 +332,9 @@
}
mChangeListeners.finishBroadcast();
}
-
+
if (DEBUG) Log.v(TAG, "reportChange " + which + " to: " + reports);
-
+
if (reports != null) {
int i = reports.size();
while (i > 0) {
@@ -369,7 +369,7 @@
int i = mAuthorities.size();
while (i > 0) {
i--;
- AuthorityInfo authority = mAuthorities.get(i);
+ AuthorityInfo authority = mAuthorities.valueAt(i);
if (authority.authority.equals(providerName)
&& authority.enabled) {
return true;
@@ -408,7 +408,7 @@
int i = mAuthorities.size();
while (i > 0) {
i--;
- AuthorityInfo authority = mAuthorities.get(i);
+ AuthorityInfo authority = mAuthorities.valueAt(i);
if (authority.authority.equals(providerName)) {
return authority.syncable;
}
@@ -457,19 +457,19 @@
return mMasterSyncAutomatically;
}
}
-
+
public AuthorityInfo getAuthority(Account account, String authority) {
synchronized (mAuthorities) {
return getAuthorityLocked(account, authority, null);
}
}
-
+
public AuthorityInfo getAuthority(int authorityId) {
synchronized (mAuthorities) {
return mAuthorities.get(authorityId);
}
}
-
+
/**
* Returns true if there is currently a sync operation for the given
* account or authority in the pending list, or actively being processed.
@@ -486,7 +486,7 @@
return true;
}
}
-
+
if (mActiveSync != null) {
AuthorityInfo ainfo = getAuthority(mActiveSync.authorityId);
if (ainfo != null && ainfo.account.equals(account)
@@ -495,17 +495,17 @@
}
}
}
-
+
return false;
}
-
+
public PendingOperation insertIntoPending(PendingOperation op) {
synchronized (mAuthorities) {
if (DEBUG) Log.v(TAG, "insertIntoPending: account=" + op.account
+ " auth=" + op.authority
+ " src=" + op.syncSource
+ " extras=" + op.extras);
-
+
AuthorityInfo authority = getOrCreateAuthorityLocked(op.account,
op.authority,
-1 /* desired identifier */,
@@ -513,16 +513,16 @@
if (authority == null) {
return null;
}
-
+
op = new PendingOperation(op);
op.authorityId = authority.ident;
mPendingOperations.add(op);
appendPendingOperationLocked(op);
-
+
SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
status.pending = true;
}
-
+
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_PENDING);
return op;
}
@@ -542,7 +542,7 @@
} else {
mNumPendingFinished++;
}
-
+
AuthorityInfo authority = getAuthorityLocked(op.account, op.authority,
"deleteFromPending");
if (authority != null) {
@@ -557,18 +557,18 @@
break;
}
}
-
+
if (!morePending) {
if (DEBUG) Log.v(TAG, "no more pending!");
SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident);
status.pending = false;
}
}
-
+
res = true;
}
}
-
+
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_PENDING);
return res;
}
@@ -581,7 +581,7 @@
mPendingOperations.clear();
final int N = mSyncStatus.size();
for (int i=0; i<N; i++) {
- mSyncStatus.get(i).pending = false;
+ mSyncStatus.valueAt(i).pending = false;
}
writePendingOperationsLocked();
}
@@ -599,7 +599,7 @@
return new ArrayList<PendingOperation>(mPendingOperations);
}
}
-
+
/**
* Return the number of currently pending operations.
*/
@@ -608,7 +608,7 @@
return mPendingOperations.size();
}
}
-
+
/**
* Called when the set of account has changed, given the new array of
* active accounts.
@@ -629,7 +629,7 @@
accIt.remove();
}
}
-
+
// Clean out all data structures.
int i = removing.size();
if (i > 0) {
@@ -691,7 +691,7 @@
mActiveSync = null;
}
}
-
+
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE);
}
@@ -701,7 +701,7 @@
public void reportActiveChange() {
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE);
}
-
+
/**
* Note that sync has started for the given account and authority.
*/
@@ -730,7 +730,7 @@
id = item.historyId;
if (DEBUG) Log.v(TAG, "returning historyId " + id);
}
-
+
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS);
return id;
}
@@ -749,20 +749,20 @@
}
item = null;
}
-
+
if (item == null) {
Log.w(TAG, "stopSyncEvent: no history for id " + historyId);
return;
}
-
+
item.elapsedTime = elapsedTime;
item.event = EVENT_STOP;
item.mesg = resultMessage;
item.downstreamActivity = downstreamActivity;
item.upstreamActivity = upstreamActivity;
-
+
SyncStatusInfo status = getOrCreateSyncStatusLocked(item.authorityId);
-
+
status.numSyncs++;
status.totalElapsedTime += elapsedTime;
switch (item.source) {
@@ -779,7 +779,7 @@
status.numSourceServer++;
break;
}
-
+
boolean writeStatisticsNow = false;
int day = getCurrentDayLocked();
if (mDayStats[0] == null) {
@@ -791,7 +791,7 @@
} else if (mDayStats[0] == null) {
}
final DayStats ds = mDayStats[0];
-
+
final long lastSyncTime = (item.eventTime + elapsedTime);
boolean writeStatusNow = false;
if (MESG_SUCCESS.equals(resultMessage)) {
@@ -820,7 +820,7 @@
ds.failureCount++;
ds.failureTime += elapsedTime;
}
-
+
if (writeStatusNow) {
writeStatusLocked();
} else if (!hasMessages(MSG_WRITE_STATUS)) {
@@ -832,9 +832,9 @@
} else if (!hasMessages(MSG_WRITE_STATISTICS)) {
sendMessageDelayed(obtainMessage(MSG_WRITE_STATISTICS),
WRITE_STATISTICS_DELAY);
- }
+ }
}
-
+
reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS);
}
@@ -848,7 +848,7 @@
return mActiveSync;
}
}
-
+
/**
* Return an array of the current sync status for all authorities. Note
* that the objects inside the array are the real, live status objects,
@@ -864,7 +864,7 @@
return ops;
}
}
-
+
/**
* Returns the status that matches the authority. If there are multiples accounts for
* the authority, the one with the latest "lastSuccessTime" status is returned.
@@ -876,7 +876,7 @@
SyncStatusInfo best = null;
final int N = mSyncStatus.size();
for (int i=0; i<N; i++) {
- SyncStatusInfo cur = mSyncStatus.get(i);
+ SyncStatusInfo cur = mSyncStatus.valueAt(i);
AuthorityInfo ainfo = mAuthorities.get(cur.authorityId);
if (ainfo != null && ainfo.authority.equals(authority)) {
if (best == null) {
@@ -889,7 +889,7 @@
return best;
}
}
-
+
/**
* Return true if the pending status is true of any matching authorities.
*/
@@ -897,7 +897,7 @@
synchronized (mAuthorities) {
final int N = mSyncStatus.size();
for (int i=0; i<N; i++) {
- SyncStatusInfo cur = mSyncStatus.get(i);
+ SyncStatusInfo cur = mSyncStatus.valueAt(i);
AuthorityInfo ainfo = mAuthorities.get(cur.authorityId);
if (ainfo == null) {
continue;
@@ -928,7 +928,7 @@
return items;
}
}
-
+
/**
* Return an array of the current per-day statistics. Note
* that the objects inside the array are the real, live status objects,
@@ -941,7 +941,7 @@
return ds;
}
}
-
+
/**
* If sync is failing for any of the provider/accounts then determine the time at which it
* started failing and return the earliest time over all the provider/accounts. If none are
@@ -952,7 +952,7 @@
if (!mMasterSyncAutomatically) {
return 0;
}
-
+
long oldest = 0;
int i = mSyncStatus.size();
while (i > 0) {
@@ -965,11 +965,11 @@
}
}
}
-
+
return oldest;
}
}
-
+
private int getCurrentDayLocked() {
mCal.setTimeInMillis(System.currentTimeMillis());
final int dayOfYear = mCal.get(Calendar.DAY_OF_YEAR);
@@ -981,10 +981,10 @@
}
return dayOfYear + mYearInDays;
}
-
+
/**
* Retrieve an authority, returning null if one does not exist.
- *
+ *
* @param accountName The name of the account for the authority.
* @param authorityName The name of the authority itself.
* @param tag If non-null, this will be used in a log message if the
@@ -1010,10 +1010,10 @@
}
return null;
}
-
+
return authority;
}
-
+
private AuthorityInfo getOrCreateAuthorityLocked(Account accountName,
String authorityName, int ident, boolean doWrite) {
AccountInfo account = mAccounts.get(accountName);
@@ -1043,10 +1043,10 @@
writeAccountInfoLocked();
}
}
-
+
return authority;
}
-
+
private SyncStatusInfo getOrCreateSyncStatusLocked(int authorityId) {
SyncStatusInfo status = mSyncStatus.get(authorityId);
if (status == null) {
@@ -1055,22 +1055,22 @@
}
return status;
}
-
+
public void writeAllState() {
synchronized (mAuthorities) {
// Account info is always written so no need to do it here.
-
+
if (mNumPendingFinished > 0) {
// Only write these if they are out of date.
writePendingOperationsLocked();
}
-
+
// Just always write these... they are likely out of date.
writeStatusLocked();
writeStatisticsLocked();
}
}
-
+
/**
* Read all account information back in to the initial engine state.
*/
@@ -1165,29 +1165,29 @@
}
}
}
-
+
/**
* Write all account information to the account file.
*/
private void writeAccountInfoLocked() {
if (DEBUG_FILE) Log.v(TAG, "Writing new " + mAccountInfoFile.getBaseFile());
FileOutputStream fos = null;
-
+
try {
fos = mAccountInfoFile.startWrite();
XmlSerializer out = new FastXmlSerializer();
out.setOutput(fos, "utf-8");
out.startDocument(null, true);
out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
-
+
out.startTag(null, "accounts");
if (!mMasterSyncAutomatically) {
out.attribute(null, "listen-for-tickles", "false");
}
-
+
final int N = mAuthorities.size();
for (int i=0; i<N; i++) {
- AuthorityInfo authority = mAuthorities.get(i);
+ AuthorityInfo authority = mAuthorities.valueAt(i);
out.startTag(null, "authority");
out.attribute(null, "id", Integer.toString(authority.ident));
out.attribute(null, "account", authority.account.name);
@@ -1203,11 +1203,11 @@
}
out.endTag(null, "authority");
}
-
+
out.endTag(null, "accounts");
-
+
out.endDocument();
-
+
mAccountInfoFile.finishWrite(fos);
} catch (java.io.IOException e1) {
Log.w(TAG, "Error writing accounts", e1);
@@ -1216,15 +1216,15 @@
}
}
}
-
+
static int getIntColumn(Cursor c, String name) {
return c.getInt(c.getColumnIndex(name));
}
-
+
static long getLongColumn(Cursor c, String name) {
return c.getLong(c.getColumnIndex(name));
}
-
+
/**
* Load sync engine state from the old syncmanager database, and then
* erase it. Note that we don't deal with pending operations, active
@@ -1243,10 +1243,10 @@
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
}
-
+
if (db != null) {
final boolean hasType = db.getVersion() >= 11;
-
+
// Copy in all of the status information, as well as accounts.
if (DEBUG_FILE) Log.v(TAG, "Reading legacy sync accounts db");
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
@@ -1290,7 +1290,7 @@
SyncStatusInfo st = null;
while (i > 0) {
i--;
- st = mSyncStatus.get(i);
+ st = mSyncStatus.valueAt(i);
if (st.authorityId == authority.ident) {
found = true;
break;
@@ -1314,9 +1314,9 @@
st.pending = getIntColumn(c, "pending") != 0;
}
}
-
+
c.close();
-
+
// Retrieve the settings.
qb = new SQLiteQueryBuilder();
qb.setTables("settings");
@@ -1333,7 +1333,7 @@
int i = mAuthorities.size();
while (i > 0) {
i--;
- AuthorityInfo authority = mAuthorities.get(i);
+ AuthorityInfo authority = mAuthorities.valueAt(i);
if (authority.authority.equals(provider)) {
authority.enabled = value == null || Boolean.parseBoolean(value);
authority.syncable = 1;
@@ -1341,20 +1341,20 @@
}
}
}
-
+
c.close();
-
+
db.close();
-
+
writeAccountInfoLocked();
writeStatusLocked();
(new File(path)).delete();
}
}
-
+
public static final int STATUS_FILE_END = 0;
public static final int STATUS_FILE_ITEM = 100;
-
+
/**
* Read all sync status back in to the initial engine state.
*/
@@ -1385,17 +1385,17 @@
Log.i(TAG, "No initial status");
}
}
-
+
/**
* Write all sync status to the sync status file.
*/
private void writeStatusLocked() {
if (DEBUG_FILE) Log.v(TAG, "Writing new " + mStatusFile.getBaseFile());
-
+
// The file is being written, so we don't need to have a scheduled
// write until the next change.
removeMessages(MSG_WRITE_STATUS);
-
+
FileOutputStream fos = null;
try {
fos = mStatusFile.startWrite();
@@ -1409,7 +1409,7 @@
out.writeInt(STATUS_FILE_END);
fos.write(out.marshall());
out.recycle();
-
+
mStatusFile.finishWrite(fos);
} catch (java.io.IOException e1) {
Log.w(TAG, "Error writing status", e1);
@@ -1418,9 +1418,9 @@
}
}
}
-
+
public static final int PENDING_OPERATION_VERSION = 1;
-
+
/**
* Read all pending operations back in to the initial engine state.
*/
@@ -1464,7 +1464,7 @@
Log.i(TAG, "No initial pending operations");
}
}
-
+
private void writePendingOperationLocked(PendingOperation op, Parcel out) {
out.writeInt(PENDING_OPERATION_VERSION);
out.writeInt(op.authorityId);
@@ -1474,7 +1474,7 @@
}
out.writeByteArray(op.flatExtras);
}
-
+
/**
* Write all currently pending ops to the pending ops file.
*/
@@ -1487,10 +1487,10 @@
mPendingFile.truncate();
return;
}
-
+
if (DEBUG_FILE) Log.v(TAG, "Writing new " + mPendingFile.getBaseFile());
fos = mPendingFile.startWrite();
-
+
Parcel out = Parcel.obtain();
for (int i=0; i<N; i++) {
PendingOperation op = mPendingOperations.get(i);
@@ -1498,7 +1498,7 @@
}
fos.write(out.marshall());
out.recycle();
-
+
mPendingFile.finishWrite(fos);
} catch (java.io.IOException e1) {
Log.w(TAG, "Error writing pending operations", e1);
@@ -1507,7 +1507,7 @@
}
}
}
-
+
/**
* Append the given operation to the pending ops file; if unable to,
* write all pending ops.
@@ -1522,7 +1522,7 @@
writePendingOperationsLocked();
return;
}
-
+
try {
Parcel out = Parcel.obtain();
writePendingOperationLocked(op, out);
@@ -1537,7 +1537,7 @@
}
}
}
-
+
static private byte[] flattenBundle(Bundle bundle) {
byte[] flatData = null;
Parcel parcel = Parcel.obtain();
@@ -1549,7 +1549,7 @@
}
return flatData;
}
-
+
static private Bundle unflattenBundle(byte[] flatData) {
Bundle bundle;
Parcel parcel = Parcel.obtain();
@@ -1566,11 +1566,11 @@
}
return bundle;
}
-
+
public static final int STATISTICS_FILE_END = 0;
public static final int STATISTICS_FILE_ITEM_OLD = 100;
public static final int STATISTICS_FILE_ITEM = 101;
-
+
/**
* Read all sync statistics back in to the initial engine state.
*/
@@ -1608,17 +1608,17 @@
Log.i(TAG, "No initial statistics");
}
}
-
+
/**
* Write all sync statistics to the sync status file.
*/
private void writeStatisticsLocked() {
if (DEBUG_FILE) Log.v(TAG, "Writing new " + mStatisticsFile.getBaseFile());
-
+
// The file is being written, so we don't need to have a scheduled
// write until the next change.
removeMessages(MSG_WRITE_STATISTICS);
-
+
FileOutputStream fos = null;
try {
fos = mStatisticsFile.startWrite();
@@ -1639,7 +1639,7 @@
out.writeInt(STATISTICS_FILE_END);
fos.write(out.marshall());
out.recycle();
-
+
mStatisticsFile.finishWrite(fos);
} catch (java.io.IOException e1) {
Log.w(TAG, "Error writing stats", e1);
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 0a42a6f..8839f95 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -184,7 +184,29 @@
* {@hide}
*/
public static final int FLAG_ALLOW_BACKUP = 1<<14;
-
+
+ /**
+ * Value for {@link #flags}: this is false if the application has set
+ * its android:killAfterRestore to false, true otherwise.
+ *
+ * <p>If android:allowBackup is set to false or no android:backupAgent
+ * is specified, this flag will be ignored.
+ *
+ * {@hide}
+ */
+ public static final int FLAG_KILL_AFTER_RESTORE = 1<<15;
+
+ /**
+ * Value for {@link #flags}: this is true if the application has set
+ * its android:restoreNeedsApplication to true, false otherwise.
+ *
+ * <p>If android:allowBackup is set to false or no android:backupAgent
+ * is specified, this flag will be ignored.
+ *
+ * {@hide}
+ */
+ public static final int FLAG_RESTORE_NEEDS_APPLICATION = 1<<16;
+
/**
* Flags associated with the application. Any combination of
* {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
@@ -193,7 +215,8 @@
* {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
* {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
* {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
- * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_RESIZEABLE_FOR_SCREENS}.
+ * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_RESIZEABLE_FOR_SCREENS},
+ * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}.
*/
public int flags = 0;
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 4399df4..b4a6fee 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1296,12 +1296,26 @@
com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
if (allowBackup) {
ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
+
+ // backupAgent, killAfterRestore, and restoreNeedsApplication are only relevant
+ // if backup is possible for the given application.
String backupAgent = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestApplication_backupAgent);
if (backupAgent != null) {
ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
+ " from " + pkgName + "+" + backupAgent);
+
+ if (sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
+ true)) {
+ ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
+ }
+ if (sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestApplication_restoreNeedsApplication,
+ false)) {
+ ai.flags |= ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION;
+ }
}
}
diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java
index 342de2b..f5f8f30 100644
--- a/core/java/android/content/pm/RegisteredServicesCache.java
+++ b/core/java/android/content/pm/RegisteredServicesCache.java
@@ -54,7 +54,7 @@
private final String mAttributesName;
// no need to be synchronized since the map is never changed once mService is written
- private volatile Map<V, ServiceInfo<V>> mServices;
+ volatile Map<V, ServiceInfo<V>> mServices;
// synchronized on "this"
private BroadcastReceiver mReceiver = null;
@@ -81,6 +81,7 @@
if (mReceiver == null) {
synchronized (this) {
mReceiver = new BroadcastReceiver() {
+ @Override
public void onReceive(Context context, Intent intent) {
mServices = generateServicesMap();
}
@@ -91,6 +92,7 @@
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ intentFilter.addDataScheme("package");
mContext.registerReceiver(mReceiver, intentFilter);
return true;
}
@@ -122,6 +124,7 @@
this.uid = uid;
}
+ @Override
public String toString() {
return "ServiceInfo: " + type + ", " + componentName;
}
@@ -159,6 +162,7 @@
maybeUnregisterForPackageChanges();
}
+ @Override
protected void finalize() throws Throwable {
synchronized (this) {
if (mReceiver != null) {
@@ -169,7 +173,7 @@
super.finalize();
}
- private Map<V, ServiceInfo<V>> generateServicesMap() {
+ Map<V, ServiceInfo<V>> generateServicesMap() {
Map<V, ServiceInfo<V>> services = Maps.newHashMap();
PackageManager pm = mContext.getPackageManager();
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index 5d7af69d..57bf3f7 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -62,53 +62,53 @@
*/
public enum ConflictAlgorithm {
/**
- * When a constraint violation occurs, an immediate ROLLBACK occurs,
- * thus ending the current transaction, and the command aborts with a
- * return code of SQLITE_CONSTRAINT. If no transaction is active
+ * When a constraint violation occurs, an immediate ROLLBACK occurs,
+ * thus ending the current transaction, and the command aborts with a
+ * return code of SQLITE_CONSTRAINT. If no transaction is active
* (other than the implied transaction that is created on every command)
* then this algorithm works the same as ABORT.
*/
ROLLBACK("ROLLBACK"),
-
+
/**
- * When a constraint violation occurs,no ROLLBACK is executed
- * so changes from prior commands within the same transaction
+ * When a constraint violation occurs,no ROLLBACK is executed
+ * so changes from prior commands within the same transaction
* are preserved. This is the default behavior.
*/
ABORT("ABORT"),
-
+
/**
- * When a constraint violation occurs, the command aborts with a return
- * code SQLITE_CONSTRAINT. But any changes to the database that
- * the command made prior to encountering the constraint violation
+ * When a constraint violation occurs, the command aborts with a return
+ * code SQLITE_CONSTRAINT. But any changes to the database that
+ * the command made prior to encountering the constraint violation
* are preserved and are not backed out.
*/
FAIL("FAIL"),
-
+
/**
- * When a constraint violation occurs, the one row that contains
- * the constraint violation is not inserted or changed.
- * But the command continues executing normally. Other rows before and
- * after the row that contained the constraint violation continue to be
+ * When a constraint violation occurs, the one row that contains
+ * the constraint violation is not inserted or changed.
+ * But the command continues executing normally. Other rows before and
+ * after the row that contained the constraint violation continue to be
* inserted or updated normally. No error is returned.
*/
IGNORE("IGNORE"),
-
+
/**
* When a UNIQUE constraint violation occurs, the pre-existing rows that
- * are causing the constraint violation are removed prior to inserting
+ * are causing the constraint violation are removed prior to inserting
* or updating the current row. Thus the insert or update always occurs.
- * The command continues executing normally. No error is returned.
+ * The command continues executing normally. No error is returned.
* If a NOT NULL constraint violation occurs, the NULL value is replaced
- * by the default value for that column. If the column has no default
- * value, then the ABORT algorithm is used. If a CHECK constraint
- * violation occurs then the IGNORE algorithm is used. When this conflict
- * resolution strategy deletes rows in order to satisfy a constraint,
+ * by the default value for that column. If the column has no default
+ * value, then the ABORT algorithm is used. If a CHECK constraint
+ * violation occurs then the IGNORE algorithm is used. When this conflict
+ * resolution strategy deletes rows in order to satisfy a constraint,
* it does not invoke delete triggers on those rows.
* This behavior might change in a future release.
*/
REPLACE("REPLACE");
-
+
private final String mValue;
ConflictAlgorithm(String value) {
mValue = value;
@@ -117,7 +117,7 @@
return mValue;
}
}
-
+
/**
* Maximum Length Of A LIKE Or GLOB Pattern
* The pattern matching algorithm used in the default LIKE and GLOB implementation
@@ -180,17 +180,19 @@
private long mLockAcquiredWallTime = 0L;
private long mLockAcquiredThreadTime = 0L;
-
+
// limit the frequency of complaints about each database to one within 20 sec
- // unless run command adb shell setprop log.tag.Database VERBOSE
+ // unless run command adb shell setprop log.tag.Database VERBOSE
private static final int LOCK_WARNING_WINDOW_IN_MS = 20000;
/** If the lock is held this long then a warning will be printed when it is released. */
private static final int LOCK_ACQUIRED_WARNING_TIME_IN_MS = 300;
private static final int LOCK_ACQUIRED_WARNING_THREAD_TIME_IN_MS = 100;
private static final int LOCK_ACQUIRED_WARNING_TIME_IN_MS_ALWAYS_PRINT = 2000;
+ private static final int SLEEP_AFTER_YIELD_QUANTUM = 500;
+
private long mLastLockMessageTime = 0L;
-
+
/** Used by native code, do not rename */
/* package */ int mNativeHandle = 0;
@@ -205,15 +207,15 @@
/** The optional factory to use when creating new Cursors */
private CursorFactory mFactory;
-
+
private WeakHashMap<SQLiteClosable, Object> mPrograms;
-
+
private final RuntimeException mLeakedException;
// package visible, since callers will access directly to minimize overhead in the case
// that logging is not enabled.
/* package */ final boolean mLogStats;
-
+
/**
* @param closable
*/
@@ -225,7 +227,7 @@
unlock();
}
}
-
+
void removeSQLiteClosable(SQLiteClosable closable) {
lock();
try {
@@ -233,8 +235,8 @@
} finally {
unlock();
}
- }
-
+ }
+
@Override
protected void onAllReferencesReleased() {
if (isOpen()) {
@@ -245,10 +247,10 @@
/**
* Attempts to release memory that SQLite holds but does not require to
* operate properly. Typically this memory will come from the page cache.
- *
+ *
* @return the number of bytes actually released
*/
- static public native int releaseMemory();
+ static public native int releaseMemory();
/**
* Control whether or not the SQLiteDatabase is made thread-safe by using locks
@@ -284,7 +286,7 @@
* touch the native sqlite3* object since it is single threaded and uses
* a polling lock contention algorithm. The lock is recursive, and may be acquired
* multiple times by the same thread. This is a no-op if mLockingEnabled is false.
- *
+ *
* @see #unlock()
*/
/* package */ void lock() {
@@ -320,7 +322,7 @@
/**
* Releases the database lock. This is a no-op if mLockingEnabled is false.
- *
+ *
* @see #unlock()
*/
/* package */ void unlock() {
@@ -350,7 +352,7 @@
private void checkLockHoldTime() {
// Use elapsed real-time since the CPU may sleep when waiting for IO
long elapsedTime = SystemClock.elapsedRealtime();
- long lockedTime = elapsedTime - mLockAcquiredWallTime;
+ long lockedTime = elapsedTime - mLockAcquiredWallTime;
if (lockedTime < LOCK_ACQUIRED_WARNING_TIME_IN_MS_ALWAYS_PRINT &&
!Log.isLoggable(TAG, Log.VERBOSE) &&
(elapsedTime - mLastLockMessageTime) < LOCK_WARNING_WINDOW_IN_MS) {
@@ -567,10 +569,21 @@
}
}
if (sleepAfterYieldDelay > 0) {
- try {
- Thread.sleep(sleepAfterYieldDelay);
- } catch (InterruptedException e) {
- Thread.interrupted();
+ // Sleep for up to sleepAfterYieldDelay milliseconds, waking up periodically to
+ // check if anyone is using the database. If the database is not contended,
+ // retake the lock and return.
+ long remainingDelay = sleepAfterYieldDelay;
+ while (remainingDelay > 0) {
+ try {
+ Thread.sleep(remainingDelay < SLEEP_AFTER_YIELD_QUANTUM ?
+ remainingDelay : SLEEP_AFTER_YIELD_QUANTUM);
+ } catch (InterruptedException e) {
+ Thread.interrupted();
+ }
+ remainingDelay -= SLEEP_AFTER_YIELD_QUANTUM;
+ if (mLock.getQueueLength() == 0) {
+ break;
+ }
}
}
beginTransaction();
@@ -720,9 +733,9 @@
if (program != null) {
program.onAllReferencesReleasedFromContainer();
}
- }
+ }
}
-
+
/**
* Native call to close the database.
*/
@@ -1157,8 +1170,8 @@
/**
* Runs the provided SQL and returns a cursor over the result set.
- * The cursor will read an initial set of rows and the return to the caller.
- * It will continue to read in batches and send data changed notifications
+ * The cursor will read an initial set of rows and the return to the caller.
+ * It will continue to read in batches and send data changed notifications
* when the later batches are ready.
* @param sql the SQL query. The SQL string must not be ; terminated
* @param selectionArgs You may include ?s in where clause in the query,
@@ -1167,19 +1180,19 @@
* @param initialRead set the initial count of items to read from the cursor
* @param maxRead set the count of items to read on each iteration after the first
* @return A {@link Cursor} object, which is positioned before the first entry
- *
+ *
* This work is incomplete and not fully tested or reviewed, so currently
* hidden.
* @hide
*/
- public Cursor rawQuery(String sql, String[] selectionArgs,
+ public Cursor rawQuery(String sql, String[] selectionArgs,
int initialRead, int maxRead) {
SQLiteCursor c = (SQLiteCursor)rawQueryWithFactory(
null, sql, selectionArgs, null);
c.setLoadStyle(initialRead, maxRead);
return c;
}
-
+
/**
* Convenience method for inserting a row into the database.
*
@@ -1232,7 +1245,7 @@
*/
public long replace(String table, String nullColumnHack, ContentValues initialValues) {
try {
- return insertWithOnConflict(table, nullColumnHack, initialValues,
+ return insertWithOnConflict(table, nullColumnHack, initialValues,
ConflictAlgorithm.REPLACE);
} catch (SQLException e) {
Log.e(TAG, "Error inserting " + initialValues, e);
@@ -1254,7 +1267,7 @@
*/
public long replaceOrThrow(String table, String nullColumnHack,
ContentValues initialValues) throws SQLException {
- return insertWithOnConflict(table, nullColumnHack, initialValues,
+ return insertWithOnConflict(table, nullColumnHack, initialValues,
ConflictAlgorithm.REPLACE);
}
@@ -1410,7 +1423,7 @@
public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {
return updateWithOnConflict(table, values, whereClause, whereArgs, null);
}
-
+
/**
* Convenience method for updating rows in the database.
*
@@ -1423,7 +1436,7 @@
* @return the number of rows affected
* @hide
*/
- public int updateWithOnConflict(String table, ContentValues values,
+ public int updateWithOnConflict(String table, ContentValues values,
String whereClause, String[] whereArgs, ConflictAlgorithm algorithm) {
if (!isOpen()) {
throw new IllegalStateException("database not open");
@@ -1440,7 +1453,7 @@
sql.append(algorithm.value());
sql.append(" ");
}
-
+
sql.append(table);
sql.append(" SET ");
@@ -1601,7 +1614,7 @@
mFlags = flags;
mPath = path;
mLogStats = "1".equals(android.os.SystemProperties.get("db.logstats"));
-
+
mLeakedException = new IllegalStateException(path +
" SQLiteDatabase created and never closed");
mFactory = factory;
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index aa3b852..38c9dbc 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -17,7 +17,9 @@
package android.hardware;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.StringTokenizer;
import java.io.IOException;
@@ -38,7 +40,7 @@
*/
public class Camera {
private static final String TAG = "Camera";
-
+
// These match the enums in frameworks/base/include/ui/Camera.h
private static final int CAMERA_MSG_ERROR = 0x001;
private static final int CAMERA_MSG_SHUTTER = 0x002;
@@ -62,12 +64,12 @@
private ZoomCallback mZoomCallback;
private ErrorCallback mErrorCallback;
private boolean mOneShot;
-
+
/**
* Returns a new Camera object.
*/
- public static Camera open() {
- return new Camera();
+ public static Camera open() {
+ return new Camera();
}
Camera() {
@@ -89,32 +91,32 @@
native_setup(new WeakReference<Camera>(this));
}
-
- protected void finalize() {
- native_release();
+
+ protected void finalize() {
+ native_release();
}
-
+
private native final void native_setup(Object camera_this);
private native final void native_release();
-
+
/**
* Disconnects and releases the Camera object resources.
- * <p>It is recommended that you call this as soon as you're done with the
+ * <p>It is recommended that you call this as soon as you're done with the
* Camera object.</p>
*/
- public final void release() {
+ public final void release() {
native_release();
}
/**
* Reconnect to the camera after passing it to MediaRecorder. To save
* setup/teardown time, a client of Camera can pass an initialized Camera
- * object to a MediaRecorder to use for video recording. Once the
+ * object to a MediaRecorder to use for video recording. Once the
* MediaRecorder is done with the Camera, this method can be used to
* re-establish a connection with the camera hardware. NOTE: The Camera
* object must first be unlocked by the process that owns it before it
- * can be connected to another proces.
+ * can be connected to another process.
*
* @throws IOException if the method fails.
*
@@ -122,7 +124,7 @@
* @hide
*/
public native final void reconnect() throws IOException;
-
+
/**
* Lock the camera to prevent other processes from accessing it. To save
* setup/teardown time, a client of Camera can pass an initialized Camera
@@ -137,9 +139,9 @@
* @hide
*/
public native final int lock();
-
+
/**
- * Unlock the camera to allow aother process to access it. To save
+ * Unlock the camera to allow another process to access it. To save
* setup/teardown time, a client of Camera can pass an initialized Camera
* object to another process. This method is used to unlock the Camera
* object before handing off the Camera object to the other process.
@@ -150,12 +152,12 @@
* @hide
*/
public native final int unlock();
-
+
/**
* Sets the SurfaceHolder to be used for a picture preview. If the surface
* changed since the last call, the screen will blank. Nothing happens
* if the same surface is re-set.
- *
+ *
* @param holder the SurfaceHolder upon which to place the picture preview
* @throws IOException if the method fails.
*/
@@ -177,23 +179,27 @@
/**
* The callback that delivers the preview frames.
*
- * @param data The contents of the preview frame in getPreviewFormat()
- * format.
+ * @param data The contents of the preview frame in {@link
+ * android.hardware.Camera.Parameters#getPreviewFormat()}
+ * format. If {@link
+ * android.hardware.Camera.Parameters#setPreviewFormat(int)}
+ * is never called, the default will be the YCbCr_420_SP
+ * (NV21) format.
* @param camera The Camera service object.
*/
void onPreviewFrame(byte[] data, Camera camera);
};
-
+
/**
* Start drawing preview frames to the surface.
*/
public native final void startPreview();
-
+
/**
* Stop drawing preview frames to the surface.
*/
public native final void stopPreview();
-
+
/**
* Return current preview state.
*
@@ -201,7 +207,7 @@
* @hide
*/
public native final boolean previewEnabled();
-
+
/**
* Can be called at any time to instruct the camera to use a callback for
* each preview frame in addition to displaying it.
@@ -260,7 +266,7 @@
mJpegCallback.onPictureTaken((byte[])msg.obj, mCamera);
}
return;
-
+
case CAMERA_MSG_PREVIEW_FRAME:
if (mPreviewCallback != null) {
mPreviewCallback.onPreviewFrame((byte[])msg.obj, mCamera);
@@ -321,8 +327,10 @@
public interface AutoFocusCallback
{
/**
- * Callback for the camera auto focus.
- *
+ * Callback for the camera auto focus. If the camera does not support
+ * auto-focus and autoFocus is called, onAutoFocus will be called
+ * immediately with success.
+ *
* @param success true if focus was successful, false if otherwise
* @param camera the Camera service object
*/
@@ -330,10 +338,12 @@
};
/**
- * Starts auto-focus function and registers a callback function to
- * run when camera is focused. Only valid after startPreview() has
- * been called.
- *
+ * Starts auto-focus function and registers a callback function to run when
+ * camera is focused. Only valid after startPreview() has been called. If
+ * the camera does not support auto-focus, it is a no-op and {@link
+ * AutoFocusCallback#onAutoFocus(boolean, Camera)} callback will be called
+ * immediately.
+ *
* @param cb the callback to run
*/
public final void autoFocus(AutoFocusCallback cb)
@@ -361,7 +371,7 @@
public interface PictureCallback {
/**
* Callback for when a picture is taken.
- *
+ *
* @param data a byte array of the picture data
* @param camera the Camera service object
*/
@@ -369,16 +379,16 @@
};
/**
- * Triggers an asynchronous image capture. The camera service
- * will initiate a series of callbacks to the application as the
- * image capture progresses. The shutter callback occurs after
- * the image is captured. This can be used to trigger a sound
- * to let the user know that image has been captured. The raw
- * callback occurs when the raw image data is available. The jpeg
- * callback occurs when the compressed image is available. If the
- * application does not need a particular callback, a null can be
- * passed instead of a callback method.
- *
+ * Triggers an asynchronous image capture. The camera service will initiate
+ * a series of callbacks to the application as the image capture progresses.
+ * The shutter callback occurs after the image is captured. This can be used
+ * to trigger a sound to let the user know that image has been captured. The
+ * raw callback occurs when the raw image data is available (NOTE: the data
+ * may be null if the hardware does not have enough memory to make a copy).
+ * The jpeg callback occurs when the compressed image is available. If the
+ * application does not need a particular callback, a null can be passed
+ * instead of a callback method.
+ *
* @param shutter callback after the image is captured, may be null
* @param raw callback with raw image data, may be null
* @param jpeg callback with jpeg image data, may be null
@@ -390,17 +400,17 @@
private native final void native_takePicture();
/**
- * Triggers an asynchronous image capture. The camera service
- * will initiate a series of callbacks to the application as the
- * image capture progresses. The shutter callback occurs after
- * the image is captured. This can be used to trigger a sound
- * to let the user know that image has been captured. The raw
- * callback occurs when the raw image data is available. The
- * postview callback occurs when a scaled, fully processed
- * postview image is available (NOTE: not all hardware supports
- * this). The jpeg callback occurs when the compressed image is
- * available. If the application does not need a particular
- * callback, a null can be passed instead of a callback method.
+ * Triggers an asynchronous image capture. The camera service will initiate
+ * a series of callbacks to the application as the image capture progresses.
+ * The shutter callback occurs after the image is captured. This can be used
+ * to trigger a sound to let the user know that image has been captured. The
+ * raw callback occurs when the raw image data is available (NOTE: the data
+ * may be null if the hardware does not have enough memory to make a copy).
+ * The postview callback occurs when a scaled, fully processed postview
+ * image is available (NOTE: not all hardware supports this). The jpeg
+ * callback occurs when the compressed image is available. If the
+ * application does not need a particular callback, a null can be passed
+ * instead of a callback method.
*
* @param shutter callback after the image is captured, may be null
* @param raw callback with raw image data, may be null
@@ -441,14 +451,14 @@
{
mZoomCallback = cb;
}
-
+
// These match the enum in include/ui/Camera.h
/** Unspecified camerar error. @see #ErrorCallback */
public static final int CAMERA_ERROR_UNKNOWN = 1;
/** Media server died. In this case, the application must release the
* Camera object and instantiate a new one. @see #ErrorCallback */
public static final int CAMERA_ERROR_SERVER_DIED = 100;
-
+
/**
* Handles the camera error callback.
*/
@@ -474,13 +484,13 @@
{
mErrorCallback = cb;
}
-
+
private native final void native_setParameters(String params);
private native final String native_getParameters();
/**
* Sets the Parameters for pictures from this Camera service.
- *
+ *
* @param params the Parameters to use for this Camera service
*/
public void setParameters(Parameters params) {
@@ -503,7 +513,7 @@
public class Size {
/**
* Sets the dimensions for pictures.
- *
+ *
* @param w the photo width (pixels)
* @param h the photo height (pixels)
*/
@@ -519,8 +529,111 @@
/**
* Handles the parameters for pictures created by a Camera service.
+ *
+ * <p>To make camera parameters take effect, applications have to call
+ * Camera.setParameters. For example, after setWhiteBalance is called, white
+ * balance is not changed until Camera.setParameters() is called.
+ *
+ * <p>Different devices may have different camera capabilities, such as
+ * picture size or flash modes. The application should query the camera
+ * capabilities before setting parameters. For example, the application
+ * should call getSupportedColorEffects before calling setEffect. If the
+ * camera does not support color effects, getSupportedColorEffects will
+ * return null.
*/
public class Parameters {
+ // Parameter keys to communicate with the camera driver.
+ private static final String KEY_PREVIEW_SIZE = "preview-size";
+ private static final String KEY_PREVIEW_FORMAT = "preview-format";
+ private static final String KEY_PREVIEW_FRAME_RATE = "preview-frame-rate";
+ private static final String KEY_PICTURE_SIZE = "picture-size";
+ private static final String KEY_PICTURE_FORMAT = "picture-format";
+ private static final String KEY_JPEG_THUMBNAIL_WIDTH = "jpeg-thumbnail-width";
+ private static final String KEY_JPEG_THUMBNAIL_HEIGHT = "jpeg-thumbnail-height";
+ private static final String KEY_JPEG_THUMBNAIL_QUALITY = "jpeg-thumbnail-quality";
+ private static final String KEY_JPEG_QUALITY = "jpeg-quality";
+ private static final String KEY_ROTATION = "rotation";
+ private static final String KEY_GPS_LATITUDE = "gps-latitude";
+ private static final String KEY_GPS_LONGITUDE = "gps-longitude";
+ private static final String KEY_GPS_ALTITUDE = "gps-altitude";
+ private static final String KEY_GPS_TIMESTAMP = "gps-timestamp";
+ private static final String KEY_WHITE_BALANCE = "whitebalance";
+ private static final String KEY_EFFECT = "effect";
+ private static final String KEY_ANTIBANDING = "antibanding";
+ private static final String KEY_SCENE_MODE = "scene-mode";
+ private static final String KEY_FLASH_MODE = "flash-mode";
+ // Parameter key suffix for supported values.
+ private static final String SUPPORTED_VALUES_SUFFIX = "-values";
+
+ // Values for white balance settings.
+ public static final String WHITE_BALANCE_AUTO = "auto";
+ public static final String WHITE_BALANCE_INCANDESCENT = "incandescent";
+ public static final String WHITE_BALANCE_FLUORESCENT = "fluorescent";
+ public static final String WHITE_BALANCE_WARM_FLUORESCENT = "warm-fluorescent";
+ public static final String WHITE_BALANCE_DAYLIGHT = "daylight";
+ public static final String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight";
+ public static final String WHITE_BALANCE_TWILIGHT = "twilight";
+ public static final String WHITE_BALANCE_SHADE = "shade";
+
+ // Values for color effect settings.
+ public static final String EFFECT_NONE = "none";
+ public static final String EFFECT_MONO = "mono";
+ public static final String EFFECT_NEGATIVE = "negative";
+ public static final String EFFECT_SOLARIZE = "solarize";
+ public static final String EFFECT_SEPIA = "sepia";
+ public static final String EFFECT_POSTERIZE = "posterize";
+ public static final String EFFECT_WHITEBOARD = "whiteboard";
+ public static final String EFFECT_BLACKBOARD = "blackboard";
+ public static final String EFFECT_AQUA = "aqua";
+
+ // Values for antibanding settings.
+ public static final String ANTIBANDING_AUTO = "auto";
+ public static final String ANTIBANDING_50HZ = "50hz";
+ public static final String ANTIBANDING_60HZ = "60hz";
+ public static final String ANTIBANDING_OFF = "off";
+
+ // Values for flash mode settings.
+ /**
+ * Flash will not be fired.
+ */
+ public static final String FLASH_MODE_OFF = "off";
+ /**
+ * Flash will be fired automatically when required. The timing is
+ * decided by camera driver.
+ */
+ public static final String FLASH_MODE_AUTO = "auto";
+ /**
+ * Flash will always be fired. The timing is decided by camera driver.
+ */
+ public static final String FLASH_MODE_ON = "on";
+ /**
+ * Flash will be fired in red-eye reduction mode.
+ */
+ public static final String FLASH_MODE_RED_EYE = "red-eye";
+
+ // Values for scene mode settings.
+ public static final String SCENE_MODE_AUTO = "auto";
+ public static final String SCENE_MODE_ACTION = "action";
+ public static final String SCENE_MODE_PORTRAIT = "portrait";
+ public static final String SCENE_MODE_LANDSCAPE = "landscape";
+ public static final String SCENE_MODE_NIGHT = "night";
+ public static final String SCENE_MODE_NIGHT_PORTRAIT = "night-portrait";
+ public static final String SCENE_MODE_THEATRE = "theatre";
+ public static final String SCENE_MODE_BEACH = "beach";
+ public static final String SCENE_MODE_SNOW = "snow";
+ public static final String SCENE_MODE_SUNSET = "sunset";
+ public static final String SCENE_MODE_STEADYPHOTO = "steadyphoto";
+ public static final String SCENE_MODE_FIREWORKS = "fireworks";
+ public static final String SCENE_MODE_SPORTS = "sports";
+ public static final String SCENE_MODE_PARTY = "party";
+ public static final String SCENE_MODE_CANDLELIGHT = "candlelight";
+
+ // Formats for setPreviewFormat and setPictureFormat.
+ private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp";
+ private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp";
+ private static final String PIXEL_FORMAT_RGB565 = "rgb565";
+ private static final String PIXEL_FORMAT_JPEG = "jpeg";
+
private HashMap<String, String> mMap;
private Parameters() {
@@ -543,7 +656,7 @@
* Creates a single string with all the parameters set in
* this Parameters object.
* <p>The {@link #unflatten(String)} method does the reverse.</p>
- *
+ *
* @return a String with all values from this Parameters object, in
* semi-colon delimited key-value pairs
*/
@@ -561,16 +674,16 @@
}
/**
- * Takes a flattened string of parameters and adds each one to
+ * Takes a flattened string of parameters and adds each one to
* this Parameters object.
* <p>The {@link #flatten()} method does the reverse.</p>
- *
- * @param flattened a String of parameters (key-value paired) that
+ *
+ * @param flattened a String of parameters (key-value paired) that
* are semi-colon delimited
*/
public void unflatten(String flattened) {
mMap.clear();
-
+
StringTokenizer tokenizer = new StringTokenizer(flattened, ";");
while (tokenizer.hasMoreElements()) {
String kv = tokenizer.nextToken();
@@ -583,14 +696,14 @@
mMap.put(k, v);
}
}
-
+
public void remove(String key) {
mMap.remove(key);
}
/**
* Sets a String parameter.
- *
+ *
* @param key the key name for the parameter
* @param value the String value of the parameter
*/
@@ -609,7 +722,7 @@
/**
* Sets an integer parameter.
- *
+ *
* @param key the key name for the parameter
* @param value the int value of the parameter
*/
@@ -619,7 +732,7 @@
/**
* Returns the value of a String parameter.
- *
+ *
* @param key the key name for the parameter
* @return the String value of the parameter
*/
@@ -629,7 +742,7 @@
/**
* Returns the value of an integer parameter.
- *
+ *
* @param key the key name for the parameter
* @return the int value of the parameter
*/
@@ -639,110 +752,133 @@
/**
* Sets the dimensions for preview pictures.
- *
+ *
* @param width the width of the pictures, in pixels
* @param height the height of the pictures, in pixels
*/
public void setPreviewSize(int width, int height) {
String v = Integer.toString(width) + "x" + Integer.toString(height);
- set("preview-size", v);
+ set(KEY_PREVIEW_SIZE, v);
}
/**
* Returns the dimensions setting for preview pictures.
- *
- * @return a Size object with the height and width setting
+ *
+ * @return a Size object with the height and width setting
* for the preview picture
*/
public Size getPreviewSize() {
- String pair = get("preview-size");
- if (pair == null)
- return null;
- String[] dims = pair.split("x");
- if (dims.length != 2)
- return null;
-
- return new Size(Integer.parseInt(dims[0]),
- Integer.parseInt(dims[1]));
-
+ String pair = get(KEY_PREVIEW_SIZE);
+ return strToSize(pair);
}
/**
- * Sets the dimensions for EXIF thumbnails.
- *
+ * Gets the supported preview sizes.
+ *
+ * @return a List of Size object. null if preview size setting is not
+ * supported.
+ */
+ public List<Size> getSupportedPreviewSizes() {
+ String str = get(KEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX);
+ return splitSize(str);
+ }
+
+ /**
+ * Sets the dimensions for EXIF thumbnail in Jpeg picture.
+ *
* @param width the width of the thumbnail, in pixels
* @param height the height of the thumbnail, in pixels
- *
- * FIXME: unhide before release
- * @hide
*/
- public void setThumbnailSize(int width, int height) {
- set("jpeg-thumbnail-width", width);
- set("jpeg-thumbnail-height", height);
+ public void setJpegThumbnailSize(int width, int height) {
+ set(KEY_JPEG_THUMBNAIL_WIDTH, width);
+ set(KEY_JPEG_THUMBNAIL_HEIGHT, height);
}
/**
- * Returns the dimensions for EXIF thumbnail
- *
- * @return a Size object with the height and width setting
- * for the EXIF thumbnails
+ * Returns the dimensions for EXIF thumbnail in Jpeg picture.
*
- * FIXME: unhide before release
- * @hide
+ * @return a Size object with the height and width setting for the EXIF
+ * thumbnails
*/
- public Size getThumbnailSize() {
- return new Size(getInt("jpeg-thumbnail-width"),
- getInt("jpeg-thumbnail-height"));
+ public Size getJpegThumbnailSize() {
+ return new Size(getInt(KEY_JPEG_THUMBNAIL_WIDTH),
+ getInt(KEY_JPEG_THUMBNAIL_HEIGHT));
}
/**
- * Sets the quality of the EXIF thumbnail
- *
- * @param quality the JPEG quality of the EXIT thumbnail
+ * Sets the quality of the EXIF thumbnail in Jpeg picture.
*
- * FIXME: unhide before release
- * @hide
+ * @param quality the JPEG quality of the EXIF thumbnail. The range is 1
+ * to 100, with 100 being the best.
*/
- public void setThumbnailQuality(int quality) {
- set("jpeg-thumbnail-quality", quality);
+ public void setJpegThumbnailQuality(int quality) {
+ set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
}
/**
- * Returns the quality setting for the EXIF thumbnail
- *
- * @return the JPEG quality setting of the EXIF thumbnail
+ * Returns the quality setting for the EXIF thumbnail in Jpeg picture.
*
- * FIXME: unhide before release
- * @hide
+ * @return the JPEG quality setting of the EXIF thumbnail.
*/
- public int getThumbnailQuality() {
- return getInt("jpeg-thumbnail-quality");
+ public int getJpegThumbnailQuality() {
+ return getInt(KEY_JPEG_THUMBNAIL_QUALITY);
+ }
+
+ /**
+ * Sets Jpeg quality of captured picture.
+ *
+ * @param quality the JPEG quality of captured picture. The range is 1
+ * to 100, with 100 being the best.
+ */
+ public void setJpegQuality(int quality) {
+ set(KEY_JPEG_QUALITY, quality);
+ }
+
+ /**
+ * Returns the quality setting for the JPEG picture.
+ *
+ * @return the JPEG picture quality setting.
+ */
+ public int getJpegQuality() {
+ return getInt(KEY_JPEG_QUALITY);
}
/**
* Sets the rate at which preview frames are received.
- *
+ *
* @param fps the frame rate (frames per second)
*/
public void setPreviewFrameRate(int fps) {
- set("preview-frame-rate", fps);
+ set(KEY_PREVIEW_FRAME_RATE, fps);
}
/**
* Returns the setting for the rate at which preview frames
* are received.
- *
+ *
* @return the frame rate setting (frames per second)
*/
public int getPreviewFrameRate() {
- return getInt("preview-frame-rate");
+ return getInt(KEY_PREVIEW_FRAME_RATE);
}
/**
- * Sets the image format for preview pictures.
- *
- * @param pixel_format the desired preview picture format
- * (<var>PixelFormat.YCbCr_420_SP</var>,
+ * Gets the supported preview frame rates.
+ *
+ * @return a List of Integer objects (preview frame rates). null if
+ * preview frame rate setting is not supported.
+ */
+ public List<Integer> getSupportedPreviewFrameRates() {
+ String str = get(KEY_PREVIEW_FRAME_RATE + SUPPORTED_VALUES_SUFFIX);
+ return splitInt(str);
+ }
+
+ /**
+ * Sets the image format for preview pictures. If this is never called,
+ * the default will be the YCbCr_420_SP (NV21) format.
+ *
+ * @param pixel_format the desired preview picture format
+ * (<var>PixelFormat.YCbCr_420_SP (NV21)</var>,
* <var>PixelFormat.RGB_565</var>, or
* <var>PixelFormat.JPEG</var>)
* @see android.graphics.PixelFormat
@@ -750,56 +886,73 @@
public void setPreviewFormat(int pixel_format) {
String s = cameraFormatForPixelFormat(pixel_format);
if (s == null) {
- throw new IllegalArgumentException();
+ throw new IllegalArgumentException(
+ "Invalid pixel_format=" + pixel_format);
}
- set("preview-format", s);
+ set(KEY_PREVIEW_FORMAT, s);
}
/**
- * Returns the image format for preview pictures.
- *
+ * Returns the image format for preview pictures got from
+ * {@link PreviewCallback}.
+ *
* @return the PixelFormat int representing the preview picture format
+ * @see android.graphics.PixelFormat
*/
public int getPreviewFormat() {
- return pixelFormatForCameraFormat(get("preview-format"));
+ return pixelFormatForCameraFormat(get(KEY_PREVIEW_FORMAT));
+ }
+
+ /**
+ * Gets the supported preview formats.
+ *
+ * @return a List of Integer objects. null if preview format setting is
+ * not supported.
+ */
+ public List<Integer> getSupportedPreviewFormats() {
+ String str = get(KEY_PREVIEW_FORMAT + SUPPORTED_VALUES_SUFFIX);
+ return splitInt(str);
}
/**
* Sets the dimensions for pictures.
- *
+ *
* @param width the width for pictures, in pixels
* @param height the height for pictures, in pixels
*/
public void setPictureSize(int width, int height) {
String v = Integer.toString(width) + "x" + Integer.toString(height);
- set("picture-size", v);
+ set(KEY_PICTURE_SIZE, v);
}
/**
* Returns the dimension setting for pictures.
- *
- * @return a Size object with the height and width setting
+ *
+ * @return a Size object with the height and width setting
* for pictures
*/
public Size getPictureSize() {
- String pair = get("picture-size");
- if (pair == null)
- return null;
- String[] dims = pair.split("x");
- if (dims.length != 2)
- return null;
+ String pair = get(KEY_PICTURE_SIZE);
+ return strToSize(pair);
+ }
- return new Size(Integer.parseInt(dims[0]),
- Integer.parseInt(dims[1]));
-
+ /**
+ * Gets the supported picture sizes.
+ *
+ * @return a List of Size objects. null if picture size setting is not
+ * supported.
+ */
+ public List<Size> getSupportedPictureSizes() {
+ String str = get(KEY_PICTURE_SIZE + SUPPORTED_VALUES_SUFFIX);
+ return splitSize(str);
}
/**
* Sets the image format for pictures.
- *
- * @param pixel_format the desired picture format
- * (<var>PixelFormat.YCbCr_420_SP</var>,
+ *
+ * @param pixel_format the desired picture format
+ * (<var>PixelFormat.YCbCr_420_SP (NV21)</var>,
* <var>PixelFormat.RGB_565</var>, or
* <var>PixelFormat.JPEG</var>)
* @see android.graphics.PixelFormat
@@ -807,27 +960,39 @@
public void setPictureFormat(int pixel_format) {
String s = cameraFormatForPixelFormat(pixel_format);
if (s == null) {
- throw new IllegalArgumentException();
+ throw new IllegalArgumentException(
+ "Invalid pixel_format=" + pixel_format);
}
- set("picture-format", s);
+ set(KEY_PICTURE_FORMAT, s);
}
/**
* Returns the image format for pictures.
- *
+ *
* @return the PixelFormat int representing the picture format
*/
public int getPictureFormat() {
- return pixelFormatForCameraFormat(get("picture-format"));
+ return pixelFormatForCameraFormat(get(KEY_PICTURE_FORMAT));
+ }
+
+ /**
+ * Gets the supported picture formats.
+ *
+ * @return a List of Integer objects (values are PixelFormat.XXX). null
+ * if picture setting is not supported.
+ */
+ public List<Integer> getSupportedPictureFormats() {
+ String str = get(KEY_PICTURE_SIZE + SUPPORTED_VALUES_SUFFIX);
+ return splitInt(str);
}
private String cameraFormatForPixelFormat(int pixel_format) {
switch(pixel_format) {
- case PixelFormat.YCbCr_422_SP: return "yuv422sp";
- case PixelFormat.YCbCr_420_SP: return "yuv420sp";
- case PixelFormat.RGB_565: return "rgb565";
- case PixelFormat.JPEG: return "jpeg";
+ case PixelFormat.YCbCr_422_SP: return PIXEL_FORMAT_YUV422SP;
+ case PixelFormat.YCbCr_420_SP: return PIXEL_FORMAT_YUV420SP;
+ case PixelFormat.RGB_565: return PIXEL_FORMAT_RGB565;
+ case PixelFormat.JPEG: return PIXEL_FORMAT_JPEG;
default: return null;
}
}
@@ -836,21 +1001,309 @@
if (format == null)
return PixelFormat.UNKNOWN;
- if (format.equals("yuv422sp"))
+ if (format.equals(PIXEL_FORMAT_YUV422SP))
return PixelFormat.YCbCr_422_SP;
- if (format.equals("yuv420sp"))
+ if (format.equals(PIXEL_FORMAT_YUV420SP))
return PixelFormat.YCbCr_420_SP;
- if (format.equals("rgb565"))
+ if (format.equals(PIXEL_FORMAT_RGB565))
return PixelFormat.RGB_565;
- if (format.equals("jpeg"))
+ if (format.equals(PIXEL_FORMAT_JPEG))
return PixelFormat.JPEG;
return PixelFormat.UNKNOWN;
}
+ /**
+ * Sets the orientation of the device in degrees, which instructs the
+ * camera driver to rotate the picture and thumbnail, in order to match
+ * what the user sees from the viewfinder. For example, suppose the
+ * natural position of the device is landscape. If the user takes a
+ * picture in landscape mode in 2048x1536 resolution, the rotation
+ * should be set to 0. If the user rotates the phone 90 degrees
+ * clockwise, the rotation should be set to 90. Applications can use
+ * {@link android.view.OrientationEventListener} to set this parameter.
+ *
+ * Since the picture is rotated, the orientation in the EXIF header is
+ * missing or always 1 (row #0 is top and column #0 is left side).
+ *
+ * @param rotation The orientation of the device in degrees. Rotation
+ * can only be 0, 90, 180 or 270.
+ * @throws IllegalArgumentException if rotation value is invalid.
+ * @see android.view.OrientationEventListener
+ */
+ public void setRotation(int rotation) {
+ if (rotation == 0 || rotation == 90 || rotation == 180
+ || rotation == 270) {
+ set(KEY_ROTATION, Integer.toString(rotation));
+ } else {
+ throw new IllegalArgumentException(
+ "Invalid rotation=" + rotation);
+ }
+ }
+
+ /**
+ * Sets GPS latitude coordinate. This will be stored in JPEG EXIF
+ * header.
+ *
+ * @param latitude GPS latitude coordinate.
+ */
+ public void setGpsLatitude(double latitude) {
+ set(KEY_GPS_LATITUDE, Double.toString(latitude));
+ }
+
+ /**
+ * Sets GPS longitude coordinate. This will be stored in JPEG EXIF
+ * header.
+ *
+ * @param longitude GPS longitude coordinate.
+ */
+ public void setGpsLongitude(double longitude) {
+ set(KEY_GPS_LONGITUDE, Double.toString(longitude));
+ }
+
+ /**
+ * Sets GPS altitude. This will be stored in JPEG EXIF header.
+ *
+ * @param altitude GPS altitude in meters.
+ */
+ public void setGpsAltitude(double altitude) {
+ set(KEY_GPS_ALTITUDE, Double.toString(altitude));
+ }
+
+ /**
+ * Sets GPS timestamp. This will be stored in JPEG EXIF header.
+ *
+ * @param timestamp GPS timestamp (UTC in seconds since January 1,
+ * 1970).
+ */
+ public void setGpsTimestamp(long timestamp) {
+ set(KEY_GPS_TIMESTAMP, Long.toString(timestamp));
+ }
+
+ /**
+ * Removes GPS latitude, longitude, altitude, and timestamp from the
+ * parameters.
+ */
+ public void removeGpsData() {
+ remove(KEY_GPS_LATITUDE);
+ remove(KEY_GPS_LONGITUDE);
+ remove(KEY_GPS_ALTITUDE);
+ remove(KEY_GPS_TIMESTAMP);
+ }
+
+ /**
+ * Gets the current white balance setting.
+ *
+ * @return one of WHITE_BALANCE_XXX string constant. null if white
+ * balance setting is not supported.
+ */
+ public String getWhiteBalance() {
+ return get(KEY_WHITE_BALANCE);
+ }
+
+ /**
+ * Sets the white balance.
+ *
+ * @param value WHITE_BALANCE_XXX string constant.
+ */
+ public void setWhiteBalance(String value) {
+ set(KEY_WHITE_BALANCE, value);
+ }
+
+ /**
+ * Gets the supported white balance.
+ *
+ * @return a List of WHITE_BALANCE_XXX string constants. null if white
+ * balance setting is not supported.
+ */
+ public List<String> getSupportedWhiteBalance() {
+ String str = get(KEY_WHITE_BALANCE + SUPPORTED_VALUES_SUFFIX);
+ return split(str);
+ }
+
+ /**
+ * Gets the current color effect setting.
+ *
+ * @return one of EFFECT_XXX string constant. null if color effect
+ * setting is not supported.
+ */
+ public String getColorEffect() {
+ return get(KEY_EFFECT);
+ }
+
+ /**
+ * Sets the current color effect setting.
+ *
+ * @param value EFFECT_XXX string constants.
+ */
+ public void setColorEffect(String value) {
+ set(KEY_EFFECT, value);
+ }
+
+ /**
+ * Gets the supported color effects.
+ *
+ * @return a List of EFFECT_XXX string constants. null if color effect
+ * setting is not supported.
+ */
+ public List<String> getSupportedColorEffects() {
+ String str = get(KEY_EFFECT + SUPPORTED_VALUES_SUFFIX);
+ return split(str);
+ }
+
+
+ /**
+ * Gets the current antibanding setting.
+ *
+ * @return one of ANTIBANDING_XXX string constant. null if antibanding
+ * setting is not supported.
+ */
+ public String getAntibanding() {
+ return get(KEY_ANTIBANDING);
+ }
+
+ /**
+ * Sets the antibanding.
+ *
+ * @param antibanding ANTIBANDING_XXX string constant.
+ */
+ public void setAntibanding(String antibanding) {
+ set(KEY_ANTIBANDING, antibanding);
+ }
+
+ /**
+ * Gets the supported antibanding values.
+ *
+ * @return a List of ANTIBANDING_XXX string constants. null if
+ * antibanding setting is not supported.
+ */
+ public List<String> getSupportedAntibanding() {
+ String str = get(KEY_ANTIBANDING + SUPPORTED_VALUES_SUFFIX);
+ return split(str);
+ }
+
+ /**
+ * Gets the current scene mode setting.
+ *
+ * @return one of SCENE_MODE_XXX string constant. null if scene mode
+ * setting is not supported.
+ */
+ public String getSceneMode() {
+ return get(KEY_SCENE_MODE);
+ }
+
+ /**
+ * Sets the scene mode.
+ *
+ * @param value SCENE_MODE_XXX string constants.
+ */
+ public void setSceneMode(String value) {
+ set(KEY_SCENE_MODE, value);
+ }
+
+ /**
+ * Gets the supported scene modes.
+ *
+ * @return a List of SCENE_MODE_XXX string constant. null if scene mode
+ * setting is not supported.
+ */
+ public List<String> getSupportedSceneModes() {
+ String str = get(KEY_SCENE_MODE + SUPPORTED_VALUES_SUFFIX);
+ return split(str);
+ }
+
+ /**
+ * Gets the current flash mode setting.
+ *
+ * @return one of FLASH_MODE_XXX string constant. null if flash mode
+ * setting is not supported.
+ */
+ public String getFlashMode() {
+ return get(KEY_FLASH_MODE);
+ }
+
+ /**
+ * Sets the flash mode.
+ *
+ * @param value FLASH_MODE_XXX string constants.
+ */
+ public void setFlashMode(String value) {
+ set(KEY_FLASH_MODE, value);
+ }
+
+ /**
+ * Gets the supported flash modes.
+ *
+ * @return a List of FLASH_MODE_XXX string constants. null if flash mode
+ * setting is not supported.
+ */
+ public List<String> getSupportedFlashModes() {
+ String str = get(KEY_FLASH_MODE + SUPPORTED_VALUES_SUFFIX);
+ return split(str);
+ }
+
+ // Splits a comma delimited string to an ArrayList of String.
+ // Return null if the passing string is null or the size is 0.
+ private ArrayList<String> split(String str) {
+ if (str == null) return null;
+
+ // Use StringTokenizer because it is faster than split.
+ StringTokenizer tokenizer = new StringTokenizer(str, ",");
+ ArrayList<String> substrings = new ArrayList<String>();
+ while (tokenizer.hasMoreElements()) {
+ substrings.add(tokenizer.nextToken());
+ }
+ return substrings;
+ }
+
+ // Splits a comma delimited string to an ArrayList of Integer.
+ // Return null if the passing string is null or the size is 0.
+ private ArrayList<Integer> splitInt(String str) {
+ if (str == null) return null;
+
+ StringTokenizer tokenizer = new StringTokenizer(str, ",");
+ ArrayList<Integer> substrings = new ArrayList<Integer>();
+ while (tokenizer.hasMoreElements()) {
+ String token = tokenizer.nextToken();
+ substrings.add(Integer.parseInt(token));
+ }
+ if (substrings.size() == 0) return null;
+ return substrings;
+ }
+
+ // Splits a comma delimited string to an ArrayList of Size.
+ // Return null if the passing string is null or the size is 0.
+ private ArrayList<Size> splitSize(String str) {
+ if (str == null) return null;
+
+ StringTokenizer tokenizer = new StringTokenizer(str, ",");
+ ArrayList<Size> sizeList = new ArrayList<Size>();
+ while (tokenizer.hasMoreElements()) {
+ Size size = strToSize(tokenizer.nextToken());
+ if (size != null) sizeList.add(size);
+ }
+ if (sizeList.size() == 0) return null;
+ return sizeList;
+ }
+
+ // Parses a string (ex: "480x320") to Size object.
+ // Return null if the passing string is null.
+ private Size strToSize(String str) {
+ if (str == null) return null;
+
+ int pos = str.indexOf('x');
+ if (pos != -1) {
+ String width = str.substring(0, pos);
+ String height = str.substring(pos + 1);
+ return new Size(Integer.parseInt(width),
+ Integer.parseInt(height));
+ }
+ Log.e(TAG, "Invalid size parameter string=" + str);
+ return null;
+ }
};
}
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index b0fc78e..5352cf6 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -104,7 +104,7 @@
* This class is used to retrieved various statistics about the memory mappings for this
* process. The returns info broken down by dalvik, native, and other. All results are in kB.
*/
- public static class MemoryInfo {
+ public static class MemoryInfo implements Parcelable {
/** The proportional set size for dalvik. */
public int dalvikPss;
/** The private dirty pages used by dalvik. */
@@ -125,6 +125,50 @@
public int otherPrivateDirty;
/** The shared dirty pages used by everything else. */
public int otherSharedDirty;
+
+ public MemoryInfo() {
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(dalvikPss);
+ dest.writeInt(dalvikPrivateDirty);
+ dest.writeInt(dalvikSharedDirty);
+ dest.writeInt(nativePss);
+ dest.writeInt(nativePrivateDirty);
+ dest.writeInt(nativeSharedDirty);
+ dest.writeInt(otherPss);
+ dest.writeInt(otherPrivateDirty);
+ dest.writeInt(otherSharedDirty);
+ }
+
+ public void readFromParcel(Parcel source) {
+ dalvikPss = source.readInt();
+ dalvikPrivateDirty = source.readInt();
+ dalvikSharedDirty = source.readInt();
+ nativePss = source.readInt();
+ nativePrivateDirty = source.readInt();
+ nativeSharedDirty = source.readInt();
+ otherPss = source.readInt();
+ otherPrivateDirty = source.readInt();
+ otherSharedDirty = source.readInt();
+ }
+
+ public static final Creator<MemoryInfo> CREATOR = new Creator<MemoryInfo>() {
+ public MemoryInfo createFromParcel(Parcel source) {
+ return new MemoryInfo(source);
+ }
+ public MemoryInfo[] newArray(int size) {
+ return new MemoryInfo[size];
+ }
+ };
+
+ private MemoryInfo(Parcel source) {
+ readFromParcel(source);
+ }
}
@@ -556,6 +600,13 @@
public static native void getMemoryInfo(MemoryInfo memoryInfo);
/**
+ * Note: currently only works when the requested pid has the same UID
+ * as the caller.
+ * @hide
+ */
+ public static native void getMemoryInfo(int pid, MemoryInfo memoryInfo);
+
+ /**
* Establish an object allocation limit in the current thread. Useful
* for catching regressions in code that is expected to operate
* without causing any allocations.
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 980cff3..699ddb2 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -74,6 +74,12 @@
public static final int SHELL_UID = 2000;
/**
+ * Defines the UID/GID for the log group.
+ * @hide
+ */
+ public static final int LOG_UID = 1007;
+
+ /**
* Defines the UID/GID for the WIFI supplicant process.
* @hide
*/
diff --git a/core/java/android/pim/ContactsAsyncHelper.java b/core/java/android/pim/ContactsAsyncHelper.java
index 342d208..7c78a81 100644
--- a/core/java/android/pim/ContactsAsyncHelper.java
+++ b/core/java/android/pim/ContactsAsyncHelper.java
@@ -183,8 +183,14 @@
switch (msg.arg1) {
case EVENT_LOAD_IMAGE:
- InputStream inputStream = Contacts.openContactPhotoInputStream(
- args.context.getContentResolver(), args.uri);
+ InputStream inputStream = null;
+ try {
+ inputStream = Contacts.openContactPhotoInputStream(
+ args.context.getContentResolver(), args.uri);
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Error opening photo input stream", e);
+ }
+
if (inputStream != null) {
args.result = Drawable.createFromStream(inputStream, args.uri.toString());
diff --git a/core/java/android/provider/Checkin.java b/core/java/android/provider/Checkin.java
index 6b491ab..84753ee 100644
--- a/core/java/android/provider/Checkin.java
+++ b/core/java/android/provider/Checkin.java
@@ -59,6 +59,8 @@
/** Valid tag values. Extend as necessary for your needs. */
public enum Tag {
+ APANIC_CONSOLE,
+ APANIC_THREADS,
AUTOTEST_FAILURE,
AUTOTEST_SEQUENCE_BEGIN,
AUTOTEST_SUITE_BEGIN,
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index e48f539..6e3b282 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -289,13 +289,30 @@
}
/**
- * The content:// style URI for this table joined with useful data from
- * {@link Data}.
- *
- * @deprecated Please use plain CONTENT_URI for the same result
+ * Computes a content URI (see {@link #CONTENT_URI}) given a lookup URI.
+ * <p>
+ * Returns null if the contact cannot be found.
*/
- @Deprecated
- public static final Uri CONTENT_SUMMARY_URI = CONTENT_URI;
+ public static Uri lookupContact(ContentResolver resolver, Uri lookupUri) {
+ if (lookupUri == null) {
+ return null;
+ }
+
+ Cursor c = resolver.query(lookupUri, new String[]{Contacts._ID}, null, null, null);
+ if (c == null) {
+ return null;
+ }
+
+ try {
+ if (c.moveToFirst()) {
+ long contactId = c.getLong(0);
+ return ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
+ }
+ } finally {
+ c.close();
+ }
+ return null;
+ }
/**
* The content:// style URI used for "type-to-filter" functionality on the
@@ -306,9 +323,6 @@
public static final Uri CONTENT_FILTER_URI = Uri.withAppendedPath(
CONTENT_URI, "filter");
- @Deprecated
- public static final Uri CONTENT_SUMMARY_FILTER_URI = CONTENT_FILTER_URI;
-
/**
* The content:// style URI for this table joined with useful data from
* {@link Data}, filtered to include only starred contacts
@@ -317,9 +331,6 @@
public static final Uri CONTENT_STREQUENT_URI = Uri.withAppendedPath(
CONTENT_URI, "strequent");
- @Deprecated
- public static final Uri CONTENT_SUMMARY_STREQUENT_URI = CONTENT_STREQUENT_URI;
-
/**
* The content:// style URI used for "type-to-filter" functionality on the
* {@link #CONTENT_STREQUENT_URI} URI. The filter string will be used to match
@@ -329,14 +340,9 @@
public static final Uri CONTENT_STREQUENT_FILTER_URI = Uri.withAppendedPath(
CONTENT_STREQUENT_URI, "filter");
- @Deprecated
- public static final Uri CONTENT_SUMMARY_STREQUENT_FILTER_URI = CONTENT_STREQUENT_FILTER_URI;
-
public static final Uri CONTENT_GROUP_URI = Uri.withAppendedPath(
CONTENT_URI, "group");
- @Deprecated
- public static final Uri CONTENT_SUMMARY_GROUP_URI = CONTENT_GROUP_URI;
/**
* The MIME type of {@link #CONTENT_URI} providing a directory of
* people.
@@ -481,17 +487,6 @@
public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "raw_contacts");
/**
- * The content:// style URL for filtering people by email address. The
- * filter argument should be passed as an additional path segment after
- * this URI.
- *
- * @hide
- */
- @Deprecated
- public static final Uri CONTENT_FILTER_EMAIL_URI =
- Uri.withAppendedPath(CONTENT_URI, "filter_email");
-
- /**
* The MIME type of {@link #CONTENT_URI} providing a directory of
* people.
*/
@@ -662,6 +657,15 @@
public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "data");
/**
+ * The content:// style URI for this table joined with {@link Presence}
+ * data where applicable.
+ *
+ * @hide
+ */
+ public static final Uri CONTENT_WITH_PRESENCE_URI = Uri.withAppendedPath(AUTHORITY_URI,
+ "data_with_presence");
+
+ /**
* The MIME type of {@link #CONTENT_URI} providing a directory of data.
*/
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/data";
@@ -724,24 +728,11 @@
public static final String _ID = "presence_id";
/**
- * Reference to the {@link RawContacts#_ID} this presence references.
- * <P>Type: INTEGER</P>
- *
- * TODO remove this from public API
- * @hide
- */
- @Deprecated
- public static final String RAW_CONTACT_ID = "presence_raw_contact_id";
-
- /**
* Reference to the {@link Data#_ID} entry that owns this presence.
* <P>Type: INTEGER</P>
*/
public static final String DATA_ID = "presence_data_id";
- @Deprecated
- public static final String IM_PROTOCOL = "im_protocol";
-
/**
* <p>Type: NUMBER</p>
*/
@@ -991,13 +982,13 @@
private Phone() {}
/** MIME type used when storing this in data table. */
- public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone";
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone_v2";
/**
* The MIME type of {@link #CONTENT_URI} providing a directory of
* phones.
*/
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/phone";
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/phone_v2";
/**
* The content:// style URI for all data records of the
@@ -1076,7 +1067,7 @@
private Email() {}
/** MIME type used when storing this in data table. */
- public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/email";
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/email_v2";
/**
* The content:// style URI for all data records of the
@@ -1114,13 +1105,14 @@
}
/** MIME type used when storing this in data table. */
- public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/postal-address";
+ public static final String CONTENT_ITEM_TYPE =
+ "vnd.android.cursor.item/postal-address_v2";
/**
* The MIME type of {@link #CONTENT_URI} providing a directory of
* postal addresses.
*/
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/postal-address";
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/postal-address_v2";
/**
* The content:// style URI for all data records of the
@@ -1142,26 +1134,6 @@
public static final String FORMATTED_ADDRESS = DATA;
/**
- * The agent who actually receives the mail. Used in work addresses.
- * Also for 'in care of' or 'c/o'.
- * <p>
- * Type: TEXT
- * @deprecated since this isn't supported by gd:structuredPostalAddress
- */
- @Deprecated
- public static final String AGENT = "data4";
-
- /**
- * Used in places where houses or buildings have names (and not
- * necessarily numbers), eg. "The Pillars".
- * <p>
- * Type: TEXT
- * @deprecated since this isn't supported by gd:structuredPostalAddress
- */
- @Deprecated
- public static final String HOUSENAME = "data5";
-
- /**
* Can be street, avenue, road, etc. This element also includes the
* house number and room/apartment/flat/floor number.
* <p>
@@ -1196,17 +1168,6 @@
public static final String CITY = "data9";
/**
- * Handles administrative districts such as U.S. or U.K. counties
- * that are not used for mail addressing purposes. Subregion is not
- * intended for delivery addresses.
- * <p>
- * Type: TEXT
- * @deprecated since this isn't supported by gd:structuredPostalAddress
- */
- @Deprecated
- public static final String SUBREGION = "data10";
-
- /**
* A state, province, county (in Ireland), Land (in Germany),
* departement (in France), etc.
* <p>
@@ -1633,7 +1594,7 @@
"vnd.android.cursor.item/aggregation_exception";
/**
- * The type of exception: {@link #TYPE_KEEP_IN}, {@link #TYPE_KEEP_OUT} or
+ * The type of exception: {@link #TYPE_KEEP_TOGETHER}, {@link #TYPE_KEEP_SEPARATE} or
* {@link #TYPE_AUTOMATIC}.
*
* <P>Type: INTEGER</P>
@@ -1641,33 +1602,45 @@
public static final String TYPE = "type";
/**
- * Allows the provider to automatically decide whether the aggregate
- * contact should include a particular raw contact or not.
+ * Allows the provider to automatically decide whether the specified raw contacts should
+ * be included in the same aggregate contact or not.
*/
public static final int TYPE_AUTOMATIC = 0;
/**
- * Makes sure that the specified raw contact is included in the
- * specified aggregate contact.
+ * Makes sure that the specified raw contacts are included in the same
+ * aggregate contact.
*/
+ public static final int TYPE_KEEP_TOGETHER = 1;
+
+ @Deprecated
public static final int TYPE_KEEP_IN = 1;
/**
- * Makes sure that the specified raw contact is NOT included in the
- * specified aggregate contact.
+ * Makes sure that the specified raw contacts are NOT included in the same
+ * aggregate contact.
*/
+ public static final int TYPE_KEEP_SEPARATE = 2;
+
+ @Deprecated
public static final int TYPE_KEEP_OUT = 2;
- /**
- * A reference to the {@link android.provider.ContactsContract.Contacts#_ID} of the
- * aggregate contact that the rule applies to.
- */
+ @Deprecated
public static final String CONTACT_ID = "contact_id";
+ @Deprecated
+ public static final String RAW_CONTACT_ID = "raw_contact_id";
+
/**
* A reference to the {@link RawContacts#_ID} of the raw contact that the rule applies to.
*/
- public static final String RAW_CONTACT_ID = "raw_contact_id";
+ public static final String RAW_CONTACT_ID1 = "raw_contact_id1";
+
+ /**
+ * A reference to the other {@link RawContacts#_ID} of the raw contact that the rule
+ * applies to.
+ */
+ public static final String RAW_CONTACT_ID2 = "raw_contact_id2";
}
private interface SettingsColumns {
diff --git a/core/java/android/provider/Gmail.java b/core/java/android/provider/Gmail.java
index 4425e51..073ae6c 100644
--- a/core/java/android/provider/Gmail.java
+++ b/core/java/android/provider/Gmail.java
@@ -1548,11 +1548,12 @@
getLabelIdValues(labelId).getAsInteger(LabelColumns.NUM_UNREAD_CONVERSATIONS);
// There seems to be a race condition here that can get the label maps into a bad
// state and lose state on a particular label.
- if (unreadConversations == null) {
- return 0;
- } else {
- return unreadConversations;
+ int result = 0;
+ if (unreadConversations != null) {
+ result = unreadConversations < 0 ? 0 : unreadConversations;
}
+
+ return result;
}
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 77d1740..5bc5855 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -119,6 +119,20 @@
"android.settings.AIRPLANE_MODE_SETTINGS";
/**
+ * Activity Action: Show settings for accessibility modules.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you
+ * safeguard against this.
+ * <p>
+ * Input: Nothing.
+ * <p>
+ * Output: Nothing.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_ACCESSIBILITY_SETTINGS =
+ "android.settings.ACCESSIBILITY_SETTINGS";
+
+ /**
* Activity Action: Show settings to allow configuration of security and
* location privacy.
* <p>
@@ -2231,6 +2245,32 @@
public static final String BACKGROUND_DATA = "background_data";
/**
+ * The time in msec, when the LAST_KMSG file was send to the checkin server.
+ * We will only send the LAST_KMSG file if it was modified after this time.
+ *
+ * @hide
+ */
+ public static final String CHECKIN_SEND_LAST_KMSG_TIME = "checkin_kmsg_time";
+
+ /**
+ * The time in msec, when the apanic_console file was send to the checkin server.
+ * We will only send the apanic_console file if it was modified after this time.
+ *
+ * @hide
+ */
+ public static final String CHECKIN_SEND_APANIC_CONSOLE_TIME =
+ "checkin_apanic_console_time";
+
+ /**
+ * The time in msec, when the apanic_thread file was send to the checkin server.
+ * We will only send the apanic_thread file if it was modified after this time.
+ *
+ * @hide
+ */
+ public static final String CHECKIN_SEND_APANIC_THREAD_TIME =
+ "checkin_apanic_thread_time";
+
+ /**
* The CDMA roaming mode 0 = Home Networks, CDMA default
* 1 = Roaming on Affiliated networks
* 2 = Roaming on any networks
@@ -2944,13 +2984,15 @@
"gtalk_max_conn_history_records";
/**
- * This is gdata url to lookup album and picture info from picasa web.
+ * This is gdata url to lookup album and picture info from picasa web. It also controls
+ * whether url scraping for picasa is enabled (NULL to disable).
*/
public static final String GTALK_PICASA_ALBUM_URL =
"gtalk_picasa_album_url";
/**
- * This is the url to lookup picture info from flickr.
+ * This is the url to lookup picture info from flickr. It also controls
+ * whether url scraping for flickr is enabled (NULL to disable).
*/
public static final String GTALK_FLICKR_PHOTO_INFO_URL =
"gtalk_flickr_photo_info_url";
@@ -2962,12 +3004,19 @@
"gtalk_flickr_photo_url";
/**
- * This is the gdata url to lookup info on a youtube video.
+ * This is the gdata url to lookup info on a youtube video. It also controls
+ * whether url scraping for youtube is enabled (NULL to disable).
*/
public static final String GTALK_YOUTUBE_VIDEO_URL =
"gtalk_youtube_video_url";
/**
+ * Enable/disable GTalk URL scraping for JPG images ("true" to enable).
+ */
+ public static final String GTALK_URL_SCRAPING_FOR_JPG =
+ "gtalk_url_scraping_for_jpg";
+
+ /**
* Chat message lifetime (for pruning old chat messages).
*/
public static final String GTALK_CHAT_MESSAGE_LIFETIME =
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 0207330..c637e02 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -490,6 +490,13 @@
public static final int RESULT_SMS_OUT_OF_MEMORY = 3;
/**
+ * Set by BroadcastReceiver. Indicates the message, while
+ * possibly valid, is of a format or encoding that is not
+ * supported.
+ */
+ public static final int RESULT_SMS_UNSUPPORTED = 4;
+
+ /**
* Broadcast Action: A new text based SMS message has been received
* by the device. The intent will have the following extra
* values:</p>
@@ -558,6 +565,23 @@
"android.provider.Telephony.SIM_FULL";
/**
+ * Broadcast Action: An incoming SMS has been rejected by the
+ * telephony framework. This intent is sent in lieu of any
+ * of the RECEIVED_ACTION intents. The intent will have the
+ * following extra value:</p>
+ *
+ * <ul>
+ * <li><em>result</em> - An int result code, eg,
+ * <code>{@link #RESULT_SMS_OUT_OF_MEMORY}</code>,
+ * indicating the error returned to the network.</li>
+ * </ul>
+
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String SMS_REJECTED_ACTION =
+ "android.provider.Telephony.SMS_REJECTED";
+
+ /**
* Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a
* {@link #DATA_SMS_RECEIVED_ACTION} intent.
*
@@ -1522,6 +1546,9 @@
public static final Uri CONTENT_DRAFT_URI = Uri.parse(
"content://mms-sms/draft");
+ public static final Uri CONTENT_LOCKED_URI = Uri.parse(
+ "content://mms-sms/locked");
+
/***
* Pass in a query parameter called "pattern" which is the text
* to search for.
@@ -1676,7 +1703,3 @@
public static final String EXTRA_SPN = "spn";
}
}
-
-
-
-
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index 79a7cf8..8cef3a2 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -347,7 +347,12 @@
} else {
mBluetoothService.getBondState().setBondState(address,
BluetoothDevice.BOND_NOT_BONDED);
+ mBluetoothService.setRemoteDeviceProperty(address, "Trusted", "false");
}
+ } else if (name.equals("Trusted")) {
+ if (DBG)
+ log("set trust state succeded, value is " + propValues[1]);
+ mBluetoothService.setRemoteDeviceProperty(address, name, propValues[1]);
}
}
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index 21104c8..b168850 100644
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -885,6 +885,42 @@
}
/**
+ * Sets the remote device trust state.
+ *
+ * @return boolean to indicate operation success or fail
+ */
+ public synchronized boolean setTrust(String address, boolean value) {
+ if (!BluetoothDevice.checkBluetoothAddress(address)) {
+ mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ return false;
+ }
+
+ return setDevicePropertyBooleanNative(getObjectPathFromAddress(address), "Trusted",
+ value ? 1 : 0);
+ }
+
+ /**
+ * Gets the remote device trust state as boolean.
+ * Note: this value may be
+ * retrieved from cache if we retrieved the data before *
+ *
+ * @return boolean to indicate trust or untrust state
+ */
+ public synchronized boolean getTrustState(String address) {
+ if (!BluetoothDevice.checkBluetoothAddress(address)) {
+ mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ return false;
+ }
+
+ String val = getRemoteDeviceProperty(address, "Trusted");
+ if (val == null) {
+ return false;
+ } else {
+ return val.equals("true") ? true : false;
+ }
+ }
+
+ /**
* Gets the remote major, minor classes encoded as a 32-bit
* integer.
*
@@ -1220,5 +1256,6 @@
private native boolean setPasskeyNative(String address, int passkey, int nativeData);
private native boolean setPairingConfirmationNative(String address, boolean confirm,
int nativeData);
+ private native boolean setDevicePropertyBooleanNative(String objectPath, String key, int value);
}
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 29dc2ea52..a92800d 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -1527,7 +1527,7 @@
if (bm != null) {
workPaint.set(paint);
Styled.measureText(paint, workPaint, text,
- offset, offset + 1, null);
+ j, j + 2, null);
float wid = (float) bm.getWidth() *
-workPaint.ascent() / bm.getHeight();
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d569220..2f17bbc7 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5343,12 +5343,36 @@
size = cache.scrollBarSize;
}
+ final int scrollX = mScrollX;
+ final int scrollY = mScrollY;
+ final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
+
if (drawHorizontalScrollBar) {
- onDrawHorizontalScrollBar(canvas, scrollBar, width, height, size);
+ scrollBar.setParameters(
+ computeHorizontalScrollRange(),
+ computeHorizontalScrollOffset(),
+ computeHorizontalScrollExtent(), false);
+ final int top = scrollY + height - size - (mUserPaddingBottom & inside);
+ final int verticalScrollBarGap = drawVerticalScrollBar ?
+ getVerticalScrollbarWidth() : 0;
+ onDrawHorizontalScrollBar(canvas, scrollBar,
+ scrollX + (mPaddingLeft & inside),
+ top,
+ scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap,
+ top + size);
}
if (drawVerticalScrollBar) {
- onDrawVerticalScrollBar(canvas, scrollBar, width, height, size);
+ scrollBar.setParameters(computeVerticalScrollRange(),
+ computeVerticalScrollOffset(),
+ computeVerticalScrollExtent(), true);
+ // TODO: Deal with RTL languages to position scrollbar on left
+ final int left = scrollX + width - size - (mUserPaddingRight & inside);
+ onDrawVerticalScrollBar(canvas, scrollBar,
+ left,
+ scrollY + (mPaddingTop & inside),
+ left + size,
+ scrollY + height - (mUserPaddingBottom & inside));
}
}
}
@@ -5368,44 +5392,20 @@
* <p>Draw the horizontal scrollbar if
* {@link #isHorizontalScrollBarEnabled()} returns true.</p>
*
- * <p>The length of the scrollbar and its thumb is computed according to the
- * values returned by {@link #computeHorizontalScrollRange()},
- * {@link #computeHorizontalScrollExtent()} and
- * {@link #computeHorizontalScrollOffset()}. Refer to
- * {@link android.widget.ScrollBarDrawable} for more information about how
- * these values relate to each other.</p>
- *
* @param canvas the canvas on which to draw the scrollbar
* @param scrollBar the scrollbar's drawable
- * @param width the width of the drawing surface
- * @param height the height of the drawing surface
- * @param size the size of the scrollbar
*
* @see #isHorizontalScrollBarEnabled()
* @see #computeHorizontalScrollRange()
* @see #computeHorizontalScrollExtent()
* @see #computeHorizontalScrollOffset()
* @see android.widget.ScrollBarDrawable
+ * @hide
*/
- private void onDrawHorizontalScrollBar(Canvas canvas, ScrollBarDrawable scrollBar, int width,
- int height, int size) {
-
- final int viewFlags = mViewFlags;
- final int scrollX = mScrollX;
- final int scrollY = mScrollY;
- final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
- final int top = scrollY + height - size - (mUserPaddingBottom & inside);
-
- final int verticalScrollBarGap =
- (viewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL ?
- getVerticalScrollbarWidth() : 0;
-
- scrollBar.setBounds(scrollX + (mPaddingLeft & inside), top,
- scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap, top + size);
- scrollBar.setParameters(
- computeHorizontalScrollRange(),
- computeHorizontalScrollOffset(),
- computeHorizontalScrollExtent(), false);
+ protected void onDrawHorizontalScrollBar(Canvas canvas,
+ Drawable scrollBar,
+ int l, int t, int r, int b) {
+ scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
}
@@ -5413,40 +5413,20 @@
* <p>Draw the vertical scrollbar if {@link #isVerticalScrollBarEnabled()}
* returns true.</p>
*
- * <p>The length of the scrollbar and its thumb is computed according to the
- * values returned by {@link #computeVerticalScrollRange()},
- * {@link #computeVerticalScrollExtent()} and
- * {@link #computeVerticalScrollOffset()}. Refer to
- * {@link android.widget.ScrollBarDrawable} for more information about how
- * these values relate to each other.</p>
- *
* @param canvas the canvas on which to draw the scrollbar
* @param scrollBar the scrollbar's drawable
- * @param width the width of the drawing surface
- * @param height the height of the drawing surface
- * @param size the size of the scrollbar
*
* @see #isVerticalScrollBarEnabled()
* @see #computeVerticalScrollRange()
* @see #computeVerticalScrollExtent()
* @see #computeVerticalScrollOffset()
* @see android.widget.ScrollBarDrawable
+ * @hide
*/
- private void onDrawVerticalScrollBar(Canvas canvas, ScrollBarDrawable scrollBar, int width,
- int height, int size) {
-
- final int scrollX = mScrollX;
- final int scrollY = mScrollY;
- final int inside = (mViewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
- // TODO: Deal with RTL languages to position scrollbar on left
- final int left = scrollX + width - size - (mUserPaddingRight & inside);
-
- scrollBar.setBounds(left, scrollY + (mPaddingTop & inside),
- left + size, scrollY + height - (mUserPaddingBottom & inside));
- scrollBar.setParameters(
- computeVerticalScrollRange(),
- computeVerticalScrollOffset(),
- computeVerticalScrollExtent(), true);
+ protected void onDrawVerticalScrollBar(Canvas canvas,
+ Drawable scrollBar,
+ int l, int t, int r, int b) {
+ scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index dd4b65f..c40107b 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -344,12 +344,18 @@
public final int TRANSIT_TASK_TO_FRONT = 10;
/** A window in an existing task is being put below all other tasks. */
public final int TRANSIT_TASK_TO_BACK = 11;
+ /** A window in a new activity that doesn't have a wallpaper is being
+ * opened on top of one that does, effectively closing the wallpaper. */
+ public final int TRANSIT_WALLPAPER_CLOSE = 12;
+ /** A window in a new activity that does have a wallpaper is being
+ * opened on one that didn't, effectively opening the wallpaper. */
+ public final int TRANSIT_WALLPAPER_OPEN = 13;
/** A window in a new activity is being opened on top of an existing one,
* and both are on top of the wallpaper. */
- public final int TRANSIT_WALLPAPER_ACTIVITY_OPEN = 12;
+ public final int TRANSIT_WALLPAPER_INTRA_OPEN = 14;
/** The window in the top-most activity is being closed to reveal the
* previous activity, and both are on top of he wallpaper. */
- public final int TRANSIT_WALLPAPER_ACTIVITY_CLOSE = 13;
+ public final int TRANSIT_WALLPAPER_INTRA_CLOSE = 15;
/** Screen turned off because of power button */
public final int OFF_BECAUSE_OF_USER = 1;
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index ce27fd7f9..e96ba11 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -31,6 +31,7 @@
import java.net.URLEncoder;
import java.util.HashMap;
+import java.util.Map;
import java.util.Iterator;
class BrowserFrame extends Handler {
@@ -59,7 +60,7 @@
private boolean mIsMainFrame;
// Attached Javascript interfaces
- private HashMap mJSInterfaceMap;
+ private Map<String, Object> mJSInterfaceMap;
// message ids
// a message posted when a frame loading is completed
@@ -98,7 +99,7 @@
* XXX: Called by WebCore thread.
*/
public BrowserFrame(Context context, WebViewCore w, CallbackProxy proxy,
- WebSettings settings) {
+ WebSettings settings, Map<String, Object> javascriptInterfaces) {
// Create a global JWebCoreJavaBridge to handle timers and
// cookies in the WebCore thread.
if (sJavaBridge == null) {
@@ -112,8 +113,7 @@
// create PluginManager with current Context
PluginManager.getInstance(context);
}
- AssetManager am = context.getAssets();
- nativeCreateFrame(w, am, proxy.getBackForwardList());
+ mJSInterfaceMap = javascriptInterfaces;
mSettings = settings;
mContext = context;
@@ -121,6 +121,9 @@
mDatabase = WebViewDatabase.getInstance(context);
mWebViewCore = w;
+ AssetManager am = context.getAssets();
+ nativeCreateFrame(w, am, proxy.getBackForwardList());
+
if (DebugFlags.BROWSER_FRAME) {
Log.v(LOGTAG, "BrowserFrame constructor: this=" + this);
}
@@ -452,6 +455,8 @@
mJSInterfaceMap.remove(interfaceName);
}
mJSInterfaceMap.put(interfaceName, obj);
+ nativeAddJavascriptInterface(0, mJSInterfaceMap.get(interfaceName),
+ interfaceName);
}
/**
@@ -670,6 +675,7 @@
// these ids need to be in sync with enum RAW_RES_ID in WebFrame
private static final int NODOMAIN = 1;
private static final int LOADERROR = 2;
+ private static final int DRAWABLEDIR = 3;
String getRawResFilename(int id) {
int resid;
@@ -682,12 +688,26 @@
resid = com.android.internal.R.raw.loaderror;
break;
+ case DRAWABLEDIR:
+ // use one known resource to find the drawable directory
+ resid = com.android.internal.R.drawable.btn_check_off;
+ break;
+
default:
Log.e(LOGTAG, "getRawResFilename got incompatible resource ID");
return "";
}
TypedValue value = new TypedValue();
mContext.getResources().getValue(resid, value, true);
+ if (id == DRAWABLEDIR) {
+ String path = value.string.toString();
+ int index = path.lastIndexOf('/');
+ if (index < 0) {
+ Log.e(LOGTAG, "Can't find drawable directory.");
+ return "";
+ }
+ return path.substring(0, index + 1);
+ }
return value.string.toString();
}
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 41e604d..e504591 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -177,17 +177,6 @@
}
/**
- * Tell the host application that the WebView has changed viewing modes.
- * @param newViewingMode One of the values described in WebView as possible
- * values for the viewing mode
- */
- /* package */ void uiOnChangeViewingMode(int newViewingMode) {
- if (mWebChromeClient != null) {
- mWebChromeClient.onChangeViewingMode(mWebView, newViewingMode);
- }
- }
-
- /**
* Called by the UI side. Calling overrideUrlLoading from the WebCore
* side will post a message to call this method.
*/
diff --git a/core/java/android/webkit/ContentLoader.java b/core/java/android/webkit/ContentLoader.java
index 27cd6b5..19aa087 100644
--- a/core/java/android/webkit/ContentLoader.java
+++ b/core/java/android/webkit/ContentLoader.java
@@ -57,6 +57,16 @@
}
+ private String errString(Exception ex) {
+ String exMessage = ex.getMessage();
+ String errString = mContext.getString(
+ com.android.internal.R.string.httpErrorFileNotFound);
+ if (exMessage != null) {
+ errString += " " + exMessage;
+ }
+ return errString;
+ }
+
@Override
protected boolean setupStreamAndSendStatus() {
Uri uri = Uri.parse(mUrl);
@@ -73,28 +83,16 @@
mDataStream = mContext.getContentResolver().openInputStream(uri);
mHandler.status(1, 1, 0, "OK");
} catch (java.io.FileNotFoundException ex) {
- mHandler.error(
- EventHandler.FILE_NOT_FOUND_ERROR,
- mContext.getString(
- com.android.internal.R.string.httpErrorFileNotFound) +
- " " + ex.getMessage());
+ mHandler.error(EventHandler.FILE_NOT_FOUND_ERROR, errString(ex));
return false;
} catch (java.io.IOException ex) {
- mHandler.error(
- EventHandler.FILE_ERROR,
- mContext.getString(
- com.android.internal.R.string.httpErrorFileNotFound) +
- " " + ex.getMessage());
+ mHandler.error(EventHandler.FILE_ERROR, errString(ex));
return false;
} catch (RuntimeException ex) {
// readExceptionWithFileNotFoundExceptionFromParcel in DatabaseUtils
// can throw a serial of RuntimeException. Catch them all here.
- mHandler.error(
- EventHandler.FILE_ERROR,
- mContext.getString(
- com.android.internal.R.string.httpErrorFileNotFound) +
- " " + ex.getMessage());
+ mHandler.error(EventHandler.FILE_ERROR, errString(ex));
return false;
}
return true;
diff --git a/core/java/android/webkit/FileLoader.java b/core/java/android/webkit/FileLoader.java
index 54a4c1d..085f1f4 100644
--- a/core/java/android/webkit/FileLoader.java
+++ b/core/java/android/webkit/FileLoader.java
@@ -72,6 +72,15 @@
}
}
+ private String errString(Exception ex) {
+ String exMessage = ex.getMessage();
+ String errString = mContext.getString(R.string.httpErrorFileNotFound);
+ if (exMessage != null) {
+ errString += " " + exMessage;
+ }
+ return errString;
+ }
+
@Override
protected boolean setupStreamAndSendStatus() {
try {
@@ -95,16 +104,11 @@
mHandler.status(1, 1, 0, "OK");
} catch (java.io.FileNotFoundException ex) {
- mHandler.error(
- EventHandler.FILE_NOT_FOUND_ERROR,
- mContext.getString(R.string.httpErrorFileNotFound) +
- " " + ex.getMessage());
+ mHandler.error(EventHandler.FILE_NOT_FOUND_ERROR, errString(ex));
return false;
} catch (java.io.IOException ex) {
- mHandler.error(EventHandler.FILE_ERROR,
- mContext.getString(R.string.httpErrorFileNotFound) +
- " " + ex.getMessage());
+ mHandler.error(EventHandler.FILE_ERROR, errString(ex));
return false;
}
return true;
diff --git a/core/java/android/webkit/GeolocationService.java b/core/java/android/webkit/GeolocationService.java
index 78b25ba..646f8c5 100755
--- a/core/java/android/webkit/GeolocationService.java
+++ b/core/java/android/webkit/GeolocationService.java
@@ -156,11 +156,16 @@
* Registers this object with the location service.
*/
private void registerForLocationUpdates() {
- mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
- mIsNetworkProviderAvailable = true;
- if (mIsGpsEnabled) {
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
- mIsGpsProviderAvailable = true;
+ try {
+ mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
+ mIsNetworkProviderAvailable = true;
+ if (mIsGpsEnabled) {
+ mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
+ mIsGpsProviderAvailable = true;
+ }
+ } catch(SecurityException e) {
+ Log.e(TAG, "Caught security exception registering for location updates from system. " +
+ "This should only happen in DumpRenderTree.");
}
}
diff --git a/core/java/android/GoogleLocationSettingManager.java b/core/java/android/webkit/GoogleLocationSettingManager.java
similarity index 100%
rename from core/java/android/GoogleLocationSettingManager.java
rename to core/java/android/webkit/GoogleLocationSettingManager.java
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index 43c76a8..1a5b2eb 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -606,6 +606,7 @@
// before calling it.
if (mCacheLoader != null) {
mCacheLoader.load();
+ mFromCache = true;
if (DebugFlags.LOAD_LISTENER) {
Log.v(LOGTAG, "LoadListener cache load url=" + url());
}
diff --git a/core/java/android/webkit/ViewManager.java b/core/java/android/webkit/ViewManager.java
index af33b4f..6a838c3 100644
--- a/core/java/android/webkit/ViewManager.java
+++ b/core/java/android/webkit/ViewManager.java
@@ -50,8 +50,8 @@
}
setBounds(x, y, width, height);
final AbsoluteLayout.LayoutParams lp =
- new AbsoluteLayout.LayoutParams(ctv(width), ctv(height),
- ctv(x), ctv(y));
+ new AbsoluteLayout.LayoutParams(ctvD(width), ctvD(height),
+ ctvX(x), ctvY(y));
mWebView.mPrivateHandler.post(new Runnable() {
public void run() {
// This method may be called multiple times. If the view is
@@ -97,9 +97,29 @@
return new ChildView();
}
- // contentToView shorthand.
- private int ctv(int val) {
- return mWebView.contentToView(val);
+ /**
+ * Shorthand for calling mWebView.contentToViewDimension. Used when
+ * obtaining a view dimension from a content dimension, whether it be in x
+ * or y.
+ */
+ private int ctvD(int val) {
+ return mWebView.contentToViewDimension(val);
+ }
+
+ /**
+ * Shorthand for calling mWebView.contentToViewX. Used when obtaining a
+ * view x coordinate from a content x coordinate.
+ */
+ private int ctvX(int val) {
+ return mWebView.contentToViewX(val);
+ }
+
+ /**
+ * Shorthand for calling mWebView.contentToViewY. Used when obtaining a
+ * view y coordinate from a content y coordinate.
+ */
+ private int ctvY(int val) {
+ return mWebView.contentToViewY(val);
}
void scaleAll() {
@@ -107,10 +127,10 @@
View view = v.mView;
AbsoluteLayout.LayoutParams lp =
(AbsoluteLayout.LayoutParams) view.getLayoutParams();
- lp.width = ctv(v.width);
- lp.height = ctv(v.height);
- lp.x = ctv(v.x);
- lp.y = ctv(v.y);
+ lp.width = ctvD(v.width);
+ lp.height = ctvD(v.height);
+ lp.x = ctvX(v.x);
+ lp.y = ctvY(v.y);
view.setLayoutParams(lp);
}
}
diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java
index ad4ba05..6421fe7 100644
--- a/core/java/android/webkit/WebChromeClient.java
+++ b/core/java/android/webkit/WebChromeClient.java
@@ -23,15 +23,6 @@
public class WebChromeClient {
/**
- * Tell the host application that the WebView has changed viewing modes.
- * @param view The WebView that initiated the callback.
- * @param newViewingMode One of the values described in WebView as possible
- * values for the viewing mode
- * @hide
- */
- public void onChangeViewingMode(WebView view, int newViewingMode) {}
-
- /**
* Tell the host application the current progress of loading a page.
* @param view The WebView that initiated the callback.
* @param newProgress Current page loading progress, represented by
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index a1f2223..95b3a12 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -697,8 +697,12 @@
* Set the selection, and disable our onSelectionChanged action.
*/
/* package */ void setSelectionFromWebKit(int start, int end) {
+ if (start < 0 || end < 0) return;
+ Spannable text = (Spannable) getText();
+ int length = text.length();
+ if (start > length || end > length) return;
mFromWebKit = true;
- Selection.setSelection((Spannable) getText(), start, end);
+ Selection.setSelection(text, start, end);
mFromWebKit = false;
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index e39e3f1..db6966a 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -31,6 +31,7 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
+import android.graphics.drawable.Drawable;
import android.net.http.SslCertificate;
import android.net.Uri;
import android.os.Bundle;
@@ -57,6 +58,7 @@
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.view.animation.AlphaAnimation;
+import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebTextView.AutoCompleteAdapter;
import android.webkit.WebViewCore.EventHub;
@@ -67,6 +69,7 @@
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
+import android.widget.ScrollBarDrawable;
import android.widget.Scroller;
import android.widget.Toast;
import android.widget.ZoomButtonsController;
@@ -81,6 +84,7 @@
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* <p>A View that displays web pages. This class is the basis upon which you
@@ -342,6 +346,9 @@
*/
VelocityTracker mVelocityTracker;
private int mMaximumFling;
+ private float mLastVelocity;
+ private float mLastVelX;
+ private float mLastVelY;
// use this flag to control whether enabling the new double tap zoom
static final boolean ENABLE_DOUBLETAP_ZOOM = true;
@@ -522,48 +529,6 @@
// the last zoom scale.
boolean mInZoomOverview = false;
- // The viewing mode of this webview. Reported back to the WebChromeClient
- // so we can hide and display the title bar as appropriate.
- private int mViewingMode;
- /**
- * Not supporting overview vs reading mode
- * @hide
- */
- public final static int NO_VIEWING_MODE = 0;
- /**
- * Zoom overview mode. The page is zoomed all the way out, mInZoomOverview
- * is true, and the title bar is showing. Double tapping will change to
- * reading mode.
- * @hide
- */
- public final static int OVERVIEW_MODE = 1;
- /**
- * Reading mode. The page is at the level specified by the user,
- * mInZoomOverview is false, and the title bar is not showing. Double
- * tapping will change to zoom overview mode.
- * @hide
- */
- public final static int READING_MODE = 2;
- /**
- * Modified reading mode, which shows the title bar. mInZoomOverview is
- * false, and double tapping will change to zoom overview mode. However,
- * if the scrolling will change to reading mode. Used when swiping a
- * tab into view which was in reading mode, unless it was a mobile site
- * with zero scroll.
- * @hide
- */
- public final static int READING_MODE_WITH_TITLE_BAR = 3;
- /**
- * Another modified reading mode. For loading a mobile site, or swiping a
- * tab into view which was displaying a mobile site in reading mode
- * with zero scroll
- * @hide
- */
- public final static int TITLE_BAR_DISMISS_MODE = 4;
- // Whether the current site is a mobile site. Determined when we receive
- // NEW_PICTURE_MSG_ID to help determine how to handle double taps
- private boolean mMobileSite;
-
// ideally mZoomOverviewWidth should be mContentWidth. But sites like espn,
// engadget always have wider mContentWidth no matter what viewport size is.
int mZoomOverviewWidth = WebViewCore.DEFAULT_VIEWPORT_WIDTH;
@@ -760,11 +725,28 @@
* @param defStyle The default style resource ID.
*/
public WebView(Context context, AttributeSet attrs, int defStyle) {
+ this(context, attrs, defStyle, null);
+ }
+
+ /**
+ * Construct a new WebView with layout parameters, a default style and a set
+ * of custom Javscript interfaces to be added to the WebView at initialization
+ * time. This guraratees that these interfaces will be available when the JS
+ * context is initialized.
+ * @param context A Context object used to access application assets.
+ * @param attrs An AttributeSet passed to our parent.
+ * @param defStyle The default style resource ID.
+ * @param javascriptInterfaces is a Map of intareface names, as keys, and
+ * object implementing those interfaces, as values.
+ * @hide pending API council approval.
+ */
+ protected WebView(Context context, AttributeSet attrs, int defStyle,
+ Map<String, Object> javascriptInterfaces) {
super(context, attrs, defStyle);
init();
mCallbackProxy = new CallbackProxy(context, this);
- mWebViewCore = new WebViewCore(context, this, mCallbackProxy);
+ mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javascriptInterfaces);
mDatabase = WebViewDatabase.getInstance(context);
mScroller = new Scroller(context);
@@ -958,15 +940,30 @@
}
/*
+ * returns the height of the titlebarview (if any). Does not care about
+ * scrolling
+ */
+ private int getTitleHeight() {
+ return mTitleBar != null ? mTitleBar.getHeight() : 0;
+ }
+
+ /*
+ * Return the amount of the titlebarview (if any) that is visible
+ */
+ private int getVisibleTitleHeight() {
+ return Math.max(getTitleHeight() - mScrollY, 0);
+ }
+
+ /*
* Return the height of the view where the content of WebView should render
- * to.
+ * to. Note that this excludes mTitleBar, if there is one.
*/
private int getViewHeight() {
- if (!isHorizontalScrollBarEnabled() || mOverlayHorizontalScrollbar) {
- return getHeight();
- } else {
- return getHeight() - getHorizontalScrollbarHeight();
+ int height = getHeight();
+ if (isHorizontalScrollBarEnabled() && !mOverlayHorizontalScrollbar) {
+ height -= getHorizontalScrollbarHeight();
}
+ return height - getVisibleTitleHeight();
}
/**
@@ -1177,7 +1174,6 @@
if (mInZoomOverview) {
b.putFloat("lastScale", mLastScale);
}
- b.putBoolean("mobile", mMobileSite);
return true;
}
return false;
@@ -1223,20 +1219,12 @@
// correctly
mActualScale = scale;
float lastScale = b.getFloat("lastScale", -1.0f);
- mMobileSite = b.getBoolean("mobile", false);
if (lastScale > 0) {
mInZoomOverview = true;
- mViewingMode = OVERVIEW_MODE;
mLastScale = lastScale;
} else {
mInZoomOverview = false;
- if (mMobileSite && (mScrollX | mScrollY) == 0) {
- mViewingMode = TITLE_BAR_DISMISS_MODE;
- } else {
- mViewingMode = READING_MODE_WITH_TITLE_BAR;
- }
}
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
invalidate();
return true;
}
@@ -1689,8 +1677,8 @@
if (type == HitTestResult.UNKNOWN_TYPE
|| type == HitTestResult.SRC_ANCHOR_TYPE) {
// Now check to see if it is an image.
- int contentX = viewToContent((int) mLastTouchX + mScrollX);
- int contentY = viewToContent((int) mLastTouchY + mScrollY);
+ int contentX = viewToContentX((int) mLastTouchX + mScrollX);
+ int contentY = viewToContentY((int) mLastTouchY + mScrollY);
String text = nativeImageURI(contentX, contentY);
if (text != null) {
result.setType(type == HitTestResult.UNKNOWN_TYPE ?
@@ -1733,8 +1721,8 @@
* as the data member with "url" as key. The result can be null.
*/
public void requestImageRef(Message msg) {
- int contentX = viewToContent((int) mLastTouchX + mScrollX);
- int contentY = viewToContent((int) mLastTouchY + mScrollY);
+ int contentX = viewToContentX((int) mLastTouchX + mScrollX);
+ int contentY = viewToContentY((int) mLastTouchY + mScrollY);
String ref = nativeImageURI(contentX, contentY);
Bundle data = msg.getData();
data.putString("url", ref);
@@ -1765,34 +1753,111 @@
// Expects y in view coordinates
private int pinLocY(int y) {
- return pinLoc(y, getViewHeight(), computeVerticalScrollRange());
+ int titleH = getTitleHeight();
+ // if the titlebar is still visible, just pin against 0
+ if (y <= titleH) {
+ return Math.max(y, 0);
+ }
+ // convert to 0-based coordinate (subtract the title height)
+ // pin(), and then add the title height back in
+ return pinLoc(y - titleH, getViewHeight(),
+ computeVerticalScrollRange()) + titleH;
}
- /*package*/ int viewToContent(int x) {
+ /**
+ * A title bar which is embedded in this WebView, and scrolls along with it
+ * vertically, but not horizontally.
+ */
+ private View mTitleBar;
+
+ /**
+ * Add or remove a title bar to be embedded into the WebView, and scroll
+ * along with it vertically, while remaining in view horizontally. Pass
+ * null to remove the title bar from the WebView, and return to drawing
+ * the WebView normally without translating to account for the title bar.
+ * @hide
+ */
+ public void setEmbeddedTitleBar(View v) {
+ if (mTitleBar == v) return;
+ if (mTitleBar != null) {
+ removeView(mTitleBar);
+ }
+ if (null != v) {
+ addView(v, new AbsoluteLayout.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0));
+ }
+ mTitleBar = v;
+ }
+
+ /**
+ * Given an x coordinate in view space, convert it to content space. Also
+ * may be used for absolute heights (such as for the WebTextView's
+ * textSize, which is unaffected by the height of the title bar).
+ */
+ /*package*/ int viewToContentX(int x) {
return Math.round(x * mInvActualScale);
}
- /*package*/ int contentToView(int x) {
- return Math.round(x * mActualScale);
+ /**
+ * Given a y coordinate in view space, convert it to content space.
+ * Takes into account the height of the title bar if there is one
+ * embedded into the WebView.
+ */
+ /*package*/ int viewToContentY(int y) {
+ return viewToContentX(y - getTitleHeight());
+ }
+
+ /**
+ * Given a distance in content space, convert it to view space. Note: this
+ * does not reflect translation, just scaling, so this should not be called
+ * with coordinates, but should be called for dimensions like width or
+ * height.
+ */
+ /*package*/ int contentToViewDimension(int d) {
+ return Math.round(d * mActualScale);
+ }
+
+ /**
+ * Given an x coordinate in content space, convert it to view
+ * space. Also used for absolute heights.
+ */
+ /*package*/ int contentToViewX(int x) {
+ return contentToViewDimension(x);
+ }
+
+ /**
+ * Given a y coordinate in content space, convert it to view
+ * space. Takes into account the height of the title bar.
+ */
+ /*package*/ int contentToViewY(int y) {
+ return contentToViewDimension(y) + getTitleHeight();
}
// Called by JNI to invalidate the View, given rectangle coordinates in
// content space
private void viewInvalidate(int l, int t, int r, int b) {
- invalidate(contentToView(l), contentToView(t), contentToView(r),
- contentToView(b));
+ invalidate(contentToViewX(l), contentToViewY(t), contentToViewX(r),
+ contentToViewY(b));
}
// Called by JNI to invalidate the View after a delay, given rectangle
// coordinates in content space
private void viewInvalidateDelayed(long delay, int l, int t, int r, int b) {
- postInvalidateDelayed(delay, contentToView(l), contentToView(t),
- contentToView(r), contentToView(b));
+ postInvalidateDelayed(delay, contentToViewX(l), contentToViewY(t),
+ contentToViewX(r), contentToViewY(b));
}
private Rect contentToView(Rect x) {
- return new Rect(contentToView(x.left), contentToView(x.top)
- , contentToView(x.right), contentToView(x.bottom));
+ return new Rect(contentToViewX(x.left), contentToViewY(x.top)
+ , contentToViewX(x.right), contentToViewY(x.bottom));
+ }
+
+ // stop the scroll animation, and don't let a subsequent fling add
+ // to the existing velocity
+ private void abortAnimation() {
+ mScroller.abortAnimation();
+ mLastVelocity = 0;
}
/* call from webcoreview.draw(), so we're still executing in the UI thread
@@ -1819,7 +1884,7 @@
mScrollY = pinLocY(mScrollY);
// android.util.Log.d("skia", "recordNewContentSize -
// abortAnimation");
- mScroller.abortAnimation(); // just in case
+ abortAnimation(); // just in case
if (oldX != mScrollX || oldY != mScrollY) {
sendOurVisibleRect();
}
@@ -1924,10 +1989,10 @@
// Sets r to be our visible rectangle in content coordinates
private void calcOurContentVisibleRect(Rect r) {
calcOurVisibleRect(r);
- r.left = viewToContent(r.left);
- r.top = viewToContent(r.top);
- r.right = viewToContent(r.right);
- r.bottom = viewToContent(r.bottom);
+ r.left = viewToContentX(r.left);
+ r.top = viewToContentY(r.top);
+ r.right = viewToContentX(r.right);
+ r.bottom = viewToContentY(r.bottom);
}
static class ViewSizeData {
@@ -1984,7 +2049,7 @@
if (mDrawHistory) {
return mHistoryWidth;
} else {
- return contentToView(mContentWidth);
+ return contentToViewDimension(mContentWidth);
}
}
@@ -1996,7 +2061,7 @@
if (mDrawHistory) {
return mHistoryHeight;
} else {
- int height = contentToView(mContentHeight);
+ int height = contentToViewDimension(mContentHeight);
if (mFindIsUp) {
height += FIND_HEIGHT;
}
@@ -2004,6 +2069,25 @@
}
}
+ @Override
+ protected int computeVerticalScrollOffset() {
+ return Math.max(mScrollY - getTitleHeight(), 0);
+ }
+
+ @Override
+ protected int computeVerticalScrollExtent() {
+ return getViewHeight();
+ }
+
+ /** @hide */
+ @Override
+ protected void onDrawVerticalScrollBar(Canvas canvas,
+ Drawable scrollBar,
+ int l, int t, int r, int b) {
+ scrollBar.setBounds(l, t + getVisibleTitleHeight(), r, b);
+ scrollBar.draw(canvas);
+ }
+
/**
* Get the url for the current page. This is not always the same as the url
* passed to WebViewClient.onPageStarted because although the load for
@@ -2339,7 +2423,7 @@
animationDuration > 0 ? animationDuration : computeDuration(dx, dy));
invalidate();
} else {
- mScroller.abortAnimation(); // just in case
+ abortAnimation(); // just in case
scrollTo(x, y);
}
return true;
@@ -2355,8 +2439,8 @@
// keys are hit, this should be safe. Right?
return false;
}
- cx = contentToView(cx);
- cy = contentToView(cy);
+ cx = contentToViewDimension(cx);
+ cy = contentToViewDimension(cy);
if (mHeightCanMeasure) {
// move our visible rect according to scroll request
if (cy != 0) {
@@ -2388,8 +2472,8 @@
// saved scroll position, it is ok to skip this.
return false;
}
- int vx = contentToView(cx);
- int vy = contentToView(cy);
+ int vx = contentToViewX(cx);
+ int vy = contentToViewY(cy);
// Log.d(LOGTAG, "content scrollTo [" + cx + " " + cy + "] view=[" +
// vx + " " + vy + "]");
pinScrollTo(vx, vy, false, 0);
@@ -2407,8 +2491,8 @@
// is used in the view system.
return;
}
- int vx = contentToView(cx);
- int vy = contentToView(cy);
+ int vx = contentToViewX(cx);
+ int vy = contentToViewY(cy);
pinScrollTo(vx, vy, true, 0);
}
@@ -2425,12 +2509,12 @@
}
if (mHeightCanMeasure) {
- if (getMeasuredHeight() != contentToView(mContentHeight)
+ if (getMeasuredHeight() != contentToViewDimension(mContentHeight)
&& updateLayout) {
requestLayout();
}
} else if (mWidthCanMeasure) {
- if (getMeasuredWidth() != contentToView(mContentWidth)
+ if (getMeasuredWidth() != contentToViewDimension(mContentWidth)
&& updateLayout) {
requestLayout();
}
@@ -2572,7 +2656,22 @@
}
@Override
+ protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+ if (child == mTitleBar) {
+ // When drawing the title bar, move it horizontally to always show
+ // at the top of the WebView.
+ mTitleBar.offsetLeftAndRight(mScrollX - mTitleBar.getLeft());
+ }
+ return super.drawChild(canvas, child, drawingTime);
+ }
+
+ @Override
protected void onDraw(Canvas canvas) {
+ int saveCount = canvas.getSaveCount();
+ if (mTitleBar != null) {
+ canvas.save();
+ canvas.translate(0, (int) mTitleBar.getHeight());
+ }
// if mNativeClass is 0, the WebView has been destroyed. Do nothing.
if (mNativeClass == 0) {
return;
@@ -2586,7 +2685,7 @@
mTouchMode = TOUCH_DONE_MODE;
}
}
- int sc = canvas.save();
+ canvas.save();
if (mTouchMode >= FIRST_SCROLL_ZOOM && mTouchMode <= LAST_SCROLL_ZOOM) {
scrollZoomDraw(canvas);
} else {
@@ -2603,7 +2702,7 @@
|| mTrackballDown || mGotCenterDown, false);
drawCoreAndCursorRing(canvas, mBackgroundColor, mDrawCursorRing);
}
- canvas.restoreToCount(sc);
+ canvas.restoreToCount(saveCount);
if (AUTO_REDRAW_HACK && mAutoRedraw) {
invalidate();
@@ -2635,6 +2734,15 @@
}
}
+ /**
+ * Need to adjust the WebTextView after a change in zoom, since mActualScale
+ * has changed. This is especially important for password fields, which are
+ * drawn by the WebTextView, since it conveys more information than what
+ * webkit draws. Thus we need to reposition it to show in the correct
+ * place.
+ */
+ private boolean mNeedToAdjustWebTextView;
+
private void drawCoreAndCursorRing(Canvas canvas, int color,
boolean drawCursorRing) {
if (mDrawHistory) {
@@ -2658,6 +2766,20 @@
zoomScale = mZoomScale;
// set mZoomScale to be 0 as we have done animation
mZoomScale = 0;
+ if (mNeedToAdjustWebTextView) {
+ mNeedToAdjustWebTextView = false;
+ mWebTextView.setTextSize(contentToViewDimension(
+ nativeFocusCandidateTextSize()));
+ Rect bounds = nativeFocusCandidateNodeBounds();
+ Rect vBox = contentToView(bounds);
+ mWebTextView.setRect(vBox.left, vBox.top, vBox.width(),
+ vBox.height());
+ // If it is a password field, start drawing the
+ // WebTextView once again.
+ if (nativeFocusCandidateIsPassword()) {
+ mWebTextView.setInPassword(true);
+ }
+ }
}
float scale = zoomScale * mInvInitialZoomScale;
int tx = Math.round(scale * (mInitialScrollX + mZoomCenterX)
@@ -2670,6 +2792,17 @@
* zoomScale)) + mScrollY;
canvas.translate(tx, ty);
canvas.scale(zoomScale, zoomScale);
+ if (inEditingMode() && !mNeedToAdjustWebTextView
+ && mZoomScale != 0) {
+ // The WebTextView is up. Keep track of this so we can adjust
+ // its size and placement when we finish zooming
+ mNeedToAdjustWebTextView = true;
+ // If it is in password mode, turn it off so it does not draw
+ // misplaced.
+ if (nativeFocusCandidateIsPassword()) {
+ mWebTextView.setInPassword(false);
+ }
+ }
} else {
canvas.scale(mActualScale, mActualScale);
}
@@ -2963,7 +3096,7 @@
mLastTouchX = halfW;
int halfH = height >> 1;
mLastTouchY = halfH;
- mScroller.abortAnimation();
+ abortAnimation();
mZoomScrollStart = System.currentTimeMillis();
Rect zoomFrame = scrollZoomFrame(width, height
, scrollZoomMagScale(mZoomScrollInvLimit));
@@ -3200,7 +3333,7 @@
// Initialize our generation number.
mTextGeneration = 0;
}
- mWebTextView.setTextSize(contentToView(nativeFocusCandidateTextSize()));
+ mWebTextView.setTextSize(contentToViewDimension(nativeFocusCandidateTextSize()));
Rect visibleRect = new Rect();
calcOurContentVisibleRect(visibleRect);
// Note that sendOurVisibleRect calls viewToContent, so the coordinates
@@ -3360,8 +3493,8 @@
mShiftIsPressed = true;
if (nativeHasCursorNode()) {
Rect rect = nativeCursorNodeBounds();
- mSelectX = contentToView(rect.left);
- mSelectY = contentToView(rect.top);
+ mSelectX = contentToViewX(rect.left);
+ mSelectY = contentToViewY(rect.top);
} else {
mSelectX = mScrollX + (int) mLastTouchX;
mSelectY = mScrollY + (int) mLastTouchY;
@@ -3748,12 +3881,6 @@
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
- if (mViewingMode == READING_MODE_WITH_TITLE_BAR
- || mViewingMode == TITLE_BAR_DISMISS_MODE) {
- mViewingMode = READING_MODE;
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
- }
-
sendOurVisibleRect();
}
@@ -3830,8 +3957,8 @@
eventTime - mLastSentTouchTime > TOUCH_SENT_INTERVAL)) {
WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
ted.mAction = action;
- ted.mX = viewToContent((int) x + mScrollX);
- ted.mY = viewToContent((int) y + mScrollY);
+ ted.mX = viewToContentX((int) x + mScrollX);
+ ted.mY = viewToContentY((int) y + mScrollY);
mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
mLastSentTouchTime = eventTime;
}
@@ -3850,6 +3977,9 @@
mLastScrollY = mZoomScrollY;
// If two taps are close, ignore the first tap
} else if (!mScroller.isFinished()) {
+ // stop the current scroll animation, but if this is
+ // the start of a fling, allow it to add to the current
+ // fling's velocity
mScroller.abortAnimation();
mTouchMode = TOUCH_DRAG_START_MODE;
mPrivateHandler.removeMessages(RESUME_WEBCORE_UPDATE);
@@ -3860,8 +3990,8 @@
if (DebugFlags.WEB_VIEW) {
Log.v(LOGTAG, "select=" + mSelectX + "," + mSelectY);
}
- nativeMoveSelection(viewToContent(mSelectX)
- , viewToContent(mSelectY), false);
+ nativeMoveSelection(viewToContentX(mSelectX),
+ viewToContentY(mSelectY), false);
mTouchSelection = mExtendSelection = true;
} else if (mPrivateHandler.hasMessages(RELEASE_SINGLE_TAP)) {
mPrivateHandler.removeMessages(RELEASE_SINGLE_TAP);
@@ -3917,8 +4047,8 @@
if (DebugFlags.WEB_VIEW) {
Log.v(LOGTAG, "xtend=" + mSelectX + "," + mSelectY);
}
- nativeMoveSelection(viewToContent(mSelectX)
- , viewToContent(mSelectY), true);
+ nativeMoveSelection(viewToContentX(mSelectX),
+ viewToContentY(mSelectY), true);
invalidate();
break;
}
@@ -3968,13 +4098,6 @@
deltaY = newScrollY - mScrollY;
boolean done = false;
if (deltaX == 0 && deltaY == 0) {
- // The user attempted to pan the page, so dismiss the title
- // bar
- if (mViewingMode == READING_MODE_WITH_TITLE_BAR
- || mViewingMode == TITLE_BAR_DISMISS_MODE) {
- mViewingMode = READING_MODE;
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
- }
done = true;
} else {
if (mSnapScrollMode == SNAP_X || mSnapScrollMode == SNAP_Y) {
@@ -4110,6 +4233,7 @@
doFling();
break;
}
+ mLastVelocity = 0;
WebViewCore.resumeUpdate(mWebViewCore);
break;
case TOUCH_DRAG_START_MODE:
@@ -4293,8 +4417,8 @@
+ " yRate=" + yRate
);
}
- nativeMoveSelection(viewToContent(mSelectX)
- , viewToContent(mSelectY), mExtendSelection);
+ nativeMoveSelection(viewToContentX(mSelectX),
+ viewToContentY(mSelectY), mExtendSelection);
int scrollX = mSelectX < mScrollX ? -SELECT_CURSOR_OFFSET
: mSelectX > maxX - SELECT_CURSOR_OFFSET ? SELECT_CURSOR_OFFSET
: 0;
@@ -4443,9 +4567,15 @@
}
}
+ private int computeMaxScrollY() {
+ int maxContentH = contentToViewDimension(mContentHeight)
+ + getTitleHeight();
+ return Math.max(maxContentH - getHeight(), 0);
+ }
+
public void flingScroll(int vx, int vy) {
int maxX = Math.max(computeHorizontalScrollRange() - getViewWidth(), 0);
- int maxY = Math.max(computeVerticalScrollRange() - getViewHeight(), 0);
+ int maxY = computeMaxScrollY();
mScroller.fling(mScrollX, mScrollY, vx, vy, 0, maxX, 0, maxY);
invalidate();
@@ -4456,7 +4586,7 @@
return;
}
int maxX = Math.max(computeHorizontalScrollRange() - getViewWidth(), 0);
- int maxY = Math.max(computeVerticalScrollRange() - getViewHeight(), 0);
+ int maxY = computeMaxScrollY();
mVelocityTracker.computeCurrentVelocity(1000, mMaximumFling);
int vx = (int) mVelocityTracker.getXVelocity();
@@ -4475,6 +4605,27 @@
vx = vx * 3 / 4;
vy = vy * 3 / 4;
}
+ float currentVelocity = mScroller.getCurrVelocity();
+ if (mLastVelocity > 0 && currentVelocity > 0) {
+ float deltaR = (float) (Math.abs(Math.atan2(mLastVelY, mLastVelX)
+ - Math.atan2(vy, vx)));
+ final float circle = (float) (Math.PI) * 2.0f;
+ if (deltaR > circle * 0.9f || deltaR < circle * 0.1f) {
+ vx += currentVelocity * mLastVelX / mLastVelocity;
+ vy += currentVelocity * mLastVelY / mLastVelocity;
+ if (DebugFlags.WEB_VIEW) {
+ Log.v(LOGTAG, "doFling vx= " + vx + " vy=" + vy);
+ }
+ } else if (DebugFlags.WEB_VIEW) {
+ Log.v(LOGTAG, "doFling missed " + deltaR / circle);
+ }
+ } else if (DebugFlags.WEB_VIEW) {
+ Log.v(LOGTAG, "doFling start last=" + mLastVelocity
+ + " current=" + currentVelocity);
+ }
+ mLastVelX = vx;
+ mLastVelY = vy;
+ mLastVelocity = (float) Math.hypot(vx, vy);
mScroller.fling(mScrollX, mScrollY, -vx, -vy, 0, maxX, 0, maxY);
// TODO: duration is calculated based on velocity, if the range is
@@ -4652,8 +4803,8 @@
return;
}
// mLastTouchX and mLastTouchY are the point in the current viewport
- int contentX = viewToContent((int) mLastTouchX + mScrollX);
- int contentY = viewToContent((int) mLastTouchY + mScrollY);
+ int contentX = viewToContentX((int) mLastTouchX + mScrollX);
+ int contentY = viewToContentY((int) mLastTouchY + mScrollY);
Rect rect = new Rect(contentX - mNavSlop, contentY - mNavSlop,
contentX + mNavSlop, contentY + mNavSlop);
nativeSelectBestAt(rect);
@@ -4668,8 +4819,8 @@
if (!inEditingMode() || mWebViewCore == null) {
return;
}
- mWebViewCore.sendMessage(EventHub.SCROLL_TEXT_INPUT, viewToContent(x),
- viewToContent(y));
+ mWebViewCore.sendMessage(EventHub.SCROLL_TEXT_INPUT, viewToContentX(x),
+ viewToContentY(y));
}
/**
@@ -4683,7 +4834,7 @@
mLastTouchY = y + (float) (mWebTextView.getTop() - mScrollY);
mLastTouchTime = eventTime;
if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
+ abortAnimation();
mPrivateHandler.removeMessages(RESUME_WEBCORE_UPDATE);
}
mSnapScrollMode = SNAP_NONE;
@@ -4716,16 +4867,16 @@
if (!inEditingMode()) {
return;
}
- int x = viewToContent((int) event.getX() + mWebTextView.getLeft());
- int y = viewToContent((int) event.getY() + mWebTextView.getTop());
+ int x = viewToContentX((int) event.getX() + mWebTextView.getLeft());
+ int y = viewToContentY((int) event.getY() + mWebTextView.getTop());
nativeTextInputMotionUp(x, y);
}
/*package*/ void shortPressOnTextField() {
if (inEditingMode()) {
View v = mWebTextView;
- int x = viewToContent((v.getLeft() + v.getRight()) >> 1);
- int y = viewToContent((v.getTop() + v.getBottom()) >> 1);
+ int x = viewToContentX((v.getLeft() + v.getRight()) >> 1);
+ int y = viewToContentY((v.getTop() + v.getBottom()) >> 1);
nativeTextInputMotionUp(x, y);
}
}
@@ -4736,8 +4887,8 @@
}
switchOutDrawHistory();
// mLastTouchX and mLastTouchY are the point in the current viewport
- int contentX = viewToContent((int) mLastTouchX + mScrollX);
- int contentY = viewToContent((int) mLastTouchY + mScrollY);
+ int contentX = viewToContentX((int) mLastTouchX + mScrollX);
+ int contentY = viewToContentY((int) mLastTouchY + mScrollY);
if (nativeMotionUp(contentX, contentY, mNavSlop)) {
if (mLogEvent) {
Checkin.updateStats(mContext.getContentResolver(),
@@ -4749,42 +4900,13 @@
}
}
- /**
- * Called when the Tabs are used to slide this WebView's tab into view.
- * @hide
- */
- public void slideIntoFocus() {
- if (mViewingMode == READING_MODE) {
- if (!mMobileSite || (mScrollX | mScrollY) != 0) {
- mViewingMode = READING_MODE_WITH_TITLE_BAR;
- } else {
- mViewingMode = TITLE_BAR_DISMISS_MODE;
- }
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
- }
- }
-
private void doDoubleTap() {
- if (mWebViewCore.getSettings().getUseWideViewPort() == false ||
- mViewingMode == NO_VIEWING_MODE) {
+ if (mWebViewCore.getSettings().getUseWideViewPort() == false) {
return;
}
- if (mViewingMode == TITLE_BAR_DISMISS_MODE) {
- mViewingMode = READING_MODE;
- // mInZoomOverview will not change, so change the viewing mode
- // and return
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
- return;
- }
- if (mViewingMode == READING_MODE_WITH_TITLE_BAR && mMobileSite) {
- scrollTo(0,0);
- }
- // READING_MODE_WITH_TITLE_BAR will go to OVERVIEW_MODE here.
mZoomCenterX = mLastTouchX;
mZoomCenterY = mLastTouchY;
mInZoomOverview = !mInZoomOverview;
- mViewingMode = mInZoomOverview ? OVERVIEW_MODE : READING_MODE;
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
// remove the zoom control after double tap
if (getSettings().getBuiltInZoomControls()) {
if (mZoomButtonsController.isVisible()) {
@@ -4802,8 +4924,8 @@
zoomWithPreview((float) getViewWidth() / mZoomOverviewWidth);
} else {
// mLastTouchX and mLastTouchY are the point in the current viewport
- int contentX = viewToContent((int) mLastTouchX + mScrollX);
- int contentY = viewToContent((int) mLastTouchY + mScrollY);
+ int contentX = viewToContentX((int) mLastTouchX + mScrollX);
+ int contentY = viewToContentY((int) mLastTouchY + mScrollY);
int left = nativeGetBlockLeftEdge(contentX, contentY, mActualScale);
if (left != NO_LEFTEDGE) {
// add a 5pt padding to the left edge. Re-calculate the zoom
@@ -4880,8 +5002,8 @@
int measuredWidth = widthSize;
// Grab the content size from WebViewCore.
- int contentHeight = mContentHeight;
- int contentWidth = mContentWidth;
+ int contentHeight = Math.round(mContentHeight * mActualScale);
+ int contentWidth = Math.round(mContentWidth * mActualScale);
// Log.d(LOGTAG, "------- measure " + heightMode);
@@ -5118,8 +5240,19 @@
mInZoomOverview = false;
mLastScale = restoreState.mTextWrapScale;
if (restoreState.mMinScale == 0) {
- mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
- mMinZoomScaleFixed = false;
+ if (restoreState.mMobileSite) {
+ if (draw.mMinPrefWidth > draw.mViewPoint.x) {
+ mMinZoomScale = (float) viewWidth
+ / draw.mMinPrefWidth;
+ mMinZoomScaleFixed = false;
+ } else {
+ mMinZoomScale = mDefaultScale;
+ mMinZoomScaleFixed = true;
+ }
+ } else {
+ mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
+ mMinZoomScaleFixed = false;
+ }
} else {
mMinZoomScale = restoreState.mMinScale;
mMinZoomScaleFixed = true;
@@ -5132,24 +5265,14 @@
setNewZoomScale(mLastScale, false);
setContentScrollTo(restoreState.mScrollX,
restoreState.mScrollY);
- if (!ENABLE_DOUBLETAP_ZOOM
- || !settings.getLoadWithOverviewMode()) {
- mMobileSite = false;
- mViewingMode = NO_VIEWING_MODE;
- } else {
- mMobileSite = restoreState.mMobileSite;
- if (useWideViewport
- && restoreState.mViewScale == 0) {
- mViewingMode = OVERVIEW_MODE;
+ if (ENABLE_DOUBLETAP_ZOOM && useWideViewport
+ && settings.getLoadWithOverviewMode()) {
+ if (restoreState.mViewScale == 0
+ || (restoreState.mMobileSite
+ && mMinZoomScale < mDefaultScale)) {
mInZoomOverview = true;
- } else if (mMobileSite
- && (mScrollX | mScrollY) == 0) {
- mViewingMode = TITLE_BAR_DISMISS_MODE;
- } else {
- mViewingMode = READING_MODE_WITH_TITLE_BAR;
}
}
- mCallbackProxy.uiOnChangeViewingMode(mViewingMode);
// As we are on a new page, remove the WebTextView. This
// is necessary for page loads driven by webkit, and in
// particular when the user was on a password field, so
@@ -5613,7 +5736,7 @@
width = visRect.width() / 2;
}
// FIXME the divisor should be retrieved from somewhere
- return viewToContent(width);
+ return viewToContentX(width);
}
private int getScaledMaxYScroll() {
@@ -5628,7 +5751,7 @@
// FIXME the divisor should be retrieved from somewhere
// the closest thing today is hard-coded into ScrollView.java
// (from ScrollView.java, line 363) int maxJump = height/2;
- return viewToContent(height);
+ return viewToContentY(height);
}
/**
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index a185779..30dea74 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -92,14 +92,46 @@
cancelMsg.sendToTarget();
}
+ // These ints must match up to the hidden values in EventHandler.
+ /** Generic error */
+ public static final int ERROR_UNKNOWN = -1;
+ /** Server or proxy hostname lookup failed */
+ public static final int ERROR_HOST_LOOKUP = -2;
+ /** Unsupported authentication scheme (not basic or digest) */
+ public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3;
+ /** User authentication failed on server */
+ public static final int ERROR_AUTHENTICATION = -4;
+ /** User authentication failed on proxy */
+ public static final int ERROR_PROXY_AUTHENTICATION = -5;
+ /** Failed to connect to the server */
+ public static final int ERROR_CONNECT = -6;
+ /** Failed to read or write to the server */
+ public static final int ERROR_IO = -7;
+ /** Connection timed out */
+ public static final int ERROR_TIMEOUT = -8;
+ /** Too many redirects */
+ public static final int ERROR_REDIRECT_LOOP = -9;
+ /** Unsupported URI scheme */
+ public static final int ERROR_UNSUPPORTED_SCHEME = -10;
+ /** Failed to perform SSL handshake */
+ public static final int ERROR_FAILED_SSL_HANDSHAKE = -11;
+ /** Malformed URL */
+ public static final int ERROR_BAD_URL = -12;
+ /** Generic file error */
+ public static final int ERROR_FILE = -13;
+ /** File not found */
+ public static final int ERROR_FILE_NOT_FOUND = -14;
+ /** Too many requests during this load */
+ public static final int ERROR_TOO_MANY_REQUESTS = -15;
+
/**
- * Report an error to an activity. These errors come up from WebCore, and
- * are network errors.
- *
+ * Report an error to the host application. These errors are unrecoverable
+ * (i.e. the main resource is unavailable). The errorCode parameter
+ * corresponds to one of the ERROR_* constants.
* @param view The WebView that is initiating the callback.
- * @param errorCode The HTTP error code.
- * @param description A String description.
- * @param failingUrl The url that failed.
+ * @param errorCode The error code corresponding to an ERROR_* value.
+ * @param description A String describing the error.
+ * @param failingUrl The url that failed to load.
*/
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index f474f15..26d9343 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -36,6 +36,8 @@
import android.view.SurfaceView;
import java.util.ArrayList;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import junit.framework.Assert;
@@ -67,7 +69,8 @@
private int mNativeClass;
// The BrowserFrame is an interface to the native Frame component.
private BrowserFrame mBrowserFrame;
-
+ // Custom JS interfaces to add during the initialization.
+ private Map<String, Object> mJavascriptInterfaces;
/*
* range is from 200 to 10,000. 0 is a special value means device-width. -1
* means undefined.
@@ -113,10 +116,12 @@
// debugging other classes that require operation within the WebCore thread.
/* package */ static final String THREAD_NAME = "WebViewCoreThread";
- public WebViewCore(Context context, WebView w, CallbackProxy proxy) {
+ public WebViewCore(Context context, WebView w, CallbackProxy proxy,
+ Map<String, Object> javascriptInterfaces) {
// No need to assign this in the WebCore thread.
mCallbackProxy = proxy;
mWebView = w;
+ mJavascriptInterfaces = javascriptInterfaces;
// This context object is used to initialize the WebViewCore during
// subwindow creation.
mContext = context;
@@ -164,7 +169,8 @@
* in turn creates a C level FrameView and attaches it to the frame.
*/
mBrowserFrame = new BrowserFrame(mContext, this, mCallbackProxy,
- mSettings);
+ mSettings, mJavascriptInterfaces);
+ mJavascriptInterfaces = null;
// Sync the native settings and also create the WebCore thread handler.
mSettings.syncSettingsAndCreateHandler(mBrowserFrame);
// Create the handler and transfer messages for the IconDatabase
@@ -1244,6 +1250,18 @@
}
}
+ private synchronized boolean hasMessages(int what) {
+ if (mBlockMessages) {
+ return false;
+ }
+ if (mMessages != null) {
+ Log.w(LOGTAG, "hasMessages() is not supported in this case.");
+ return false;
+ } else {
+ return mHandler.hasMessages(what);
+ }
+ }
+
private synchronized void sendMessageDelayed(Message msg, long delay) {
if (mBlockMessages) {
return;
@@ -1355,9 +1373,22 @@
// We don't want anyone to post a message between removing pending
// messages and sending the destroy message.
synchronized (mEventHub) {
+ // RESUME_TIMERS and PAUSE_TIMERS are per process base. They need to
+ // be preserved even the WebView is destroyed.
+ // Note: we should not have more than one RESUME_TIMERS/PAUSE_TIMERS
+ boolean hasResume = mEventHub.hasMessages(EventHub.RESUME_TIMERS);
+ boolean hasPause = mEventHub.hasMessages(EventHub.PAUSE_TIMERS);
mEventHub.removeMessages();
mEventHub.sendMessageAtFrontOfQueue(
Message.obtain(null, EventHub.DESTROY));
+ if (hasPause) {
+ mEventHub.sendMessageAtFrontOfQueue(
+ Message.obtain(null, EventHub.PAUSE_TIMERS));
+ }
+ if (hasResume) {
+ mEventHub.sendMessageAtFrontOfQueue(
+ Message.obtain(null, EventHub.RESUME_TIMERS));
+ }
mEventHub.blockMessages();
mWebView = null;
}
@@ -1541,7 +1572,10 @@
// layout.
draw.mViewPoint = new Point(mCurrentViewWidth, mCurrentViewHeight);
if (WebView.ENABLE_DOUBLETAP_ZOOM && mSettings.getUseWideViewPort()) {
- draw.mMinPrefWidth = Math.max(DEFAULT_VIEWPORT_WIDTH,
+ draw.mMinPrefWidth = Math.max(
+ mViewportWidth == -1 ? DEFAULT_VIEWPORT_WIDTH
+ : (mViewportWidth == 0 ? mCurrentViewWidth
+ : mViewportWidth),
nativeGetContentMinPrefWidth());
}
if (mRestoreState != null) {
@@ -1828,9 +1862,6 @@
if (mViewportInitialScale == 0) {
mViewportInitialScale = WebView.DEFAULT_SCALE_PERCENT;
}
- if (mViewportMinimumScale == 0) {
- mViewportMinimumScale = WebView.DEFAULT_SCALE_PERCENT;
- }
}
if (mViewportUserScalable == false) {
mViewportInitialScale = WebView.DEFAULT_SCALE_PERCENT;
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index b179a13..2f28d9f 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -651,6 +651,7 @@
if (mProgress > max) {
mProgress = max;
+ refreshProgress(R.id.progress, mProgress, false);
}
}
}
diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java
index 381641f..11dab02 100644
--- a/core/java/android/widget/Scroller.java
+++ b/core/java/android/widget/Scroller.java
@@ -133,6 +133,17 @@
}
/**
+ * @hide
+ * Returns the current velocity.
+ *
+ * @return The original velocity less the deceleration. Result may be
+ * negative.
+ */
+ public float getCurrVelocity() {
+ return mVelocity - mDeceleration * timePassed() / 2000.0f;
+ }
+
+ /**
* Returns the start X offset in the scroll.
*
* @return The start X offset as an absolute distance from the origin.
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 8486272..4e6f9ca 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -83,7 +83,7 @@
Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());
int hasQwerty = getQwertyKeyboard();
-
+
if (Config.LOGV) Log.d(TAG, ">>>>> qwerty keyboard = " + hasQwerty);
if (hasQwerty == 1) {
System.setProperty("qwerty", "1");
@@ -133,13 +133,13 @@
* @param className Fully-qualified class name
* @param argv Argument vector for main()
*/
- private static void invokeStaticMain(String className, String[] argv)
+ private static void invokeStaticMain(String className, String[] argv)
throws ZygoteInit.MethodAndArgsCaller {
-
+
// We want to be fairly aggressive about heap utilization, to avoid
// holding on to a lot of memory that isn't needed.
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
-
+
Class<?> cl;
try {
@@ -178,7 +178,7 @@
public static final void main(String[] argv) {
commonInit();
-
+
/*
* Now that we're running in interpreted code, call back into native code
* to run the system.
@@ -187,7 +187,7 @@
if (Config.LOGV) Log.d(TAG, "Leaving RuntimeInit!");
}
-
+
public static final native void finishInit();
/**
@@ -236,7 +236,7 @@
}
// Remaining arguments are passed to the start class's static main
-
+
String startClass = argv[curArg++];
String[] startArgs = new String[argv.length - curArg];
@@ -245,28 +245,28 @@
}
public static final native void zygoteInitNative();
-
+
/**
* Returns 1 if the computer is on. If the computer isn't on, the value returned by this method is undefined.
*/
public static final native int isComputerOn();
/**
- * Turns the computer on if the computer is off. If the computer is on, the behavior of this method is undefined.
+ * Turns the computer on if the computer is off. If the computer is on, the behavior of this method is undefined.
*/
public static final native void turnComputerOn();
/**
- *
+ *
* @return 1 if the device has a qwerty keyboard
*/
public static native int getQwertyKeyboard();
-
+
/**
* Report a fatal error in the current process. If this is a user-process,
* a dialog may be displayed informing the user of the error. This
* function does not return; it forces the current process to exit.
- *
+ *
* @param tag to use when logging the error
* @param t exception that was generated by the error
*/
@@ -405,7 +405,7 @@
/**
* Replay an encoded CrashData record back into a useable CrashData record. This can be
* helpful for providing debugging output after a process error.
- *
+ *
* @param crashDataBytes The byte array containing the encoded crash record
* @return new CrashData record, or null if could not create one.
*/
diff --git a/core/java/com/android/internal/os/SamplingProfilerIntegration.java b/core/java/com/android/internal/os/SamplingProfilerIntegration.java
new file mode 100644
index 0000000..44bcd16
--- /dev/null
+++ b/core/java/com/android/internal/os/SamplingProfilerIntegration.java
@@ -0,0 +1,144 @@
+package com.android.internal.os;
+
+import dalvik.system.SamplingProfiler;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import android.util.Log;
+import android.os.*;
+import android.net.Uri;
+
+/**
+ * Integrates the framework with Dalvik's sampling profiler.
+ */
+public class SamplingProfilerIntegration {
+
+ private static final String TAG = "SamplingProfilerIntegration";
+
+ private static final boolean enabled;
+ private static final Executor snapshotWriter;
+ static {
+ enabled = "1".equals(SystemProperties.get("persist.sampling_profiler"));
+ if (enabled) {
+ snapshotWriter = Executors.newSingleThreadExecutor();
+ Log.i(TAG, "Profiler is enabled.");
+ } else {
+ snapshotWriter = null;
+ Log.i(TAG, "Profiler is disabled.");
+ }
+ }
+
+ /**
+ * Is profiling enabled?
+ */
+ public static boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * Starts the profiler if profiling is enabled.
+ */
+ public static void start() {
+ if (!enabled) return;
+ SamplingProfiler.getInstance().start(10);
+ }
+
+ /** Whether or not we've created the snapshots dir. */
+ static boolean dirMade = false;
+
+ /** Whether or not a snapshot is being persisted. */
+ static volatile boolean pending;
+
+ /**
+ * Writes a snapshot to the SD card if profiling is enabled.
+ */
+ public static void writeSnapshot(final String name) {
+ if (!enabled) return;
+
+ if (!pending) {
+ pending = true;
+ snapshotWriter.execute(new Runnable() {
+ public void run() {
+ String dir = "/sdcard/snapshots";
+ if (!dirMade) {
+ makeDirectory(dir);
+ dirMade = true;
+ }
+ try {
+ writeSnapshot(dir, name);
+ } finally {
+ pending = false;
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * Writes the zygote's snapshot to internal storage if profiling is enabled.
+ */
+ public static void writeZygoteSnapshot() {
+ if (!enabled) return;
+
+ String dir = "/data/zygote/snapshots";
+ makeDirectory(dir);
+ writeSnapshot(dir, "zygote");
+ }
+
+ private static void writeSnapshot(String dir, String name) {
+ byte[] snapshot = SamplingProfiler.getInstance().snapshot();
+ if (snapshot == null) {
+ return;
+ }
+
+ /*
+ * We use the current time as a unique ID. We can't use a counter
+ * because processes restart. This could result in some overlap if
+ * we capture two snapshots in rapid succession.
+ */
+ long start = System.currentTimeMillis();
+ String path = dir + "/" + name.replace(':', '.') + "-"
+ + System.currentTimeMillis() + ".snapshot";
+ try {
+ // Try to open the file a few times. The SD card may not be mounted.
+ FileOutputStream out;
+ int count = 0;
+ while (true) {
+ try {
+ out = new FileOutputStream(path);
+ break;
+ } catch (FileNotFoundException e) {
+ if (++count > 3) {
+ Log.e(TAG, "Could not open " + path + ".");
+ return;
+ }
+
+ // Sleep for a bit and then try again.
+ try {
+ Thread.sleep(2500);
+ } catch (InterruptedException e1) { /* ignore */ }
+ }
+ }
+
+ try {
+ out.write(snapshot);
+ } finally {
+ out.close();
+ }
+ long elapsed = System.currentTimeMillis() - start;
+ Log.i(TAG, "Wrote snapshot for " + name
+ + " in " + elapsed + "ms.");
+ } catch (IOException e) {
+ Log.e(TAG, "Error writing snapshot.", e);
+ }
+ }
+
+ private static void makeDirectory(String dir) {
+ new File(dir).mkdirs();
+ }
+}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index a2d3cd8..404c513 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -19,7 +19,6 @@
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
-import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.net.LocalServerSocket;
import android.os.Debug;
@@ -31,6 +30,7 @@
import dalvik.system.VMRuntime;
import dalvik.system.Zygote;
+import dalvik.system.SamplingProfiler;
import java.io.BufferedReader;
import java.io.FileDescriptor;
@@ -73,7 +73,7 @@
* never gets destroyed.
*/
private static Resources mResources;
-
+
/**
* The number of times that the main Zygote loop
* should run before calling gc() again.
@@ -192,7 +192,7 @@
* RuntimeException on failure.
*/
private static ZygoteConnection acceptCommandPeer() {
- try {
+ try {
return new ZygoteConnection(sServerSocket.accept());
} catch (IOException ex) {
throw new RuntimeException(
@@ -251,7 +251,7 @@
*/
private static void preloadClasses() {
final VMRuntime runtime = VMRuntime.getRuntime();
-
+
InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(
PRELOADED_CLASSES);
if (is == null) {
@@ -259,7 +259,7 @@
} else {
Log.i(TAG, "Preloading classes...");
long startTime = SystemClock.uptimeMillis();
-
+
// Drop root perms while running static initializers.
setEffectiveGroup(UNPRIVILEGED_GID);
setEffectiveUser(UNPRIVILEGED_UID);
@@ -275,7 +275,7 @@
Debug.startAllocCounting();
try {
- BufferedReader br
+ BufferedReader br
= new BufferedReader(new InputStreamReader(is), 256);
int count = 0;
@@ -394,7 +394,7 @@
*/
private static void preloadResources() {
final VMRuntime runtime = VMRuntime.getRuntime();
-
+
Debug.startAllocCounting();
try {
runtime.gcSoftReferences();
@@ -527,7 +527,7 @@
/**
* Prepare the arguments and fork for the system server process.
*/
- private static boolean startSystemServer()
+ private static boolean startSystemServer()
throws MethodAndArgsCaller, RuntimeException {
/* Hardcoded command line to start the system server */
String args[] = {
@@ -561,8 +561,8 @@
parsedArgs.gids, debugFlags, null);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
- }
-
+ }
+
/* For child process */
if (pid == 0) {
handleSystemServerProcess(parsedArgs);
@@ -573,6 +573,9 @@
public static void main(String argv[]) {
try {
+ // Start profiling the zygote initialization.
+ SamplingProfilerIntegration.start();
+
registerZygoteSocket();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
@@ -582,6 +585,13 @@
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
+ if (SamplingProfilerIntegration.isEnabled()) {
+ SamplingProfiler sp = SamplingProfiler.getInstance();
+ sp.pause();
+ SamplingProfilerIntegration.writeZygoteSnapshot();
+ sp.shutDown();
+ }
+
// Do an initial gc to clean up after startup
gc();
diff --git a/core/java/com/android/internal/widget/ContactHeaderWidget.java b/core/java/com/android/internal/widget/ContactHeaderWidget.java
index 8bae3e4..4dd289c 100644
--- a/core/java/com/android/internal/widget/ContactHeaderWidget.java
+++ b/core/java/com/android/internal/widget/ContactHeaderWidget.java
@@ -27,12 +27,8 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
import android.os.SystemClock;
-import android.provider.SocialContract;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Intents;
@@ -43,13 +39,11 @@
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.SocialContract.Activities;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.internal.R;
@@ -77,7 +71,6 @@
private QueryHandler mQueryHandler;
protected long mContactId;
- protected Uri mContactSummaryUri;
protected Uri mContactUri;
protected Uri mStatusUri;
@@ -313,17 +306,16 @@
mContactId = contactId;
mContactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, mContactId);
- bindSummaryUri(ContentUris.withAppendedId(Contacts.CONTENT_SUMMARY_URI, mContactId));
+ bindContactUri(mContactUri);
bindSocialUri(ContentUris.withAppendedId(Activities.CONTENT_CONTACT_STATUS_URI, mContactId));
}
/**
* Convenience method for binding {@link Contacts} header details from a
- * {@link Contacts#CONTENT_SUMMARY_URI} reference.
+ * {@link Contacts#CONTENT_URI} reference.
*/
- public void bindSummaryUri(Uri contactSummary) {
- mContactSummaryUri = contactSummary;
- mQueryHandler.startQuery(TOKEN_CONTACT_INFO, null, mContactSummaryUri, HEADER_PROJECTION,
+ public void bindContactUri(Uri contactUri) {
+ mQueryHandler.startQuery(TOKEN_CONTACT_INFO, null, contactUri, HEADER_PROJECTION,
null, null, null);
}
@@ -425,6 +417,11 @@
}
public void onClick(View view) {
+ // Make sure there is a contact
+ if (mContactUri == null) {
+ return;
+ }
+
switch (view.getId()) {
case R.id.star: {
// Toggle "starred" state
diff --git a/core/jni/android_bluetooth_BluetoothSocket.cpp b/core/jni/android_bluetooth_BluetoothSocket.cpp
index 0aeaadc..51cf0cb9 100644
--- a/core/jni/android_bluetooth_BluetoothSocket.cpp
+++ b/core/jni/android_bluetooth_BluetoothSocket.cpp
@@ -468,7 +468,7 @@
return -1;
}
-static void closeNative(JNIEnv *env, jobject obj) {
+static void abortNative(JNIEnv *env, jobject obj) {
#ifdef HAVE_BLUETOOTH
LOGV(__FUNCTION__);
struct asocket *s = get_socketData(env, obj);
@@ -510,7 +510,7 @@
{"availableNative", "()I", (void *) availableNative},
{"readNative", "([BII)I", (void *) readNative},
{"writeNative", "([BII)I", (void *) writeNative},
- {"closeNative", "()V", (void *) closeNative},
+ {"abortNative", "()V", (void *) abortNative},
{"destroyNative", "()V", (void *) destroyNative},
};
diff --git a/core/jni/android_location_GpsLocationProvider.cpp b/core/jni/android_location_GpsLocationProvider.cpp
index c329602..4aed277 100755
--- a/core/jni/android_location_GpsLocationProvider.cpp
+++ b/core/jni/android_location_GpsLocationProvider.cpp
@@ -370,14 +370,14 @@
static jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj, jint index, jbyteArray nmeaArray, jint buffer_size)
{
- // this should only be called from within a call to reportStatus, so we don't need to lock here
+ // this should only be called from within a call to reportNmea, so we don't need to lock here
jbyte* nmea = env->GetByteArrayElements(nmeaArray, 0);
- int length = strlen(sNmeaBuffer[index].nmea);
+ int length = strlen(sNmeaBufferCopy[index].nmea);
if (length > buffer_size)
length = buffer_size;
- memcpy(nmea, sNmeaBuffer[index].nmea, length);
+ memcpy(nmea, sNmeaBufferCopy[index].nmea, length);
env->ReleaseByteArrayElements(nmeaArray, nmea, 0);
return length;
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index b4c60f1..3ee404ad 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -200,12 +200,13 @@
fclose(fp);
}
-static void android_os_Debug_getDirtyPages(JNIEnv *env, jobject clazz, jobject object)
+static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz,
+ jint pid, jobject object)
{
stats_t stats;
memset(&stats, 0, sizeof(stats_t));
- load_maps(getpid(), &stats);
+ load_maps(pid, &stats);
env->SetIntField(object, dalvikPss_field, stats.dalvikPss);
env->SetIntField(object, dalvikPrivateDirty_field, stats.dalvikPrivateDirty);
@@ -220,6 +221,11 @@
env->SetIntField(object, otherSharedDirty_field, stats.otherSharedDirty);
}
+static void android_os_Debug_getDirtyPages(JNIEnv *env, jobject clazz, jobject object)
+{
+ android_os_Debug_getDirtyPagesPid(env, clazz, getpid(), object);
+}
+
static jint read_binder_stat(const char* stat)
{
FILE* fp = fopen(BINDER_STATS, "r");
@@ -281,6 +287,8 @@
(void*) android_os_Debug_getNativeHeapFreeSize },
{ "getMemoryInfo", "(Landroid/os/Debug$MemoryInfo;)V",
(void*) android_os_Debug_getDirtyPages },
+ { "getMemoryInfo", "(ILandroid/os/Debug$MemoryInfo;)V",
+ (void*) android_os_Debug_getDirtyPagesPid },
{ "getBinderSentTransactions", "()I",
(void*) android_os_Debug_getBinderSentTransactions },
{ "getBinderReceivedTransactions", "()I",
diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp
index 1bfabd7..8fe7487 100644
--- a/core/jni/android_server_BluetoothEventLoop.cpp
+++ b/core/jni/android_server_BluetoothEventLoop.cpp
@@ -227,37 +227,58 @@
const char * get_adapter_path(DBusConnection *conn) {
- DBusMessage *msg, *reply;
+ DBusMessage *msg, *reply = NULL;
DBusError err;
const char *device_path = NULL;
- msg = dbus_message_new_method_call("org.bluez", "/",
- "org.bluez.Manager", "DefaultAdapter");
- if (!msg) {
- LOGE("%s: Can't allocate new method call for GetProperties!",
- __FUNCTION__);
- return NULL;
- }
- dbus_message_append_args(msg, DBUS_TYPE_INVALID);
+ int attempt = 0;
- dbus_error_init(&err);
- reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
- dbus_message_unref(msg);
-
- if (!reply) {
- if (dbus_error_is_set(&err)) {
- LOG_AND_FREE_DBUS_ERROR(&err);
+ for (attempt = 0; attempt < 1000 && reply == NULL; attempt ++) {
+ msg = dbus_message_new_method_call("org.bluez", "/",
+ "org.bluez.Manager", "DefaultAdapter");
+ if (!msg) {
+ LOGE("%s: Can't allocate new method call for get_adapter_path!",
+ __FUNCTION__);
+ return NULL;
}
- return NULL;
+ dbus_message_append_args(msg, DBUS_TYPE_INVALID);
+ dbus_error_init(&err);
+ reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
+
+ if (!reply) {
+ if (dbus_error_is_set(&err)) {
+ if (dbus_error_has_name(&err,
+ "org.freedesktop.DBus.Error.ServiceUnknown")) {
+ // bluetoothd is still down, retry
+ LOG_AND_FREE_DBUS_ERROR(&err);
+ usleep(10000); // 10 ms
+ continue;
+ } else {
+ // Some other error we weren't expecting
+ LOG_AND_FREE_DBUS_ERROR(&err);
+ }
+ }
+ goto failed;
+ }
}
+ if (attempt == 1000) {
+ LOGE("Time out while trying to get Adapter path, is bluetoothd up ?");
+ goto failed;
+ }
+
if (!dbus_message_get_args(reply, &err, DBUS_TYPE_OBJECT_PATH,
&device_path, DBUS_TYPE_INVALID)
|| !device_path){
if (dbus_error_is_set(&err)) {
LOG_AND_FREE_DBUS_ERROR(&err);
}
- return NULL;
+ goto failed;
}
+ dbus_message_unref(msg);
return device_path;
+
+failed:
+ dbus_message_unref(msg);
+ return NULL;
}
static int register_agent(native_data_t *nat,
@@ -274,6 +295,9 @@
}
nat->adapter = get_adapter_path(nat->conn);
+ if (nat->adapter == NULL) {
+ return -1;
+ }
msg = dbus_message_new_method_call("org.bluez", nat->adapter,
"org.bluez.Adapter", "RegisterAgent");
if (!msg) {
diff --git a/core/jni/android_server_BluetoothService.cpp b/core/jni/android_server_BluetoothService.cpp
index d1901b4..de921f1 100644
--- a/core/jni/android_server_BluetoothService.cpp
+++ b/core/jni/android_server_BluetoothService.cpp
@@ -646,6 +646,7 @@
if (!msg) {
LOGE("%s: Can't allocate new method call for GetProperties!",
__FUNCTION__);
+ env->ReleaseStringUTFChars(key, c_key);
return JNI_FALSE;
}
@@ -701,6 +702,60 @@
#endif
}
+static jboolean setDevicePropertyNative(JNIEnv *env, jobject object, jstring path,
+ jstring key, void *value, jint type) {
+#ifdef HAVE_BLUETOOTH
+ LOGV(__FUNCTION__);
+ native_data_t *nat = get_native_data(env, object);
+ if (nat) {
+ DBusMessage *reply, *msg;
+ DBusMessageIter iter;
+ DBusError err;
+
+ const char *c_key = env->GetStringUTFChars(key, NULL);
+ const char *c_path = env->GetStringUTFChars(path, NULL);
+
+ dbus_error_init(&err);
+ msg = dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,
+ c_path, DBUS_DEVICE_IFACE, "SetProperty");
+ if (!msg) {
+ LOGE("%s: Can't allocate new method call for device SetProperty!", __FUNCTION__);
+ env->ReleaseStringUTFChars(key, c_key);
+ env->ReleaseStringUTFChars(path, c_path);
+ return JNI_FALSE;
+ }
+
+ dbus_message_append_args(msg, DBUS_TYPE_STRING, &c_key, DBUS_TYPE_INVALID);
+ dbus_message_iter_init_append(msg, &iter);
+ append_variant(&iter, type, value);
+
+ reply = dbus_connection_send_with_reply_and_block(nat->conn, msg, -1, &err);
+ dbus_message_unref(msg);
+
+ env->ReleaseStringUTFChars(key, c_key);
+ env->ReleaseStringUTFChars(path, c_path);
+ if (!reply) {
+ if (dbus_error_is_set(&err)) {
+ LOG_AND_FREE_DBUS_ERROR(&err);
+ } else
+ LOGE("DBus reply is NULL in function %s", __FUNCTION__);
+ return JNI_FALSE;
+ }
+ return JNI_TRUE;
+ }
+#endif
+ return JNI_FALSE;
+}
+
+static jboolean setDevicePropertyBooleanNative(JNIEnv *env, jobject object,
+ jstring path, jstring key, jint value) {
+#ifdef HAVE_BLUETOOTH
+ return setDevicePropertyNative(env, object, path, key,
+ (void *)&value, DBUS_TYPE_BOOLEAN);
+#else
+ return JNI_FALSE;
+#endif
+}
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
@@ -740,6 +795,8 @@
{"setPinNative", "(Ljava/lang/String;Ljava/lang/String;I)Z", (void *)setPinNative},
{"cancelPairingUserInputNative", "(Ljava/lang/String;I)Z",
(void *)cancelPairingUserInputNative},
+ {"setDevicePropertyBooleanNative", "(Ljava/lang/String;Ljava/lang/String;I)Z",
+ (void *)setDevicePropertyBooleanNative},
};
int register_android_server_BluetoothService(JNIEnv *env) {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1ea5fa3..53e0125 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1113,6 +1113,7 @@
android:label="@string/android_system_label"
android:allowClearUserData="false"
android:backupAgent="com.android.server.SystemBackupAgent"
+ android:killAfterRestore="false"
android:icon="@drawable/ic_launcher_android">
<activity android:name="com.android.internal.app.ChooserActivity"
android:theme="@style/Theme.Dialog.Alert"
diff --git a/core/res/res/anim/accelerate_decelerate_interpolator.xml b/core/res/res/anim/accelerate_decelerate_interpolator.xml
index 724ed0a..4a0216b 100644
--- a/core/res/res/anim/accelerate_decelerate_interpolator.xml
+++ b/core/res/res/anim/accelerate_decelerate_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<accelerateDecelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"/>
+<accelerateDecelerateInterpolator />
diff --git a/core/res/res/anim/accelerate_interpolator.xml b/core/res/res/anim/accelerate_interpolator.xml
index c689c35..13f87f3 100644
--- a/core/res/res/anim/accelerate_interpolator.xml
+++ b/core/res/res/anim/accelerate_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<accelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android" factor="1" />
+<accelerateInterpolator />
diff --git a/core/res/res/anim/anticipate_interpolator.xml b/core/res/res/anim/anticipate_interpolator.xml
index 50a555a..7a16b5f 100644
--- a/core/res/res/anim/anticipate_interpolator.xml
+++ b/core/res/res/anim/anticipate_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<anticipateInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />
+<anticipateInterpolator />
diff --git a/core/res/res/anim/anticipate_overshoot_interpolator.xml b/core/res/res/anim/anticipate_overshoot_interpolator.xml
index 440a899..d61ddd1 100644
--- a/core/res/res/anim/anticipate_overshoot_interpolator.xml
+++ b/core/res/res/anim/anticipate_overshoot_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<anticipateOvershootInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />
+<anticipateOvershootInterpolator />
diff --git a/core/res/res/anim/bounce_interpolator.xml b/core/res/res/anim/bounce_interpolator.xml
index 406fbb9..d89ba49 100644
--- a/core/res/res/anim/bounce_interpolator.xml
+++ b/core/res/res/anim/bounce_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<bounceInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />
+<bounceInterpolator />
diff --git a/core/res/res/anim/decelerate_interpolator.xml b/core/res/res/anim/decelerate_interpolator.xml
index fff6616..7b29fb3 100644
--- a/core/res/res/anim/decelerate_interpolator.xml
+++ b/core/res/res/anim/decelerate_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android" factor="1" />
+<decelerateInterpolator />
diff --git a/core/res/res/anim/linear_interpolator.xml b/core/res/res/anim/linear_interpolator.xml
index 70bbecc..f4d256a6 100644
--- a/core/res/res/anim/linear_interpolator.xml
+++ b/core/res/res/anim/linear_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<linearInterpolator xmlns:android="http://schemas.android.com/apk/res/android"/>
+<linearInterpolator />
diff --git a/core/res/res/anim/overshoot_interpolator.xml b/core/res/res/anim/overshoot_interpolator.xml
index c614e0b..725ea48 100644
--- a/core/res/res/anim/overshoot_interpolator.xml
+++ b/core/res/res/anim/overshoot_interpolator.xml
@@ -18,4 +18,4 @@
*/
-->
-<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />
+<overshootInterpolator />
diff --git a/core/res/res/anim/wallpaper_activity_open_enter.xml b/core/res/res/anim/wallpaper_close_enter.xml
similarity index 63%
copy from core/res/res/anim/wallpaper_activity_open_enter.xml
copy to core/res/res/anim/wallpaper_close_enter.xml
index e60bac2..8e7d049 100644
--- a/core/res/res/anim/wallpaper_activity_open_enter.xml
+++ b/core/res/res/anim/wallpaper_close_enter.xml
@@ -20,12 +20,6 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_interpolator">
- <scale android:fromXScale=".5" android:toXScale="1.0"
- android:fromYScale=".5" android:toYScale="1.0"
- android:pivotX="50%" android:pivotY="50%"
- android:duration="@android:integer/config_mediumAnimTime" />
- <translate android:fromXDelta="100%" android:toXDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_mediumAnimTime" />
+ <translate android:fromXDelta="33%" android:toXDelta="0"
+ android:duration="@android:integer/config_mediumAnimTime"/>
</set>
diff --git a/core/res/res/anim/wallpaper_activity_close_enter.xml b/core/res/res/anim/wallpaper_close_exit.xml
similarity index 73%
copy from core/res/res/anim/wallpaper_activity_close_enter.xml
copy to core/res/res/anim/wallpaper_close_exit.xml
index 9e9bd80..0a63990 100644
--- a/core/res/res/anim/wallpaper_activity_close_enter.xml
+++ b/core/res/res/anim/wallpaper_close_exit.xml
@@ -21,12 +21,10 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_interpolator"
android:zAdjustment="top">
- <scale android:fromXScale="2.0" android:toXScale="1.0"
- android:fromYScale="2.0" android:toYScale="1.0"
- android:pivotX="50%" android:pivotY="50%"
- android:duration="@android:integer/config_mediumAnimTime" />
- <translate android:fromXDelta="-150%" android:toXDelta="0"
+ <translate android:fromXDelta="0%" android:toXDelta="-100%"
android:duration="@android:integer/config_mediumAnimTime"/>
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_mediumAnimTime" />
+ <scale android:fromXScale="1.0" android:toXScale="2.0"
+ android:fromYScale="1.0" android:toYScale="2.0"
+ android:pivotX="0%" android:pivotY="50%"
+ android:duration="@android:integer/config_mediumAnimTime" />
</set>
diff --git a/core/res/res/anim/wallpaper_activity_close_enter.xml b/core/res/res/anim/wallpaper_intra_close_enter.xml
similarity index 95%
rename from core/res/res/anim/wallpaper_activity_close_enter.xml
rename to core/res/res/anim/wallpaper_intra_close_enter.xml
index 9e9bd80..b75745d 100644
--- a/core/res/res/anim/wallpaper_activity_close_enter.xml
+++ b/core/res/res/anim/wallpaper_intra_close_enter.xml
@@ -23,7 +23,7 @@
android:zAdjustment="top">
<scale android:fromXScale="2.0" android:toXScale="1.0"
android:fromYScale="2.0" android:toYScale="1.0"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="100%" android:pivotY="50%"
android:duration="@android:integer/config_mediumAnimTime" />
<translate android:fromXDelta="-150%" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
diff --git a/core/res/res/anim/wallpaper_activity_close_exit.xml b/core/res/res/anim/wallpaper_intra_close_exit.xml
similarity index 95%
rename from core/res/res/anim/wallpaper_activity_close_exit.xml
rename to core/res/res/anim/wallpaper_intra_close_exit.xml
index badbbf0..6a4e276 100644
--- a/core/res/res/anim/wallpaper_activity_close_exit.xml
+++ b/core/res/res/anim/wallpaper_intra_close_exit.xml
@@ -22,7 +22,7 @@
android:interpolator="@anim/accelerate_interpolator">
<scale android:fromXScale="1.0" android:toXScale=".5"
android:fromYScale="1.0" android:toYScale=".5"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="0%" android:pivotY="50%"
android:duration="@android:integer/config_mediumAnimTime" />
<translate android:fromXDelta="0%" android:toXDelta="100%"
android:duration="@android:integer/config_mediumAnimTime"/>
diff --git a/core/res/res/anim/wallpaper_activity_open_enter.xml b/core/res/res/anim/wallpaper_intra_open_enter.xml
similarity index 95%
rename from core/res/res/anim/wallpaper_activity_open_enter.xml
rename to core/res/res/anim/wallpaper_intra_open_enter.xml
index e60bac2..a46bc42 100644
--- a/core/res/res/anim/wallpaper_activity_open_enter.xml
+++ b/core/res/res/anim/wallpaper_intra_open_enter.xml
@@ -22,7 +22,7 @@
android:interpolator="@anim/decelerate_interpolator">
<scale android:fromXScale=".5" android:toXScale="1.0"
android:fromYScale=".5" android:toYScale="1.0"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="0%" android:pivotY="50%"
android:duration="@android:integer/config_mediumAnimTime" />
<translate android:fromXDelta="100%" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
diff --git a/core/res/res/anim/wallpaper_activity_open_exit.xml b/core/res/res/anim/wallpaper_intra_open_exit.xml
similarity index 95%
rename from core/res/res/anim/wallpaper_activity_open_exit.xml
rename to core/res/res/anim/wallpaper_intra_open_exit.xml
index 01abbb7..0e9bc4a 100644
--- a/core/res/res/anim/wallpaper_activity_open_exit.xml
+++ b/core/res/res/anim/wallpaper_intra_open_exit.xml
@@ -23,7 +23,7 @@
android:zAdjustment="top">
<scale android:fromXScale="1.0" android:toXScale="2.0"
android:fromYScale="1.0" android:toYScale="2.0"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="100%" android:pivotY="50%"
android:duration="@android:integer/config_mediumAnimTime" />
<translate android:fromXDelta="0" android:toXDelta="-150%"
android:duration="@android:integer/config_mediumAnimTime"/>
diff --git a/core/res/res/anim/wallpaper_activity_close_enter.xml b/core/res/res/anim/wallpaper_open_enter.xml
similarity index 82%
copy from core/res/res/anim/wallpaper_activity_close_enter.xml
copy to core/res/res/anim/wallpaper_open_enter.xml
index 9e9bd80..9daf925 100644
--- a/core/res/res/anim/wallpaper_activity_close_enter.xml
+++ b/core/res/res/anim/wallpaper_open_enter.xml
@@ -21,12 +21,10 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/decelerate_interpolator"
android:zAdjustment="top">
+ <translate android:fromXDelta="-100%" android:toXDelta="0"
+ android:duration="@android:integer/config_mediumAnimTime"/>
<scale android:fromXScale="2.0" android:toXScale="1.0"
android:fromYScale="2.0" android:toYScale="1.0"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="0%" android:pivotY="50%"
android:duration="@android:integer/config_mediumAnimTime" />
- <translate android:fromXDelta="-150%" android:toXDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_mediumAnimTime" />
</set>
diff --git a/core/res/res/anim/wallpaper_activity_close_exit.xml b/core/res/res/anim/wallpaper_open_exit.xml
similarity index 63%
copy from core/res/res/anim/wallpaper_activity_close_exit.xml
copy to core/res/res/anim/wallpaper_open_exit.xml
index badbbf0..96fff94 100644
--- a/core/res/res/anim/wallpaper_activity_close_exit.xml
+++ b/core/res/res/anim/wallpaper_open_exit.xml
@@ -19,13 +19,7 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@anim/accelerate_interpolator">
- <scale android:fromXScale="1.0" android:toXScale=".5"
- android:fromYScale="1.0" android:toYScale=".5"
- android:pivotX="50%" android:pivotY="50%"
- android:duration="@android:integer/config_mediumAnimTime" />
- <translate android:fromXDelta="0%" android:toXDelta="100%"
+ android:interpolator="@anim/decelerate_interpolator">
+ <translate android:fromXDelta="0%" android:toXDelta="33%"
android:duration="@android:integer/config_mediumAnimTime"/>
- <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
- android:duration="@android:integer/config_mediumAnimTime"/>
</set>
diff --git a/core/res/res/drawable-hdpi/divider_vertical_bright.9.png b/core/res/res/drawable-hdpi/divider_vertical_bright.9.png
index 128a4de..1035656 100644
--- a/core/res/res/drawable-hdpi/divider_vertical_bright.9.png
+++ b/core/res/res/drawable-hdpi/divider_vertical_bright.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_data_connected_1x.png b/core/res/res/drawable-hdpi/stat_sys_data_connected_1x.png
new file mode 100644
index 0000000..58d2dbb
--- /dev/null
+++ b/core/res/res/drawable-hdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_data_in_1x.png b/core/res/res/drawable-hdpi/stat_sys_data_in_1x.png
new file mode 100644
index 0000000..cd1afe9
--- /dev/null
+++ b/core/res/res/drawable-hdpi/stat_sys_data_in_1x.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_data_inandout_1x.png b/core/res/res/drawable-hdpi/stat_sys_data_inandout_1x.png
new file mode 100644
index 0000000..c398d6f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/stat_sys_data_inandout_1x.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_data_out_1x.png b/core/res/res/drawable-hdpi/stat_sys_data_out_1x.png
new file mode 100644
index 0000000..e1eb5b0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/stat_sys_data_out_1x.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus.9.png b/core/res/res/drawable-hdpi/tab_focus.9.png
index 0c3a9ee..6e8a71f 100644
--- a/core/res/res/drawable-hdpi/tab_focus.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png b/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
index 54e3022..51194a4 100644
--- a/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png b/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
index 34a85f0..51194a4 100644
--- a/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press.9.png b/core/res/res/drawable-hdpi/tab_press.9.png
index 6b3c1c7..119b2c6 100644
--- a/core/res/res/drawable-hdpi/tab_press.9.png
+++ b/core/res/res/drawable-hdpi/tab_press.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press_bar_left.9.png b/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
index f998532..dc2fbce 100644
--- a/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press_bar_right.9.png b/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
index 43515bd..dc2fbce 100644
--- a/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected.9.png b/core/res/res/drawable-hdpi/tab_selected.9.png
index b128b48..29d45a17 100644
--- a/core/res/res/drawable-hdpi/tab_selected.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png b/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
index a49ef68..aa935fe 100644
--- a/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png b/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
index 472f839..aa935fe 100644
--- a/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_unselected.9.png b/core/res/res/drawable-hdpi/tab_unselected.9.png
index ed9e311..f5781ab 100644
--- a/core/res/res/drawable-hdpi/tab_unselected.9.png
+++ b/core/res/res/drawable-hdpi/tab_unselected.9.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_data_connected_1x.png b/core/res/res/drawable-mdpi/stat_sys_data_connected_1x.png
similarity index 100%
rename from core/res/res/drawable/stat_sys_data_connected_1x.png
rename to core/res/res/drawable-mdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_data_in_1x.png b/core/res/res/drawable-mdpi/stat_sys_data_in_1x.png
similarity index 100%
rename from core/res/res/drawable/stat_sys_data_in_1x.png
rename to core/res/res/drawable-mdpi/stat_sys_data_in_1x.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_data_inandout_1x.png b/core/res/res/drawable-mdpi/stat_sys_data_inandout_1x.png
similarity index 100%
rename from core/res/res/drawable/stat_sys_data_inandout_1x.png
rename to core/res/res/drawable-mdpi/stat_sys_data_inandout_1x.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_data_out_1x.png b/core/res/res/drawable-mdpi/stat_sys_data_out_1x.png
similarity index 100%
rename from core/res/res/drawable/stat_sys_data_out_1x.png
rename to core/res/res/drawable-mdpi/stat_sys_data_out_1x.png
Binary files differ
diff --git a/core/res/res/values-en-rUS/donottranslate-names.xml b/core/res/res/values-en-rUS/donottranslate-names.xml
index 42c8ab4..82ba310 100644
--- a/core/res/res/values-en-rUS/donottranslate-names.xml
+++ b/core/res/res/values-en-rUS/donottranslate-names.xml
@@ -147,7 +147,7 @@
MD, MS, PH.D., PHD, SR, V, VI, VII, VIII, X
</string>
<string name="common_last_name_prefixes">
- D', DE, DEL, DI, LA, LE, MC, SAN, ST, TER, VAN, VON
+ D\', DE, DEL, DI, LA, LE, MC, SAN, ST, TER, VAN, VON
</string>
<string name="common_name_conjunctions">
&, AND, OR
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 7e7bfca..1e71a99 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -979,26 +979,47 @@
(which is exiting the screen). -->
<attr name="taskToBackExitAnimation" format="reference" />
+ <!-- When opening a new activity that shows the wallpaper, while
+ currently not showing the wallpaper, this is the animation that
+ is run on the new wallpaper activity (which is entering the screen). -->
+ <attr name="wallpaperOpenEnterAnimation" format="reference" />
+ <!-- When opening a new activity that shows the wallpaper, while
+ currently not showing the wallpaper, this is the animation that
+ is run on the current activity (which is exiting the screen). -->
+ <attr name="wallpaperOpenExitAnimation" format="reference" />
+ <!-- When opening a new activity that hides the wallpaper, while
+ currently showing the wallpaper, this is the animation that
+ is run on the new activity (which is entering the screen). -->
+ <attr name="wallpaperCloseEnterAnimation" format="reference" />
+ <!-- When opening a new activity that hides the wallpaper, while
+ currently showing the wallpaper, this is the animation that
+ is run on the old wallpaper activity (which is exiting the screen). -->
+ <attr name="wallpaperCloseExitAnimation" format="reference" />
+
<!-- When opening a new activity that is on top of the wallpaper
when the current activity is also on top of the wallpaper,
this is the animation that is run on the new activity
- (which is entering the screen). -->
- <attr name="wallpaperActivityOpenEnterAnimation" format="reference" />
+ (which is entering the screen). The wallpaper remains
+ static behind the animation. -->
+ <attr name="wallpaperIntraOpenEnterAnimation" format="reference" />
<!-- When opening a new activity that is on top of the wallpaper
when the current activity is also on top of the wallpaper,
this is the animation that is run on the current activity
- (which is exiting the screen). -->
- <attr name="wallpaperActivityOpenExitAnimation" format="reference" />
+ (which is exiting the screen). The wallpaper remains
+ static behind the animation. -->
+ <attr name="wallpaperIntraOpenExitAnimation" format="reference" />
<!-- When closing a foreround activity that is on top of the wallpaper
when the previous activity is also on top of the wallpaper,
this is the animation that is run on the previous activity
- (which is entering the screen). -->
- <attr name="wallpaperActivityCloseEnterAnimation" format="reference" />
+ (which is entering the screen). The wallpaper remains
+ static behind the animation. -->
+ <attr name="wallpaperIntraCloseEnterAnimation" format="reference" />
<!-- When closing a foreround activity that is on top of the wallpaper
when the previous activity is also on top of the wallpaper,
this is the animation that is run on the current activity
- (which is exiting the screen). -->
- <attr name="wallpaperActivityCloseExitAnimation" format="reference" />
+ (which is exiting the screen). The wallpaper remains
+ static behind the animation. -->
+ <attr name="wallpaperIntraCloseExitAnimation" format="reference" />
</declare-styleable>
<!-- ============================= -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index ce421db..7aaf218 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -580,6 +580,15 @@
<!-- This is not the attribute you are looking for. -->
<attr name="allowBackup" format="boolean" />
+ <!-- Whether the application in question should be terminated after its
+ settings have been restored. The default is to do so. -->
+ <attr name="killAfterRestore" format="boolean" />
+
+ <!-- Whether the application needs to have its own Application subclass
+ active during restore. The default is to run restore with a minimal
+ Application class to avoid interference with application logic. -->
+ <attr name="restoreNeedsApplication" format="boolean" />
+
<!-- The <code>manifest</code> tag is the root of an
<code>AndroidManifest.xml</code> file,
describing the contents of an Android package (.apk) file. One
@@ -656,6 +665,8 @@
<attr name="testOnly" />
<attr name="backupAgent" />
<attr name="allowBackup" />
+ <attr name="killAfterRestore" />
+ <attr name="restoreNeedsApplication" />
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 0fba0f6..3be3ef8 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1151,14 +1151,19 @@
<public type="attr" name="contentAuthority" />
<public type="attr" name="userVisible" />
<public type="attr" name="windowShowWallpaper" />
- <public type="attr" name="wallpaperActivityOpenEnterAnimation" />
- <public type="attr" name="wallpaperActivityOpenExitAnimation" />
- <public type="attr" name="wallpaperActivityCloseEnterAnimation" />
- <public type="attr" name="wallpaperActivityCloseExitAnimation" />
+ <public type="attr" name="wallpaperOpenEnterAnimation" />
+ <public type="attr" name="wallpaperOpenExitAnimation" />
+ <public type="attr" name="wallpaperCloseEnterAnimation" />
+ <public type="attr" name="wallpaperCloseExitAnimation" />
+ <public type="attr" name="wallpaperIntraOpenEnterAnimation" />
+ <public type="attr" name="wallpaperIntraOpenExitAnimation" />
+ <public type="attr" name="wallpaperIntraCloseEnterAnimation" />
+ <public type="attr" name="wallpaperIntraCloseExitAnimation" />
+ <public type="attr" name="supportsUploading" />
+ <public type="attr" name="killAfterRestore" />
+ <public type="attr" name="restoreNeedsApplication" />
<public type="style" name="Theme.Wallpaper" />
<public type="style" name="Theme.Wallpaper.NoTitleBar" />
<public type="style" name="Theme.Wallpaper.NoTitleBar.Fullscreen" />
-
- <public type="attr" name="supportsUploading" />
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 70c9385..3333915 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1943,25 +1943,34 @@
<string-array translatable="false" name="carrier_properties">
</string-array>
- <!-- Title for the selected state of a CompoundButton. -->
- <string name="accessibility_compound_button_selected">checked</string>
+ <!-- Title for the selected state of a CompoundButton. -->
+ <string name="accessibility_compound_button_selected">checked</string>
- <!-- Title for the unselected state of a CompoundButton. -->
- <string name="accessibility_compound_button_unselected">not checked</string>
+ <!-- Title for the unselected state of a CompoundButton. -->
+ <string name="accessibility_compound_button_unselected">not checked</string>
- <string name="grant_credentials_permission_message_desc">The
- listed applications are requesting permission to access the login credentials for account <xliff:g id="account" example="foo@gmail.com">%1$s</xliff:g> from
- <xliff:g id="application" example="Google Apps">%2$s</xliff:g>. Do you wish to grant this permission? If so, your answer will be remembered and you will not be prompted
- again.</string>
+ <string name="grant_credentials_permission_message_desc">The
+ listed applications are requesting permission to access the login credentials for account <xliff:g id="account" example="foo@gmail.com">%1$s</xliff:g> from
+ <xliff:g id="application" example="Google Apps">%2$s</xliff:g>. Do you wish to grant this permission? If so, your answer will be remembered and you will not be prompted
+ again.</string>
- <string name="grant_credentials_permission_message_with_authtokenlabel_desc">The
- listed applications are requesting permission to access the <xliff:g id="type" example="Contacts">%1$s</xliff:g> login credentials for account <xliff:g id="account" example="foo@gmail.com">%2$s</xliff:g> from
- <xliff:g id="application" example="Google Apps">%3$s</xliff:g>. Do you wish to grant this permission? If so, your answer will be remembered and you will not be prompted
- again.</string>
+ <string name="grant_credentials_permission_message_with_authtokenlabel_desc">The
+ listed applications are requesting permission to access the <xliff:g id="type" example="Contacts">%1$s</xliff:g> login credentials for account <xliff:g id="account" example="foo@gmail.com">%2$s</xliff:g> from
+ <xliff:g id="application" example="Google Apps">%3$s</xliff:g>. Do you wish to grant this permission? If so, your answer will be remembered and you will not be prompted
+ again.</string>
- <string name="allow">Allow</string>
- <string name="deny">Deny</string>
- <string name="permission_request_notification_title">Permission Requested</string>
- <string name="permission_request_notification_subtitle">for account <xliff:g id="account" example="foo@gmail.com">%s</xliff:g></string>
+ <string name="allow">Allow</string>
+ <string name="deny">Deny</string>
+ <string name="permission_request_notification_title">Permission Requested</string>
+ <string name="permission_request_notification_subtitle">for account <xliff:g id="account" example="foo@gmail.com">%s</xliff:g></string>
+ <!-- Label to show for a service that is running because it is an input method. -->
+ <string name="input_method_binding_label">Input method</string>
+ <!-- Label to show for a service that is running because it is a sync adapter. -->
+ <string name="sync_binding_label">Sync</string>
+ <!-- Label to show for a service that is running because it is an accessibility module. -->
+ <string name="accessibility_binding_label">Accessibility</string>
+ <!-- Label to show for a service that is running because it is a wallpaper. -->
+ <string name="wallpaper_binding_label">Wallpaper</string>
+
</resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 55f8167..18b97657 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -66,10 +66,14 @@
<item name="taskToFrontExitAnimation">@anim/task_open_exit</item>
<item name="taskToBackEnterAnimation">@anim/task_close_enter</item>
<item name="taskToBackExitAnimation">@anim/task_close_exit</item>
- <item name="wallpaperActivityOpenEnterAnimation">@anim/wallpaper_activity_open_enter</item>
- <item name="wallpaperActivityOpenExitAnimation">@anim/wallpaper_activity_open_exit</item>
- <item name="wallpaperActivityCloseEnterAnimation">@anim/wallpaper_activity_close_enter</item>
- <item name="wallpaperActivityCloseExitAnimation">@anim/wallpaper_activity_close_exit</item>
+ <item name="wallpaperOpenEnterAnimation">@anim/wallpaper_open_enter</item>
+ <item name="wallpaperOpenExitAnimation">@anim/wallpaper_open_exit</item>
+ <item name="wallpaperCloseEnterAnimation">@anim/wallpaper_close_enter</item>
+ <item name="wallpaperCloseExitAnimation">@anim/wallpaper_close_exit</item>
+ <item name="wallpaperIntraOpenEnterAnimation">@anim/wallpaper_intra_open_enter</item>
+ <item name="wallpaperIntraOpenExitAnimation">@anim/wallpaper_intra_open_exit</item>
+ <item name="wallpaperIntraCloseEnterAnimation">@anim/wallpaper_intra_close_enter</item>
+ <item name="wallpaperIntraCloseExitAnimation">@anim/wallpaper_intra_close_exit</item>
</style>
<!-- Standard animations for a non-full-screen window or activity. -->
diff --git a/docs/html/community/index.jd b/docs/html/community/index.jd
index eb5887a..3e69de4 100644
--- a/docs/html/community/index.jd
+++ b/docs/html/community/index.jd
@@ -3,8 +3,8 @@
@jd:body
<div id="mainBodyFluid">
- <h1>Community</h1>
- <p>Welcome to the Android developers community! We're glad you're here and invite you to participate in these discussions. Before posting, please read the <a href="http://source.android.com/discuss/android-discussion-groups-charter">Groups Charter</a> that covers the community guidelines.</p>
+<h1>Community</h1>
+<p>Welcome to the Android developers community! We're glad you're here and invite you to participate in these discussions. Before posting, please read the <a href="http://source.android.com/discuss/android-discussion-groups-charter">Groups Charter</a> that covers the community guidelines.</p>
<p class="note"><strong>Note:</strong> If you are seeking discussion about Android source code (not application development),
then please refer to the <a href="http://source.android.com/discuss">Open Source Project Mailing lists</a>.</p>
@@ -53,48 +53,42 @@
<li><b>Android beginners</b> - You're new to Android application development. You want to figure out how to get started with the Android SDK and the basic Android APIs? Start here. This list is open to any discussion around beginner-type questions for developers using the SDK; this is a great way to get up and running with your new application on the Android platform. Ask about getting your development environment set up, get help with the first steps of Android development (your first User Interface, your first permission, your first file on the Android filesystem, your first app on the Android Market...). Be sure to check the archives first before asking new questions. Please avoid advanced subjects, which belong on android-developers, and user questions, which will get a better reception on android-discuss.
<ul>
<li>Subscribe using Google Groups: <a href="http://groups.google.com/group/android-beginners">android-beginners</a></li>
-<li>Subscribe via email: <a href="mailto:android-beginners-subscribe@googlegroups.com">android-beginners-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com">
-</a></li>
+<li>Subscribe via email: <a href="mailto:android-beginners-subscribe@googlegroups.com">android-beginners-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android developers</b> - You're now an experienced Android application developer. You've grasped the basics of Android app development, you're comfortable using the SDK, now you want to move to advanced topics. Get help here with troubleshooting applications, advice on implementation, and strategies for improving your application's performance and user experience. This is the not the right place to discuss user issues (use android-discuss for that) or beginner questions with the Android SDK (use android-beginners for that).
<ul>
<li>Subscribe using Google Groups: <a href="http://groups.google.com/group/android-developers">android-developers</a></li>
-<li>Subscribe via email: <a href="mailto:android-developers-subscribe@googlegroups.com">android-developers-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com">
-</a></li>
+<li>Subscribe via email: <a href="mailto:android-developers-subscribe@googlegroups.com">android-developers-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android discuss</b> - The "water cooler" of Android discussion. You can discuss just about anything Android-related here, ideas for the Android platform, announcements about your applications, discussions about Android devices, community resources... As long as your discussion is related to Android, it's on-topic here. However, if you have a discussion here that could belong on another list, you are probably not reaching all of your target audience here and may want to consider shifting to a more targeted list.
<ul>
<li>Subscribe using Google Groups: <a href="http://groups.google.com/group/android-discuss">android-discuss</a></li>
-<li>Subscribe via email: <a href="mailto:android-discuss-subscribe@googlegroups.com">android-discuss-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com">
- </a></li>
+<li>Subscribe via email: <a href="mailto:android-discuss-subscribe@googlegroups.com">android-discuss-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android ndk</b> - A place for discussing the Android NDK and topics related to using native code in Android applications.
<ul>
<li>Subscribe using Google Groups: <a href="http://groups.google.com/group/android-ndk">android-ndk</a></li>
-<li>Subscribe via email: <a href="mailto:android-ndk-subscribe@googlegroups.com">android-ndk-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com">
- </a></li>
+<li>Subscribe via email: <a href="mailto:android-ndk-subscribe@googlegroups.com">android-ndk-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android security discuss</b> - A place for open discussion on secure development, emerging security concerns, and best practices for and by android developers. Please don't disclose vulnerabilities directly on this list, you'd be putting all Android users at risk.
<ul>
<li>Subscribe using Google Groups: <a href="http://groups.google.com/group/android-security-discuss">android-security-discuss</a></li>
-<li>Subscribe via email: <a href="mailto:android-security-discuss@googlegroups.com">android-security-discuss@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com">
- </a></li>
+<li>Subscribe via email: <a href="mailto:android-security-discuss@googlegroups.com">android-security-discuss@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android security announce</b> - A low-volume group for security-related announcements by the Android Security Team.
<ul>
<li>Subscribe using Google Groups: <a href="http://groups.google.com/group/android-security-announce">android-security-announce</a></li>
-<li>Subscribe via email: <a href="mailto:android-security-announce-subscribe@googlegroups.com">android-security-announce-subscribe@googlegroups.com</a>
-<a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li>
+<li>Subscribe via email: <a href="mailto:android-security-announce-subscribe@googlegroups.com">android-security-announce-subscribe@googlegroups.com</a></li>
</ul>
</li>
diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd
index 8fc899b..a4dcc5e 100644
--- a/docs/html/guide/appendix/api-levels.jd
+++ b/docs/html/guide/appendix/api-levels.jd
@@ -1,81 +1,323 @@
page.title=Android API Levels
@jd:body
+<div id="qv-wrapper">
+<div id="qv">
-<p>The Android <em>API Level</em> is an integer that indicates a set of APIs available in an Android SDK
-and on a version of the Android platform. Each version of the Android platform supports a specific set
-of APIs, which are always backward-compatible. For example, Android 1.5 supports all APIs available in
-Android 1.0, but the reverse is not true. If an application uses APIs
-available in Android 1.5 that are not available in 1.0, then the application should never be installed
-on an Android 1.0 device, because it will fail due to missing APIs. The API Level ensures this does not happen
-by comparing the minimum API Level required by the applicaiton to the API Level available on the device.</p>
+ <h2>In this document</h2>
+<ol>
+ <li><a href="intro">What is API Level?</a></li>
+ <li><a href="#uses">Uses of API Level</a></li>
+ <li><a href="#considerations">Development Considerations</a>
+ <ol>
+ <li><a href="#fc">Application forward compatibility</a></li>
+ <li><a href="#bc">Application backward compatibility</a></li>
+ <li><a href="#platform">Selecting a platform version for compiling</a></li>
+ <li><a href="#apilevel">Declaring a minimum API Level</a></li>
+ <li><a href="#testing">Testing against higher API Levels</a></li>
+ </ol>
+ </li>
+ <li><a href="#filtering">Filtering the documentation</a></li>
+</ol>
-<p>When a new version of Android adds APIs, a new API Level is added to the platform. The new APIs
-are available only to applications that declare a minimum API Level that is equal-to or greater-than
-the API Level in which the APIs were introduced. The API Level required by an application is declared with the
-<code><uses-sdk></code> element inside the Android manifest, like this:</p>
+ <h2>See also</h2>
+ <ol>
+ <li><a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a> manifest element</li>
+ </ol>
-<pre><uses-sdk android:minSdkVersion="3" /></pre>
+</div>
+</div>
-<p>The value for <code>minSdkVersion</code> is the minimum API Level required by the application.
-If this is not declared, then it is assumed that the application is compatible with all versions and defaults to
-API Level 1. In which case, if the application actually uses APIs introduced with an API Level greater than 1, then
-the application will fail in unpredictable ways when installed on a device that only supports API Level 1
-(such as an Android 1.0 device).
-See the <code><a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a></code>
-documentation for more about declaring the API Level in your manifest.</p>
+<p>As you develop your application on Android, it's useful to understand the
+platform's general approach to API change management. It's also important to
+understand the API Level identifier and the role it plays in ensuring your
+application's compatibility with devices on which it may be installed. </p>
-<p>For example, the {@link android.appwidget} package was introduced with API Level 3. If your application
-has set <code>minSdkVersion</code> to 1 or 2, then your application cannot use this package,
-even if the device running your application uses a version of Android that supports it.
-In order to use the {@link android.appwidget} package, your application must set <code>minSdkVersion</code>
-to 3 or higher. When the <code>minSdkVersion</code> is set to 3, the application will no longer be able to install
-on a device running a platform version with an API Level less than 3.</p>
+<p>The sections below provide information about API Level and how it affects
+your applications. </p>
-<p>Despite the name of the manifest attribute (<code>minSdkVersion</code>), the API Level is not directly
-associated with a specific SDK. For example, the SDK for Android 1.0 uses
-API Level 1 and the SDK for Android 1.1 uses API Level 2. So it may seem that the API Level increases consistently.
-However, it's possible that a subsequent platform
-releases will not introduce new APIs, and thus, the API Level will remain the same. In addition, there are often
-multiple SDK releases for a single platform version (there were three SDK releases for Android 1.5), and
-there's no guarantee that the API Level will remain the same between these. It's possible (but unlikely) that
-a second or third SDK for a given version of the platform will provide new APIs and add a new API Level.
-When you install a new SDK, be sure to read the SDK Contents on the install page, which specifies the API
-Level for each platform available in the SDK. Also see the comparison of
-<a href="#VersionsVsApiLevels">Platform Versions vs. API Levels</a>, below.</p>
+<p>For information about how to use the "Filter by API Level" control
+available in the API reference documentation, see
+<a href="#filtering">Filtering the documentation</a> at the
+end of this document. </p>
-<p class="note"><strong>Note:</strong> During an "Early Look" SDK release, the APIs may not be final, so the
-API Level number cannot be specified. In this case, a string value matching the
-platform codename must be used as the value for <code>minSdkVersion</code>. This codename value
-will only be valid while using the Early Look SDK with the emulator. An application using this API Level
-can never be installed on an Android device. When the final SDK is released, you must update your manifest to use
-the official API Level integer.</p>
+<h2 id="intro">What is API Level?</h2>
-<h2 id="VersionsVsApiLevels">Platform Versions vs. API Levels</h2>
+<p>API Level is an integer value that uniquely identifies the framework API
+revision offered by a version of the Android platform.</p>
-<p>The following table specifies the <em>maximum</em> API Level supported by each version of the Android platform.
-(Every platform is backward-compatible to API Level 1.)</p>
+<p>The Android platform provides a framework API that applications can use to
+interact with the underlying Android system. The framework API consists of:</p>
+
+<ul>
+<li>A core set of packages and classes</li>
+<li>A set of XML elements and attributes for declaring a manifest file</li>
+<li>A set of XML elements and attributes for declaring and accessing resources</li>
+<li>A set of Intents</li>
+<li>A set of permissions that applications can request, as well as permission
+enforcements included in the system</li>
+</ul>
+
+<p>Each successive version of the Android platform can include updates to the
+Android application framework API that it delivers. </p>
+
+<p>Updates to the framework API are designed so that the new API remains
+compatible with earlier versions of the API. That is, most changes in the API
+are additive and introduce new or replacement functionality. As parts of the API
+are upgraded, the older replaced parts are deprecated but are not removed, so
+that existing applications can still use them. In a very small number of cases,
+parts of the API may be modified or removed, although typically such changes are
+only needed to ensure API robustness and application or system security. All
+other API parts from earlier revisions are carried forward without
+modification.</p>
+
+<p>The framework API that an Android platform delivers is specified using an
+integer identifier called "API Level". Each Android platform version supports
+exactly one API Level, although support is implicit for all earlier API Levels
+(down to API Level 1). The initial release of the Android platform provided
+API Level 1 and subsequent releases have incremented the API Level.</p>
+
+<p>The following table specifies the API Level supported by each version of the
+Android platform.</p>
<table>
<tr><th>Platform Version</th><th>API Level</th></tr>
- <tr><td>Android 1.0</td><td>1</td></tr>
- <tr><td>Android 1.1</td><td>2</td></tr>
+ <tr><td>Android 1.6</td><td>4</td></tr>
<tr><td>Android 1.5</td><td>3</td></tr>
- <tr><td>Android Donut</td><td>Donut</td></tr>
+ <tr><td>Android 1.1</td><td>2</td></tr>
+ <tr><td>Android 1.0</td><td>1</td></tr>
</table>
-<h2 id="ViewingTheApiReference">Viewing the API Reference Based on API Level</h2>
+<h2 id="uses">Uses of API Level in Android</h2>
-<p>The Android API reference includes information that specififies the minimum API Level required for each
-package, class, and member. You can see this information on the right side of each header or label.</p>
+<p>The API Level identifier serves a key role in ensuring the best possible
+experience for users and application developers:
-<p>By default, the reference documentation shows all APIs available with the latest SDK release.
-This means that the reference assumes you're using the latest API Level and will show you everything available
-with it. If you're developing applications for a version of Android that does not support the latest API Level,
-then you can filter the reference to reveal only the packages, classes, and members available for that API Level.
-When viewing the reference, use the "Filter by API Level" selection box (below the search box) to pick the API Level
-you'd like to view.</p>
+<ul>
+<li>It lets the Android platform describe the maximum framework API revision
+that it supports</li>
+<li>It lets applications describe the framework API revision that they
+require</li>
+<li>It lets the system negotiate the installation of applications on the user's
+device, such that version-incompatible applications are not installed on a
+user's device</li>
+</ul>
+
+<p>Each Android platform version stores its API Level identifier internally, in
+the Android system itself. </p>
+
+<p>Applications can use a manifest element provided by the framework API —
+<code><uses-sdk></code> — to describe the minimum and maximum API
+Levels under which they are able to run, as well as the preferred API Level that
+they are designed to support. The element offers two key attributes:</p>
+
+<ul>
+<li><code>android:minSdkVersion</code> — Specifies the minimum API Level
+on which the application is able to run. The default value is "1".</li>
+<li><code>android:maxSdkVersion</code> — Specifies the maximum API Level
+on which the application is able to run.</li>
+</ul>
+
+<p>For example, to specify the minimum system API Level that an application
+requires in order to run, the application would include in its manifest a
+<code><uses-sdk></code> element with a <code>android:minSdkVersion</code>
+attribute. The value of <code>android:minSdkVersion</code> would be the integer
+corresponding to the API Level of the earliest version of the Android platform
+under which the application can run. </p>
+
+<p>When the user attempts to install an application, the Android system first
+checks the <code><uses-sdk></code> attributes in the application's
+manifest and compares them against its own internal API Level. The system
+allows the installation to begin only if these conditions are met:</p>
+
+<ul>
+<li>If a <code>android:minSdkVersion</code> attribute is declared, its value
+must be less than or equal to the system's API Level integer. If not declared,
+the system assumes that the application requires API Level 1. </li>
+<li>If a <code>android:maxSdkVersion</code> attribute is declared, its value
+must be equal to or greater than the system's API Level integer.
+in the system itself. If not declared, the system assumes that the application
+has no maximum API Level. </li>
+</ul>
+
+<p>When declared in an application's manifest, a <code><uses-sdk></code>
+element might look like this: </p>
+
+<pre><manifest>
+ ...
+ <uses-sdk android:minSdkVersion="4" />
+ ...
+</manifest></pre>
+
+<p>The principal reason that an application would declare an API Level in
+<code>android:minSdkVersion</code> is to tell the Android system that it is
+using APIs that were <em>introduced</em> in the API Level specified. If the
+application were to be somehow installed on a platform with a lower API Level,
+then it would crash at run-time when it tries to access APIs that don't exist.
+The system prevents such an outcome by not allowing the application to be
+installed if the lowest API Level it requires is higher than that of the
+platform version on the target device.</p>
+
+<p>For example, the {@link android.appwidget} package was introduced with API
+Level 3. If an application uses that API, it must declare a
+<code>android:minSdkVersion</code> attribute with a value of "3". The
+application will then be installable on platforms such as Android 1.5 (API Level
+3) and Android 1.6 (API Level 4), but not on the Android 1.1 (API Level 2) and
+Android 1.0 platforms (API Level 1).</p>
+
+<p>For more information about how to specify an application's API Level
+requirements, see the <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
+ section of the manifest file documentation.</p>
+<h2 id="considerations">Development Considerations</h2>
+<p>The sections below provide information related to API level that you should
+consider when developing your application.</p>
+
+<h3 id="fc">Application forward compatibility</h3>
+
+<p>Android applications are generally forward-compatible with new versions of
+the Android platform.</p>
+
+<p>Because almost all changes to the framework API are additive, an Android
+application developed using any given version of the API (as specified by its
+API Level) is forward-compatible with later versions of the Android platform and
+higher API levels. The application should be able to run on all later versions
+of the Android platform, except in isolated cases where the application uses a
+part of the API that is later removed for some reason. </p>
+
+<p>Forward compatibility is important because many Android-powered devices
+receive over-the-air (OTA) system updates. The user may install your
+application and use it successfully, then later receive an OTA update to a new
+version of the Android platform. Once the update is installed, your application
+will run in a new run-time version of the environment, but one that has the API
+and system capabilities that it depends on. </p>
+
+<p>In some cases, changes <em>below</em> the API, such those in the underlying
+system itself, may affect your application when it is run in the new
+environment. For that reason it's important for you, as the application
+developer, to understand how the application will look and behave in each system
+environment. To help you test your application on various versions of the Android
+platform, the Android SDK includes multiple platforms that you can download.
+Each platform includes a compatible system image that you can run in an AVD, to
+test your application. </p>
+
+<h3 id="bc">Application backward compatibility</h3>
+
+<p>Android applications are not necessarily backward compatible with versions of
+the Android platform older than the version against which they were compiled.
+</p>
+
+<p>Each new version of the Android platform can include new framework APIs, such
+as those that give applications access to new platform capabilities or replace
+existing API parts. The new APIs are accessible to applications when running on
+the new platform and, as mentioned above, also when running on later versions of
+the platform, as specified by API Level. Conversely, because earlier versions of
+the platform do not include the new APIs, applications that use the new APIs are
+unable to run on those platforms.</p>
+
+<p>Although it's unlikely that an Android-powered device would be downgraded to
+a previous version of the platform, it's important to realize that there are
+likely to be many devices in the field that run earlier versions of the
+platform. Even among devices that receive OTA updates, some might lag and not
+receive an update for a significant amount of time. </p>
+
+<h3 id="platform">Selecting a platform version and API Level</h3>
+
+<p>When you are developing your application, you will need to choose
+the platform version against which you will compile the application. In
+general, you should compile your application against the lowest possible
+version of the platform that your application can support.
+
+<p>You can determine the lowest possible platform version by compiling the
+application against successively lower build targets. After you determine the
+lowest version, you should create an AVD using the corresponding platform
+version (and API Level) and fully test your application. Make sure to declare a
+<code>android:minSdkVersion</code> attribute in the application's manifest and
+set its value to the API Level of the platform version. </p>
+
+<h3 id="apilevel">Declaring a minimum API Level</h3>
+
+<p>If you build an application that uses APIs or system features introduced in
+the latest platform version, you should set the
+<code>android:minSdkVersion</code> attribute to the API Level of the latest
+platform version. This ensures that users will only be able to install your
+application if their devices are running a compatible version of the Android
+platform. In turn, this ensures that your application can function properly on
+their devices. </p>
+
+<p>If your application uses APIs introduced in the latest platform version but
+does <em>not</em> declare a <code>android:minSdkVersion</code> attribute, then
+it will run properly on devices running the latest version of the platform, but
+<em>not</em> on devices running earlier versions of the platform. In the latter
+case, the application will crash at runtime when it tries to use APIs that don't
+exist on the earlier versions.</p>
+
+<h3 id="testing">Testing against higher API Levels</h3>
+
+<p>After compiling your application, you should make sure to test it on the
+platform specified in the application's <code>android:minSdkVersion</code>
+attribute. To do so, create an AVD that uses the platform version required by
+your application. Additionally, to ensure forward-compatibility, you should run
+and test the application on all platforms that use a higher API Level than that
+used by your application. </p>
+
+<p>The Android SDK includes multiple platform versions that you can use,
+including the latest version, and provides an updater tool that you can use to
+download other platform versions as necessary. </p>
+
+<p>To access the updater, use the <code>android</code> command-line tool,
+located in the <sdk>/tools directory. You can launch the Updater by using
+the <code>android</code> command without specifying any options. You can
+also simply double-click the android.bat (Windows) or android (OS X/Linux) file.
+In ADT, you can also access the updater by selecting
+<strong>Window</strong> > <strong>Android SDK and AVD
+Manager</strong>.</p>
+
+<p>To run your application against different platform versions in the emulator,
+create an AVD for each platform version that you want to test. For more
+information about AVDs, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>. If
+you are using a physical device for testing, ensure that you know the API Level
+of the Android platform it runs. See the table at the top of this document for
+a list of platform versions and their API Levels. </p>
+
+<!--
+The Framework API makeup: the API available in a specific platform version is
+made up of API parts introduced in previous versions, plus some parts that are
+new.
+-->
+
+<h2 id="filtering">Filtering the Reference Documentation by API Level</h2>
+
+<p>Reference documentation pages on the Android Developers site offer a "Filter
+by API Level" control in the top-right area of each page. </p>
+
+<p>The "Filter by API Level" lets you show documentation only for parts of the
+API that are actually accessible to your application, based on the API Level
+that it specifies in the <code>minSdkVersion</code> attribute in its manifest
+file </p>
+
+<p>When you filter the reference documentation by an API level, only the APIs
+available at that API level are shown. APIs introduced in a later API level are
+grayed out and their content is masked, since they would not be accessible to
+your application. </p>
+
+<p>Note that filtering by API Level in the documentation does not provide a view
+of what is new or introduced in each API Level. Filtering simply provides a way
+to view the entire API associated with a given API Level, while excluding API
+elements introduced in later API Levels.</p>
+
+<p>By default, API Level filtering is enabled and set to show the latest API
+Level. If you do not want to use filtering reference documentation, select the
+highest available API Level.</p>
+
+<p>Note that the reference documentation for API elements also specifies the API
+Level at which the element was introduced. The API Level for packages and
+classes is specified as "Since <api level>" at the top-right corner of the
+content area on each documentation page. The API Level for each class member is
+specified in the member's detailed description section header, at the right
+margin. </p>
diff --git a/docs/html/guide/developing/eclipse-adt.jd b/docs/html/guide/developing/eclipse-adt.jd
index a5cf735..c3ec2e5 100644
--- a/docs/html/guide/developing/eclipse-adt.jd
+++ b/docs/html/guide/developing/eclipse-adt.jd
@@ -149,15 +149,15 @@
<h3 id="CreatingAnAvd">Creating an AVD</h3>
-<p>With ADT 0.9.2 and above, the Android AVD Manager provides a simple graphical interface
+<p>With ADT 0.9.3 and above, the Android SDK and AVD Manager provides a simple graphical interface
for creating and managing AVDs. (If you're using ADT version 0.9.1 or older, you must
use the <code>android</code> tool to create your AVDs—read the AVD guide to
<a href="{@docRoot}guide/developing/tools/avd.html#creating">Creating an AVD</a>.)
-<p>To create an AVD with the Android AVD Manager:</p>
+<p>To create an AVD with the AVD Manager:</p>
<ol>
- <li>Select <strong>Window > Android AVD Manager</strong>, or click the Android AVD Manager icon (a black device)
+ <li>Select <strong>Window > Android SDK and AVD Manager</strong>, or click the Android SDK and AVD Manager icon (a black device)
in the Eclipse toolbar.</p>
</li>
<li>In the Virtual Devices panel, you'll see a list of existing AVDs. Click <strong>New</strong>
@@ -169,7 +169,7 @@
<li>Click <strong>Create AVD</strong>.</li>
</ol>
-<p>Your AVD is now ready and you can close the Android AVD Manager.
+<p>Your AVD is now ready and you can close the AVD Manager.
In the next section, you'll see how the AVD is used
when launching your application on an emulator.</p>
@@ -217,7 +217,7 @@
as an <em>Android Application</em>, ADT will automatically create a run configuration.
The default run configuration will
launch the default project Activity and use automatic target mode for device selection
-(with no preferred AVD). If the default setting don't suit your project, you can
+(with no preferred AVD). If the default settings don't suit your project, you can
customize the launch configuration or even create a new.</p>
<p>To create or modify a launch configuration, follow these steps as appropriate
@@ -256,6 +256,12 @@
when selecting an AVD to run your application.
See the following section on <a href=#AutoAndManualModes">Automatic and manual target
modes</a>).</p>
+ <p>You can specify any emulator options to the Additional Emulator Command
+ Line Options field. For example, you could add <code>-scale 96dpi</code> to
+ scale the AVD's screen to an accurate size, based on the dpi of your
+ computer monitor. For a full list of emulator options, see the <a
+ href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a>
+document.</p>
</li>
</ol>
diff --git a/docs/html/guide/developing/other-ide.jd b/docs/html/guide/developing/other-ide.jd
index 8cdf0b9..2080873 100644
--- a/docs/html/guide/developing/other-ide.jd
+++ b/docs/html/guide/developing/other-ide.jd
@@ -85,7 +85,8 @@
navigate to the <code>tools/</code> directory of your SDK and run:</p>
<pre>
android create project \
---target <em><targetID></em> \
+--target <em><target_ID></em> \
+--name <em><your_project_name></em> \
--path <em>/path/to/your/project</em> \
--activity <em><your_activity_name></em> \
--package <em><your_package_namespace></em>
@@ -96,11 +97,14 @@
to an Android platform library (including any add-ons, such as Google APIs) that you would like to
build your project against. To see a list of available targets and their corresponding IDs,
execute: <code>android list targets</code>.</li>
+ <li><code>name</code> is the name for your project. This is optional. If provided, this name will be used
+ for your .apk filename when you build your application.</li>
<li><code>path</code> is the location of your project directory. If the directory does not exist,
it will be created for you.</li>
- <li><code>activity</code> is the name for your {@link android.app.Activity} class. This class file
+ <li><code>activity</code> is the name for your default {@link android.app.Activity} class. This class file
will be created for you inside
- <code><em><path_to_your_project></em>/src/<em><your_package_namespace_path></em>/</code>.</li>
+ <code><em><path_to_your_project></em>/src/<em><your_package_namespace_path></em>/</code>.
+ This will also be used for your .apk filename unless you provide a the <code>name</code>.</li>
<li><code>package</code> is the package namespace for your project, following the same rules as for
packages in the Java programming language.</li>
</ul>
@@ -109,9 +113,10 @@
<pre>
android create project \
--target 1 \
---path ./myProject \
---activity MyActivity \
---package com.example.myproject
+--name MyAndroidApp \
+--path ./MyAndroidAppProject \
+--activity MyAndroidAppActivity \
+--package com.example.myandroid
</pre>
<p>The tool generates the following files and directories:</p>
@@ -123,7 +128,8 @@
<li><code>default.properties</code> - Properties for the build system. <em>Do not modify
this file</em>.</li>
<li><code>build.properties</code> - Customizable properties for the build system. You can edit this
- file to overried default build settings used by Ant.</li>
+ file to override default build settings used by Ant and provide a pointer to your keystore and key alias
+ so that the build tools can sign your application when built in release mode.</li>
<li><code>src<em>/your/package/namespace/ActivityName</em>.java</code> - The Activity class
you specified during project creation.</li>
<li><code>bin/</code> - Output directory for the build script.</li>
@@ -141,7 +147,7 @@
to the emulator (discussed later). So you need access between your project solution and
the <code>tools/</code> folder.</p>
-<p class="warning"><strong>Note:</strong> You should refrain from moving the
+<p class="caution"><strong>Caution:</strong> You should refrain from moving the
location of the SDK directory, because this will break the build scripts. (They
will need to be manually updated to reflect the new SDK location before they will
work again.)</p>
@@ -153,14 +159,15 @@
a new project from existing code, use the
<code>android update project</code> command to update the project to the new development
environment. You can also use this command to revise the build target of an existing project
-(with the <code>--target</code> option). The <code>android</code> tool will generate any files and
+(with the <code>--target</code> option) and the project name (with the <code>--name</code>
+option). The <code>android</code> tool will generate any files and
folders (listed in the previous section) that are either missing or need to be updated,
as needed for the Android project.</p>
<p>To update an existing Android project, open a command-line
and navigate to the <code>tools/</code> directory of your SDK. Now run:</p>
<pre>
-android update project --target <em><targetID></em> --path <em>path/to/your/project/</em>
+android update project --name <em><project_name></em> --target <em><target_ID></em> --path <em>path/to/your/project/</em>
</pre>
<ul>
@@ -169,11 +176,13 @@
like to build your project against. To see a list of available targets and their corresponding IDs,
execute: <code>android list targets</code>.</li>
<li><code>path</code> is the location of your project directory.</li>
+ <li><code>name</code> is the name for the project. This is optional—if you're not
+ changing the project name, you don't need this.</li>
</ul>
<p>Here's an example:</p>
<pre>
-android update project --target 2 --path ./myProject
+android update project --name MyApp --target 2 --path ./MyAppProject
</pre>
@@ -237,8 +246,9 @@
<h3 id="DebugMode">Building in debug mode</h3>
<p>For immediate application testing and debugging, you can build your application
-in debug mode and immediately install it on an emulator. In debug mode, the build tools automatically
-sign your application with a debug key. However, you can (and should) also test your
+in debug mode and immediately install it on an emulator. In debug mode, the build tools
+automatically sign your application with a debug key and optimize the package with
+{@code zipalign}. However, you can (and should) also test your
application in release mode. Debug mode simply allows you to run your application without
manually signing the application.</p>
@@ -248,9 +258,9 @@
<li>Open a command-line and navigate to the root of your project directory.</li>
<li>Use Ant to compile your project in debug mode:
<pre>ant debug</pre>
- <p>This creates your Android application .apk file inside the project <code>bin/</code>
- directory, named <code><em><your_DefaultActivity_name></em>-debug.apk</code>. The file
- is already signed with the debug key.</p>
+ <p>This creates your debug .apk file inside the project <code>bin/</code>
+ directory, named <code><em><your_project_name></em>-debug.apk</code>. The file
+ is already signed with the debug key and has been aligned with {@code zipalign}.</p>
</li>
</ol>
@@ -267,23 +277,86 @@
your application in release mode. Once you have built in release mode, it's a good idea to perform
additional testing and debugging with the final .apk.</p>
-<p>To build in release mode:</p>
+<p>Before you start building your application in release mode, be aware that you must sign
+the resulting application package with your private key, and should then align it using the
+{@code zipalign} tool. There are two approaches to building in release mode:
+build an unsigned package in release mode and then manually sign and align
+the package, or allow the build script
+to sign and align the package for you.</p>
+
+<h4 id="ManualReleaseMode">Build unsigned</h4>
+
+<p>If you build your application <em>unsigned</em>, then you will need to
+manually sign and align the package.</p>
+
+<p>To build an <em>unsigned</em> .apk in release mode:</p>
<ol>
<li>Open a command-line and navigate to the root of your project directory.</li>
<li>Use Ant to compile your project in release mode:
<pre>ant release</pre>
- <p>This creates your Android application .apk file inside the project <code>bin/</code>
- directory, named <code><em><your_DefaultActivity_name></em>.apk</code>.</p>
- <p class="note"><strong>Note:</strong> The .apk file is <em>unsigned</em> at this point.
- You can't install it on an emulator or device until you sign it with your private key.</p>
</li>
</ol>
-<p>Because release mode builds your application unsigned, your next step is to sign
-it with your private key, in order to distribute it to end-users. To complete this procedure,
+<p>This creates your Android application .apk file inside the project <code>bin/</code>
+directory, named <code><em><your_project_name></em>-unsigned.apk</code>.</p>
+
+<p class="note"><strong>Note:</strong> The .apk file is <em>unsigned</em> at this point
+and can't be installed until signed with your private key.</p>
+
+<p>Once you have created the unsigned .apk, your next step is to sign the .apk
+with your private key and then align it with {@code zipalign}. To complete this procedure,
read <a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
+<p>When your .apk has been signed and aligned, it's ready to be distributed to end-users.</p>
+
+<h4 id="AutoReleaseMode">Build signed and aligned</h4>
+
+<p>If you would like, you can configure the Android build script to automatically
+sign and align your application package. To do so, you must provide the path to your keystore
+and the name of your key alias in your project's {@code build.properties} file. With this
+information provided, the build script will prompt you for your keystore and alias password
+when you build in release mode and produce your final application package, which will be ready
+for distribution.</p>
+
+<p class="caution"><strong>Caution:</strong> Due to the way Ant handles input, the password that
+you enter during the build process <strong>will be visible</strong>. If you are
+concerned about your keystore and alias password being visible on screen, then you
+may prefer to perform the application signing manually, via Jarsigner (or a similar tool). To instead
+perform the signing procedure manually, <a href="#ManualReleaseMode">buid unsigned</a> and then continue
+with <a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
+
+<p>To specify your keystore and alias, open the project {@code build.properties} file (found in the
+root of the project directory) and add entries for {@code key.store} and {@code key.alias}.
+For example:</p>
+
+<pre>
+key.store=/path/to/my.keystore
+key.alias=mykeystore
+</pre>
+
+<p>Save your changes. Now you can build a <em>signed</em> .apk in release mode:</p>
+
+<ol>
+ <li>Open a command-line and navigate to the root of your project directory.</li>
+ <li>Use Ant to compile your project in release mode:
+ <pre>ant release</pre>
+ </li>
+ <li>When prompted, enter you keystore and alias passwords.
+ <p class="caution"><strong>Caution:</strong> As described above,
+ your password will be visible on the screen.</p>
+ </li>
+</ol>
+
+<p>This creates your Android application .apk file inside the project <code>bin/</code>
+directory, named <code><em><your_project_name></em>-release.apk</code>.
+This .apk file has been signed with the private key specified in
+{@code build.properties} and aligned with {@code zipalign}. It's ready for
+installation and distribution.</p>
+
+
+<h4>Once built and signed in release mode</h4>
+
<p>Once you have signed your application with a private key, you can install it on an
emulator or device as discussed in the following section about
<a href="#Running">Running Your Application</a>.
@@ -329,7 +402,7 @@
you'll use this in the next step.</p>
</li>
<li>Create a new AVD using your selected deployment target:
- <pre>android create avd --name <em><your_avd_name></em> --target <em><targetID></em></pre>
+ <pre>android create avd --name <em><your_avd_name></em> --target <em><target_ID></em></pre>
<li>Next, you'll be asked whether you'd like to create a custom hardware profile.
If you respond "yes," you'll be presented with a series of prompts to define various aspects of the
device hardware (leave entries blank to use default values, which are shown in brackets). Otherwise,
diff --git a/docs/html/guide/developing/tools/avd.jd b/docs/html/guide/developing/tools/avd.jd
index b8f205e..06b1245 100644
--- a/docs/html/guide/developing/tools/avd.jd
+++ b/docs/html/guide/developing/tools/avd.jd
@@ -11,6 +11,8 @@
hardware options, system image, and data storage.
<li>You create AVD configurations to model different device environments
in the Android emulator.</li>
+ <li>The <code>android</code> tool offers a graphical Android AVD
+ Manager and a command-line interface for creating AVDs.</li>
</ul>
<h2>In this document</h2>
<ol>
@@ -72,9 +74,18 @@
href="{@docRoot}guide/developing/tools/emulator.html">Emulator</a>
documentation. </p>
-<p>To create and manage AVDs, you use the android tool provided in the Android
-SDK. For more information about how to work with AVDs from inside
-your development environment, see <a
+<p>To create and manage AVDs, you use the <code>android</code> tool provided in
+the <code>tools/</code> directory of the Android SDK. The tool provides both a
+graphical AVD manager and a command-line interface that you can use to
+create AVDs. To access the graphical AVD manager, run the
+<code>android</code> tool without options. The sections below describe how to
+use the <code>android</code> command-line interface to create and manage AVDs.
+Note that some functionality, such as the capability to create an AVD with a
+custom hardware configuration, are only available through the command-line
+interface. </p>
+
+<p>For more information about how to work with AVDs from inside your development
+environment, see <a
href="{@docRoot}guide/developing/eclipse-adt.html">Developing in Eclipse with
ADT</a> or <a href="{@docRoot}guide/developing/other-ide.html">Developing in
Other IDEs</a>, as appropriate for your environment.</p>
@@ -89,11 +100,11 @@
</div>
</div>
-<p>To create an AVD, you use the android tool, a command-line utility
-available in the <code><sdk>/tools/</code> directory. Managing AVDs is one
-of the two main function of the android tool (the other is creating and updating
-Android projects). Open a terminal window and change to the
-<code><sdk>/tools/</code> directory, if needed</p>
+<p>To create an AVD, you use the <code>android</code> tool, a command-line
+utility available in the <code><sdk>/tools/</code> directory. Managing
+AVDs is one of the two main function of the <code>android</code> tool (the other
+is creating and updating Android projects). Open a terminal window and change to
+the <code><sdk>/tools/</code> directory, if needed</p>
<p>To create each AVD, you issue the command <code>android create avd</code>,
with options that specify a name for the new AVD and the system image you want
@@ -118,11 +129,12 @@
be running on the system that you specify in the <code>-t</code> argument.<p>
<p>To specify the system image to use, you refer to its <em>target ID</em>
-— an integer — as assigned by the android tool. The target ID is not
-derived from the system image name, version, or API Level, or other attribute,
-so you need to have the android tool list the available system images and the
-target ID of each, as described in the next section. You should do this
-<em>before</em> you run the <code>android create avd</code> command.
+— an integer — as assigned by the <code>android</code> tool. The
+target ID is not derived from the system image name, version, or API Level, or
+other attribute, so you need to have the <code>android</code> tool list the
+available system images and the target ID of each, as described in the next
+section. You should do this <em>before</em> you run the <code>android create
+avd</code> command.
</p>
<h3 id="listingtargets">Listing targets</h3>
@@ -131,7 +143,7 @@
<pre>android list targets</pre>
-<p>The android tool scans the <code><sdk>/platforms</code> and
+<p>The <code>android</code> tool scans the <code><sdk>/platforms</code> and
<code><sdk>/add-ons</code> directories looking for valid system images and
then generates the list of targets. Here's an example of the command output:
</p>
@@ -199,24 +211,22 @@
<pre>android create avd -n my_android1.5 -t 2</pre>
<p>If the target you selected was a standard Android system image ("Type:
-platform"), the android tool next asks you whether you want to create a custom
-hardware profile. </p>
-
+platform"), the <code>android</code> tool next asks you whether you want to
+create a custom hardware profile. </p>
<pre>Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]</pre>
<p>If you want to set custom hardware emulation options for the AVD, enter
"yes" and set values as needed. If you want to use the default hardware
emulation options for the AVD, just press the return key (the default is "no").
-The android tool creates the AVD with name and system image mapping you
+The <code>android</code> tool creates the AVD with name and system image mapping you
requested, with the options you specified.
-<p class="note">If you are creating an AVD whose target is an SDK add-on,
-the android tool does not allow you to set hardware emulation options. It
-assumes that the provider of the add-on has set emulation options appropriately
-for the device that the add-on is modeling, and so prevents you from resetting
-the options. </p>
-
+<p class="note">If you are creating an AVD whose target is an SDK add-on, the
+<code>android</code> tool does not allow you to set hardware emulation options.
+It assumes that the provider of the add-on has set emulation options
+appropriately for the device that the add-on is modeling, and so prevents you
+from resetting the options. </p>
<p>For a list of options you can use in the <code>android create avd</code>
command, see the table in <a href="#options">Command-line options for AVDs</a>,
at the bottom of
@@ -225,11 +235,11 @@
<h3 id="hardwareopts">Setting hardware emulation options</h3>
<p>When are creating a new AVD that uses a standard Android system image ("Type:
-platform"), the android tool lets you set hardware emulation options for virtual
-device. The table below lists the options available and the default values, as
-well as the names of properties that store the emulated hardware options in the AVD's
-configuration file (the config.ini file in the AVD's local directory). </p>
-
+platform"), the <code>android</code> tool lets you set hardware emulation
+options for virtual device. The table below lists the options available and the
+default values, as well as the names of properties that store the emulated
+hardware options in the AVD's configuration file (the config.ini file in the
+AVD's local directory). </p>
<table>
<tr>
@@ -249,7 +259,6 @@
<td>Whether there is a touch screen or not on the device. Default value is "yes".</td>
<td>hw.touchScreen
-
<tr>
<td>Trackball support </td>
<td>Whether there is a trackball on the device. Default value is "yes".</td>
@@ -339,23 +348,30 @@
<td>Default value is "66MB".</td>
<td>disk.cachePartition.size </td>
</tr>
+
+<tr>
+<td>Abstracted LCD density</td>
+<td>Sets the generalized density characteristic used by the AVD's screen. Default value is "160".</td>
+<td>hw.lcd.density </td>
+</tr>
+
</table>
<h3 id="location">Default location of the AVD files</h3>
-<p>When you create an AVD, the android tool creates a dedicated directory for it
+<p>When you create an AVD, the <code>android</code> tool creates a dedicated directory for it
on your development computer. The directory contains the AVD configuration file,
the user data image and SD card image (if available), and any other files
associated with the device. Note that the directory does not contain a system
image — instead, the AVD configuration file contains a mapping to the
system image, which it loads when the AVD is launched. </p>
-<p>The android tool also creates a <AVD name>.ini file for the AVD at the
+<p>The <code>android</code> tool also creates a <AVD name>.ini file for the AVD at the
root of the .android/avd directory on your computer. The file specifies the
location of the AVD directory and always remains at the root the .android
directory.</p>
-<p>By default, the android tool creates the AVD directory inside
+<p>By default, the <code>android</code> tool creates the AVD directory inside
<code>~/.android/avd/</code> (on Linux/Mac), <code>C:\Documents and
Settings\<user>\.android\</code> on Windows XP, and
<code>C:\Users\<user>\.android\</code> on Windows Vista.
@@ -396,18 +412,18 @@
<h3 id="deleting">Deleting an AVD</h3>
-<p>You can use the android tool to delete an AVD. Here is the command usage:</p>
+<p>You can use the <code>android</code> tool to delete an AVD. Here is the command usage:</p>
<pre>android delete avd -n <name> </pre>
-<p>When you issue the command, the android tool looks for an AVD matching the
+<p>When you issue the command, the <code>android</code> tool looks for an AVD matching the
specified name deletes the AVD's directory and files. </p>
<h2 id="options">Command-line options for AVDs</h2>
<p>The table below lists the command-line options you can use with the
-android tool. </p>
+<code>android</code> tool. </p>
<table>
@@ -448,9 +464,9 @@
<td><code>-f</code></td>
<td>Force creation of the AVD</td>
<td>By default, if the name of the AVD being created matches that of an
- existing AVD, the android tool will not create the new AVD or overwrite
+ existing AVD, the <code>android</code> tool will not create the new AVD or overwrite
the existing AVD. If you specify the <code>-f</code> option, however, the
- android tool will automatically overwrite any existing AVD that has the
+ <code>android</code> tool will automatically overwrite any existing AVD that has the
same name as the new AVD. The files and data of the existing AVD are
deleted. </td>
</tr>
@@ -465,7 +481,7 @@
<td><code>-s <name></code> or <br>
<code>-s <width>-<height></code> </td>
<td>The skin to use for this AVD, identified by name or dimensions.</td>
- <td>The android tool scans for a matching skin by name or dimension in the
+ <td>The <code>android</code> tool scans for a matching skin by name or dimension in the
<code>skins/</code> directory of the target referenced in the <code>-t
<targetID></code> argument. Example: <code>-s HVGA-L</code></td>
</tr>
diff --git a/docs/html/guide/developing/tools/emulator.jd b/docs/html/guide/developing/tools/emulator.jd
index 82d3c8d..a9b6914 100644
--- a/docs/html/guide/developing/tools/emulator.jd
+++ b/docs/html/guide/developing/tools/emulator.jd
@@ -1,7 +1,7 @@
page.title=Android Emulator
@jd:body
-<img src="{@docRoot}images/emulator-hvga-p.png" alt="Image of the Android Emulator" width="271" height="524" style="margin-left:0em;margin-top:-4em;float:right;"/>
+<div style="padding:1em;"><img src="/images/emulator-wvga800l.png" alt="Image of the Android Emulator" width="367" height="349" style="margin-left:2em;margin-top:-4em;float:right;"/></div>
<p>The Android SDK includes a mobile device emulator -- a virtual mobile device
that runs on your computer. The emulator lets you prototype, develop, and test
@@ -27,9 +27,13 @@
arriving SMS messages or phone calls), and simulate latency effects and dropouts
on the data channel.</p>
-<div class="inline-toc" style="whitespace:nowrap;">
-<h4>In this document:</h4>
-<div class="g-unit g-first" style="whitespace:nowrap;width:35%;">
+<table>
+<tr>
+<td colspan="2" style="border:0;"><strong>In this document:</strong></td>
+</tr>
+<tr>
+<td style="border:0;">
+
<ol class="toc">
<li><a href="#overview">Overview</a></li>
<li><a href="#starting">Starting and Stopping the Emulator</a></li>
@@ -53,9 +57,9 @@
<li><a href="#calling">Sending a Voice Call or SMS to Another Emulator Instance</a></li>
</ol></li>
</ol>
-</div>
+</td>
-<div class="g-unit" style="whitespace:nowrap;">
+<td style="border:0;">
<ol class="toc">
<li><a href="#console">Using the Emulator Console</a>
<ol class="toc">
@@ -85,9 +89,9 @@
<li><a href="#troubleshooting">Troubleshooting Emulator Problems</a></li>
<li><a href="#limitations">Emulator Limitations</a></li>
</ol>
-</div>
+</td>
-</div>
+</table>
<a name="overview"></a>
@@ -260,11 +264,11 @@
</tr>
<tr>
<td>Switch to previous layout orientation (for example, portrait, landscape)</td>
- <td>KEYPAD_7, F11</td>
+ <td>KEYPAD_7, Ctrl-F11</td>
</tr>
<tr>
<td>Switch to next layout orientation (for example, portrait, landscape)</td>
- <td>KEYPAD_9, F12</td>
+ <td>KEYPAD_9, Ctrl-F12</td>
</tr>
<tr>
<td>Toggle cell networking on/off</td>
@@ -721,19 +725,19 @@
</tr>
<tr>
<td><code>-skin <skinID></code></td>
- <td>Start the emulator with the specified skin. </td>
- <td>The standard Android platforms includes a <a href="#skins">choice of
- four skins</a>:<br />
- <li>HVGA-L (480x320, landscape)</li>
- <li>HVGA-P (320x480, portrait) (default) </li>
- <li>QVGA-L (320x240, landscape)</li>
- <li>QVGA-P (240x320, portrait) </li>
+ <td>This emulator option is deprecated. </td>
+ <td>Please set skin options using AVDs, rather than by using this emulator
+option. Using this option may yield unexpected and in some cases misleading
+results, since the density with which to render the skin may not be defined.
+AVDs let you associate each skin with a default density and override the default
+as needed. For more information, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>.
</td>
</tr>
<tr>
<td><code>-skindir <dir></code></td>
- <td>Search for emulator skins in <dir>. </td>
- <td> </td></tr>
+ <td>This emulator option is deprecated. </td>
+ <td>See comments for <code>-skin</code>, above.</td></tr>
</table>
<a name="diskimages"></a>
@@ -1636,41 +1640,9 @@
<h2>Using Emulator Skins</h2>
-<p>You can run the emulator with any of four default skins, as described in the table below. To specify a skin, use <code>-skin <skinID></code> when starting the emulator. </p>
+<p>The Android SDK includes several Emulator skins that you can use to control the resolution and density of the emulated device's screen. To select a specific skin for running the emulator, create an AVD that uses that skin. Please do not use deprecated emulator options such as <code>-skin</code> to control the skin used by an emulator instance. For more information about AVDs, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>. </p>
-<p>For example: </p>
-
-<pre>emulator -skin HVGA-L</pre>
-
-<p>Note that you must enter the <code><skinID></code> in uppercase letters (if your development computer is case-sensitive).</p>
-
-<table border="0" style="clear:left;padding:2em;">
- <tr>
- <th width="20%">skinID</th>
- <th >Description</th>
- <th >Skin</th>
- </tr>
- <tr>
- <td><code>HVGA-L</code></td>
- <td>480x320, landscape</td>
- <td><img src="{@docRoot}images/e-mini-hvga-l.png" width="219" height="113"></td>
- </tr>
- <tr>
- <td><code>HVGA-P</code></td>
- <td>320x480, portrait (default)</td>
- <td><img src="{@docRoot}images/e-mini-hvga-p.png" width="113" height="219"></td>
- </tr>
- <tr>
- <td><code>QVGA-L</code></td>
- <td>320x240, landscape</td>
- <td><img src="{@docRoot}images/e-mini-qvga-l.png" width="119" height="197"></td>
- </tr>
- <tr>
- <td><code>QVGA-P</code></td>
- <td>240x320, portrait</td>
- <td><img src="{@docRoot}images/e-mini-qvga-p.png" width="95" height="173"></td>
- </tr>
-</table>
<a name="multipleinstances"></a>
diff --git a/docs/html/guide/developing/tools/index.jd b/docs/html/guide/developing/tools/index.jd
index 2c9e45d..91b430f 100644
--- a/docs/html/guide/developing/tools/index.jd
+++ b/docs/html/guide/developing/tools/index.jd
@@ -89,5 +89,10 @@
<dd>A script that lets you manage AVDs and generate <a
href="http://ant.apache.org/" title="Ant">Ant</a> build files that
you can use to compile your Android applications. </dd>
+
+ <dt><a href="zipalign.html">zipalign</a></dt>
+ <dd>An important .apk optimization tool. This tool ensures that all uncompressed data starts
+ with a particular alignment relative to the start of the file. This should always be used
+ to align .apk files after they have been signed.</dd>
</dl>
diff --git a/docs/html/guide/developing/tools/zipalign.jd b/docs/html/guide/developing/tools/zipalign.jd
new file mode 100644
index 0000000..6231798
--- /dev/null
+++ b/docs/html/guide/developing/tools/zipalign.jd
@@ -0,0 +1,65 @@
+page.title=zipalign
+@jd:body
+
+<p>zipalign is an archive alignment tool that provides important
+optimization to Android application (.apk) files.
+The purpose is to ensure that all uncompressed data starts
+with a particular alignment relative to the start of the file. Specifically,
+it causes all uncompressed data within the .apk, such as images or raw files,
+to be aligned on 4-byte boundaries. This
+allows all portions to be accessed directly with {@code mmap()} even if they
+contain binary data with alignment restrictions.
+The benefit is a reduction in the amount of RAM consumed
+when running the application.</p>
+
+<p>This tool should always be used to align your .apk file before
+distributing it to end-users. The Android build tools can handle
+this for you. When using Eclipse with the ADT plugin, the Export Wizard
+will automatically zipalign your .apk after it signs it with your private key.
+The build scripts used
+when compiling your application with Ant will also zipalign your .apk,
+as long as you have provided the path to your keystore and the key alias in
+your project {@code build.properties} file, so that the build tools
+can sign the package first.</p>
+
+<p class="caution"><strong>Caution:</strong> zipalign must only be performed
+<strong>after</strong> the .apk file has been signed with your private key.
+If you perform zipalign before signing, then the signing procedure will undo
+the alignment. Also, do not make alterations to the aligned package.
+Alterations to the archive, such as renaming or deleting entries, will
+potentially disrupt the alignment of the modified entry and all later
+entries. And any files added to an "aligned" archive will not be aligned.</p>
+
+<p>The adjustment is made by altering the size of
+the "extra" field in the zip Local File Header sections. Existing data
+in the "extra" fields may be altered by this process.</p>
+
+<p>For more information about how to use zipalign when building your
+application, please read <a href="{@docRoot}guide/publishing/app-signing.html">Signing
+Your Application</a>.</p>
+
+
+<h3>Usage</h3>
+
+<p>To align {@code infile.apk} and save it as {@code outfile.apk}:</p>
+
+<pre>zipalign [-f] [-v] <alignment> infile.apk outfile.apk</pre>
+
+<p>To confirm the alignment of {@code existing.apk}:</p>
+
+<pre>zipalign -c -v <alignment> existing.apk</pre>
+
+<p>The {@code <alignment>} is an integer that defines the byte-alignment boundaries.
+This must always be 4 (which provides 32-bit alignment) or else it effectively
+does nothing.</p>
+
+<p>Flags:</p>
+
+<ul>
+ <li>{@code -f} : overwrite existing outfile.zip</li>
+ <li>{@code -v} : verbose output</li>
+ <li>{@code -c} : confirm the alignment of the given file</li>
+</ul>
+
+
+
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index ef1a1ea..5abc872 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -256,6 +256,7 @@
<li><a href="<?cs var:toroot ?>guide/developing/tools/monkey.html">Monkey</a></li>
<li><a href="<?cs var:toroot ?>guide/developing/tools/adb.html#sqlite">sqlite3</a></li>
<li><a href="<?cs var:toroot ?>guide/developing/tools/traceview.html" >Traceview</a></li>
+ <li><a href="<?cs var:toroot ?>guide/developing/tools/zipalign.html" >zipalign</a></li>
</ul>
</li>
<!--<li><a href="<?cs var:toroot ?>guide/developing/instrumentation/index.html">Instrumentation</a></li>
@@ -375,7 +376,7 @@
</ul>
<ul>
<?cs if:android.whichdoc != "online" ?>
- <li><a href="<?cs var:toroot ?>../samples">
+ <li><a href="<?cs var:toroot ?>../platforms/android-<?cs var:sdk.version ?>/samples">
<span class="en">Sample Code</span>
»</a></li>
<?cs else ?>
diff --git a/docs/html/guide/publishing/app-signing.jd b/docs/html/guide/publishing/app-signing.jd
index a16c910..f0febc0 100644
--- a/docs/html/guide/publishing/app-signing.jd
+++ b/docs/html/guide/publishing/app-signing.jd
@@ -22,10 +22,11 @@
<li><a href="#debugmode">Signing in Debug Mode</a></li>
<li><a href="#releasemode">Signing for Public Release</a>
<ol>
- <li><a href="#releasecompile">Compiling for release</a></li>
- <li><a href="#cert">Obtaining a suitable private key</a></li>
- <li><a href="#signapp">Signing your application</a></li>
- <li><a href="#ExportWizard">Compiling and signing with Eclipse ADT</a></li>
+ <li><a href="#cert">Obtain a suitable private key</a></li>
+ <li><a href="#releasecompile">Compile the application in release mode</a></li>
+ <li><a href="#signapp">Sign your application with your private key</a></li>
+ <li><a href="#align">Align the final APK package</a></li>
+ <li><a href="#ExportWizard">Compile and sign with Eclipse ADT</a></li>
</ol>
</li>
<li><a href="#secure-key">Securing Your Private Key</a></li>
@@ -71,6 +72,7 @@
will continue to function normally.</li>
<li>You can use standard tools — Keytool and Jarsigner — to generate keys and
sign your application .apk files.</li>
+ <li>Once you have signed the application, use the <code>zipalign</code> tool to optimize the final APK package.</li>
</ul>
<p>The Android system will not install or run an application that is not signed appropriately. This
@@ -107,6 +109,9 @@
</li>
</ul>
+<p>Once your application is signed, don't forget to run {@code zipalign} on the APK
+for additional optimization.</p>
+
<h2 id="strategies">Signing Strategies</h2>
<p>Some aspects of application signing may affect how you approach the development
@@ -171,16 +176,16 @@
<h2 id="setup">Basic Setup for Signing</h2>
-<p>To support the generation of a keystore and debug key, you should first make sure that
+<p>Before you begin, you should make sure that
Keytool is available to the SDK build
-tools. In most cases, you can tell the SDK build tools how to find Keytool by making sure
-that your JAVA_HOME environment variable is set and that it references a suitable JDK.
-Alternatively, you can add the JDK version of Keytool to your PATH variable.</p>
+tools. In most cases, you can tell the SDK build tools how to find Keytool by setting
+your <code>JAVA_HOME</code> environment variable to references a suitable JDK.
+Alternatively, you can add the JDK version of Keytool to your <code>PATH</code> variable.</p>
<p>If you are developing on a version of Linux that originally came with GNU Compiler for
Java, make sure that the system is using the JDK version of Keytool, rather than the gcj
-version. If Keytool is already in your PATH, it might be pointing to a symlink at
-<code>/usr/bin/keytool</code>. In this case, check the symlink target to make sure that it points
+version. If Keytool is already in your <code>PATH</code>, it might be pointing to a symlink at
+<code>/usr/bin/keytool</code>. In this case, check the symlink target to be sure it points
to the Keytool in the JDK.</p>
<p>If you will release your application to the public, you will also need to have
@@ -191,46 +196,50 @@
<p>The Android build tools provide a debug signing mode that makes it easier for you
to develop and debug your application, while still meeting the Android system
-requirement for signing your .apk when it is installed in the emulator or a device.
-When you use debug mode, the SDK tools invoke Keytool to create a debug
-keystore and key.</p>
+requirement for signing your .apk.
+When using debug mode to build your app, the SDK tools invoke Keytool to automatically create
+a debug keystore and key. This debug key is then used to automatically sign the .apk, so
+you do not need to sign the package with your own key.</p>
-<p>The SDK tools create the debug keystore/key with predetermined names/passwords;</p>
+<p>The SDK tools create the debug keystore/key with predetermined names/passwords:</p>
<ul>
-<li>Keystore name – "debug.keystore"</li>
-<li>Keystore password – "android"</li>
-<li>Key alias – "androiddebugkey"</li>
-<li>Key password – "android"</li>
-<li>CN – "CN=Android Debug,O=Android,C=US"</li>
+<li>Keystore name: "debug.keystore"</li>
+<li>Keystore password: "android"</li>
+<li>Key alias: "androiddebugkey"</li>
+<li>Key password: "android"</li>
+<li>CN: "CN=Android Debug,O=Android,C=US"</li>
</ul></p>
<p>If necessary, you can change the location/name of the debug keystore/key or
-supply a custom debug keystore/key to use. In Eclipse/ADT, you can use
-<strong>Windows</strong> > <strong>Prefs</strong> >
-<strong>Android</strong> > <strong>Build</strong>. However, any custom debug
+supply a custom debug keystore/key to use. However, any custom debug
keystore/key must use the same keystore/key names and passwords as the default
-debug key (as described above).</p>
+debug key (as described above). (To do so in Eclipse/ADT, go to
+<strong>Windows</strong> > <strong>Preferences</strong> >
+<strong>Android</strong> > <strong>Build</strong>.) </p>
-<p class="note"><strong>Note:</strong> You <em>cannot</em> release your application
+<p class="caution"><strong>Caution:</strong> You <em>cannot</em> release your application
to the public when signed with the debug certificate.</p>
<h3>Eclipse Users</h3>
-<p>If you are developing in Eclipse/ADT and have set up Keytool as described
-above, signing in debug mode is enabled by default. When you run or debug your
-application, ADT signs the .apk with the debug certificate and installs it on
-the emulator. No specific action on your part is needed, provided ADT has
-access to Keytool.</p>
+<p>If you are developing in Eclipse/ADT (and have set up Keytool as described above in
+<a href="#setup">Basic Setup for Signing</a>),
+signing in debug mode is enabled by default. When you run or debug your
+application, ADT signs the .apk with the debug certificate, runs {@code zipalign} on the
+package, then installs it on
+the selected emulator or connected device. No specific action on your part is needed,
+provided ADT has access to Keytool.</p>
<h3>Ant Users</h3>
-<p>If you use Ant to build your .apk files, debug signing mode
-is enabled by using the <code>debug</code> option, assuming that you are using a
-<code>build.xml</code> file generated by the
-<code>android</code> tool. When you run <code>ant debug</code> to
+<p>If you are using Ant to build your .apk files, debug signing mode
+is enabled by using the <code>debug</code> option with the <code>ant</code> command
+(assuming that you are using a <code>build.xml</code> file generated by the
+<code>android</code> tool). When you run <code>ant debug</code> to
compile your app, the build script generates a keystore/key and signs the .apk for you.
+The script then also aligns the .apk with the <code>zipalign</code> tool.
No other action on your part is needed. Read
-<a href="{@docRoot}guide/developing/other-ide.html#DebugMode">Developing In Other IDEs: Building
+<a href="{@docRoot}guide/developing/other-ide.html#DebugMode">Developing In Other IDEs: Building
in debug mode</a> for more information.</p>
@@ -268,51 +277,20 @@
<p>When your application is ready for release to other users, you must:</p>
<ol>
- <li>Compile the application in release mode</li>
- <li>Obtain a suitable private key</li>
- <li>Sign the application with your private key</li>
+ <li><a href="#cert">Obtain a suitable private key</a></li>
+ <li><a href="#releasecompile">Compile the application in release mode</li>
+ <li><a href="#signapp">Sign your application with your private key</a></li>
+ <li><a href="#align">Align the final APK package</a></li>
</ol>
-<p>The sections below provide information about how to perform these steps.</p>
-
-<p>If you use Eclipse with the ADT plugin, you can instead use the Export Wizard
-to compile and sign an .apk with your private key. The Export Wizard even allows you to
-generate a new keystore and private key in the process. Skip to
-<a href="#ExportWizard">Compiling and signing with Eclipse ADT</a>.</p>
+<p>If you are developing in Eclipse with the ADT plugin, you can use the Export Wizard
+to perform the compile, sign, and align procedures. The Export Wizard even allows you to
+generate a new keystore and private key in the process. So if you use Eclipse, you can
+skip to <a href="#ExportWizard">Compile and sign with Eclipse ADT</a>.</p>
-<h3 id="releasecompile">Compiling for release</h3>
-<p>To prepare your application for release, you must first compile it in release mode.
-In release mode, the Android build tools compile your application as usual,
-but without signing it with the debug key.</p>
-
-<p class="warning"><strong>Note:</strong>
-You can not release your application unsigned, or signed with the debug key.</p>
-
-<h4>Eclipse users</h4>
-
-<p>To export an <em>unsigned</em> .apk from Eclipse, right-click the project in the Package
-Explorer and select <strong>Android Tools</strong> > <strong>Export Unsigned Application
-Package</strong>. Then simply specify the file location for the unsigned .apk.
-(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, open
-the <em>Overview</em> tab, and click <strong>Export an unsigned .apk</strong>.)</p>
-
-<p>You can also combine the compiling and signing steps with the Export Wizard. See
-<a href="#ExportWizard">Compiling and signing with Eclipse ADT</a>.</p>
-
-<h4>Ant users</h4>
-
-<p>If you are using Ant, all you need to do is specify the build target
-"release" in the Ant command. For example, if you are running Ant from the
-directory containing your build.xml file, the command would look like this:</p>
-
-<pre>$ ant release</pre>
-
-<p>The build script compiles the application .apk without signing it.</p>
-
-
-<h3 id="cert">Obtaining a Suitable Private Key</h3>
+<h3 id="cert">1. Obtain a suitable private key</h3>
<p>In preparation for signing your application, you must first ensure that
you have a suitable private key with which to sign. A suitable private
@@ -339,7 +317,8 @@
command and pass any of the options listed below (and any others, as
needed). </p>
-<p class="warning"><strong>Note:</strong> Before you run Keytool, make sure to read
+<p class="warning"><strong>Warning:</strong> Keep your private key secure.
+Before you run Keytool, make sure to read
<a href="#secure-key">Securing Your Private Key</a> for a discussion of how to keep
your key secure and why doing so is critically important to you and to users. In
particular, when you are generating your key, you should select strong passwords
@@ -395,7 +374,6 @@
</tr>
</table>
-
<p>Here's an example of a Keytool command that generates a private key:</p>
<pre>$ keytool -genkey -v -keystore my-release-key.keystore
@@ -415,9 +393,57 @@
http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security</a></p>
-<h3 id="signapp">Signing your application</h3>
-<p>When you are ready to actually sign your .apk for release, you can do so
+<h3 id="releasecompile">2. Compile the application in release mode</h3>
+
+<p>In order to release your application to users, you must compile it in release mode.
+In release mode, the compiled application is not signed by default and you will need
+to sign it with your private key.</p>
+
+<p class="caution"><strong>Caution:</strong>
+You can not release your application unsigned, or signed with the debug key.</p>
+
+<h4>With Eclipse</h4>
+
+<p>To export an <em>unsigned</em> .apk from Eclipse, right-click the project in the Package
+Explorer and select <strong>Android Tools</strong> > <strong>Export Unsigned Application
+Package</strong>. Then specify the file location for the unsigned .apk.
+(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, open
+the <em>Overview</em> tab, and click <strong>Export an unsigned .apk</strong>.)</p>
+
+<p>Note that you can combine the compiling and signing steps with the Export Wizard. See
+<a href="#ExportWizard">Compiling and signing with Eclipse ADT</a>.</p>
+
+<h4>With Ant</h4>
+
+<p>If you are using Ant, you can enable release mode by using the <code>release</code> option
+with the <code>ant</code> command. For example, if you are running Ant from the
+directory containing your {@code build.xml} file, the command would look like this:</p>
+
+<pre>ant release</pre>
+
+<p>By default, the build script compiles the application .apk without signing it. The output file
+in your project {@code bin/} will be <code><em><your_project_name></em>-unsigned.apk</code>.
+Because the application .apk is still unsigned, you must manually sign it with your private
+key and then align it using {@code zipalign}.</p>
+
+<p>However, the Ant build script can also perform the signing
+and aligning for you, if you have provided the path to your keystore and the name of
+your key alias in the project's {@code build.properties} file. With this information provided,
+the build script will prompt you for your keystore and alias password when you perform
+<code>ant release</code>, it will sign the package and then align it. The final output
+file in {@code bin/} will instead be
+<code><em><your_project_name></em>-release.apk</code>. With these steps
+automated for you, you're able to skip the manual procedures below (steps 3 and 4).
+To learn how to specify your keystore and alias in the {@code build.properties} file,
+see <a href="{@docRoot}guide/developing/other-ide.html#ReleaseMode">Developing In Other
+IDEs: Building in release mode</a>.</p>
+
+
+
+<h3 id="signapp">3. Sign your application with your private key</h3>
+
+<p>When you have an application package that is ready to be signed, you can do sign it
using the Jarsigner tool. Make sure that you have Jarsigner available on your
machine, as described in <a href="#setup">Basic Setup</a>. Also, make sure that
the keystore containing your private key is available.</p>
@@ -492,29 +518,63 @@
http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security</a></p>
-<h3 id="ExportWizard">Compiling and signing with Eclipse ADT</h3>
+<h3 id="align">4. Align the final APK package</h3>
-<p>When using Eclipse with ADT, you can use the Export Wizard to
+<p>Once you have signed the .apk with your private key, run <code>zipalign</code> on the file.
+This tool ensures that all uncompressed data starts with a particular byte alignment,
+relative to the start of the file. Ensuring alignment at 4-byte boundaries provides
+a performance optimization when installed on a device. When aligned, the Android
+system is able to read files with {@code mmap()}, even if
+they contain binary data with alignment restrictions, rather than copying all
+of the data from the package. The benefit is a reduction in the amount of
+RAM consumed by the running application.</p>
+
+<p>The <code>zipalign</code> tool is provided with the Android SDK, inside the
+<code>tools/</code> directory. To align your signed .apk, execute:</p>
+
+<pre>zipalign -v 4 <em>your_project_name</em>-unaligned.apk <em>your_project_name</em>.apk</pre>
+
+<p>The {@code -v} flag turns on verbose output (optional). {@code 4} is the
+byte-alignment (don't use anything other than 4). The first file argument is
+your signed .apk (the input) and the second file is the destination .apk file (the output).
+If you're overriding an existing .apk, add the {@code -f} flag.</p>
+
+<p class="caution"><strong>Caution:</strong> Your input .apk must be signed with your
+private key <strong>before</strong> you optimize the package with {@code zipalign}.
+If you sign it after using {@code zipalign}, it will undo the alignment.</p>
+
+<p>For more information, read about the
+<a href="{@docRoot}guide/developing/tools/zipalign.html">zipalign</a> tool.
+
+
+<h3 id="ExportWizard">Compile and sign with Eclipse ADT</h3>
+
+<p>If you are using Eclipse with the ADT plugin, you can use the Export Wizard to
export a <em>signed</em> .apk (and even create a new keystore,
if necessary). The Export Wizard performs all the interaction with
-the Keytool and Jarsigner for you, which allows you to perform signing via a
-graphical interface instead of the command-line.
+the Keytool and Jarsigner for you, which allows you to sign the package using a GUI
+instead of performing the manual procedures to compile, sign,
+and align, as discussed above. Once the wizard has compiled and signed your package,
+it will also perfom package alignment with {@code zipalign}.
Because the Export Wizard uses both Keytool and Jarsigner, you should
ensure that they are accessible on your computer, as described above
in the <a href=#setup">Basic Setup for Signing</a>.</p>
-<p>To create a signed .apk, right-click the project in the Package
-Explorer and select <strong>Android Tools > Export Signed Application Package</strong>.
-(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, open
-the <em>Overview</em> tab, and click <strong>Use the Export Wizard</strong>.)
-The window that appears will display any errors found while
-attempting to export your application. If no errors are found, continue with the
-Export Wizard, which will guide you through the process of signing your application,
-including steps for selecting the private key with which to sign the .apk,
-or creating a new keystore and private key.</p>
+<p>To create a signed and aligned .apk in Eclipse:</p>
-<p>When you complete the Export Wizard, you'll
-have a signed .apk that's ready for distribution.</p>
+<ol>
+ <li>Select the project in the Package
+Explorer and select <strong>File > Export</strong>.</li>
+ <li>Open the Android folder, select Export Android Application,
+ and click <strong>Next</strong>.
+ <p>The Export Android Application wizard now starts, which will
+ guide you through the process of signing your application,
+ including steps for selecting the private key with which to sign the .apk
+ (or creating a new keystore and private key).</p>
+ <li>Complete the Export Wizard and your application will be compiled,
+ signed, aligned, and ready for distribution.</li>
+</ol>
+
<h2 id="secure-key">Securing Your Private Key</h2>
diff --git a/docs/html/guide/publishing/preparing.jd b/docs/html/guide/publishing/preparing.jd
index b4eaea3..5357166 100644
--- a/docs/html/guide/publishing/preparing.jd
+++ b/docs/html/guide/publishing/preparing.jd
@@ -220,22 +220,20 @@
to download Maps data. </li>
</ol>
-<p>For more information about signing and your private key, see <a
-href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
-
-
<h2 id="compile">Compile your application</h2>
<p>When you've prepared your application as described in the previous sections,
-you can compile your application for release. </p>
+you can compile your application for release.</p>
+
<h2 id="post-compile">After compiling your application</h2>
<h3 id="signapp">8. Sign your application</h3>
-<p>Sign your application using your private key. Signing your application
-correctly is critically important. Please see
-<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your
+<p>Sign your application using your private key and then
+align it with the {@code zipalign} tool. Signing your application
+correctly is critically important. Please see
+<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your
Applications</a> for complete information. </p>
<h3 id="testapp">9. Test your compiled and signed application</h3>
diff --git a/docs/html/guide/publishing/versioning.jd b/docs/html/guide/publishing/versioning.jd
index d0eafcd..8d8b304 100644
--- a/docs/html/guide/publishing/versioning.jd
+++ b/docs/html/guide/publishing/versioning.jd
@@ -17,7 +17,7 @@
<ol>
<li><a href="#appversion">Setting Application Version</a></li>
-<li><a href="#minsdkversion">Specifying Minimum System API Version</a>
+<li><a href="#minsdkversion">Specifying Your Application's System API Requirements</a>
</ol>
@@ -125,31 +125,44 @@
{@link android.content.pm.PackageManager#getPackageInfo(java.lang.String, int)}
method of {@link android.content.pm.PackageManager PackageManager}. </p>
-<h2 id="minsdkversion">Specifying Minimum System API Version</h2>
+<h2 id="minsdkversion">Specifying Your Application's System API Requirements</h2>
<p>If your application requires a specific minimum version of the Android
-platform, you can specify that version as an API Level identifier
+platform, or is designed only to support a certain range of Android platform
+versions, you can specify those version requirements as API Level identifiers
in the application's manifest file. Doing so ensures that your
application can only be installed on devices that
are running a compatible version of the Android system. </p>
-<p>To specify the minimum system version in the manifest, use this attribute: </p>
+<p>To specify API Level requirements, add a <code><uses-sdk></code>
+element in the application's manifest, with one or more of these attributes: </p>
<ul>
-<li><code>android:minSdkVersion</code> — An integer value corresponding to
-the code version of the Android platform.
-<p>When preparing to install an application, the system checks the value of this
+<li><code>android:minSdkVersion</code> — The minimum version
+of the Android platform on which the application will run, specified
+by the platform's API Level identifier. </li>
+<li><code>android:maxSdkVersion</code> — The maximum version
+of the Android platform on which the application is designed to run,
+specified by the platform's API Level identifier. </li>
+</ul>
+
+<p>When preparing to install your application, the system checks the value of this
attribute and compares it to the system version. If the
<code>android:minSdkVersion</code> value is greater than the system version, the
-system aborts the installation of the application. </p>
+system aborts the installation of the application. Similarly, the system
+installs your application only if its <code>android:maxSdkVersion</code>
+is compatible with the platform version.</p>
-<p>If you do not specify this attribute in your manifest, the system assumes
-that your application is compatible with all platform versions.</p></li>
-</ul>
+<p>If you do not specify these attributes in your manifest, the system assumes
+that your application is compatible with all platform versions, with no
+maximum API Level. </p>
<p>To specify a minimum platform version for your application, add a
<code><uses-sdk></code> element as a child of
<code><manifest></code>, then define the
<code>android:minSdkVersion</code> as an attribute. </p>
-<p>For more information, also see the <a href="{@docRoot}sdk/android-1.1.html">Android System Image 1.1 Version Notes</a>.</p>
+<p>For more information, see the <a
+href="{@docRoot}guide/developing/manifest/uses-sdk-element.html"><code><uses-
+sdk></code></a> manifest element documentation and the <a
+href="{@docRoot}guide/appendix/api-levels.htmll">API Levels</a> document.</p>
diff --git a/docs/html/guide/topics/intents/intents-filters.jd b/docs/html/guide/topics/intents/intents-filters.jd
index fd20ca17..962a001 100644
--- a/docs/html/guide/topics/intents/intents-filters.jd
+++ b/docs/html/guide/topics/intents/intents-filters.jd
@@ -16,10 +16,11 @@
<h2>In this document</h2>
<ol>
<li><a href="#iobjs">Intent Objects</a></li>
-<li><a href="#ires">Intent Resolution</a>, including:</li>
+<li><a href="#ires">Intent Resolution</a></li>
<li style="margin-left: 2em"><a href="#ifs">Intent filters</a></li>
<li style="margin-left: 2em"><a href="#ccases">Common cases</a></li>
<li style="margin-left: 2em"><a href="#imatch">Using intent matching</a></li>
+<li><a href="#npex">Note Pad Example</a></li>
</ol>
</div>
</div>
@@ -31,7 +32,7 @@
Intent messaging is a facility for late run-time binding between components in the same
or different applications. The intent itself, an {@link android.content.Intent}
object, is a passive data structure holding an abstract description of an operation
-to be performed — or, in the case of broadcasts, a description of something
+to be performed — or, often in the case of broadcasts, a description of something
that has happened and is being announced. There are separate mechanisms for
delivering intents to each type of component:
</p>
@@ -40,7 +41,9 @@
<li>An Intent object is passed to <code>{@link android.content.Context#startActivity
Context.startActivity()}</code> or <code>{@link android.app.Activity#startActivityForResult
Activity.startActivityForResult()}</code> to launch an activity or get an existing
-activity to do something new.</li>
+activity to do something new. (It can also be passed to
+<code>{@link android.app.Activity#setResult(int, Intent) Activity.setResult()}</code>
+to return information to the activity that called {@code startActivityForResult()}.)</li>
<li><p>An Intent object is passed to <code>{@link android.content.Context#startService
Context.startService()}</code> to initiate a service or deliver new instructions to an
@@ -380,22 +383,12 @@
<p>
A component has separate filters for each job it can do, each face it can
-present to the user. For example, the principal activity of the sample
-NotePad application has three filters — one for starting up with a
-blank slate, another for starting with an assigned directory of notes
-that the user can view, edit, or select from, and a third for finding a
-particular note without an initial specification of its directory.
-</p>
-
-<p>
-An intent filter is an instance of the {@link android.content.IntentFilter} class.
-However, since the Android system must know about the capabilities of a component
-before it can launch that component, intent filters are generally not set up in
-Java code, but in the application's manifest file (AndroidManifest.xml) as
-{@code <intent-filter>} elements. (The one exception would be filters for
-broadcast receivers that are registered dynamically by calling <code>{@link android.content.Context#registerReceiver(BroadcastReceiver, IntentFilter, String,
-Handler) Context.registerReceiver()}</code>; they are directly created as
-IntentFilter objects.)
+present to the user. For example, the NoteEditor activity of the sample
+Note Pad application has two filters — one for starting up with a
+specific note that the user can view or edit, and another for starting
+with a new, blank note that the user can fill in and save. (All of Note
+Pad's filters are described in the <a href="#npex">Note Pad Example</a>
+section, later.)
</p>
<div class="sidebox-wrapper">
@@ -413,6 +406,18 @@
</div>
<p>
+An intent filter is an instance of the {@link android.content.IntentFilter} class.
+However, since the Android system must know about the capabilities of a component
+before it can launch that component, intent filters are generally not set up in
+Java code, but in the application's manifest file (AndroidManifest.xml) as
+<code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code>
+elements. (The one exception would be filters for
+broadcast receivers that are registered dynamically by calling <code>{@link android.content.Context#registerReceiver(BroadcastReceiver, IntentFilter, String,
+Handler) Context.registerReceiver()}</code>; they are directly created as
+IntentFilter objects.)
+</p>
+
+<p>
A filter has fields that parallel the action, data, and category fields of an
Intent object. An implicit intent is tested against the filter in all three areas.
To be delivered to the component that owns the filter, it must pass all three tests.
@@ -429,8 +434,11 @@
<dl>
<dt><b>Action test</b></dt>
-<dd>An {@code <intent-filter>} element in the manifest file lists actions
-as {@code <action>} subelements. For example:
+<dd>An
+<code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code>
+element in the manifest file lists actions as
+<code><a href="{@docRoot}guide/topics/manifest/action-element.html"><action></a></code>
+subelements. For example:
<pre><intent-filter . . . >
<action android:name="com.example.project.SHOW_CURRENT" />
@@ -464,8 +472,9 @@
</dd>
<dt><b>Category test</b></dt>
-<dd>An {@code <intent-filter>} element also lists categories as subelements.
-For example:
+<dd>An
+<code><a href="{@docRoot}guide/topics/manifest/intent-filter-element.html"><intent-filter></a></code>
+element also lists categories as subelements. For example:
<pre><intent-filter . . . >
<category android:name="android.intent.category.DEFAULT" />
@@ -512,14 +521,16 @@
multiple times, or not at all. For example:
<pre><intent-filter . . . >
- <data android:type="video/mpeg" android:scheme="http" . . . />
- <data android:type="audio/mpeg" android:scheme="http" . . . />
+ <data android:mimeType="video/mpeg" android:scheme="http" . . . />
+ <data android:mimeType="audio/mpeg" android:scheme="http" . . . />
. . .
</intent-filter></pre>
<p>
-Each {@code <data>} element can specify a URI and a data type (MIME media type).
-There are separate attributes — {@code scheme}, {@code host}, {@code port},
+Each
+<code><a href="{@docRoot}guide/topics/manifest/data-element.html"><data></a></code>
+element can specify a URI and a data type (MIME media type). There are separate
+attributes — {@code scheme}, {@code host}, {@code port},
and {@code path} — for each part of the URI:
</p>
@@ -607,7 +618,7 @@
provider and display it:
</p>
-<pre><data android:type="image/*" /></pre>
+<pre><data android:mimeType="image/*" /></pre>
<p>
Since most available data is dispensed by content providers, filters that
@@ -681,6 +692,357 @@
queryBroadcastReceivers()}, for broadcast receivers.
</p>
+<h2 id="npex">Note Pad Example</h2>
+
+<p>
+The Note Pad sample application enables users to browse through a list
+of notes, view details about individual items in the list, edit the items,
+and add a new item to the list. This section looks at the intent filters
+declared in its manifest file. (If you're working offline in the SDK, you
+can find all the source files for this sample application, including its
+manifest file, at {@code <sdk>/samples/NotePad/index.html}.
+If you're viewing the documentation online, the source files are in the
+<a href="{@docRoot}guide/samples/index.html">Tutorials and Sample Code</a>
+section <a href="{@docRoot}guide/samples/NotePad/index.html">here</a>.)
+</p>
+
+<p>
+In its manifest file, the Note Pad application declares three activities,
+each with at least one intent filter. It also declares a content provider
+that manages the note data. Here is the manifest file in its entirety:
+</p>
+
+<pre><manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.notepad">
+ <application android:icon="@drawable/app_notes"
+ android:label="@string/app_name" >
+
+ <provider android:name="NotePadProvider"
+ android:authorities="com.google.provider.NotePad" />
+
+ <activity android:name="NotesList" android:label="@string/title_notes_list">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <action android:name="android.intent.action.EDIT" />
+ <action android:name="android.intent.action.PICK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.GET_CONTENT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="NoteEditor"
+ android:theme="@android:style/Theme.Light"
+ android:label="@string/title_note" >
+ <intent-filter android:label="@string/resolve_edit">
+ <action android:name="android.intent.action.VIEW" />
+ <action android:name="android.intent.action.EDIT" />
+ <action android:name="com.android.notepad.action.EDIT_NOTE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.INSERT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="TitleEditor"
+ android:label="@string/title_edit_title"
+ android:theme="@android:style/Theme.Dialog">
+ <intent-filter android:label="@string/resolve_title">
+ <action android:name="com.android.notepad.action.EDIT_TITLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.ALTERNATIVE" />
+ <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
+ <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
+ </intent-filter>
+ </activity>
+
+ </application>
+</manifest></pre>
+
+<p>
+The first activity, NotesList, is
+distinguished from the other activities by the fact that it operates
+on a directory of notes (the note list) rather than on a single note.
+It would generally serve as the initial user interface into the
+application. It can do three things as described by its three intent
+filters:
+</p>
+
+<ol>
+<li><pre><intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+</intent-filter></pre>
+
+<p>
+This filter declares the main entry point into the Note Pad application.
+The standard {@code MAIN} action is an entry point that does not require
+any other information in the Intent (no data specification, for example),
+and the {@code LAUNCHER} category says that this entry point should be
+listed in the application launcher.
+</p></li>
+
+<li><pre><intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <action android:name="android.intent.action.EDIT" />
+ <action android:name="android.intent.action.PICK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
+</intent-filter></pre>
+
+<p>
+This filter declares the things that the activity can do on a directory
+of notes. It can allow the user to view or edit the directory (via
+the {@code VIEW} and {@code EDIT} actions), or to pick a particular note
+from the directory (via the {@code PICK} action).
+</p>
+
+<p>
+The {@code mimeType} attribute of the
+<code><a href="{@docRoot}guide/topics/manifest/data-element.html"><data></a></code>
+element specifies the kind of data that these actions operate on. It
+indicates that the activity can get a Cursor over zero or more items
+({@code vnd.android.cursor.dir}) from a content provider that holds
+Note Pad data ({@code vnd.google.note}). The Intent object that launches
+the activity would include a {@code content:} URI specifying the exact
+data of this type that the activity should open.
+</p>
+
+<p>
+Note also the {@code DEFAULT} category supplied in this filter. It's
+there because the <code>{@link android.content.Context#startActivity
+Context.startActivity()}</code> and
+<code>{@link android.app.Activity#startActivityForResult
+Activity.startActivityForResult()}</code> methods treat all intents
+as if they contained the {@code DEFAULT} category — with just
+two exceptions:
+</p>
+
+<ul>
+<li>Intents that explicitly name the target activity</li>
+<li>Intents consisting of the {@code MAIN} action and {@code LAUNCHER}
+category</li>
+</ul>
+
+<p>
+Therefore, the {@code DEFAULT} category is <em>required</em> for all
+filters — except for those with the {@code MAIN} action and
+{@code LAUNCHER} category. (Intent filters are not consulted for
+explicit intents.)
+</p></li>
+
+<li><pre><intent-filter>
+ <action android:name="android.intent.action.GET_CONTENT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
+</intent-filter></pre>
+
+<p>
+This filter describes the activity's ability to return a note selected by
+the user without requiring any specification of the directory the user should
+choose from. The {@code GET_CONTENT} action is similar to the {@code PICK}
+action. In both cases, the activity returns the URI for a note selected by
+the user. (In each case, it's returned to the activity that called
+<code>{@link android.app.Activity#startActivityForResult
+startActivityForResult()}</code> to start the NoteList activity.) Here,
+however, the caller specifies the type of data desired instead of the
+directory of data the user will be picking from.
+</p>
+
+<p>
+The data type, <code>vnd.android.cursor.item/vnd.google.note</code>,
+indicates the type of data the activity can return — a URI for
+a single note. From the returned URI, the caller can get a Cursor for
+exactly one item ({@code vnd.android.cursor.item}) from the content
+provider that holds Note Pad data ({@code vnd.google.note}).
+</p>
+
+<p>
+In other words, for the {@code PICK} action in the previous filter,
+the data type indicates the type of data the activity could display to the
+user. For the {@code GET_CONTENT} filter, it indicates the type of data
+the activity can return to the caller.
+</p></li>
+</ol>
+
+<p>
+Given these capabilities, the following intents will resolve to the
+NotesList activity:
+</p>
+
+<dl style="margin-left: 2em">
+<dt>action: <code>android.intent.action.MAIN</code></dt>
+<dd>Launches the activity with no data specified.</dd>
+
+<dt>action: <code>android.intent.action.MAIN</code>
+<br/>category: <code>android.intent.category.LAUNCHER</code></dt>
+<dd> Launches the activity with no data selected specified.
+This is the actual intent used by the Launcher to populate its top-level
+list. All activities with filters that match this action and category
+are added to the list.</dd>
+
+<dt>action: <code>android.intent.action.VIEW</code>
+<br/>data: <code>content://com.google.provider.NotePad/notes</code></dt>
+<dd>Asks the activity to display a list of all the notes under
+<code>content://com.google.provider.NotePad/notes</code>. The user can then
+browse through the list and get information about the items in it.</dd>
+
+<dt>action: <code>android.intent.action.PICK</code>
+<br/>data: <code>content://com.google.provider.NotePad/notes</code></dt>
+<dd>Asks the activity to display a list of the notes under
+<code>content://com.google.provider.NotePad/notes</code>.
+The user can then pick a note from the list, and the activity will return
+the URI for that item back to the activity that started the NoteList activity.</dd>
+
+<dt>action: <code>android.intent.action.GET_CONTENT</code>
+<br/>data type: <code>vnd.android.cursor.item/vnd.google.note</code></dt>
+<dd>Asks the activity to supply a single item of Note Pad data.</dd>
+</dl>
+
+<p>
+The second activity, NoteEditor, shows
+users a single note entry and allows them to edit it. It can do two things
+as described by its two intent filters:
+
+<ol>
+<li><pre><intent-filter android:label="@string/resolve_edit">
+ <action android:name="android.intent.action.VIEW" />
+ <action android:name="android.intent.action.EDIT" />
+ <action android:name="com.android.notepad.action.EDIT_NOTE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
+</intent-filter></pre>
+
+<p>
+The first, primary, purpose of this activity is to enable the user to
+interact with a single note &mdash to either {@code VIEW} the note or
+{@code EDIT} it. (The {@code EDIT_NOTE} category is a synonym for
+{@code EDIT}.) The intent would contain the URI for data matching the
+MIME type <code>vnd.android.cursor.item/vnd.google.note</code> —
+that is, the URI for a single, specific note. It would typically be a
+URI that was returned by the {@code PICK} or {@code GET_CONTENT}
+actions of the NoteList activity.
+</p>
+
+<p>
+As before, this filter lists the {@code DEFAULT} category so that the
+activity can be launched by intents that don't explicitly specify the
+NoteEditor class.
+</p></li>
+
+<li><pre><intent-filter>
+ <action android:name="android.intent.action.INSERT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
+</intent-filter></pre>
+
+<p>
+The secondary purpose of this activity is to enable the user to create a new
+note, which it will {@code INSERT} into an existing directory of notes. The
+intent would contain the URI for data matching the MIME type
+<code>vnd.android.cursor.dir/vnd.google.note</code> — that
+is, the URI for the directory where the note should be placed.
+</p></li>
+</ol>
+
+<p>
+Given these capabilities, the following intents will resolve to the
+NoteEditor activity:
+</p>
+
+<dl style:"margin-left: 2em">
+<dt>action: <code>android.intent.action.VIEW</code>
+<br/>data: <code>content://com.google.provider.NotePad/notes/<var>ID</var></code></dt>
+<dd>Asks the activity to display the content of the note identified
+by {@code <var>ID</var>}. (For details on how {@code content:} URIs
+specify individual members of a group, see
+<a href="{@docRoot}guide/topics/provider/content-providers.html">Content Providers</a>.)
+
+<dt>action: <code>android.intent.action.EDIT</code>
+<br/>data: <code>content://com.google.provider.NotePad/notes/<var>ID</var></code></dt>
+<dd>Asks the activity to display the content of the note identified
+by {@code <var>ID</var>}, and to let the user edit it. If the user
+saves the changes, the activity updates the data for the note in the
+content provider.</dd>
+
+<dt>action: <code>android.intent.action.INSERT</code>
+<br/>data: <code>content://com.google.provider.NotePad/notes</code></dt>
+<dd>Asks the activity to create a new, empty note in the notes list at
+<code>content://com.google.provider.NotePad/notes</code>
+and allow the user to edit it. If the user saves the note, its URI
+is returned to the caller.
+</dd>
+</dl>
+
+<p>The last activity, TitleEditor,
+enables the user to edit the title of a note. This could be implemented
+by directly invoking the activity (by explicitly setting its component
+name in the Intent), without using an intent filter. But here we take
+the opportunity to show how to publish alternative operations on existing
+data:
+</p>
+
+<pre><intent-filter android:label="@string/resolve_title">
+ <action android:name="com.android.notepad.action.EDIT_TITLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.ALTERNATIVE" />
+ <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
+ <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
+</intent-filter></pre>
+
+<p>
+The single intent filter for this activity uses a custom action called
+"<code>com.android.notepad.action.EDIT_TITLE</code>". It must be invoked on
+a specific note (data type <code>vnd.android.cursor.item/vnd.google.note</code>),
+like the previous {@code VIEW} and {@code EDIT} actions. However, here the
+activity displays the title contained in the note data, not the content of
+the note itself.
+</p>
+
+<p>
+In addition to supporting the usual {@code DEFAULT} category, the title
+editor also supports two other standard categories:
+<code>{@link android.content.Intent#CATEGORY_ALTERNATIVE ALTERNATIVE}</code>
+and <code>{@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE
+SELECTED_ALTERNATIVE}</code>.
+These categories identify activities that can be presented to users in
+a menu of options (much as the {@code LAUNCHER} category identifies
+activities that should be presented to user in the application launcher).
+Note that the filter also supplies an explicit label (via
+<code>android:label="@string/resolve_title"</code>) to better control
+what users see when presented with this activity as an alternative
+action to the data they are currently viewing. (For more information
+on these categories and building options menus, see the
+<code>{@link android.content.pm.PackageManager#queryIntentActivityOptions
+PackageManager.queryIntentActivityOptions()}</code> and
+<code>{@link android.view.Menu#addIntentOptions Menu.addIntentOptions()}</code>
+methods.)
+</p>
+
+<p>
+Given these capabilities, the following intent will resolve to the
+TitleEditor activity:
+</p>
+
+<dl style="margin-left: 2em">
+<dt>action: <code>com.android.notepad.action.EDIT_TITLE</code>
+<br/>data: <code>content://com.google.provider.NotePad/notes/<var>ID</var></code></dt>
+<dd>Asks the activity to display the title associated with note <var>ID</var>, and
+allow the user to edit the title.</dd>
+</dl>
+
diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd
index 0248985..e508392 100644
--- a/docs/html/guide/topics/manifest/uses-feature-element.jd
+++ b/docs/html/guide/topics/manifest/uses-feature-element.jd
@@ -15,20 +15,60 @@
<dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd>
<dt>description:</dt>
-<dd>This element specifies a specific feature used by the application.
+<dd>This element declares a specific feature used by the application.
Android provides some features that may not be equally supported by all
Android devices. In a manner similar to the <code><a href="uses-sdk-element.html"><uses-sdk></a></code>
-element, this element allows an application to specify which potentially variable
-features it requires. In this way, the application
-will not be installed on devices that do not offer the required feature.</p>
+element, this element allows an application to specify which device-variable
+features it uses. In this way, the application
+will not be installed on devices that do not offer the feature.</p>
-<p>For example, an application might specify that it requires a certain version of Open GL.
-If a device does not support that version of Open GL, then it will not allow installation of the application.</p>
+<p>For example, an application might specify that it requires a camera with auto-focus capabilities.
+If a device does not provide a camera with auto-focus, then it will not allow
+installation of the application.</p>
+
+<p>In order to maintain strict device compatibility, it's very important that you use
+this element to declare all features that your application uses. Failure to declare
+a feature may result your application being installed on a device
+that does not support the feature and your application failing.</p>
+
+<p>For some features, there may exist a specfic attribute that allows you to define
+a version of the feature, such as the version of Open GL used (declared with
+<a href="#glEsVersion">{@code glEsVersion}</a>). Other features that either do or do not
+exist for a device, such as camera auto-focus, are declared using the
+<a href="#name">{@code name}</a> attribute.</p>
+
+<p>Any software or hardware features that may vary among Android-powered
+devices will be listed on this page among the attributes below. If you see any features
+here that you use in your application, you should include a {@code
+<uses-feature>} element for each one. For example, if your application uses the device
+camera, then you should include the following in your {@code AndroidManifest.xml}:</p>
+
+<pre>
+<uses-feature android:name="android.hardware.camera" />
+</pre>
+
+<p>If you declare "android.hardware.camera", then your application is considered
+compatible with all devices that include a camera, regardless of whether auto-focus is
+available or not. If you also use the auto-focus features (available through the {@link
+android.hardware.Camera Camera API}), then you need to include an additional
+{@code <uses-feature>} element that declares the "android.hardware.camera.autofocus"
+feature. Also note that you must still request the {@link android.Manifest.permission#CAMERA
+CAMERA permission}. Requesting permission grants your application access to the
+appropriate hardware and software, while declaring the features used by
+your application ensures proper device compatibility.</p>
+
+<p>Although the {@code <uses-feature>} element is only activated for devices running
+API Level 4 or higher, it is safe to include this for applications that declare
+a <a href="uses-sdk-element.html#min">{@code minSdkVersion}</a>
+of "3" or lower. Devices running older versions of the platform
+will simply ignore this element, but newer devices will recognize it and enforce
+installation restrictions based on whether the device supports the feature.</p>
<p class="note"><strong>Note:</strong>
For each feature required by your application, you must include a new {@code
<uses-feature>} element. Multiple features cannot be declared in one
instance of this element.</p>
+
</dd>
@@ -51,16 +91,30 @@
<table>
<tr>
+ <th>Feature</th>
<th>Value</th>
<th>Description</th>
</tr><tr>
+ <td rowspan="3">Camera</td>
<td>"{@code android.hardware.camera}"</td>
<td>The application requires a camera.</td>
</tr><tr>
<td>"{@code android.hardware.camera.autofocus}"</td>
<td>The application requires a camera with auto-focus capability.
As a prerequisite, "{@code android.hardware.camera}" must also be declared
- with a separate {@code <uses-feature>} element.</td>
+ with a separate {@code <uses-feature>} element.
+ </td>
+ <tr>
+ <td colspan="2">
+ <strong>Note:</strong> Any application that requests the
+ {@link android.Manifest.permission#CAMERA CAMERA permission} but does <em>not</em>
+ declare any camera features with the {@code <uses-feature>} element will be assumed
+ to use all camera features (such as auto-focus). Thus, the application will not
+ be compatible with devices that do not support all features. Please use
+ {@code <uses-feature>} to declare only the camera features that your
+ application needs.
+ </td>
+ </tr>
</tr>
</table>
diff --git a/docs/html/guide/topics/manifest/uses-sdk-element.jd b/docs/html/guide/topics/manifest/uses-sdk-element.jd
index adcdc28..ee8d03d 100644
--- a/docs/html/guide/topics/manifest/uses-sdk-element.jd
+++ b/docs/html/guide/topics/manifest/uses-sdk-element.jd
@@ -3,7 +3,10 @@
<dl class="xml">
<dt>syntax:</dt>
-<dd><pre class="stx"><uses-sdk android:<a href="#min">minSdkVersion</a>="<i>integer</i>" /></pre></dd>
+<dd><pre>
+<uses-sdk android:<a href="#min">minSdkVersion</a>="<i>integer</i>"
+ android:<a href="#max">maxSdkVersion</a>="<i>integer</i>"
+ android:<a href="#target">targetSdkVersion</a>="<i>integer</i>" /></pre></dd>
<dt>contained in:</dt>
<dd><code><a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd>
@@ -64,12 +67,16 @@
<dt><a name="target"></a>{@code android:targetSdkVersion}</dt>
<dd>An integer designating the API Level that the application is targetting.
- <p>With this attribute set, the application says that is is be able to run on
+ <p>With this attribute set, the application says that it is able to run on
older versions (down to {@code minSdkVersion}), but was explicitly tested to work
with the version specified here.
- Specifying this version allows the platform to disable compatibility
- code that is not required or enable newer features that are not
- available to older applications.</p>
+ Specifying this target version allows the platform to disable compatibility
+ settings that are not required for the target version (which may otherwise be turned on
+ in order to maintain forward-compatibility) or enable newer features that are not
+ available to older applications. This does not mean that you can program different
+ features for different versions of the platform—it simply informs the platform that you
+ have tested against the target version and the platform should not perform any extra
+ work to maintain forward-compatibility with the target version.</p>
<p>Introduced in: API Level 4</p>
</dd>
diff --git a/docs/html/images/emulator-wvga800l.png b/docs/html/images/emulator-wvga800l.png
new file mode 100644
index 0000000..a214033
--- /dev/null
+++ b/docs/html/images/emulator-wvga800l.png
Binary files differ
diff --git a/docs/html/index.jd b/docs/html/index.jd
index 823ec96..6945f9e 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -15,12 +15,12 @@
<div id="announcement" style="width:275px">
<p>The second Android Developer Challenge has begun! In this contest,
real-world users will help review and score applications and the overall winner will
- take away $250,000. The deadline for submitting an application to the contest is August 31, 2009.</p>
+ take away $250,000. The deadline for submissions was August 31, 2009 and judging by users has started.</p>
<p><a href="http://code.google.com/android/adc/">Learn more about ADC 2 »</a></p>
</div> <!-- end annoucement -->
</div> <!-- end annoucement-block -->
</div><!-- end topAnnouncement -->
- <div id="carouselMain" style="height:192px"> <!-- this height can be adjusted based on the content height -->
+ <div id="carouselMain" style="height:190px"> <!-- this height can be adjusted based on the content height -->
</div>
<div class="clearer"></div>
<div id="carouselWheel">
@@ -120,12 +120,17 @@
'sdk': {
'layout':"imgLeft",
'icon':"sdk-small.png",
- 'name':"SDK 1.5 r3",
- 'img':"sdk-large.png",
- 'title':"Android 1.5 SDK",
- 'desc': "<p>Android 1.5 SDK is now available. It includes new APIs for Android 1.5, updated developer tools, multiple platform versions, and a Google APIs add-on.</p><p><a href='{@docRoot}sdk/1.5_r3/index.html'>Download Android 1.5 SDK »</a></p>"
+ 'name':"Android 1.6 SDK",
+ 'img':"donut-android.png",
+ 'title':"Android 1.6 SDK",
+ 'desc': "<p>The Android 1.6 SDK is now available, with new APIs and updated tools!</p>"
+ + " <p>For more about the Android 1.6 platform, read the <a href='http://developer.android.com/sdk/android-1.6-highlights.html'>highlights</a>"
+ + "<!--and watch some <a href='http://developer.android.com/videos/index.html'>videos</a>-->."
+ + " Also keep an eye on the <a href='http://android-developers.blogspot.com'>Blog</a>"
+ + " for posts about some of the new developer technologies in Android 1.6.</p>"
+ + "<p><a href='{@docRoot}sdk/1.6_r1/index.html'>Download the Android 1.6 SDK »</a></p>"
},
-
+
'io': {
'layout':"imgLeft",
'icon':"io-small.png",
diff --git a/docs/html/intl/ja/community/index.jd b/docs/html/intl/ja/community/index.jd
index e0a645b..659aee7 100644
--- a/docs/html/intl/ja/community/index.jd
+++ b/docs/html/intl/ja/community/index.jd
@@ -40,38 +40,46 @@
<h3 id="ApplicationDeveloperLists">アプリケーション デベロッパー メーリング リスト</h3>
<ul>
+
+<li><b>Android SDK Japan</b> - Android SDK に関する質問と答え、提案とフィードバックを交換できる場です。
+<ul>
+<li>Google グループで登録: <a href="http://groups.google.co.jp/group/android-sdk-japan?hl=ja">android-sdk-japan</a></li>
+<li>メールで登録: <a href="mailto:android-sdk-japan-subscribe@googlegroups.com">android-sdk-japan-subscribe@googlegroups.com</a></li>
+</ul>
+</li>
+
<li><b>Android 初心者向け</b> - Android アプリケーションの開発初心者向けです。Android SDK と基本的な Android API の利用方法について学習したい場合は、このメーリング リストから始めてください。このメーリング リストには、SDK を利用するデベロッパーの初歩的なディスカッションの場所です。Android プラットフォームで初めてアプリケーションを作成して実行する際は、非常に有益な情報を得ることができるでしょう。開発環境のインストール方法についての質問を投稿したり、Android 開発の初歩(初めて作成するユーザー インターフェース、権限、Android ファイルシステムでのファイル、Android マーケットでのアプリケーションなど)について教えてもらうことができます。新たに質問する前に、必ず最初にアーカイブを確認してください。高度な内容の質問の場合はここでは質問せず、android-developers メーリング リストで質問してください。また使用に関する質問は、android-discuss メーリング リストの方が適しています。
<ul>
<li>Google グループで登録: <a href="http://groups.google.com/group/android-beginners?hl=ja">android-beginners</a></li>
-<li>メールで登録: <a href="mailto:android-beginners-subscribe@googlegroups.com">android-beginners-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li>
+<li>メールで登録: <a href="mailto:android-beginners-subscribe@googlegroups.com">android-beginners-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android デベロッパー向け</b> - Android アプリケーション デベロッパーとして経験を積むにつれ、Android アプリケーション開発の基本を把握して、SDK を使いこなせるようになります。今度は、より高度な内容について質問する必要があります。アプリケーションのトラブルシューティング、実装へのアドバイス、アプリケーションのパフォーマンスやユーザー エクスペリエンスを改良するテクニックに関する質問には、次のメーリング リストが役立ちます。使用に関する問題(android-discuss をご利用ください)や、Android SDK を使用する際の初歩的質問(android-beginners をご利用ください)についてのディスカッションの場所ではありません。
<ul>
<li>Google グループで登録: <a href="http://groups.google.com/group/android-developers?hl=ja">android-developers</a></li>
-<li>メールで登録: <a href="mailto:android-developers-subscribe@googlegroups.com">android-developers-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li>
+<li>メールで登録: <a href="mailto:android-developers-subscribe@googlegroups.com">android-developers-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android ディスカッション</b> - Android に関する「井戸端会議」です。ここでは、Android プラットフォームへのアイデア、自分のアプリケーションの公表、Android 携帯端末に関するディスカッション、コミュニティ リソースなど、Android に関することなら何でも投稿可能です。ただし他のメーリング リストに該当する内容の場合は、そのメーリング リストに投稿することをおすすめします。質問のテーマが限定されている場所の方が、より多くの回答を得ることができるでしょう。
<ul>
<li>Google グループで登録: <a href="http://groups.google.com/group/android-discuss?hl=ja">android-discuss</a></li>
-<li>メールで登録: <a href="mailto:android-discuss-subscribe@googlegroups.com">android-discuss-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li>
+<li>メールで登録: <a href="mailto:android-discuss-subscribe@googlegroups.com">android-discuss-subscribe@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android セキュリティ ディスカッション</b> - 安全な開発、新たに発生したセキュリティの問題、Android デベロッパー向けの Android デベロッパーによるベスト プラクティスについて自由にディスカッションを行える場所です。メーリング リストで脆弱性を直接公開することは、すべての Android ユーザーを危険にさらすことになるので、避けてください。
<ul>
<li>Google グループで登録: <a href="http://groups.google.com/group/android-security-discuss?hl=ja">android-security-discuss</a></li>
-<li>メールで登録: <a href="mailto:android-security-discuss@googlegroups.com">android-security-discuss@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li>
+<li>メールで登録: <a href="mailto:android-security-discuss@googlegroups.com">android-security-discuss@googlegroups.com</a></li>
</ul>
</li>
<li><b>Android セキュリティに関する発表</b> - Android セキュリティ チームがセキュリティ関連の発表を行う、小規模なグループです。
<ul>
<li>Google グループで登録: <a href="http://groups.google.com/group/android-security-announce?hl=ja">android-security-announce</a></li>
-<li>メールで登録: <a href="mailto:android-security-announce-subscribe@googlegroups.com">android-security-announce-subscribe@googlegroups.com</a> <a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li>
+<li>メールで登録: <a href="mailto:android-security-announce-subscribe@googlegroups.com">android-security-announce-subscribe@googlegroups.com</a></li>
</ul>
</li>
diff --git a/docs/html/sdk/1.6_r1/index.jd b/docs/html/sdk/1.6_r1/index.jd
new file mode 100644
index 0000000..419649e
--- /dev/null
+++ b/docs/html/sdk/1.6_r1/index.jd
@@ -0,0 +1,140 @@
+page.title=Android 1.6 SDK, Release 1
+sdk.redirect=0
+sdk.version=1.6
+
+sdk.date=September 2009
+
+sdk.win_download=android-sdk-windows-1.6_r1.zip
+sdk.win_bytes=251325064
+sdk.win_checksum=efd6fccd5a6ff6b57585b49393d221d9
+
+sdk.mac_download=android-sdk-mac_x86-1.6_r1.zip
+sdk.mac_bytes=238229779
+sdk.mac_checksum=2be1a1ae5d33272be841c97e8a3a3b1c
+
+sdk.linux_download=android-sdk-linux_x86-1.6_r1.tgz
+sdk.linux_bytes=229032773
+sdk.linux_checksum=02ff0d0e38d4f464108a5a7f7567b207
+
+adt.zip_download=ADT-0.9.3.zip
+adt.zip_version=0.9.3
+adt.zip_bytes=3252487
+adt.zip_checksum=c296488ac35772667c0f49e822156979
+
+@jd:body
+
+<p>For more information on this SDK release, read the
+<a href="{@docRoot}sdk/RELEASENOTES.html#1.6_r1">Release Notes</a>.</p>
+
+<h2>SDK Contents</h2>
+
+<h4>Development tools</h4>
+
+<p>The SDK includes a full set of tools for developing and debugging application
+code and designing an application UI. You can read about the tools in the <a
+href="{@docRoot}guide/developing/tools/index.html">Dev Guide</a> and access them
+in the <code><sdk>/tools/</code> directory.
+
+<p>The tools package in this SDK includes updates from those provided in the
+previous SDK. The tools use the same project structure as in the previous SDK
+(Android 1.5). If you have application projects developed in the Android 1.5
+SDK, you can migrate them to the latest SDK without modification. For more
+information about how to migrate, see <a href="upgrading.html">Upgrading the
+SDK</a>.
+
+<h4 id="system_images">Android Platforms</h4>
+
+<p>This SDK includes multiple Android platform versions that you can use to
+develop applications. For each version, both a fully compliant Android library
+and system image are provided. The table below lists the platform versions
+included in this SDK. For more information about a platform version —
+features, applications included, localizations, API changes, and so on —
+see its Version Notes. </p>
+
+<table style="margin-right:1em;" width="80%">
+<tr>
+<th><nobr>Platform</nobr></th><th><nobr>API
+Level</nobr></th><th>Notes</th><th>Description</th>
+</tr>
+<tr>
+<td width="5%"><nobr>Android 1.6</nobr></td>
+<td width="5%">4</td>
+<td width="5%"><nobr><a href="{@docRoot}sdk/android-1.6.html">Version
+Notes</a></nobr></td>
+<td>Includes a standard Android 1.6 library and system image with a set of
+development applications. Does not include any external libraries (such as the
+Maps external library).</td>
+</tr>
+<tr>
+<td width="5%"><nobr>Android 1.5</nobr></td>
+<td width="5%">3</td>
+<td width="5%"><nobr><a href="{@docRoot}sdk/android-1.5.html">Version
+Notes</a></nobr></td>
+<td>Includes a standard Android 1.5 library and system image with a set of
+development applications. Does not include any external libraries (such as the
+Maps external library).</td>
+</tr>
+</table>
+
+<p>Note that you can use the Android SDK and AVD Manager to download other
+platform versions into your development environment.</span>.
+
+<h4 id="system_images">SDK Add-Ons</h4>
+
+<p>An SDK add-on provides a development environment for an Android external
+library or a customized (but fully compliant) Android system image. This SDK
+includes the SDK add-ons listed below. The Android system API Level required by
+the add-ons are noted.</p>
+
+<table style="margin-right:1em;" width="80%">
+<tr>
+<th><nobr>Add-On</nobr></th><th><nobr>API Level</nobr></th>
+<th>Notes</th><th>Description</th>
+</tr>
+<tr>
+<td width="5%"><nobr>Google APIs</nobr></td>
+<td width="5%">4</td>
+<td width="5%"> </td>
+<td>Includes the com.google.android.maps external library, a compliant
+Android 1.6 system image, a {@link android.location.Geocoder Geocoder}
+backend service implementation, documentation, and sample code. </td>
+</tr>
+<tr>
+<td width="5%"><nobr>Google APIs</nobr></td>
+<td width="5%">3</td>
+<td width="5%"> </td>
+<td>Includes the com.google.android.maps external library, a compliant
+Android 1.5 system image, a {@link android.location.Geocoder Geocoder}
+backend service implementation, documentation, and sample code. </td>
+</tr>
+</table>
+
+<h4>Sample Code and Applications</h4>
+
+<p>You can look at a variety of tutorials and samples in the <a
+href="{@docRoot}guide/samples/index.html">Dev Guide</a> and access the sample
+code itself in the <code><sdk>/platforms/<platform>/samples/</code>
+directory of the SDK package. Note the new location — the SDK now includes
+multiple platform versions that you can develop against and each has its own
+sample code directory. </p>
+
+<p>For example, to view or build the samples available for the Android
+1.6 platform (AVD target "Android 1.6"), you will find the samples in the
+<code><sdk>/platforms/android-1.6/samples/</code> directory of the SDK
+package. </p>
+
+<h4>Documentation</h4>
+
+<p>The SDK package includes a full set of local documentation. To view it, open
+the <code><sdk>/documentation.html</code> file in a web browser. If you
+are developing in an IDE such as Eclipse, you can also view the reference
+documentation directly in the IDE. </p>
+
+<p>The most current documentation is always available on the Android Developers
+site:</p>
+
+<p style="margin-left:2em;"><a
+href="http://developer.android.com/index.html">http://developer.android.com/</a>
+</p>
+
+
diff --git a/docs/html/sdk/1.6_r1/installing.jd b/docs/html/sdk/1.6_r1/installing.jd
new file mode 100644
index 0000000..954bfa3
--- /dev/null
+++ b/docs/html/sdk/1.6_r1/installing.jd
@@ -0,0 +1,441 @@
+page.title=Installing the Android 1.6 SDK
+sdk.version=1.6
+sdk.preview=0
+
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Preparing">Prepare for Installation</a></li>
+ <li><a href="#Installing">Install the SDK</a></li>
+ <li><a href="#InstallingADT">Install the ADT Plugin for Eclipse</a></li>
+ <li><a href="#sdkContents">SDK Contents</a></li>
+ <li><a href="#NextSteps">Next Steps</a></li>
+ <li><a href="#InstallationNotes">Installation Notes</a></li>
+ <li><a href="#Troubleshooting">Troubleshooting ADT Installation</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>This page describes how to install the Android SDK and set up your
+development environment.</p>
+
+<p>If you encounter any problems during installation, see the
+<a href="#InstallationNotes">Installation Notes</a> at the bottom of
+this page.</p>
+
+<h4 style="margin-top">Upgrading?</h4>
+<p>If you have already developed applications using an earlier version
+of the Android SDK, please read <a href="upgrading.html">Upgrading the SDK</a>, instead.
+</p>
+
+
+<h2 id="Preparing">Prepare for Installation</h2>
+
+<p>Before you begin, take a moment to confirm that your development machine
+meets the <a href="requirements.html">System Requirements</a>.</p>
+
+<p>If you will be developing on Eclipse with the Android Development
+Tools (ADT) Plugin — the recommended path if you are new to
+Android — make sure that you have a suitable version of Eclipse
+installed on your computer (3.4 or newer is recommended). If you need
+to install Eclipse, you can download it from this location: </p>
+
+<p style="margin-left:2em;"><a href=
+"http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a></p>
+
+<p>A Java or RCP version of Eclipse is recommended. </p>
+
+<h2 id="Installing">Install the SDK</h2>
+
+<p>After downloading the Android SDK, unpack the Android SDK .zip archive
+to a suitable location on your machine. By default, the SDK files are unpacked
+into a directory named <code>android_sdk_<em><platform</em>>_<em><release></em></code>. </p>
+
+<p>Make a note of the name and location of the unpacked SDK directory on your system — you
+will need to refer to the SDK directory later, when setting up the Android plugin or when
+using the SDK tools.</p>
+
+<p>Optionally, you may want to add the location of the SDK's primary <code>tools</code> directory
+to your system <code>PATH</code>. The primary <code>tools/</code> directory is located at the root of the
+SDK folder. Adding <code>tools</code> to your path lets you run Android Debug Bridge (adb) and
+the other command line <a href="{@docRoot}guide/developing/tools/index.html">tools</a> without
+needing to supply the full path to the tools directory. </p>
+<ul>
+ <li>On Linux, edit your <code>~/.bash_profile</code> or <code>~/.bashrc</code> file. Look
+ for a line that sets the PATH environment variable and add the
+ full path to the <code>tools/</code> directory to it. If you don't
+ see a line setting the path, you can add one:</li>
+
+ <ul><code>export PATH=${PATH}:<em><your_sdk_dir></em>/tools</code></ul>
+
+ <li>On a Mac, look in your home directory for <code>.bash_profile</code> and
+ proceed as for Linux. You can create the <code>.bash_profile</code> if
+ you haven't already set one up on your machine. </li>
+
+ <li>On Windows, right-click on My Computer, and select Properties.
+ Under the Advanced tab, hit the Environment Variables button, and in the
+ dialog that comes up, double-click on Path (under System Variables). Add the full path to the
+ <code>tools/</code> directory to the path. </li>
+ </ul>
+
+<p>Note that, if you update your SDK in the future, you
+should remember to update your <code>PATH</code> settings to point to the new location, if different.</p>
+
+<p>If you will be using the Eclipse IDE as your development environment,
+the next section describes how to install the Android Development Tools (ADT) plugin and set up Eclipse.
+If you choose not to use Eclipse, you can
+develop Android applications in an IDE of your choice and then compile, debug and deploy using
+the tools included in the SDK (skip to <a href="#NextSteps">Next Steps</a>).</p>
+
+
+<h2 id="InstallingADT">Install the ADT Plugin for Eclipse</h2>
+
+<p>Android offers a custom plugin for the Eclipse IDE, called Android
+Development Tools (ADT), that is designed to give you a powerful,
+integrated environment in which to build Android applications. It
+extends the capabilites of Eclipse to let you quickly set up new Android
+projects, create an application UI, add components based on the Android
+Framework API, debug your applications using the Android SDK tools, and even export
+signed (or unsigned) APKs in order to distribute your application.</p>
+
+<p>In general, using Eclipse with ADT is a highly recommended approach to
+Android development and is the fastest way to get started. (If you prefer to
+work in an IDE other than Eclipse, you do not need to install Eclipse or ADT,
+instead, you can directly use the SDK tools to build and debug your
+application—skip to <a href="#NextSteps">Next Steps</a>.)</p>
+
+<p>Once you have the Eclipse IDE installed, as described in <a
+href="#Preparing">Preparing for Installation</a>, follow the steps below to
+download the ADT plugin and install it in your respective Eclipse environment.
+</p>
+
+<table style="font-size:100%">
+<tr><th>Eclipse 3.4 (Ganymede)</th><th>Eclipse 3.5 (Galileo)</th></tr>
+<tr>
+<td width="45%">
+<!-- 3.4 steps -->
+<ol>
+ <li>Start Eclipse, then select <strong>Help</strong> > <strong>Software Updates...</strong>.
+ In the dialog that appears, click the <strong>Available Software</strong> tab. </li>
+ <li>Click <strong>Add Site...</strong> </li>
+ <li>In the Add Site dialog that appears, enter this URL in the "Location" field:
+ <pre style="margin-left:0">https://dl-ssl.google.com/android/eclipse/</pre>
+ <p>Note: If you have trouble aqcuiring the plugin, try using "http" in the Location URL,
+ instead of "https" (https is preferred for security reasons).</p>
+ <p>Click <strong>OK</strong>.</p></li>
+ <li>Back in the Available Software view, you should see the plugin listed by the URL,
+ with "Developer Tools" nested within it. Select the checkbox next to
+ Developer Tools and click <strong>Install...</strong></li>
+ <li>On the subsequent Install window, "Android DDMS" and "Android Development Tools"
+ should both be checked. Click <strong>Next</strong>. </li>
+ <li>Read and accept the license agreement, then click <strong>Finish</strong>.</li>
+ <li>Restart Eclipse. </li>
+</ol>
+
+</td>
+<td>
+<!-- 3.5 steps -->
+<ol>
+ <li>Start Eclipse, then select <strong>Help</strong> > <strong>Install
+ New Softare</strong>. </li>
+ <li>In the Available Software dialog, click <strong>Add...</strong>.</li>
+ <li>In the Add Site dialog that appears, enter a name for the remote site
+ (e.g., "Android Plugin") in the "Name" field.
+ <p>In the "Location" field, enter this URL:</p>
+ <pre>https://dl-ssl.google.com/android/eclipse/</pre>
+ <p>Note: If you have trouble aqcuiring the plugin, you can try
+ using "http" in the URL, instead of "https" (https is preferred for
+ security reasons).</p>
+ <p>Click <strong>OK</strong>.</p>
+ </li>
+ <li>Back in the Available Software view, you should now see "Developer
+ Tools" added to the list. Select the checkbox next to Developer Tools,
+ which will automatically select the nested tools Android DDMS and Android
+ Development Tools.
+ Click <strong>Next</strong>. </li>
+ <li>In the resulting Install Details dialog, the Android DDMS and Android
+ Development Tools features are listed. Click <strong>Next</strong> to
+ read and accept the license agreement and install any dependencies,
+ then click <strong>Finish</strong>. </li>
+ <li>Restart Eclipse. </li>
+
+</ol>
+</td>
+</tr>
+</table>
+
+<p>Now modify your Eclipse preferences to point to the Android SDK directory:</p>
+<ol>
+ <li>Select <strong>Window</strong> > <strong>Preferences...</strong> to open the Preferences
+ panel (Mac: <strong>Eclipse</strong> > <strong>Preferences</strong>).</li>
+ <li>Select <strong>Android</strong> from the left panel. </li>
+ <li>For the <em>SDK Location</em> in the main panel, click <strong>Browse...</strong> and
+ locate your downloaded SDK directory. </li>
+ <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li>
+</ol>
+
+<p>Done! If you haven't encountered any problems, then you're ready to
+begin developing Android applications. See the
+<a href="#NextSteps">Next Steps</a> section for suggestions on how to start. </p>
+
+
+<h2 id="sdkContents">Contents of the SDK</h2>
+
+<p>Once you've downloaded and unpacked the SDK, open the SDK directory
+and take a look at what's inside.
+
+<p>The table below describes the SDK directory contents. </p>
+
+<table>
+<tr>
+<th colspan="3">Name</th><th>Description</th>
+</tr>
+<tr>
+<td colspan="3"><code>add-ons/</code></td>
+<td>Contains add-ons to the Android SDK development
+environment, which let you develop against external libraries that are available on some
+devices. </td>
+</tr>
+<tr>
+<td colspan="3"><code>docs/</code></td>
+<td>A full set of documentation in HTML format, including the Developer's Guide,
+API Reference, and other information.</td>
+</tr>
+<tr>
+<td colspan="3"><code>platforms/</code></td>
+<td>Contains a set of Android platform versions that you can develop
+applications against, each in a separate directory. </td>
+</tr>
+<tr>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td colspan="2"><code><platform>/</code></td>
+<td>Platform version directory, for example "Android 1.6". All platform version
+directories contain a similar set of files and subdirectory structure.</td>
+</tr>
+
+<tr>
+<td style="width:2em;border-bottom-color:white;"> </td>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td><code>data/</code></td>
+<td>Storage area for default fonts and resource definitions.</td>
+</tr>
+<tr>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td><code>images/</code></td>
+<td>Storage area for default disk images, including the Android system image,
+the default userdata image, the default ramdisk image, and more. The images
+are used in emulator sessions.</td>
+</tr>
+<tr>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td><code>samples/</code></td>
+<td>Contains a wide variety of sample applications that you can load as projects
+into your development environment, compile, and run on the emulator.</td>
+</tr>
+<tr>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td><code>skins/</code></td>
+<td>A set of emulator skins available for the platform version. Each skin is
+designed for a specific screen resolution.</td>
+</tr>
+<tr>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td><code>templates/</code></td>
+<td>Storage area for file templates used by the SDK development tools.</td>
+</tr>
+<tr>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td style="width:2em;border-bottom-color:white;"></td>
+<td><code>tools/</code></td>
+<td>Any development tools that are specific to the platform version.</td>
+</tr>
+<tr>
+<td style="width:2em;"></td>
+<td style="width:2em;"></td>
+<td><code>android.jar</code></td>
+<td>The Android library used when compiling applications against this platform
+version.</td>
+</tr>
+<tr>
+<td colspan="3"><code>tools/</code></td>
+<td>Contains the set of development and profiling tools available to you, such
+as the emulator, the <code>android</code> tool, adb, ddms, and more.</td>
+</tr>
+<tr>
+<td colspan="3"><code>RELEASE_NOTES.html</code></td>
+<td>A file that loads the local version of the SDK release notes, if
+available.</td>
+</tr>
+<tr>
+<td colspan="3"><code>documentation.html</code></td>
+<td>A file that loads the entry page for the local Android SDK
+documentation.</td>
+</tr>
+
+</table>
+
+<h2 id="NextSteps">Next Steps</h2>
+<p>Once you have completed installation, you are ready to
+begin developing applications. Here are a few ways you can get started: </p>
+
+<p><strong>Learn about Android</strong></p>
+<ul>
+ <li>Take a look at the <a href="{@docRoot}guide/index.html">Dev
+ Guide</a> and the types of information it provides</li>
+ <li>Read an introduction to Android as a platform in <a
+ href="{@docRoot}guide/basics/what-is-android.html">What is
+ Android?</a></li>
+ <li>Learn about the Android framework and how applications run on it in
+ <a href="{@docRoot}guide/topics/fundamentals.html">Application
+ Fundamentals</a></li>
+ <li>Take a look at the Android framework API specification in the <a
+ href="{@docRoot}reference/packages.html">Reference</a> tab</li>
+</ul>
+
+<p><strong>Explore the SDK</strong></p>
+<ul>
+ <li>Get an overview of the <a
+ href="{@docRoot}guide/developing/tools/index.html">development
+ tools</a> that are available to you</li>
+ <li>Read how to develop <a
+ href="{@docRoot}guide/developing/eclipse-adt.html">in Eclipse/ADT</a> or
+ <a href="{@docRoot}guide/developing/other-ide.html">in other IDEs</a>
+ </li>
+</ul>
+
+<p><strong>Explore some code</strong></p>
+<ul>
+ <li>Set up a <a href="{@docRoot}guide/tutorials/hello-world.html">Hello
+ World application</a> (highly recommended, especially for Eclipse users)</li>
+ <li>Follow the <a href="{@docRoot}guide/tutorials/notepad/index.html">
+ Notepad Tutorial</a> to build a full Android application </li>
+ <li>Create a new project for one of the other sample applications
+ included in <code><em><sdk></em>/platforms/<em><platform></em>/samples</code>,
+ then compile and run it in your development environment</li>
+</ul>
+
+<p><strong>Visit the Android developer groups</strong></p>
+<ul>
+ <li>Take a look at the <a
+ href="{@docRoot}community/index.html">Community</a> tab to see a list of
+ Android developers groups. In particular, you might want to look at the
+ <a href="http://groups.google.com/group/android-developers">Android
+ Developers</a> group to get a sense for what the Android developer
+ community is like.</li>
+</ul>
+
+
+<h2 id="InstallationNotes">Installation Notes</h2>
+
+<h3>Ubuntu Linux Notes</h3>
+
+<ul>
+ <li>If you need help installing and configuring Java on your
+ development machine, you might find these resources helpful:
+ <ul>
+ <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/Java </a></li>
+ <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/JavaInstallation</a></li>
+ </ul>
+ </li>
+ <li>Here are the steps to install Java and Eclipse, prior to installing
+ the Android SDK and ADT Plugin.
+ <ol>
+ <li>If you are running a 64-bit distribution on your development
+ machine, you need to install the <code>ia32-libs</code> package using
+ <code>apt-get:</code>:
+ <pre>apt-get install ia32-libs</pre>
+ </li>
+ <li>Next, install Java: <pre>apt-get install sun-java6-bin</pre></li>
+ <li>The Ubuntu package manager does not currently offer an Eclipse 3.3
+ version for download, so we recommend that you download Eclipse from
+ eclipse.org (<a
+ href="http://www.eclipse.org/downloads/">http://www.eclipse.org/
+ downloads/</a>). A Java or RCP version of Eclipse is recommended.</li>
+ <li>Follow the steps given in previous sections to install the SDK
+ and the ADT plugin. </li>
+ </ol>
+ </li>
+</ul>
+
+<h3>Other Linux Notes</h3>
+
+<ul>
+ <li>If JDK is already installed on your development computer, please
+ take a moment to make sure that it meets the version requirements listed
+ in the <a href="requirements.html">System Requirements</a>.
+ In particular, note that some Linux distributions may include JDK 1.4 or Gnu
+ Compiler for Java, both of which are not supported for Android development.</li>
+</ul>
+
+
+<h2 id="Troubleshooting">Troubleshooting ADT Installation</h2>
+
+<p> If you are having trouble downloading the ADT plugin after following the
+steps above, here are some suggestions: </p>
+
+<ul>
+ <li>If Eclipse can not find the remote update site containing the ADT plugin,
+try changing the remote site URL to use http, rather than https. That is, set
+the Location for the remote site to:
+<pre>http://dl-ssl.google.com/android/eclipse/</pre></li>
+<li>If you are behind a firewall (such as a corporate firewall), make sure that
+you have properly configured your proxy settings in Eclipse. In Eclipse 3.3/3.4,
+you can configure proxy information from the main Eclipse menu in
+<strong>Window</strong> (on Mac, <strong>Eclipse</strong>) >
+<strong>Preferences</strong> > <strong>General</strong> > <strong>Network
+Connections</strong>.</li>
+</ul>
+
+<p> If you are still unable to use Eclipse to download the ADT plugin as a
+remote update site, you can download the ADT zip file to your local machine and
+manually install it:</p>
+
+<ol>
+ <li><a href="http://developer.android.com/sdk/preview/index.html">Download the
+ ADT Plugin zip file</a> (do not unpack it).</li>
+ <li>Follow steps 1 and 2 in the <a href="#InstallingADT">default install
+ instructions</a> (above).</li>
+ <li>In the Add Site dialog, click <strong>Archive</strong>.</li>
+ <li>Browse and select the downloaded zip file.</li>
+ <li>In Eclipse 3.5 only, enter a name for the local update site (e.g.,
+ "Android Plugin") in the "Name" field.</li>
+ <li>Click <strong>OK</strong>.
+ <li>Follow the remaining procedures as listed for
+ <a href="#InstallingADT">default installation</a> above,
+ starting from step 4.</li>
+</ol>
+
+<p>To update your plugin once you've installed using the zip file, you will have
+to follow these steps again instead of the default update instructions.</p>
+
+<h4>Other install errors</h4>
+
+<p>Note that there are features of ADT that require some optional
+Eclipse components (for example, WST). If you encounter an error when
+installing ADT, your Eclipse installion might not include these components.
+For information about how to quickly add the necessary components to your
+Eclipse installation, see the troubleshooting topic
+<a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT
+Installation Error: "requires plug-in org.eclipse.wst.sse.ui"</a>.</p>
+
+<h4>For Linux users</h4>
+<p>If you encounter this error when installing the ADT Plugin for Eclipse:
+<pre>
+An error occurred during provisioning.
+Cannot connect to keystore.
+JKS</pre>
+<p>
+...then your development machine lacks a suitable Java VM. Installing Sun
+Java 6 will resolve this issue and you can then reinstall the ADT
+Plugin.</p>
+
+
diff --git a/docs/html/sdk/1.6_r1/requirements.jd b/docs/html/sdk/1.6_r1/requirements.jd
new file mode 100644
index 0000000..781ee32
--- /dev/null
+++ b/docs/html/sdk/1.6_r1/requirements.jd
@@ -0,0 +1,51 @@
+page.title=System Requirements
+sdk.version=1.6
+sdk.preview=0
+@jd:body
+
+<p>The sections below describe the system and software requirements for developing
+Android applications using the Android SDK tools included in Android
+<?cs var:sdk.version ?> SDK<?cs if:sdk.rel.id ?>, Release <?cs var:sdk.rel.id ?><?cs /if ?>. </p>
+
+<h3>Supported Operating Systems</h3>
+<ul>
+ <li>Windows XP (32-bit) or Vista (32- or 64-bit)</li>
+ <li>Mac OS X 10.4.8 or later (x86 only)</li>
+ <li>Linux (tested on Linux Ubuntu Dapper Drake)</li>
+</ul>
+
+<h3>Supported Development Environments</h3>
+<ul>
+ <li>Eclipse IDE
+ <ul>
+ <li><a href="http://www.eclipse.org/downloads/">Eclipse</a> 3.4 (Ganymede) or 3.5 (Galileo)
+ <ul>
+ <li>Note: Eclipse 3.3 has not been fully tested with ADT 0.9.3 and support can no longer be guaranteed. We suggest you upgrade to
+ Eclipse 3.4 or 3.5.</li>
+ <li>Recommended Eclipse IDE packages: Eclipse IDE for Java EE Developers, Eclipse IDE for Java Developers, Eclipse for RCP/Plug-in Developers</li>
+ <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included in most Eclipse IDE packages) </li>
+ <li>Eclipse Classic IDE package is not supported.</li>
+ </ul>
+ </li>
+ <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li>
+ <li><a href="installing.html#installingplugin">Android Development Tools plugin</a> (optional)</li>
+ <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li>
+ </ul>
+ </li>
+ <li>Other development environments or IDEs
+ <ul>
+ <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li>
+ <li><a href="http://ant.apache.org/">Apache Ant</a> 1.6.5 or later for Linux and Mac, 1.7 or later for Windows</li>
+ <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li>
+ </ul>
+ </li>
+</ul>
+
+<p class="note"><strong>Note:</strong> If JDK is already installed on your development computer, please take a moment to make sure that it meets the version requirements listed above. In
+particular, note that some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are not supported for Android development. </p>
+
+<h3>Hardware requirements</h3>
+<ul>
+ <li>For the base SDK package, at least 600MB of available disk space. For each platform downloaded into the SDK, an additional 100MB is needed. </li>
+</ul>
+
diff --git a/docs/html/sdk/1.6_r1/upgrading.jd b/docs/html/sdk/1.6_r1/upgrading.jd
new file mode 100644
index 0000000..2f9cc73
--- /dev/null
+++ b/docs/html/sdk/1.6_r1/upgrading.jd
@@ -0,0 +1,386 @@
+page.title=Upgrading the SDK
+sdk.version=1.6
+sdk.preview=0
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+ <h2>Upgrading the SDK</h2>
+ <ul>
+ <li>If you are developing on the Android 1.5 SDK, migrating your
+applications is straightforward and typically requires no modifications.</li>
+ <li>For Eclipse users, a new version of ADT is available. To use the Android
+1.6 SDK, please upgrade to ADT 0.9.3 (or later).</li>
+ <li>For Windows users, the SDK includes a new USB driver that you can
+install, if you are developing on a device. </li>
+ <li>A new Android SDK and AVD Manager tool is available. To access
+it, run the <code>android</code> tool without options. </li>
+ </ul>
+
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#Install">Install the SDK</a></li>
+ <li><a href="#UpdateAdt">Update Your Eclipse ADT Plugin</a></li>
+ <li><a href="#RunYourApps">Run Your Applications</a></li>
+ <li><a href="#MigrateYourApps">Migrate Your Applications</a></li>
+ </ol>
+
+ <h2>Migrating information</h2>
+ <ol>
+ <li><a href="{@docRoot}sdk/api_diff/4/changes.html">Android 1.6 API
+Differences</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>This document describes how to move your development environment and existing
+Android applications from an Android 1.5 SDK to the Android 1.6 SDK. If you are
+migrating applications from an SDK older than 1.5, please also read the
+upgrading document available in the Android 1.5 SDK package.</p>
+
+<p>There are several compelling reasons to upgrade, such as new SDK tools that
+make developing more efficient and new APIs that allow you to expand the
+feature-set of your applications. However, even if you or your applications
+don't require these enhancements, it's important that you upgrade to ensure that
+your applications run properly on the upcoming Android platform.</p>
+
+<p>The Android 1.6 platform will soon be deployable to devices around the world.
+If you have already released Android applications to the public, you should test
+the forward-compatibility of your applications on the latest version of the
+platform as soon as possible. It's unlikely that you'll encounter problems in
+your applications, but in the interest of maintaining the best user experience,
+you should take no risks. So, please install the new Android SDK and test your
+applications on the new platform.</p>
+
+<!-- NOT AVAILABLE FOR PREVIEW RELEASES -->
+<p>For more information on new SDK features and system changes,
+see the <a href="{@docRoot}sdk/android-1.6.html">Android 1.6 Version Notes</a>.</p>
+<!-- -->
+
+<h2 id="Install">Install the SDK</h2>
+
+<p>If you haven't yet downloaded the SDK, <a href="index.html">download it from
+here</a> and unpack it into a safe location.</p>
+
+<p>If you had previously setup your <code>PATH</code> variable to point to the SDK
+tools directory, then you need to update it to point to the new SDK. For example, for
+a <code>.bashrc</code> or <code>.bash_profile</code> file:</p>
+<pre>export PATH=$PATH:<em><your_sdk_dir></em>/tools</pre>
+
+
+<h2 id="UpdateAdt">Update Your Eclipse ADT Plugin</h2>
+
+<p>If you don't use the Eclipse IDE for development,
+skip to <a href="#RunYourApps">Run Your Applications</a>.</p>
+
+<p>A new version of the ADT Plugin, ADT 0.9.3, is available in conjunction with
+this SDK release. To use the SDK, you must upgrade your ADT Plugin to version
+0.9.3. With ADT 0.9.3, you can still compile your existing applications against
+multiple platform versions, such as Android 1.5, Android 1.1, and so on. However,
+ADT 0.9.3 is not compatible with previous versions of the SDK and its tools, so
+make sure that you upgrade both your SDK <em>and</em> the ADT Plugin.</p>
+
+The upgrade steps for ADT are described below. For information about new features in ADT, see the <a
+href="{@docRoot}sdk/RELEASENOTES.html">Release Notes</a> document. </p>
+
+<p>If you're currently using a version of ADT <em>older</em> than version 0.9,
+then you must uninstall ADT before you proceed (read how to <a
+href="{@docRoot}sdk/1.5_r3/upgrading.html#uninstallAdt">Uninstall your previous
+ADT plugin</a>). If you currently have version 0.9 or 0.9.1, then you don't need
+to uninstall and can continue with the procedure below.</p>
+
+<table style="font-size:100%">
+<tr><th>Eclipse 3.4 (Ganymede)</th><th>Eclipse 3.5 (Galileo)</th></tr>
+<tr>
+<td width="50%">
+<!-- 3.4 steps -->
+<ol>
+ <li>Select <strong>Help</strong> > <strong>Software Updates</strong>.</li>
+ <li>Select the <strong>Available Software</strong> tab.</li>
+ <li>Select the checkboxes next to Android DDMS and Android Developer Tools,
+ then click <strong>Update</strong>.</li>
+ <li>In the resulting Available Updates dialog, ensure that both Android DDMS
+ and Android Development Tools are selected, then click
+ <strong>Next</strong>.</li>
+ <li>Read and accept the license agreement and then click <strong>Finish</strong>.
+ This will download and install the latest version of Android DDMS and
+ Android Development Tools.</li>
+ <li>Restart Eclipse.</li>
+</ol>
+</td>
+<td>
+<!-- 3.5 steps -->
+<ol>
+ <li>Select <strong>Help</strong> > <strong>Check for Updates</strong>. </li>
+ <li>In the resulting Available Updates dialog, locate the Android DDMS and
+ Android Development Tools features in the list and ensure that the checkboxes
+ next to them are selected. Click <strong>Next</strong>.
+ <p>If the Available Updates dialog does not list Android DDMS and Android
+ Development tools, make sure that you have set up a remote update site
+ for them, as described in
+ <a href="installing.html#InstallingADT">Installing the ADT Plugin</a>.
+ </p></li>
+ <li>In the Update Details dialog, click <strong>Next</strong>.</li>
+ <li>Read and accept the license agreement and then click <strong>Finish</strong>.
+ This will download and install the latest version of Android DDMS and
+ Android Development Tools.</li>
+ <li>Restart Eclipse.</li>
+</ol>
+</td>
+</tr>
+</table>
+
+<p>If you encounter problems with this update procedure, try performing a fresh
+installation. Fully remove your existing ADT Plugin as described in <a
+href="{@docRoot}sdk/1.5_r3/upgrading.html#uninstallAdt">Uninstall your previous
+ADT plugin</a> and then follow the guide to <a
+href="installing.html#InstallingADT">Installing the ADT Plugin for
+Eclipse</a>.</p>
+
+<h3 id="updateEclipsePrefs">Update your Eclipse SDK Preferences</h3>
+
+<p>The last step is to update your Eclipse preferences to point to the new
+SDK directory:</p>
+<ol>
+ <li>Select <strong>Window</strong> > <strong>Preferences</strong> to open
+ the Preferences panel (Mac: <strong>Eclipse</strong> > <strong>Preferences
+ </strong>).</li>
+ <li>Select <strong>Android</strong> from the left panel.</li>
+ <li>For the SDK Location, click <strong>Browse</strong>
+ and locate your SDK directory.</li>
+ <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li>
+</ol>
+
+
+<h2 id="RunYourApps">Run Your Applications to Test Forward Compatibility</h2>
+
+<p>Now that you have installed the Android 1.6 SDK, we encourage you run each of
+your existing applications on the Android 1.6 system image that is included in
+the SDK, to ensure that it functions properly on the new platform.
+Testing forward-compatibility in this way is especially important for
+applications that you may have already published and that may be installed on
+devices that will upgrade to the new platform. </p>
+
+<p>In most cases, your applications will function properly when run on the new
+version of the platform. However, it is possible that you will encounter
+unexpected behavior, because of changes in the API or underlying platform. If
+you do find problems, you can use the SDK tools to compile and publish an update
+to the applications, which users can then download.
+
+<p>To test forward-compatibility, simply run your application, as-is, on an
+instance of the Android Emulator that uses an AVD targeted to the "Android 1.6"
+system image. Here are the steps: </p>
+
+<ol>
+ <li>Make no changes to your application code.</li>
+ <li>Create a new AVD that runs the new "Android 1.6" platform. </li>
+ <li>Launch your application in an emulator running the new AVD.</li>
+ <li>Perform normal testing on your application to ensure everything works as
+ expected.</li>
+</ol>
+
+<p>Note that, for the purposes of forward-compatibility testing, you should not
+change how your application is compiled. That is, you should continue to compile
+the application against the same version of the Android library as before. The
+only change needed is to the AVD, which controls the version of the Android
+system image (run-time environment) on which the application is run.
+
+<p>For more information on creating an AVD and launching your application, see
+<a href="{@docRoot}guide/developing/eclipse-adt.html#Running">Running Your
+Applications (Eclipse)</a> or <a
+href="{@docRoot}guide/developing/other-ide.html#Running">Running
+Your Applications (other IDEs)</a>, depending on your development
+environment.</p>
+
+<h3 id="FutureProofYourApps">Android 1.6 Forward-Compatibility Tips</h3>
+
+<p>The new version of the Android platform includes several new APIs, but
+very few actual changes to existing APIs. This means that, in most
+cases, your applications written with earlier versions of the Android library
+should run properly on the Android 1.6 platform. </p>
+
+<p>However, here are some areas to pay attention to as you test forward-compatibility:</p>
+
+<ul>
+ <li><strong>Make sure your application doesn't use internal APIs</strong>. Your
+application should not use any APIs that are not officially supported and are
+not published in the Android reference documentation. Unofficial APIs can change
+at any time without notice and — if your application happens to be using
+them — such a change could cause the application to break.</li>
+
+ <li><strong>Watch for assumptions about available hardware</strong>. Remember
+that not all compatible devices offer the same hardware capabilities —
+screens, keyboards, and physical keys, and so on. As you test your application,
+watch for areas where your application depends on the presence of specific
+hardware capabilities. If you find dependencies, you can design around them by
+building in alternate support or graceful degradation, or you can specify them
+as hardware requirements in a
+<a href="{@docRoot}guide/topics/manifest/uses-configuration-element.html"><code><uses-configuration></code>.</a>
+element in the application's manifest file. Also see the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code>
+manifest element, which lets your application declare a requirement for
+specific features, such as an OpenGL ES version or a camera that has
+autofocus capability.
+</li>
+
+ <li><strong>Watch for assumptions about available features</strong>. Not all
+compatible devices offer equal support for embedded features. same hardware capabilities —
+screens, keyboards, and physical keys, and so on. As you test your application,
+watch for areas where your application depends on the presence of specific
+hardware capabilities. If you find dependencies, you can design around them by
+building in alternate support or graceful degradation, or you can specify them
+as hardware requirements in a
+<a href="{@docRoot}guide/topics/manifest/uses-configuration-element.html"><code><uses-configuration></code>.</a>
+element in the application's manifest file. </li>
+
+ <p>When testing forward-compatibility, try running your application in various
+AVDs that emulate different hardware configurations. For example, you can create
+an AVD that does not offer a physical keyboard or one that uses a dpad instead
+of a trackball. Running your application in different emulated hardware
+configurations will give you an idea of where its dependencies are and help you
+identify problems. </p>
+ </li>
+
+ <li><strong>Watch for assumptions about screen resolution and
+density</strong>. A device's screen resolution and density is likely to affect
+the way that your application's UI is rendered, especially if your app specifies
+dimensions or positions using pixels or absolute layouts. To ensure consistent
+UI across screens, your app should specify the dimensions and positions of
+layouts and drawables in relative units that can be scaled by the system as
+appropriate, according to the density of the device's screen. Alternatively, you
+can create custom sets of layout/drawable resources for specific screens, which
+the system can then load as appropriate, based on the current device screen.</p>
+
+ <p>When testing forward-compatibility, try running your application in various
+AVDs that emulate different screen resolutions and densities. Also note that,
+starting with Android 1.6, the platform provides a Compatibility Mode that
+automatically scales the UI of applications if they do not explicitly indicate
+support for the current screen in the
+<a href="{@docRoot}guide/topics/manifest/supports-screen-element.html"><code><supports-screen></code>
+element in their manifest files. As part of testing, you should evaluate how
+your application is displayed in Compatibility Mode on different screens. </p>
+ </li>
+
+ <li><strong>Avoid performing layout orientation changes based on the
+acceletometer (or via other sensors)</strong>. Some Android-powered devices will
+automatically rotate the orientation (and all devices have the option to turn on
+auto-rotation), so if your application also attempts to rotate the orientation,
+it can result in strange behavior. In addition, if your application uses the
+accelerometer to detect shaking and you do not want to rotate the orientation,
+then you should lock the current orientation with <a
+href="{@docRoot}guide/topics/manifest/activity-element.html#screen">android:screenOrientation</a>.
+ </li>
+
+</ul>
+
+<h2 id="MigrateYourApps">Migrate Your Applications</h2>
+
+<p>If you want to use any of the new Android 1.6 APIs in your existing
+applications, you must first migrate the applications to the new Android
+platform version. Generally, migrating an application includes: </p>
+
+<ul>
+<li>Referencing the proper API Level in the application's manifest file,
+and</li>
+<li>Resetting its project properties so that it is compiled against the Android
+1.6 build target.</li>
+</ul>
+
+<p>Additionally, to run your application in the emulator, you need to
+create an AVD that uses the Android 1.6 system image. </p>
+
+<p class="note"><strong>Note:</strong> You only need migrate your application as
+described in this section if the application will actually use APIs
+<em>introduced</em> in the Android 1.6 platform (which are not available on
+devices running older versions of the Android platform). If your application
+does not use any new APIs, you can compile and run it without modification and
+not migration is necessary.</p>
+
+<h3>Reference the Proper API Level</h3>
+
+<p>If your application is using APIs introduced in Android 1.6, you must
+reference that dependency in the application's manifest file so that it can be
+deployed to devices running the Android 1.6 platform. </p>
+
+<p>Open the manifest file and locate the <code>minSdkVersion</code> attribute
+in the <code><uses-sdk></code> manifest element. Set the value of
+<code>minSdkVersion</code> to <code>"4"</code> (the API Level
+identifier corresponding to Android 1.6). Here's an example:</p>
+
+<pre>
+<manifest>
+ ...
+ <uses-sdk android:minSdkVersion="4" />
+ ...
+</manifest>
+</pre>
+
+<h3>Compile Against the Proper Build Target</h3>
+
+<p>Once you've changed the <code>minSdkVersion</code> value in your
+application's manifest, you need to set the application's project properties so
+that the application will be compiled against the Android 1.6 library. To do so,
+follow the steps below for your respective development environment. </p>
+
+<h4 id="EclipseUsers">Eclipse Users</h4>
+
+<ol>
+ <li>Right-click on the individual project (in the Package Explorer)
+ and select <strong>Properties</strong>.</li>
+ <li>In the properties, open the Android panel and select a new Project Build Target.
+ Select "Android 1.6" to target the new platform (or "Google APIs" with the "4"
+ API Level, if your application uses the Google Maps APIs).</li>
+ <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li>
+</ol>
+
+<h4 id="AntUsers">Ant Users</h4>
+
+<p>Use the <code>android</code> tool (located in
+<code><em>your_sdk</em>/tools/</code>) to create a new <code>build.xml</code>
+that references the new platform target. To see a list of available targets,
+execute:</p>
+
+<pre>android list targets</pre>
+
+<p>Select the target <code>id</code> that corresponds to the "Android 1.6" platform
+and pass it with the <code>--target</code> parameter when updating your project.
+For example:</p>
+
+<pre>android update project --path /path/to/my-project --target 2</pre>
+
+<p>If your application uses the Google Maps APIs (i.e., MapView), be certain to
+select a Google APIs target.</p>
+
+<h3>Create an AVD that Uses the Android 1.6 Platform</h3>
+
+<p>Finally, you need to set up a new AVD that uses the Android 1.6 platform, so that
+you can run your application in the emulator.
+
+<p>To set up the new AVD, use the <code>android</code> tool, available in the
+<code>tools/</code> directory of the SDK. You can run the AVD manager by simply
+changing to the <code>tools/</code> directory and entering <code>android</code>
+at the command line. Click "New" to create the AVD and set its properties.</p>
+
+<p>When creating the AVD, make sure to select a target of "Android 1.6 - API
+Level 4". If your application uses the Google Maps APIs (MapView), select the
+target "Google APIs (Google Inc.) - API Level 4". </p>
+
+<p>For more information about running your application in an AVD, see <a
+href="{@docRoot}guide/developing/eclipse-adt.html#Running">Running Your
+Application (Eclipse)</a> or <a
+href="{@docRoot}guide/developing/other-ide.html#Running">Running Your
+Application (other IDEs)</a>. </p>
+
+<p>For general information about AVDs, see the <a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual
+Devices</a> document. </p>
+
+
+
+<div class="special">
+<p>If you have trouble migrating to the new version of the SDK, visit the
+<a href="http://groups.google.com/group/android-developers">Android Developers Group</a>
+to seek help from other Android developers.</p>
+</div>
+
diff --git a/docs/html/sdk/RELEASENOTES.jd b/docs/html/sdk/RELEASENOTES.jd
index 03eeb4b..130a92c 100644
--- a/docs/html/sdk/RELEASENOTES.jd
+++ b/docs/html/sdk/RELEASENOTES.jd
@@ -5,6 +5,198 @@
releases. For the latest known issues, please ensure that you're viewing this
page at <a href="http://developer.android.com/sdk/RELEASENOTES.html">http://developer.android.com/sdk/RELEASENOTES.html</a>.</p>
+<h2 id="1.6_r1">Android 1.6 SDK, Release 1</h2>
+
+<p>This SDK provides updates to the development tools and Android system that
+you use to create applications for compliant Android-powered devices. </p>
+
+<h3>Release Overview</h3>
+
+<p>This SDK release includes several new features for developers. Highlights of the
+changes include: </p>
+
+ <ul>
+ <li>Emulator support for multiple screen sizes/densities, including new
+skins. </li>
+ <li>Android SDK and AVD Manager, a graphical UI to let you manage your
+SDK and AVD environments more easily. The tool lets you create and manage
+your <a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual
+Devices</a> and download new SDK packages (such as platform versions and
+add-ons) into your environment.</li>
+ <li>Improved support for test packages in New Project Wizard</li>
+ </ul>
+
+<p>For details about the Android platforms included in the SDK — including
+bug fixes, features, and API changes — please read the Version Notes
+documents available at left. For a list of Android platforms included in this
+release, see the <a href="{@docRoot}sdk/1.6_r1/index.html">Download
+page</a>. Note that you can use the Android SDK and AVD Manager to download
+additional platforms.</p>
+
+<h3>Installation and Upgrade Notes</h3>
+
+<p>If you've been developing an application using an Android 1.1 SDK, you need
+to make a few changes to your development environment to migrate to the new SDK.
+Tools and documentation are provided to assist you. No changes to the source
+code of an existing application should be needed, provided that your application
+is not using Android internal structures or APIs.</p>
+
+<p>To ensure that your existing application will work properly on a device
+running the latest version of the Android platform, you are strongly encouraged
+to migrate the application to the new SDK, compile it using the platform
+matching the application's original API Level, and run it against the most
+current platform. </p>
+
+<p>If you're installing the Android SDK for the first time, please see
+the instructions in <a
+href="{@docRoot}sdk/1.5_r1/installing.html">Installing the SDK</a>.
+
+<h3>ADT Plugin for Eclipse</h3>
+
+<p>An updated version of the ADT Plugin for Eclipse is available with the
+Android 1.6 SDK. The new version, ADT 0.9.3, provides several new
+features, including integrated support for the Android SDK and AVD Manager
+and zipalign tool. In addition, the New Project Wizard now
+lets you create a test package containing tests for your application. These
+features are described in the sections below. </p>
+
+<p>If you are developing in Eclipse with ADT and want to get started with the
+Android 1.6 SDK, you should download and install a compatible version of the ADT
+Plugin (0.9.3 or higher). </p>
+
+<p>The new version of ADT is downloadable from the usual remote update site or
+is separately downloadable as a .zip archive. For instructions on how to
+download the plugin, please see <a href="upgrading.html#UpdateAdt">Upgrading
+Your Eclipse Plugin</a>. </p>
+
+<h3>Android SDK and AVD Manager</h3>
+
+<p>The SDK offers a new tool called Android AVD Manager that lets you manage
+your SDK and AVD environments more efficiently. </p>
+
+<p>Using the tool, you can quickly check what Android platforms, add-ons,
+extras, and documentation packages are available in your SDK environment, what
+their versions are, and whether updated versions are available. You can then
+download one or more items from remote repositories and install them directly in
+your SDK environment. For example, the tool lets you obtain updates to SDK tools
+incrementally, as they are made available, without having to wait for the next
+SDK release. You can also download Android platform versions into your
+environment that were not included in the SDK package.</p>
+
+<p>The tool also lets you quickly create new AVDs, manage
+their properties, and run a target AVD from a single window. </p>
+
+<p>If you are developing in Eclipse with ADT, you can access the Android SDK
+and AVD Manager from the <strong>Window</strong> menu. </p>
+
+<p>If you are developing in another IDE, you can access the Android SDK and
+AVD Manager through the <code>android</code> command-line tool, located in the
+<sdk>/tools directory. You can launch the tool with a graphical UI by
+using the <code>android</code> command without specifying any options. You can
+also simply double-click the android.bat (Windows) or android (OS X/Linux) file.
+You can still use <code>android</code> commands to create and manage AVDs,
+including AVDs with custom hardware configurations.</p>
+
+<h3>Integration with zipalign</h3>
+
+<p>The Android system offers a performance optimization for installed
+application packages whose contained uncompressed files are all aligned on
+4-byte boundaries. For these .apks, the system can read the files by mmap'ing
+the zip file, rather than by copying all the data out of them. This reduces
+the amount of memory used by the application at run time. The SDK includes
+a tool called <code>zipalign</code> that you can run against your .apks, to
+align them properly and enable them to benefit from this optimization.</p>
+
+<p>The ADT Plugin and the Ant build tools both provide integrated support for
+aligning your application packages. After you build an .apk, the SDK tools can
+sign and then run <code>zipalign</code> against it. The SDK includes the
+standalone version of the <code>zipalign</code> tool, so you can run also run it
+manually from the command line if you choose. </p>
+
+<ul>
+ <li>If you are developing in Eclipse with ADT, support for
+<code>zipalign</code> is integrated into the Export Wizard. When you use the
+Wizard to export a signed application package, ADT signs and then automatically
+runs <code>zipalign</code> against the exported package. If you use the Wizard
+to export an unsigned application package, then it will not zipalign the
+package because zipalign must be performed only after the APK has been signed.
+You must manually sign and zipalign the package after export. </li>
+ <li>If you are developing using Ant and are compiling in release mode, the
+build tools will automatically sign and then <code>zipalign</code> the
+application package, provided that you have specified the location of a valid
+keystore in the build properties file. If you are compiling in debug mode, the
+build tools will sign the package with the debug key and then <code>zipalign</code>
+it.</li>
+ <li>To use <code>zipalign</code> manually, change to the SDK tools directory
+and use the command syntax <code>$ zipalign 4 <infile>
+<outfile></code></li>
+</ul>
+
+<p>In general, note that you must <code>zipalign</code> an application only
+<em>after</em> it has been signed, as signing will disrupt the package
+alignment.</p>
+
+<h3>Support for Test Packages in New Project Wizard</h3>
+
+<p>The New Project Wizard available in the ADT 0.9.3 now lets you add a test
+package containing Instrumentation or other classes of tests while you are
+creating or importing a new Android application project. </p>
+
+<h3>New USB Driver for Windows</h3>
+
+<p>If you are using Windows and want to develop or test your application on an
+Android-powered device (such as the T-Mobile G1), you need an appropriate USB
+driver.
+
+<p>The Windows version of the Android 1.6 SDK includes a new, WinUSB-based
+driver that you can install. The driver is compatible with both 32- and 64-bit
+versions of Windows XP and Vista. The driver represents an upgrade from the USB
+driver included in previous Android SDKs, although installing the new driver is
+not required. </p>
+
+<p>If you installed the USB driver from a previous SDK release and it is working
+properly, you do not need to upgrade to the new driver. However, we recommend
+upgrading if you have had any problems with the older driver or simply want
+to upgrade to the latest version.</p>
+
+<p>The USB driver files are located in the
+<code><SDK>/usb_driver</code> directory. For driver installation or
+upgrade instructions, see <a
+href="{@docRoot}guide/developing/device.html#WinUsbDriver">Installing the WinUSB
+Driver</a>.</p>
+</p>
+
+<h3>Emulator Skins, Android 1.6 Platform</h3>
+
+<p>The Android 1.6 platform included in the SDK provides a new set of emulator
+skins, including: </p>
+
+<ul>
+ <li>QVGA — 240 x 320, low density (120 dpi)</li>
+ <li>HVGA — 320 x 480, medium density (160 dpi)</li>
+ <li>WVGA800 — 480 x 800, high density (240 dpi)</li>
+ <li>WVGA854 — 480 x 854, high density (240 dpi)</li>
+</ul>
+
+<p>Besides these defaults, You can also create an AVD that overrides the default
+density for each skin, to create any combination of resolution/density (WVGA
+with medium density, for instance). To do so, use the <code>android</code> tool
+command line to create a new AVD that uses a custom hardare configuration. See
+<a href="{@docRoot}guide/developing/tools/avd.html#createavd">Creating an
+AVD</a> for more information.</p>
+
+<h3>Other Notes and Resolved Issues</h3>
+
+<ul>
+ <li>This SDK release adds support for Eclipse 3.5 (Galileo) and deprecates
+support for Eclipse 3.3 (Europa). </li>
+ <li>We regret to inform developers that Android 1.6 will not include support
+for <a href="http://www.ietf.org/rfc/rfc2549">RFC 2549</a></li>
+ <li>The issue preventing adb from recognizing Samsung Galaxy devices (linux SDK
+only) has been fixed.</li>
+</ul>
+
+
<h2 id="1.5_r3">Android 1.5 SDK, Release 3</h2>
<p>Provides an updated Android 1.5 system image that includes permissions
diff --git a/docs/html/sdk/adt_download.jd b/docs/html/sdk/adt_download.jd
index d7b9ac3..3eb6831 100644
--- a/docs/html/sdk/adt_download.jd
+++ b/docs/html/sdk/adt_download.jd
@@ -26,24 +26,24 @@
</tr>
<tr>
- <td>0.9.2</td>
- <td><a href="http://dl-ssl.google.com/android/ADT-0.9.2.zip">ADT-0.9.2.zip</a></td>
+ <td>0.9.3</td>
+ <td><a href="http://dl-ssl.google.com/android/ADT-0.9.3.zip">ADT-0.9.3.zip</a></td>
<td><nobr>bytes</nobr></td>
<td><nobr></nobr></td>
- <td><nobr>Required for users of Android 1.6 SDK (and later releases). Updated from 0.9.1. <em><nobr>August 2009</nobr></em></td>
+ <td><nobr>Required for users of Android 1.6 SDK (and later releases). Updated from 0.9.1. <em><nobr>September 2009</nobr></em></td>
</tr>
<tr class="alt-color">
<td>0.9.1</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.9.1.zip">ADT-0.9.1.zip</a></td>
<td><nobr>2916093 bytes</nobr></td>
<td><nobr>e7b2ab40414ac98</nobr></td>
- <td><nobr>Required for users of Android 1.5 SDK (and later releases). Updated from 0.9.0. <em><nobr>6 May 2009</nobr></em></td>
+ <td><nobr>Required for users of Android 1.5 SDK. Updated from 0.9.0. <em><nobr>6 May 2009</nobr></em></td>
</tr>
<tr>
<td>0.8.0</td>
<td><a href="http://dl-ssl.google.com/android/ADT-0.8.0.zip">ADT-0.8.0.zip</a></td>
<td colspan="2"><nobr> </nobr></td>
- <td><nobr>Required for users of Android 1.1 SDK and Android 1.0 SDK. <em><nobr>23 Sep 2008</nobr></em></td>
+ <td><nobr>Required for users of Android 1.0/1.1 SDKs. <em><nobr>23 Sep 2008</nobr></em></td>
</tr>
</table>
@@ -63,20 +63,19 @@
<tr>
<td>0.7.1</td>
- <td>Required for users of Android 0.9 SDK beta. As of this version, <b>Eclipse 3.2 is no longer supported.</b>
- Please upgrade to Eclipse Ganymede (3.4) or Europa (3.3) if you are still using 3.2. <em><nobr>18 Aug 2008</nobr></em></td>
+ <td>Required for users of the Android 0.9 SDK beta. <em><nobr>18 Aug 2008</nobr></em></td>
</tr>
<tr>
<td>0.4.0</td>
- <td>Required if you are using the M5 SDK. See the SDK Release Notes for details on changes and enhancements in this version. <em><nobr>12 Feb 2008</nobr></em></td>
+ <td>Required for users of the Android M5 Early Look SDK. <em><nobr>12 Feb 2008</nobr></em></td>
</tr>
<tr>
<td>0.3.3</td>
- <td>Some significant enhancements (see m3-rc37 SDK Release Notes). <em><nobr>14 Dec 2007</nobr></em></td>
+ <td>Required for users of the Android M3-RC37 Early Look SDK. <em><nobr>14 Dec 2007</nobr></em></td>
</tr>
<tr>
<td>0.3.1</td>
- <td>Initial Release. Required for Android m3-rc20 SDK and Android m3-rc22 SDK.<em><nobr>21 Nov 2007</nobr></em></td>
+ <td>Initial Release. Required for users of the Android M3-RC20/22 SDKs.<em><nobr>21 Nov 2007</nobr></em></td>
</tr>
</table>
</p>
diff --git a/docs/html/sdk/android-1.6.jd b/docs/html/sdk/android-1.6.jd
new file mode 100644
index 0000000..29dceec
--- /dev/null
+++ b/docs/html/sdk/android-1.6.jd
@@ -0,0 +1,235 @@
+page.title=Android 1.6 Version Notes
+
+@jd:body
+
+<p>
+<em>Date:</em> September 2009<br />
+<em>API Level:</em> <strong>4</strong></p>
+
+
+<p>This document provides version notes for the Android 1.6 system image included in the SDK. </p>
+
+<ul>
+<li><a href="#overview">Overview</a>
+<li><a href="#features">New Features</a>
+<li><a href="#apps">Built-in Applications</a>
+<li><a href="#locs">Locales</a>
+<li><a href="#api-changes">API Changes</a>
+</ul>
+
+<h2 id="overview">Overview</h2>
+
+<p>The Android 1.6 system delivered in the SDK (as library and system image) is
+the development counterpart to the Android 1.6 production system image,
+deployable to Android-powered handsets starting September 2009. The system is fully
+compliant and includes no external libraries.</p>
+
+<p>The Android 1.6 system delivers an updated version of the framework
+API. As with previous versions, the Android 1.6 API
+is assigned an integer identifier — <strong>4</strong> — that is
+stored in the system itself. This identifier, called the "API Level", allows the
+system to correctly determine whether an application is compatible with
+the system, prior to installing the application. </p>
+
+<p>For more information about how to use API Level, see the <a
+href="{@docRoot}guide/developing/">API Levels</a> document. </p>
+
+<h2 id="features">New Features</h2>
+
+<p>For a list of new system features, see the <a
+href="http://developer.android.com/sdk/android-1.6-highlights.html">Android 1.6 Platform
+Highlights</a> document.</p>
+
+<h2 id="apps">Built-in Applications</h2>
+
+<p>The system image includes these built-in applications:</p>
+ <ul>
+ <li>Alarm Clock</li>
+ <li>Browser</li>
+ <li>Calculator</li>
+ <li>Camcorder</li>
+ <li>Camera</li>
+ <li>Contacts</li>
+ <li>Custom Locale (developer app)</li>
+ <li>Dev Tools (developer app)</li>
+ <li>Dialer</li>
+ <li>Email</li>
+ <li>Gallery</li>
+ <li>Gestures Builder</li>
+ <li>IME for Japanese text input</li>
+ <li>Messaging</li>
+ <li>Music</li>
+ <li>Settings</li>
+ <li>Spare Parts (developer app)</li>
+ </ul>
+
+<h2 id="locs">Locales</h2>
+
+<p>The system image provides a variety of built-in locales. In some cases,
+region-specific strings are available for the locales. In other cases,
+a default version of the language is used. The languages that will be
+available in the Android 1.6 system image are listed below (with
+<em>language</em>_<em>country/region</em> locale descriptor).</p>
+
+<table style="border:0;">
+<tr>
+<td style="border:0">
+<ul style="margin-bottom:0;">
+<li>Arabic, Egypt (ar_EG)</li>
+<li>Arabic, Israel (ar_IL)</li>
+<li>Bulgarian, Bulgaria (bg_BG)</li>
+<li>Chinese, PRC (zh_CN)</li>
+<li>Chinese, Taiwan (zh_TW)</li>
+<li>Croatian, Croatia (hr_HR)</li>
+<li>Czech, Czech Republic (cs_CZ)</li>
+<li>Danish, Denmark (da_DK)</li>
+<li>Dutch, Netherlands (nl_NL)</li>
+<li>Dutch, Belgium (nl_BE)</li>
+<li>English, US (en_US)</li>
+<li>English, Britain (en_GB)</li>
+<li>English, Canada (en_CA)</li>
+<li>English, Australia (en_AU)</li>
+<li>English, India (en_IN)</li>
+<li>English, Ireland (en_IE)</li>
+<li>English, New Zealand (en_NZ)</li>
+<li>English, Singapore (en_SG)</li>
+<li>English, South Africa (en_ZA)</li>
+<li>Finnish, Finland (fi_FI)</li>
+<li>French, France (fr_FR)</li>
+<li>French, Belgium (fr_BE)</li>
+<li>French, Canada (fr_CA)</li>
+<li>French, Switzerland (fr_CH)</li>
+<li>German, Germany (de_DE)</li>
+<li>German, Austria (de_AT)</li>
+<li>German, Switzerland (de_CH)</li>
+<li>German, Liechtenstein (de_LI)</li>
+</ul>
+</td>
+<td style="border:0;padding-left:5em;">
+<ul style="margin-bottom:0;">
+<li>Greek, Greece (el_GR)</li>
+<li>Hindi, India (hi_IN)</li>
+<li>Hungarian, Hungary (hu_HU)</li>
+<li>Indonesian, Indonesia (id_ID)</li>
+<li>Italian, Italy (it_IT)</li>
+<li>Italian, Switzerland (it_CH)</li>
+<li>Japanese, Japan (ja_JP)</li>
+<li>Korean, Korea (ko_KR)</li>
+<li>Latvian, Latvia (lv_LV)</li>
+<li>Lithuanian, Lithuania (lt_LT)</li>
+<li>Norwegian Bokmål, Norway (nb_NO)</li>
+<li>Polish, Poland (pl_PL)</li>
+<li>Portuguese, Brazil (pt_BR)</li>
+<li>Portuguese, Portugal (pt_PT)</li>
+<li>Romanian, Romania (ro_RO)</li>
+<li>Russian, Russia (ru_RU)</li>
+<li>Serbian, Serbia (sr_RS)</li>
+<li>Slovak, Slovakia (sk_SK)</li>
+<li>Slovenian, Slovenia (sl_SI)</li>
+<li>Spanish, Spain (es_ES)</li>
+<li>Spanish, US (es_US)</li>
+<li>Swedish, Sweden (sv_SE)</li>
+<li>Thai, Thailand (th_TH)</li>
+<li>Tagalog, Philippines (tl_PH)</li>
+<li>Turkish, Turkey (tr_TR)</li>
+<li>Ukranian, Ukrania (uk_UA)</li>
+<li>Vietnamese, Vietnam (vi_VN)</li>
+</ul>
+</td>
+</tr>
+</table>
+
+<p>Localized UI strings match the locales that are displayable in
+the emulator, accessible through the device Settings application.</p>
+
+<h2 id="api-changes">API Changes</h2>
+
+<h3 style="padding-top:0">Overview</h3>
+
+<ul>
+
+<li>Search framework</li>
+ <ul>
+ <li>Applications can now expose relevant content to users as search suggestions in the Quick Search Box, a new device-wide search capability that is accessible from the home screen. To support this, the search framework adds new attributes to the searchable metadata file. For complete information, see the {@link android.app.SearchManager SearchManager} documentation.</li>
+ </ul>
+</li>
+
+<li>Accessibility framework</li>
+ <ul>
+ <li>New {@link android.view.accessibility android.accessibility} package
+that includes classes for capturing accessibility events and forwarding them to
+an {@link android.accessibilityservice AccessibilityService} handler. </li>
+ <li>New {@link android.accessibilityservice AccessibilityService} package
+that lets your application track user events and provide visual, audible, or
+haptic feedback to the user. </li>
+ </ul>
+</li>
+
+<li>Gestures</li>
+ <ul>
+ <li>New {@link android.gesture gesture} API for creating, recognizing,
+loading, and saving gestures.</li>
+ </ul>
+</li>
+
+<li>Text-to-speech</li>
+ <ul>
+ <li>New package {@link android.speech.tts android.speech.tts} provides
+classes for synthesizing speech from text, for immediate playback or to create a
+sound file.</li>
+ </ul>
+</li>
+
+<li>Permissions</li>
+ <ul>
+
+ <li>New permissions for
+{@link android.Manifest.permission#CHANGE_WIFI_MULTICAST_STATE CHANGE_WIFI_MULTICAST_STATE},
+{@link android.Manifest.permission#INSTALL_LOCATION_PROVIDER INSTALL_LOCATION_PROVIDER},
+{@link android.Manifest.permission#READ_HISTORY_BOOKMARKS READ_HISTORY_BOOKMARKS},
+{@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE}, and
+{@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS WRITE_HISTORY_BOOKMARKS}.</li>
+ </ul>
+</li>
+
+<li>Graphics</li>
+ <ul>
+ <li>Classes in {@link android.graphics android.graphics} now support scaling
+for different screen densities.</li>
+ </ul>
+</li>
+
+<li>Telephony</li>
+ <ul>
+ <li>New {@link android.telephony.SmsManager SmsManager} and other classes
+for sending and receiving SMS messages.</li>
+ </ul>
+</li>
+
+<li>Utilities</li>
+ <ul>
+ <li>New {@link android.util.DisplayMetrics DisplayMetrics} fields for
+determining the density of the current device screen.</li>
+ </ul>
+</li>
+
+<li>Application-defined support for various screen densities</li>
+ <p>Applications can now use a new element in their manifest files, <a
+href="{@docRoot}guide/topics/manifest/supports-screen-element.html"><supports-
+screen></a> to indicate to the specific screen resolutions/densities that
+they are designed to support. When the application is installed on a device
+whose screen is not explicitly supported by the application, the system
+runs the application in Compatibility Mode, where possible. </p>
+</li>
+</ul>
+
+<h3 id="api-diff">API Change Details</h3>
+
+<p>For a detailed view of API changes in this platform (API Level 4), see the <a
+href="{@docRoot}sdk/api_diff/4/changes.html">API Differences Report</a>.</p>
+
+
+
+
+
+
diff --git a/docs/html/sdk/api_diff/4/changes.html b/docs/html/sdk/api_diff/4/changes.html
index da18ae6..c1b66a1 100644
--- a/docs/html/sdk/api_diff/4/changes.html
+++ b/docs/html/sdk/api_diff/4/changes.html
@@ -4,11 +4,11 @@
<meta name="generator" content="JDiff v1.1.0">
<!-- Generated by the JDiff Javadoc doclet -->
<!-- (http://www.jdiff.org) -->
-<!-- on Wed Aug 05 19:20:54 PDT 2009 -->
+<!-- on Wed Sep 02 18:26:54 PDT 2009 -->
<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
<TITLE>
-API Differences between 3 and Donut
+API Differences between 3 and 4
</TITLE>
<link href="../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
<link href="stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
diff --git a/docs/html/sdk/api_diff/4/changes/alldiffs_index_additions.html b/docs/html/sdk/api_diff/4/changes/alldiffs_index_additions.html
index 048f928..cb7b0f9 100644
--- a/docs/html/sdk/api_diff/4/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/api_diff/4/changes/alldiffs_index_additions.html
@@ -69,6 +69,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ACCESSIBILITY_ENABLED" class="hiddenlink" target="rightframe">ACCESSIBILITY_ENABLED</A>
@@ -157,6 +158,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.backupAgent" class="hiddenlink" target="rightframe">backupAgent</A>
@@ -200,6 +202,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.CHANGE_WIFI_MULTICAST_STATE" class="hiddenlink" target="rightframe">CHANGE_WIFI_MULTICAST_STATE</A>
@@ -262,6 +265,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.graphics.BitmapFactory.html#android.graphics.BitmapFactory.decodeResourceStream_added(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory.Options)" class="hiddenlink" target="rightframe"><b>decodeResourceStream</b>
@@ -316,952 +320,6 @@
<nobr><A HREF="android.view.Window.Callback.html#android.view.Window.Callback.dispatchPopulateAccessibilityEvent_added(android.view.accessibility.AccessibilityEvent)" class="hiddenlink" target="rightframe">type <b>
(<code>AccessibilityEvent</code>)</b> in android.view.Window.Callback
</A></nobr><br>
-<!-- Field donut_resource_pad1 -->
-<i>donut_resource_pad1</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
-<i>donut_resource_pad10</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
-<i>donut_resource_pad11</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
-<i>donut_resource_pad12</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
-<i>donut_resource_pad13</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
-<i>donut_resource_pad14</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
-<i>donut_resource_pad15</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
-<i>donut_resource_pad16</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
-<i>donut_resource_pad17</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
-<i>donut_resource_pad18</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
-<i>donut_resource_pad19</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
-<i>donut_resource_pad2</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
-<i>donut_resource_pad20</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
-<i>donut_resource_pad21</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
-<i>donut_resource_pad22</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad23 -->
-<i>donut_resource_pad23</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad23 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad23 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad24 -->
-<i>donut_resource_pad24</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad24 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad24 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad25 -->
-<i>donut_resource_pad25</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad25 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad25 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad26 -->
-<i>donut_resource_pad26</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad26 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad26 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad27 -->
-<i>donut_resource_pad27</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad27 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad27 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad28 -->
-<i>donut_resource_pad28</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad28 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad29 -->
-<i>donut_resource_pad29</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad29 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
-<i>donut_resource_pad3</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad30 -->
-<i>donut_resource_pad30</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad30 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad31 -->
-<i>donut_resource_pad31</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad31 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad32 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad32" class="hiddenlink" target="rightframe">donut_resource_pad32</A>
-</nobr><br>
-<!-- Field donut_resource_pad33 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad33" class="hiddenlink" target="rightframe">donut_resource_pad33</A>
-</nobr><br>
-<!-- Field donut_resource_pad34 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad34" class="hiddenlink" target="rightframe">donut_resource_pad34</A>
-</nobr><br>
-<!-- Field donut_resource_pad35 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad35" class="hiddenlink" target="rightframe">donut_resource_pad35</A>
-</nobr><br>
-<!-- Field donut_resource_pad36 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad36" class="hiddenlink" target="rightframe">donut_resource_pad36</A>
-</nobr><br>
-<!-- Field donut_resource_pad37 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad37" class="hiddenlink" target="rightframe">donut_resource_pad37</A>
-</nobr><br>
-<!-- Field donut_resource_pad38 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad38" class="hiddenlink" target="rightframe">donut_resource_pad38</A>
-</nobr><br>
-<!-- Field donut_resource_pad39 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad39" class="hiddenlink" target="rightframe">donut_resource_pad39</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
-<i>donut_resource_pad4</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad40 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad40" class="hiddenlink" target="rightframe">donut_resource_pad40</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
-<i>donut_resource_pad5</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
-<i>donut_resource_pad6</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
-<i>donut_resource_pad7</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
-<i>donut_resource_pad8</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
-<i>donut_resource_pad9</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
<!-- Field dropDownHeight -->
<nobr><A HREF="android.R.attr.html#android.R.attr.dropDownHeight" class="hiddenlink" target="rightframe">dropDownHeight</A>
</nobr><br>
@@ -1287,6 +345,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES" class="hiddenlink" target="rightframe">ENABLED_ACCESSIBILITY_SERVICES</A>
@@ -1322,6 +381,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.fadeDuration" class="hiddenlink" target="rightframe">fadeDuration</A>
@@ -1384,6 +444,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.gestureColor" class="hiddenlink" target="rightframe">gestureColor</A>
@@ -1557,6 +618,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<i>ImageSpan</i><br>
@@ -1638,6 +700,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.largeScreens" class="hiddenlink" target="rightframe">largeScreens</A>
@@ -1667,6 +730,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.os.Build.html#android.os.Build.MANUFACTURER" class="hiddenlink" target="rightframe">MANUFACTURER</A>
@@ -1696,6 +760,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<i>NinePatchDrawable</i><br>
@@ -1729,6 +794,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.os.RemoteCallbackList.html#android.os.RemoteCallbackList.onCallbackDied_added(E, java.lang.Object)" class="hiddenlink" target="rightframe"><b>onCallbackDied</b>
@@ -1763,6 +829,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.content.Intent.html#android.content.Intent.parseUri_added(java.lang.String, int)" class="hiddenlink" target="rightframe"><b>parseUri</b>
@@ -1806,6 +873,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.queryAfterZeroResults" class="hiddenlink" target="rightframe">queryAfterZeroResults</A>
@@ -1832,6 +900,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.READ_HISTORY_BOOKMARKS" class="hiddenlink" target="rightframe">READ_HISTORY_BOOKMARKS</A>
@@ -1870,6 +939,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.content.res.Configuration.html#android.content.res.Configuration.screenLayout" class="hiddenlink" target="rightframe">screenLayout</A>
@@ -2055,6 +1125,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<i>targetSdkVersion</i><br>
@@ -2330,6 +1401,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.uncertainGestureColor" class="hiddenlink" target="rightframe">uncertainGestureColor</A>
@@ -2365,6 +1437,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#U"><font size="-2">U</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.view.html#ViewDebug.FlagToString" class="hiddenlink" target="rightframe"><b>ViewDebug.FlagToString</b></A><br>
@@ -2399,6 +1472,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.style.html#android.R.style.Widget_ProgressBar_Inverse" class="hiddenlink" target="rightframe">Widget_ProgressBar_Inverse</A>
@@ -2417,6 +1491,34 @@
<!-- Field WRITE_HISTORY_BOOKMARKS -->
<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.WRITE_HISTORY_BOOKMARKS" class="hiddenlink" target="rightframe">WRITE_HISTORY_BOOKMARKS</A>
</nobr><br>
+<!-- Class ZoomButtonsController -->
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#Q"><font size="-2">Q</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#U"><font size="-2">U</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#W"><font size="-2">W</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.widget.html#ZoomButtonsController" class="hiddenlink" target="rightframe"><b>ZoomButtonsController</b></A><br>
+<!-- Class ZoomButtonsController.OnZoomListener -->
+<A HREF="pkg_android.widget.html#ZoomButtonsController.OnZoomListener" class="hiddenlink" target="rightframe"><b><i>ZoomButtonsController.OnZoomListener</i></b></A><br>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
diff --git a/docs/html/sdk/api_diff/4/changes/alldiffs_index_all.html b/docs/html/sdk/api_diff/4/changes/alldiffs_index_all.html
index d20054b..4c52602 100644
--- a/docs/html/sdk/api_diff/4/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/api_diff/4/changes/alldiffs_index_all.html
@@ -71,6 +71,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ACCESSIBILITY_ENABLED" class="hiddenlink" target="rightframe">ACCESSIBILITY_ENABLED</A>
@@ -228,6 +229,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.backupAgent" class="hiddenlink" target="rightframe">backupAgent</A>
@@ -291,6 +293,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<i>calculateLength</i><br>
@@ -385,6 +388,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<i>Date</i><br>
@@ -464,952 +468,6 @@
<!-- Method divideMessage -->
<nobr><A HREF="android.telephony.gsm.SmsManager.html#android.telephony.gsm.SmsManager.divideMessage_changed(java.lang.String)" class="hiddenlink" target="rightframe">divideMessage
(<code>String</code>)</A></nobr><br>
-<!-- Field donut_resource_pad1 -->
-<i>donut_resource_pad1</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad1 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
-<i>donut_resource_pad10</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad10 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
-<i>donut_resource_pad11</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad11 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
-<i>donut_resource_pad12</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad12 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
-<i>donut_resource_pad13</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad13 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
-<i>donut_resource_pad14</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad14 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
-<i>donut_resource_pad15</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad15 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
-<i>donut_resource_pad16</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad16 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
-<i>donut_resource_pad17</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad17 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
-<i>donut_resource_pad18</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad18 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
-<i>donut_resource_pad19</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad19 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
-<i>donut_resource_pad2</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad2 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
-<i>donut_resource_pad20</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad20 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
-<i>donut_resource_pad21</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad21 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
-<i>donut_resource_pad22</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad22 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad23 -->
-<i>donut_resource_pad23</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad23 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad23 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad24 -->
-<i>donut_resource_pad24</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad24 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad24 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad25 -->
-<i>donut_resource_pad25</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad25 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad25 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad26 -->
-<i>donut_resource_pad26</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad26 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad26 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad27 -->
-<i>donut_resource_pad27</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad27 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad27 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad28 -->
-<i>donut_resource_pad28</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad28 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad29 -->
-<i>donut_resource_pad29</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad29 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
-<i>donut_resource_pad3</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad3 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad30 -->
-<i>donut_resource_pad30</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad30 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad31 -->
-<i>donut_resource_pad31</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad31 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad32 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad32" class="hiddenlink" target="rightframe">donut_resource_pad32</A>
-</nobr><br>
-<!-- Field donut_resource_pad33 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad33" class="hiddenlink" target="rightframe">donut_resource_pad33</A>
-</nobr><br>
-<!-- Field donut_resource_pad34 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad34" class="hiddenlink" target="rightframe">donut_resource_pad34</A>
-</nobr><br>
-<!-- Field donut_resource_pad35 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad35" class="hiddenlink" target="rightframe">donut_resource_pad35</A>
-</nobr><br>
-<!-- Field donut_resource_pad36 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad36" class="hiddenlink" target="rightframe">donut_resource_pad36</A>
-</nobr><br>
-<!-- Field donut_resource_pad37 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad37" class="hiddenlink" target="rightframe">donut_resource_pad37</A>
-</nobr><br>
-<!-- Field donut_resource_pad38 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad38" class="hiddenlink" target="rightframe">donut_resource_pad38</A>
-</nobr><br>
-<!-- Field donut_resource_pad39 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad39" class="hiddenlink" target="rightframe">donut_resource_pad39</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
-<i>donut_resource_pad4</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad4 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad40 -->
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad40" class="hiddenlink" target="rightframe">donut_resource_pad40</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
-<i>donut_resource_pad5</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad5 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
-<i>donut_resource_pad6</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad6 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
-<i>donut_resource_pad7</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad7 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
-<i>donut_resource_pad8</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad8 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
-<i>donut_resource_pad9</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<!-- Field donut_resource_pad9 -->
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
<!-- Class Drawable -->
<A HREF="android.graphics.drawable.Drawable.html" class="hiddenlink" target="rightframe">Drawable</A><br>
<!-- Field dropDownHeight -->
@@ -1439,6 +497,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES" class="hiddenlink" target="rightframe">ENABLED_ACCESSIBILITY_SERVICES</A>
@@ -1494,6 +553,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.fadeDuration" class="hiddenlink" target="rightframe">fadeDuration</A>
@@ -1564,6 +624,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.gestureColor" class="hiddenlink" target="rightframe">gestureColor</A>
@@ -1817,6 +878,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<i>ImageSpan</i><br>
@@ -2030,6 +1092,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.inputmethodservice.KeyboardView.html" class="hiddenlink" target="rightframe">KeyboardView</A><br>
@@ -2057,6 +1120,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.largeScreens" class="hiddenlink" target="rightframe">largeScreens</A>
@@ -2103,6 +1167,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br>
@@ -2159,6 +1224,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.graphics.NinePatch.html" class="hiddenlink" target="rightframe">NinePatch</A><br>
@@ -2204,6 +1270,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.os.RemoteCallbackList.html#android.os.RemoteCallbackList.onCallbackDied_added(E, java.lang.Object)" class="hiddenlink" target="rightframe"><b>onCallbackDied</b>
@@ -2246,6 +1313,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.content.pm.PackageManager.html" class="hiddenlink" target="rightframe">PackageManager</A><br>
@@ -2302,6 +1370,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.queryAfterZeroResults" class="hiddenlink" target="rightframe">queryAfterZeroResults</A>
@@ -2330,27 +1399,14 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.R.anim.html" class="hiddenlink" target="rightframe">R.anim</A><br>
-<!-- Class R.array -->
-<A HREF="android.R.array.html" class="hiddenlink" target="rightframe">R.array</A><br>
<!-- Class R.attr -->
<A HREF="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
-<!-- Class R.color -->
-<A HREF="android.R.color.html" class="hiddenlink" target="rightframe">R.color</A><br>
-<!-- Class R.dimen -->
-<A HREF="android.R.dimen.html" class="hiddenlink" target="rightframe">R.dimen</A><br>
<!-- Class R.drawable -->
<A HREF="android.R.drawable.html" class="hiddenlink" target="rightframe">R.drawable</A><br>
-<!-- Class R.id -->
-<A HREF="android.R.id.html" class="hiddenlink" target="rightframe">R.id</A><br>
-<!-- Class R.integer -->
-<A HREF="android.R.integer.html" class="hiddenlink" target="rightframe">R.integer</A><br>
-<!-- Class R.layout -->
-<A HREF="android.R.layout.html" class="hiddenlink" target="rightframe">R.layout</A><br>
-<!-- Class R.string -->
-<A HREF="android.R.string.html" class="hiddenlink" target="rightframe">R.string</A><br>
<!-- Class R.style -->
<A HREF="android.R.style.html" class="hiddenlink" target="rightframe">R.style</A><br>
<!-- Field READ_HISTORY_BOOKMARKS -->
@@ -2412,6 +1468,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.content.res.Configuration.html#android.content.res.Configuration.screenLayout" class="hiddenlink" target="rightframe">screenLayout</A>
@@ -2699,6 +1756,7 @@
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.widget.TabHost.TabSpec.html" class="hiddenlink" target="rightframe">TabHost.TabSpec</A><br>
@@ -2989,6 +2047,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.attr.html#android.R.attr.uncertainGestureColor" class="hiddenlink" target="rightframe">uncertainGestureColor</A>
@@ -3026,6 +2085,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#U"><font size="-2">U</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.view.VelocityTracker.html" class="hiddenlink" target="rightframe">VelocityTracker</A><br>
@@ -3068,6 +2128,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#U"><font size="-2">U</font></a>
<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.R.style.html#android.R.style.Widget_ProgressBar_Inverse" class="hiddenlink" target="rightframe">Widget_ProgressBar_Inverse</A>
@@ -3090,6 +2151,36 @@
<!-- Field WRITE_HISTORY_BOOKMARKS -->
<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.WRITE_HISTORY_BOOKMARKS" class="hiddenlink" target="rightframe">WRITE_HISTORY_BOOKMARKS</A>
</nobr><br>
+<!-- Class ZoomButtonsController -->
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#E"><font size="-2">E</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#J"><font size="-2">J</font></a>
+<a href="#K"><font size="-2">K</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#Q"><font size="-2">Q</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#U"><font size="-2">U</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#W"><font size="-2">W</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.widget.html#ZoomButtonsController" class="hiddenlink" target="rightframe"><b>ZoomButtonsController</b></A><br>
+<!-- Class ZoomButtonsController.OnZoomListener -->
+<A HREF="pkg_android.widget.html#ZoomButtonsController.OnZoomListener" class="hiddenlink" target="rightframe"><b><i>ZoomButtonsController.OnZoomListener</i></b></A><br>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
diff --git a/docs/html/sdk/api_diff/4/changes/alldiffs_index_changes.html b/docs/html/sdk/api_diff/4/changes/alldiffs_index_changes.html
index 8195523..8b9e697 100644
--- a/docs/html/sdk/api_diff/4/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/api_diff/4/changes/alldiffs_index_changes.html
@@ -705,24 +705,10 @@
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.R.anim.html" class="hiddenlink" target="rightframe">R.anim</A><br>
-<!-- Class R.array -->
-<A HREF="android.R.array.html" class="hiddenlink" target="rightframe">R.array</A><br>
<!-- Class R.attr -->
<A HREF="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
-<!-- Class R.color -->
-<A HREF="android.R.color.html" class="hiddenlink" target="rightframe">R.color</A><br>
-<!-- Class R.dimen -->
-<A HREF="android.R.dimen.html" class="hiddenlink" target="rightframe">R.dimen</A><br>
<!-- Class R.drawable -->
<A HREF="android.R.drawable.html" class="hiddenlink" target="rightframe">R.drawable</A><br>
-<!-- Class R.id -->
-<A HREF="android.R.id.html" class="hiddenlink" target="rightframe">R.id</A><br>
-<!-- Class R.integer -->
-<A HREF="android.R.integer.html" class="hiddenlink" target="rightframe">R.integer</A><br>
-<!-- Class R.layout -->
-<A HREF="android.R.layout.html" class="hiddenlink" target="rightframe">R.layout</A><br>
-<!-- Class R.string -->
-<A HREF="android.R.string.html" class="hiddenlink" target="rightframe">R.string</A><br>
<!-- Class R.style -->
<A HREF="android.R.style.html" class="hiddenlink" target="rightframe">R.style</A><br>
<!-- Field RELEASE -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.Manifest.permission.html b/docs/html/sdk/api_diff/4/changes/android.Manifest.permission.html
index b0389a1..76a0095 100644
--- a/docs/html/sdk/api_diff/4/changes/android.Manifest.permission.html
+++ b/docs/html/sdk/api_diff/4/changes/android.Manifest.permission.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.Manifest.permission_group.html b/docs/html/sdk/api_diff/4/changes/android.Manifest.permission_group.html
index 628ef07..10347eb 100644
--- a/docs/html/sdk/api_diff/4/changes/android.Manifest.permission_group.html
+++ b/docs/html/sdk/api_diff/4/changes/android.Manifest.permission_group.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.anim.html b/docs/html/sdk/api_diff/4/changes/android.R.anim.html
index cce8c29..93459a5 100644
--- a/docs/html/sdk/api_diff/4/changes/android.R.anim.html
+++ b/docs/html/sdk/api_diff/4/changes/android.R.anim.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -105,153 +105,6 @@
</TR>
<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
<TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad19"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad19" target="_top"><code>donut_resource_pad19</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad20"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad20" target="_top"><code>donut_resource_pad20</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad21"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad21" target="_top"><code>donut_resource_pad21</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.anim.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
<A NAME="android.R.anim.linear_interpolator"></A>
<nobr><code>int</code> <A HREF="../../../../reference/android/R.anim.html#linear_interpolator" target="_top"><code>linear_interpolator</code></A></nobr>
</TD>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.array.html b/docs/html/sdk/api_diff/4/changes/android.R.array.html
deleted file mode 100644
index 43bd0b1..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.array.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.array
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.array.html" target="_top"><font size="+2"><code>R.array</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.array.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.array.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.attr.html b/docs/html/sdk/api_diff/4/changes/android.R.attr.html
index a4b9adb..a1923f6 100644
--- a/docs/html/sdk/api_diff/4/changes/android.R.attr.html
+++ b/docs/html/sdk/api_diff/4/changes/android.R.attr.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -119,132 +119,6 @@
</TR>
<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
<TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.attr.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
<A NAME="android.R.attr.dropDownHeight"></A>
<nobr><code>int</code> <A HREF="../../../../reference/android/R.attr.html#dropDownHeight" target="_top"><code>dropDownHeight</code></A></nobr>
</TD>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.color.html b/docs/html/sdk/api_diff/4/changes/android.R.color.html
deleted file mode 100644
index 20ce475..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.color.html
+++ /dev/null
@@ -1,332 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.color
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.color.html" target="_top"><font size="+2"><code>R.color</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad19"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad19" target="_top"><code>donut_resource_pad19</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad20"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad20" target="_top"><code>donut_resource_pad20</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad21"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad21" target="_top"><code>donut_resource_pad21</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad22"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad22" target="_top"><code>donut_resource_pad22</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad23"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad23" target="_top"><code>donut_resource_pad23</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad24"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad24" target="_top"><code>donut_resource_pad24</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad25"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad25" target="_top"><code>donut_resource_pad25</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad26"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad26" target="_top"><code>donut_resource_pad26</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad27"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad27" target="_top"><code>donut_resource_pad27</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad28"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad28" target="_top"><code>donut_resource_pad28</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad29"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad29" target="_top"><code>donut_resource_pad29</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad30"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad30" target="_top"><code>donut_resource_pad30</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad31"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad31" target="_top"><code>donut_resource_pad31</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.color.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.color.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.dimen.html b/docs/html/sdk/api_diff/4/changes/android.R.dimen.html
deleted file mode 100644
index d6736d7..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.dimen.html
+++ /dev/null
@@ -1,213 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.dimen
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.dimen.html" target="_top"><font size="+2"><code>R.dimen</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.dimen.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.dimen.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.drawable.html b/docs/html/sdk/api_diff/4/changes/android.R.drawable.html
index 25776a9..9ecf628 100644
--- a/docs/html/sdk/api_diff/4/changes/android.R.drawable.html
+++ b/docs/html/sdk/api_diff/4/changes/android.R.drawable.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -84,286 +84,6 @@
</TH>
<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
<TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad19"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad19" target="_top"><code>donut_resource_pad19</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad20"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad20" target="_top"><code>donut_resource_pad20</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad21"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad21" target="_top"><code>donut_resource_pad21</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad22"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad22" target="_top"><code>donut_resource_pad22</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad23"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad23" target="_top"><code>donut_resource_pad23</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad24"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad24" target="_top"><code>donut_resource_pad24</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad25"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad25" target="_top"><code>donut_resource_pad25</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad26"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad26" target="_top"><code>donut_resource_pad26</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad27"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad27" target="_top"><code>donut_resource_pad27</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad28"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad28" target="_top"><code>donut_resource_pad28</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad29"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad29" target="_top"><code>donut_resource_pad29</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad30"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad30" target="_top"><code>donut_resource_pad30</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad31"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad31" target="_top"><code>donut_resource_pad31</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad32"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad32" target="_top"><code>donut_resource_pad32</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad33"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad33" target="_top"><code>donut_resource_pad33</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad34"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad34" target="_top"><code>donut_resource_pad34</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad35"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad35" target="_top"><code>donut_resource_pad35</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad36"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad36" target="_top"><code>donut_resource_pad36</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad37"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad37" target="_top"><code>donut_resource_pad37</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad38"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad38" target="_top"><code>donut_resource_pad38</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad39"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad39" target="_top"><code>donut_resource_pad39</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad40"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad40" target="_top"><code>donut_resource_pad40</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.drawable.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
<A NAME="android.R.drawable.stat_sys_vp_phone_call"></A>
<nobr><code>int</code> <A HREF="../../../../reference/android/R.drawable.html#stat_sys_vp_phone_call" target="_top"><code>stat_sys_vp_phone_call</code></A></nobr>
</TD>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.id.html b/docs/html/sdk/api_diff/4/changes/android.R.id.html
deleted file mode 100644
index 4fb4894..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.id.html
+++ /dev/null
@@ -1,269 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.id
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.id.html" target="_top"><font size="+2"><code>R.id</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad19"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad19" target="_top"><code>donut_resource_pad19</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad20"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad20" target="_top"><code>donut_resource_pad20</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad21"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad21" target="_top"><code>donut_resource_pad21</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad22"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad22" target="_top"><code>donut_resource_pad22</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.id.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.id.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.integer.html b/docs/html/sdk/api_diff/4/changes/android.R.integer.html
deleted file mode 100644
index 6b9e2c0..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.integer.html
+++ /dev/null
@@ -1,213 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.integer
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.integer.html" target="_top"><font size="+2"><code>R.integer</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.integer.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.integer.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.layout.html b/docs/html/sdk/api_diff/4/changes/android.R.layout.html
deleted file mode 100644
index b8aeabd..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.layout.html
+++ /dev/null
@@ -1,206 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.layout
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.layout.html" target="_top"><font size="+2"><code>R.layout</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.layout.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.layout.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.string.html b/docs/html/sdk/api_diff/4/changes/android.R.string.html
deleted file mode 100644
index 770be4e..0000000
--- a/docs/html/sdk/api_diff/4/changes/android.R.string.html
+++ /dev/null
@@ -1,304 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<HTML style="overflow:auto;">
-<HEAD>
-<meta name="generator" content="JDiff v1.1.0">
-<!-- Generated by the JDiff Javadoc doclet -->
-<!-- (http://www.jdiff.org) -->
-<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
-<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
-<TITLE>
-android.R.string
-</TITLE>
-<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
-<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
-<noscript>
-<style type="text/css">
-body{overflow:auto;}
-#body-content{position:relative; top:0;}
-#doc-content{overflow:visible;border-left:3px solid #666;}
-#side-nav{padding:0;}
-#side-nav .toggle-list ul {display:block;}
-#resize-packages-nav{border-bottom:3px solid #666;}
-</style>
-</noscript>
-<style type="text/css">
-</style>
-</HEAD>
-<BODY>
-<!-- Start of nav bar -->
-<a name="top"></a>
-<div id="header" style="margin-bottom:0;padding-bottom:0;">
-<div id="headerLeft">
-<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
-</div>
- <div id="headerRight">
- <div id="headerLinks">
-<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
-<span class="text">
-<!-- <a href="#">English</a> | -->
-<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
-</span>
-</div>
- <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td colspan="2" class="diffspechead">API Diff Specification</td>
- </tr>
- <tr>
- <td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
- </tr>
- <tr>
- <td class="diffspec">From Level:</td>
- <td class="diffvalueold">3</td>
- </tr>
- <tr>
- <td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
- </tr>
- </table>
- </div><!-- End and-diff-id -->
- <div class="and-diff-id" style="margin-right:8px;">
- <table class="diffspectable">
- <tr>
- <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
- </tr>
- </table>
- </div> <!-- End and-diff-id -->
- </div> <!-- End headerRight -->
- </div> <!-- End header -->
-<div id="body-content" xstyle="padding:12px;padding-right:18px;">
-<div id="doc-content" style="position:relative;">
-<div id="mainBodyFluid">
-<H2>
-Class android.<A HREF="../../../../reference/android/R.string.html" target="_top"><font size="+2"><code>R.string</code></font></A>
-</H2>
-<a NAME="constructors"></a>
-<a NAME="methods"></a>
-<a NAME="fields"></a>
-<p>
-<a NAME="Added"></a>
-<TABLE summary="Added Fields" WIDTH="100%">
-<TR>
- <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
-</TH>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad19"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad19" target="_top"><code>donut_resource_pad19</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad20"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad20" target="_top"><code>donut_resource_pad20</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad21"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad21" target="_top"><code>donut_resource_pad21</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad22"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad22" target="_top"><code>donut_resource_pad22</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad23"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad23" target="_top"><code>donut_resource_pad23</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad24"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad24" target="_top"><code>donut_resource_pad24</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad25"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad25" target="_top"><code>donut_resource_pad25</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad26"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad26" target="_top"><code>donut_resource_pad26</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad27"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad27" target="_top"><code>donut_resource_pad27</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.string.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.string.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-</TABLE>
-
- </div>
- <div id="footer">
- <div id="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="/license.html">Content License</a>.
- </div>
- <div id="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.android.com/branding.html">Brand Guidelines</a>
- </p>
- </div>
- </div> <!-- end footer -->
- </div><!-- end doc-content -->
- </div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
-<script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-5831155-1");
- pageTracker._setAllowAnchor(true);
- pageTracker._initData();
- pageTracker._trackPageview();
- } catch(e) {}
-</script>
-</BODY>
-</HTML>
diff --git a/docs/html/sdk/api_diff/4/changes/android.R.style.html b/docs/html/sdk/api_diff/4/changes/android.R.style.html
index 5dbe9a1..6755e3d 100644
--- a/docs/html/sdk/api_diff/4/changes/android.R.style.html
+++ b/docs/html/sdk/api_diff/4/changes/android.R.style.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -103,139 +103,6 @@
</TD>
<TD> </TD>
</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad1"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad1" target="_top"><code>donut_resource_pad1</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad10"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad10" target="_top"><code>donut_resource_pad10</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad11"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad11" target="_top"><code>donut_resource_pad11</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad12"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad12" target="_top"><code>donut_resource_pad12</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad13"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad13" target="_top"><code>donut_resource_pad13</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad14"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad14" target="_top"><code>donut_resource_pad14</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad15"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad15" target="_top"><code>donut_resource_pad15</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad16"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad16" target="_top"><code>donut_resource_pad16</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad17"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad17" target="_top"><code>donut_resource_pad17</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad18"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad18" target="_top"><code>donut_resource_pad18</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad19"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad19" target="_top"><code>donut_resource_pad19</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad2"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad2" target="_top"><code>donut_resource_pad2</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad3"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad3" target="_top"><code>donut_resource_pad3</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad4"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad4" target="_top"><code>donut_resource_pad4</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad5"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad5" target="_top"><code>donut_resource_pad5</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad6"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad6" target="_top"><code>donut_resource_pad6</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad7"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad7" target="_top"><code>donut_resource_pad7</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad8"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad8" target="_top"><code>donut_resource_pad8</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="android.R.style.donut_resource_pad9"></A>
- <nobr><code>int</code> <A HREF="../../../../reference/android/R.style.html#donut_resource_pad9" target="_top"><code>donut_resource_pad9</code></A></nobr>
- </TD>
- <TD> </TD>
-</TR>
</TABLE>
</div>
diff --git a/docs/html/sdk/api_diff/4/changes/android.app.Activity.html b/docs/html/sdk/api_diff/4/changes/android.app.Activity.html
index 633252d..6950355 100644
--- a/docs/html/sdk/api_diff/4/changes/android.app.Activity.html
+++ b/docs/html/sdk/api_diff/4/changes/android.app.Activity.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.app.Dialog.html b/docs/html/sdk/api_diff/4/changes/android.app.Dialog.html
index df5a13c..a6ec387 100644
--- a/docs/html/sdk/api_diff/4/changes/android.app.Dialog.html
+++ b/docs/html/sdk/api_diff/4/changes/android.app.Dialog.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.ListItem.html b/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.ListItem.html
index f837ae5..83070a1 100644
--- a/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.ListItem.html
+++ b/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.ListItem.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.html b/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.html
index 2a21f3b..ebfd0ae 100644
--- a/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.html
+++ b/docs/html/sdk/api_diff/4/changes/android.app.LauncherActivity.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.app.PendingIntent.html b/docs/html/sdk/api_diff/4/changes/android.app.PendingIntent.html
index 032671b..221ce64 100644
--- a/docs/html/sdk/api_diff/4/changes/android.app.PendingIntent.html
+++ b/docs/html/sdk/api_diff/4/changes/android.app.PendingIntent.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.app.SearchManager.html b/docs/html/sdk/api_diff/4/changes/android.app.SearchManager.html
index 7cde296..99df03e 100644
--- a/docs/html/sdk/api_diff/4/changes/android.app.SearchManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.app.SearchManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.ComponentName.html b/docs/html/sdk/api_diff/4/changes/android.content.ComponentName.html
index 09b3892..6451a5b 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.ComponentName.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.ComponentName.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.ContentProvider.html b/docs/html/sdk/api_diff/4/changes/android.content.ContentProvider.html
index 387574c..baeb713 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.ContentProvider.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.ContentProvider.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.Context.html b/docs/html/sdk/api_diff/4/changes/android.content.Context.html
index 08ad9ad..0d90202 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.Context.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.Context.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.ContextWrapper.html b/docs/html/sdk/api_diff/4/changes/android.content.ContextWrapper.html
index 6f67f68..b39cd46 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.ContextWrapper.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.ContextWrapper.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.Intent.html b/docs/html/sdk/api_diff/4/changes/android.content.Intent.html
index 69995d6..7274c55 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.Intent.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.Intent.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.pm.ActivityInfo.html b/docs/html/sdk/api_diff/4/changes/android.content.pm.ActivityInfo.html
index 369dd3f..ffdccb8 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.pm.ActivityInfo.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.pm.ActivityInfo.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.pm.ApplicationInfo.html b/docs/html/sdk/api_diff/4/changes/android.content.pm.ApplicationInfo.html
index e218e8f..20f9b6b 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.pm.ApplicationInfo.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.pm.ApplicationInfo.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.pm.ConfigurationInfo.html b/docs/html/sdk/api_diff/4/changes/android.content.pm.ConfigurationInfo.html
index b44626b..600a08f 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.pm.ConfigurationInfo.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.pm.ConfigurationInfo.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.pm.PackageManager.html b/docs/html/sdk/api_diff/4/changes/android.content.pm.PackageManager.html
index 8667611..921ba9f 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.pm.PackageManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.pm.PackageManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.pm.ProviderInfo.html b/docs/html/sdk/api_diff/4/changes/android.content.pm.ProviderInfo.html
index 059c7e0..911419b 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.pm.ProviderInfo.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.pm.ProviderInfo.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.content.res.Configuration.html b/docs/html/sdk/api_diff/4/changes/android.content.res.Configuration.html
index 947243f..cc3f967 100644
--- a/docs/html/sdk/api_diff/4/changes/android.content.res.Configuration.html
+++ b/docs/html/sdk/api_diff/4/changes/android.content.res.Configuration.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.Bitmap.html b/docs/html/sdk/api_diff/4/changes/android.graphics.Bitmap.html
index df2e105..6e99e84 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.Bitmap.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.Bitmap.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.Options.html b/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.Options.html
index bc8cc7c..6c812d0 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.Options.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.Options.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.html b/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.html
index 8549752..d730e09 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.BitmapFactory.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.Canvas.html b/docs/html/sdk/api_diff/4/changes/android.graphics.Canvas.html
index 49128fa..48ed8b6 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.Canvas.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.Canvas.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.NinePatch.html b/docs/html/sdk/api_diff/4/changes/android.graphics.NinePatch.html
index 1a3f94a..0d78eb0 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.NinePatch.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.NinePatch.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.Typeface.html b/docs/html/sdk/api_diff/4/changes/android.graphics.Typeface.html
index 6739f05..e6d27d4 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.Typeface.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.Typeface.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.AnimationDrawable.html b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.AnimationDrawable.html
index c5c7670..d72281a 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.AnimationDrawable.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.AnimationDrawable.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.BitmapDrawable.html b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.BitmapDrawable.html
index 8dea688..4971712 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.BitmapDrawable.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.BitmapDrawable.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.Drawable.html b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.Drawable.html
index 7e52fc6..e1dc283 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.Drawable.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.Drawable.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.NinePatchDrawable.html b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.NinePatchDrawable.html
index 49245f1..5eafab0 100644
--- a/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.NinePatchDrawable.html
+++ b/docs/html/sdk/api_diff/4/changes/android.graphics.drawable.NinePatchDrawable.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.hardware.SensorManager.html b/docs/html/sdk/api_diff/4/changes/android.hardware.SensorManager.html
index 55ebacf..87b1f34 100644
--- a/docs/html/sdk/api_diff/4/changes/android.hardware.SensorManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.hardware.SensorManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.inputmethodservice.KeyboardView.html b/docs/html/sdk/api_diff/4/changes/android.inputmethodservice.KeyboardView.html
index 6e927b8..bec08b0 100644
--- a/docs/html/sdk/api_diff/4/changes/android.inputmethodservice.KeyboardView.html
+++ b/docs/html/sdk/api_diff/4/changes/android.inputmethodservice.KeyboardView.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.location.Address.html b/docs/html/sdk/api_diff/4/changes/android.location.Address.html
index b32f4f3..0aeec49 100644
--- a/docs/html/sdk/api_diff/4/changes/android.location.Address.html
+++ b/docs/html/sdk/api_diff/4/changes/android.location.Address.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.media.AudioManager.html b/docs/html/sdk/api_diff/4/changes/android.media.AudioManager.html
index 1ac2b9c..8d1224c 100644
--- a/docs/html/sdk/api_diff/4/changes/android.media.AudioManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.media.AudioManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.AudioSource.html b/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.AudioSource.html
index b371e46..9321b59 100644
--- a/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.AudioSource.html
+++ b/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.AudioSource.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.html b/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.html
index 8f7aa00..c161466 100644
--- a/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.html
+++ b/docs/html/sdk/api_diff/4/changes/android.media.MediaRecorder.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.media.ToneGenerator.html b/docs/html/sdk/api_diff/4/changes/android.media.ToneGenerator.html
index c1e1bb8..a8d5580 100644
--- a/docs/html/sdk/api_diff/4/changes/android.media.ToneGenerator.html
+++ b/docs/html/sdk/api_diff/4/changes/android.media.ToneGenerator.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.net.wifi.WifiManager.html b/docs/html/sdk/api_diff/4/changes/android.net.wifi.WifiManager.html
index f1fcaad..2e4f339 100644
--- a/docs/html/sdk/api_diff/4/changes/android.net.wifi.WifiManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.net.wifi.WifiManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.os.Build.VERSION.html b/docs/html/sdk/api_diff/4/changes/android.os.Build.VERSION.html
index 941c554..178adbb 100644
--- a/docs/html/sdk/api_diff/4/changes/android.os.Build.VERSION.html
+++ b/docs/html/sdk/api_diff/4/changes/android.os.Build.VERSION.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.os.Build.html b/docs/html/sdk/api_diff/4/changes/android.os.Build.html
index 075819a..89fcb48 100644
--- a/docs/html/sdk/api_diff/4/changes/android.os.Build.html
+++ b/docs/html/sdk/api_diff/4/changes/android.os.Build.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.os.RemoteCallbackList.html b/docs/html/sdk/api_diff/4/changes/android.os.RemoteCallbackList.html
index de379ea..19918aa 100644
--- a/docs/html/sdk/api_diff/4/changes/android.os.RemoteCallbackList.html
+++ b/docs/html/sdk/api_diff/4/changes/android.os.RemoteCallbackList.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Genres.Members.html b/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Genres.Members.html
index af0b161..a5d47d6 100644
--- a/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Genres.Members.html
+++ b/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Genres.Members.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Media.html b/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Media.html
index aa07442..ab8f2062 100644
--- a/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Media.html
+++ b/docs/html/sdk/api_diff/4/changes/android.provider.MediaStore.Audio.Media.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.provider.Settings.Secure.html b/docs/html/sdk/api_diff/4/changes/android.provider.Settings.Secure.html
index be600e4..f349488 100644
--- a/docs/html/sdk/api_diff/4/changes/android.provider.Settings.Secure.html
+++ b/docs/html/sdk/api_diff/4/changes/android.provider.Settings.Secure.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.provider.Settings.System.html b/docs/html/sdk/api_diff/4/changes/android.provider.Settings.System.html
index d979133..4730602 100644
--- a/docs/html/sdk/api_diff/4/changes/android.provider.Settings.System.html
+++ b/docs/html/sdk/api_diff/4/changes/android.provider.Settings.System.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsManager.html b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsManager.html
index 35d07a4..555ec8c 100644
--- a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.MessageClass.html b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.MessageClass.html
index c848939..e60aada 100644
--- a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.MessageClass.html
+++ b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.MessageClass.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.SubmitPdu.html b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.SubmitPdu.html
index af36496..03d5b6a 100644
--- a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.SubmitPdu.html
+++ b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.SubmitPdu.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.html b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.html
index e480955..e9f749e 100644
--- a/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.html
+++ b/docs/html/sdk/api_diff/4/changes/android.telephony.gsm.SmsMessage.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.test.AndroidTestCase.html b/docs/html/sdk/api_diff/4/changes/android.test.AndroidTestCase.html
index 8e772ab..b816a07 100644
--- a/docs/html/sdk/api_diff/4/changes/android.test.AndroidTestCase.html
+++ b/docs/html/sdk/api_diff/4/changes/android.test.AndroidTestCase.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.test.mock.MockContext.html b/docs/html/sdk/api_diff/4/changes/android.test.mock.MockContext.html
index 317556a..fdc83cd 100644
--- a/docs/html/sdk/api_diff/4/changes/android.test.mock.MockContext.html
+++ b/docs/html/sdk/api_diff/4/changes/android.test.mock.MockContext.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.test.mock.MockPackageManager.html b/docs/html/sdk/api_diff/4/changes/android.test.mock.MockPackageManager.html
index 939b9e8..2e4fc37 100644
--- a/docs/html/sdk/api_diff/4/changes/android.test.mock.MockPackageManager.html
+++ b/docs/html/sdk/api_diff/4/changes/android.test.mock.MockPackageManager.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.text.style.ImageSpan.html b/docs/html/sdk/api_diff/4/changes/android.text.style.ImageSpan.html
index 729d9ef..b4eb161 100644
--- a/docs/html/sdk/api_diff/4/changes/android.text.style.ImageSpan.html
+++ b/docs/html/sdk/api_diff/4/changes/android.text.style.ImageSpan.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.util.Config.html b/docs/html/sdk/api_diff/4/changes/android.util.Config.html
index e5d67d9..d6d303e 100644
--- a/docs/html/sdk/api_diff/4/changes/android.util.Config.html
+++ b/docs/html/sdk/api_diff/4/changes/android.util.Config.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.util.DisplayMetrics.html b/docs/html/sdk/api_diff/4/changes/android.util.DisplayMetrics.html
index 4ab0b38..d1a482a 100644
--- a/docs/html/sdk/api_diff/4/changes/android.util.DisplayMetrics.html
+++ b/docs/html/sdk/api_diff/4/changes/android.util.DisplayMetrics.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.util.TypedValue.html b/docs/html/sdk/api_diff/4/changes/android.util.TypedValue.html
index fd15172..bb74b65 100644
--- a/docs/html/sdk/api_diff/4/changes/android.util.TypedValue.html
+++ b/docs/html/sdk/api_diff/4/changes/android.util.TypedValue.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.view.Surface.html b/docs/html/sdk/api_diff/4/changes/android.view.Surface.html
index 7231913..a323bee 100644
--- a/docs/html/sdk/api_diff/4/changes/android.view.Surface.html
+++ b/docs/html/sdk/api_diff/4/changes/android.view.Surface.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.view.VelocityTracker.html b/docs/html/sdk/api_diff/4/changes/android.view.VelocityTracker.html
index 208ee0d..4d96667 100644
--- a/docs/html/sdk/api_diff/4/changes/android.view.VelocityTracker.html
+++ b/docs/html/sdk/api_diff/4/changes/android.view.VelocityTracker.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.view.View.html b/docs/html/sdk/api_diff/4/changes/android.view.View.html
index 1696e1c..45d735b 100644
--- a/docs/html/sdk/api_diff/4/changes/android.view.View.html
+++ b/docs/html/sdk/api_diff/4/changes/android.view.View.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.view.ViewConfiguration.html b/docs/html/sdk/api_diff/4/changes/android.view.ViewConfiguration.html
index 30a66ab..aa8d02a 100644
--- a/docs/html/sdk/api_diff/4/changes/android.view.ViewConfiguration.html
+++ b/docs/html/sdk/api_diff/4/changes/android.view.ViewConfiguration.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.view.Window.Callback.html b/docs/html/sdk/api_diff/4/changes/android.view.Window.Callback.html
index 61626bd..de1d354 100644
--- a/docs/html/sdk/api_diff/4/changes/android.view.Window.Callback.html
+++ b/docs/html/sdk/api_diff/4/changes/android.view.Window.Callback.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.widget.AutoCompleteTextView.html b/docs/html/sdk/api_diff/4/changes/android.widget.AutoCompleteTextView.html
index 2ad8c43..bad2b22 100644
--- a/docs/html/sdk/api_diff/4/changes/android.widget.AutoCompleteTextView.html
+++ b/docs/html/sdk/api_diff/4/changes/android.widget.AutoCompleteTextView.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.widget.CheckedTextView.html b/docs/html/sdk/api_diff/4/changes/android.widget.CheckedTextView.html
index 91675dc8..79e40a8 100644
--- a/docs/html/sdk/api_diff/4/changes/android.widget.CheckedTextView.html
+++ b/docs/html/sdk/api_diff/4/changes/android.widget.CheckedTextView.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.widget.ListView.html b/docs/html/sdk/api_diff/4/changes/android.widget.ListView.html
index 37680eb..487c69b 100644
--- a/docs/html/sdk/api_diff/4/changes/android.widget.ListView.html
+++ b/docs/html/sdk/api_diff/4/changes/android.widget.ListView.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.widget.PopupWindow.html b/docs/html/sdk/api_diff/4/changes/android.widget.PopupWindow.html
index e97e296d..6ce83af 100644
--- a/docs/html/sdk/api_diff/4/changes/android.widget.PopupWindow.html
+++ b/docs/html/sdk/api_diff/4/changes/android.widget.PopupWindow.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.widget.TabHost.TabSpec.html b/docs/html/sdk/api_diff/4/changes/android.widget.TabHost.TabSpec.html
index 639b466..8940867 100644
--- a/docs/html/sdk/api_diff/4/changes/android.widget.TabHost.TabSpec.html
+++ b/docs/html/sdk/api_diff/4/changes/android.widget.TabHost.TabSpec.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/android.widget.TabWidget.html b/docs/html/sdk/api_diff/4/changes/android.widget.TabWidget.html
index beb4056..17b2a5e 100644
--- a/docs/html/sdk/api_diff/4/changes/android.widget.TabWidget.html
+++ b/docs/html/sdk/api_diff/4/changes/android.widget.TabWidget.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/changes-summary.html b/docs/html/sdk/api_diff/4/changes/changes-summary.html
index d4b794c..a4850a5 100644
--- a/docs/html/sdk/api_diff/4/changes/changes-summary.html
+++ b/docs/html/sdk/api_diff/4/changes/changes-summary.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/classes_index_additions.html b/docs/html/sdk/api_diff/4/changes/classes_index_additions.html
index 8100cfc..d59f666 100644
--- a/docs/html/sdk/api_diff/4/changes/classes_index_additions.html
+++ b/docs/html/sdk/api_diff/4/changes/classes_index_additions.html
@@ -57,6 +57,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.graphics.drawable.html#Animatable" class="hiddenlink" target="rightframe"><b><i>Animatable</i></b></A><br>
@@ -72,6 +73,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.view.animation.html#BounceInterpolator" class="hiddenlink" target="rightframe"><b>BounceInterpolator</b></A><br>
@@ -86,6 +88,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.opengl.html#GLES10" class="hiddenlink" target="rightframe"><b>GLES10</b></A><br>
@@ -102,6 +105,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.content.html#IntentSender" class="hiddenlink" target="rightframe"><b>IntentSender</b></A><br>
@@ -117,6 +121,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.view.animation.html#OvershootInterpolator" class="hiddenlink" target="rightframe"><b>OvershootInterpolator</b></A><br>
@@ -130,6 +135,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.content.pm.html#PathPermission" class="hiddenlink" target="rightframe"><b>PathPermission</b></A><br>
@@ -143,6 +149,7 @@
<a href="#P"><font size="-2">P</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.telephony.html#SmsManager" class="hiddenlink" target="rightframe"><b>SmsManager</b></A><br>
@@ -159,6 +166,7 @@
<a href="#P"><font size="-2">P</font></a>
<a href="#S"><font size="-2">S</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.view.html#ViewDebug.FlagToString" class="hiddenlink" target="rightframe"><b>ViewDebug.FlagToString</b></A><br>
@@ -172,9 +180,25 @@
<a href="#P"><font size="-2">P</font></a>
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.net.wifi.html#WifiManager.MulticastLock" class="hiddenlink" target="rightframe"><b>WifiManager.MulticastLock</b></A><br>
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#W"><font size="-2">W</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.widget.html#ZoomButtonsController" class="hiddenlink" target="rightframe"><b>ZoomButtonsController</b></A><br>
+<A HREF="pkg_android.widget.html#ZoomButtonsController.OnZoomListener" class="hiddenlink" target="rightframe"><b><i>ZoomButtonsController.OnZoomListener</i></b></A><br>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
diff --git a/docs/html/sdk/api_diff/4/changes/classes_index_all.html b/docs/html/sdk/api_diff/4/changes/classes_index_all.html
index 667a433..4af2716 100644
--- a/docs/html/sdk/api_diff/4/changes/classes_index_all.html
+++ b/docs/html/sdk/api_diff/4/changes/classes_index_all.html
@@ -65,6 +65,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.app.Activity.html" class="hiddenlink" target="rightframe">Activity</A><br>
@@ -96,6 +97,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.graphics.Bitmap.html" class="hiddenlink" target="rightframe">Bitmap</A><br>
@@ -124,6 +126,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.graphics.Canvas.html" class="hiddenlink" target="rightframe">Canvas</A><br>
@@ -153,6 +156,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="java.util.Date.html" class="hiddenlink" target="rightframe">Date</A><br>
@@ -177,6 +181,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.opengl.html#GLES10" class="hiddenlink" target="rightframe"><b>GLES10</b></A><br>
@@ -201,6 +206,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.text.style.ImageSpan.html" class="hiddenlink" target="rightframe">ImageSpan</A><br>
@@ -228,6 +234,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.inputmethodservice.KeyboardView.html" class="hiddenlink" target="rightframe">KeyboardView</A><br>
@@ -249,6 +256,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.app.LauncherActivity.html" class="hiddenlink" target="rightframe">LauncherActivity</A><br>
@@ -272,6 +280,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br>
@@ -300,6 +309,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.graphics.NinePatch.html" class="hiddenlink" target="rightframe">NinePatch</A><br>
@@ -322,6 +332,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.view.animation.html#OvershootInterpolator" class="hiddenlink" target="rightframe"><b>OvershootInterpolator</b></A><br>
@@ -343,6 +354,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.content.pm.PackageManager.html" class="hiddenlink" target="rightframe">PackageManager</A><br>
@@ -368,18 +380,12 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.R.anim.html" class="hiddenlink" target="rightframe">R.anim</A><br>
-<A HREF="android.R.array.html" class="hiddenlink" target="rightframe">R.array</A><br>
<A HREF="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
-<A HREF="android.R.color.html" class="hiddenlink" target="rightframe">R.color</A><br>
-<A HREF="android.R.dimen.html" class="hiddenlink" target="rightframe">R.dimen</A><br>
<A HREF="android.R.drawable.html" class="hiddenlink" target="rightframe">R.drawable</A><br>
-<A HREF="android.R.id.html" class="hiddenlink" target="rightframe">R.id</A><br>
-<A HREF="android.R.integer.html" class="hiddenlink" target="rightframe">R.integer</A><br>
-<A HREF="android.R.layout.html" class="hiddenlink" target="rightframe">R.layout</A><br>
-<A HREF="android.R.string.html" class="hiddenlink" target="rightframe">R.string</A><br>
<A HREF="android.R.style.html" class="hiddenlink" target="rightframe">R.style</A><br>
<A HREF="android.os.RemoteCallbackList.html" class="hiddenlink" target="rightframe">RemoteCallbackList</A><br>
<A NAME="S"></A>
@@ -400,6 +406,7 @@
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.app.SearchManager.html" class="hiddenlink" target="rightframe">SearchManager</A><br>
@@ -439,6 +446,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#V"><font size="-2">V</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.widget.TabHost.TabSpec.html" class="hiddenlink" target="rightframe">TabHost.TabSpec</A><br>
@@ -464,6 +472,7 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#T"><font size="-2">T</font></a>
<a href="#W"><font size="-2">W</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.view.VelocityTracker.html" class="hiddenlink" target="rightframe">VelocityTracker</A><br>
@@ -488,11 +497,35 @@
<a href="#S"><font size="-2">S</font></a>
<a href="#T"><font size="-2">T</font></a>
<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.net.wifi.WifiManager.html" class="hiddenlink" target="rightframe">WifiManager</A><br>
<A HREF="pkg_android.net.wifi.html#WifiManager.MulticastLock" class="hiddenlink" target="rightframe"><b>WifiManager.MulticastLock</b></A><br>
<A HREF="android.view.Window.Callback.html" class="hiddenlink" target="rightframe"><i>Window.Callback</i></A><br>
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>
+<a href="#A"><font size="-2">A</font></a>
+<a href="#B"><font size="-2">B</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#D"><font size="-2">D</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#K"><font size="-2">K</font></a>
+<a href="#L"><font size="-2">L</font></a>
+<a href="#M"><font size="-2">M</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#W"><font size="-2">W</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="pkg_android.widget.html#ZoomButtonsController" class="hiddenlink" target="rightframe"><b>ZoomButtonsController</b></A><br>
+<A HREF="pkg_android.widget.html#ZoomButtonsController.OnZoomListener" class="hiddenlink" target="rightframe"><b><i>ZoomButtonsController.OnZoomListener</i></b></A><br>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
diff --git a/docs/html/sdk/api_diff/4/changes/classes_index_changes.html b/docs/html/sdk/api_diff/4/changes/classes_index_changes.html
index 246e64b..193e21c 100644
--- a/docs/html/sdk/api_diff/4/changes/classes_index_changes.html
+++ b/docs/html/sdk/api_diff/4/changes/classes_index_changes.html
@@ -293,15 +293,8 @@
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.R.anim.html" class="hiddenlink" target="rightframe">R.anim</A><br>
-<A HREF="android.R.array.html" class="hiddenlink" target="rightframe">R.array</A><br>
<A HREF="android.R.attr.html" class="hiddenlink" target="rightframe">R.attr</A><br>
-<A HREF="android.R.color.html" class="hiddenlink" target="rightframe">R.color</A><br>
-<A HREF="android.R.dimen.html" class="hiddenlink" target="rightframe">R.dimen</A><br>
<A HREF="android.R.drawable.html" class="hiddenlink" target="rightframe">R.drawable</A><br>
-<A HREF="android.R.id.html" class="hiddenlink" target="rightframe">R.id</A><br>
-<A HREF="android.R.integer.html" class="hiddenlink" target="rightframe">R.integer</A><br>
-<A HREF="android.R.layout.html" class="hiddenlink" target="rightframe">R.layout</A><br>
-<A HREF="android.R.string.html" class="hiddenlink" target="rightframe">R.string</A><br>
<A HREF="android.R.style.html" class="hiddenlink" target="rightframe">R.style</A><br>
<A HREF="android.os.RemoteCallbackList.html" class="hiddenlink" target="rightframe">RemoteCallbackList</A><br>
<A NAME="S"></A>
diff --git a/docs/html/sdk/api_diff/4/changes/fields_index_additions.html b/docs/html/sdk/api_diff/4/changes/fields_index_additions.html
index 6a500b4..8ab19ba 100644
--- a/docs/html/sdk/api_diff/4/changes/fields_index_additions.html
+++ b/docs/html/sdk/api_diff/4/changes/fields_index_additions.html
@@ -205,721 +205,6 @@
</nobr><br>
<nobr><A HREF="android.util.DisplayMetrics.html#android.util.DisplayMetrics.densityDpi" class="hiddenlink" target="rightframe">densityDpi</A>
</nobr><br>
-<i>donut_resource_pad1</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad10</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad11</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad12</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad13</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad14</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad15</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad16</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad17</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad18</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad19</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad2</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad20</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad21</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad22</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad23</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad24</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad25</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad26</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad27</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad28</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<i>donut_resource_pad29</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<i>donut_resource_pad3</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad30</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<i>donut_resource_pad31</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad32" class="hiddenlink" target="rightframe">donut_resource_pad32</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad33" class="hiddenlink" target="rightframe">donut_resource_pad33</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad34" class="hiddenlink" target="rightframe">donut_resource_pad34</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad35" class="hiddenlink" target="rightframe">donut_resource_pad35</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad36" class="hiddenlink" target="rightframe">donut_resource_pad36</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad37" class="hiddenlink" target="rightframe">donut_resource_pad37</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad38" class="hiddenlink" target="rightframe">donut_resource_pad38</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad39" class="hiddenlink" target="rightframe">donut_resource_pad39</A>
-</nobr><br>
-<i>donut_resource_pad4</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad40" class="hiddenlink" target="rightframe">donut_resource_pad40</A>
-</nobr><br>
-<i>donut_resource_pad5</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad6</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad7</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad8</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad9</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
<nobr><A HREF="android.R.attr.html#android.R.attr.dropDownHeight" class="hiddenlink" target="rightframe">dropDownHeight</A>
</nobr><br>
<A NAME="E"></A>
diff --git a/docs/html/sdk/api_diff/4/changes/fields_index_all.html b/docs/html/sdk/api_diff/4/changes/fields_index_all.html
index db76778..3d155b7 100644
--- a/docs/html/sdk/api_diff/4/changes/fields_index_all.html
+++ b/docs/html/sdk/api_diff/4/changes/fields_index_all.html
@@ -214,721 +214,6 @@
</nobr><br>
<nobr><A HREF="android.util.DisplayMetrics.html#android.util.DisplayMetrics.densityDpi" class="hiddenlink" target="rightframe">densityDpi</A>
</nobr><br>
-<i>donut_resource_pad1</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad1" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad10</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad10" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad11</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad11" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad12</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad12" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad13</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad13" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad14</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad14" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad15</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad15" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad16</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad16" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad17</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad17" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad18</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad18" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad19</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad19" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad2</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad2" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad20</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad20" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad21</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad21" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad22</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad22" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad23</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad23" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad24</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad24" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad25</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad25" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad26</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad26" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad27</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad27" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
-<i>donut_resource_pad28</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad28" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<i>donut_resource_pad29</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad29" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<i>donut_resource_pad3</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad3" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad30</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad30" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<i>donut_resource_pad31</i><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad31" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad32" class="hiddenlink" target="rightframe">donut_resource_pad32</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad33" class="hiddenlink" target="rightframe">donut_resource_pad33</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad34" class="hiddenlink" target="rightframe">donut_resource_pad34</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad35" class="hiddenlink" target="rightframe">donut_resource_pad35</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad36" class="hiddenlink" target="rightframe">donut_resource_pad36</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad37" class="hiddenlink" target="rightframe">donut_resource_pad37</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad38" class="hiddenlink" target="rightframe">donut_resource_pad38</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad39" class="hiddenlink" target="rightframe">donut_resource_pad39</A>
-</nobr><br>
-<i>donut_resource_pad4</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad4" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad40" class="hiddenlink" target="rightframe">donut_resource_pad40</A>
-</nobr><br>
-<i>donut_resource_pad5</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad5" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad6</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad6" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad7</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad7" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad8</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad8" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
-<i>donut_resource_pad9</i><br>
- in
-<nobr><A HREF="android.R.anim.html#android.R.anim.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.anim</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.array.html#android.R.array.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.array</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.attr.html#android.R.attr.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.attr</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.color.html#android.R.color.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.color</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.dimen.html#android.R.dimen.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.dimen</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.drawable.html#android.R.drawable.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.drawable</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.id.html#android.R.id.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.id</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.integer.html#android.R.integer.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.integer</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.layout.html#android.R.layout.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.layout</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.string.html#android.R.string.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.string</A>
-</nobr><br>
- in
-<nobr><A HREF="android.R.style.html#android.R.style.donut_resource_pad9" class="hiddenlink" target="rightframe">android.R.style</A>
-</nobr><br>
<nobr><A HREF="android.R.attr.html#android.R.attr.dropDownHeight" class="hiddenlink" target="rightframe">dropDownHeight</A>
</nobr><br>
<A NAME="E"></A>
diff --git a/docs/html/sdk/api_diff/4/changes/java.lang.String.html b/docs/html/sdk/api_diff/4/changes/java.lang.String.html
index 1e19474..61a6945 100644
--- a/docs/html/sdk/api_diff/4/changes/java.lang.String.html
+++ b/docs/html/sdk/api_diff/4/changes/java.lang.String.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/java.net.Socket.html b/docs/html/sdk/api_diff/4/changes/java.net.Socket.html
index 0d1cf76..bbeeab9 100644
--- a/docs/html/sdk/api_diff/4/changes/java.net.Socket.html
+++ b/docs/html/sdk/api_diff/4/changes/java.net.Socket.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/java.util.Date.html b/docs/html/sdk/api_diff/4/changes/java.util.Date.html
index 69caada..13acc8d 100644
--- a/docs/html/sdk/api_diff/4/changes/java.util.Date.html
+++ b/docs/html/sdk/api_diff/4/changes/java.util.Date.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/jdiff_help.html b/docs/html/sdk/api_diff/4/changes/jdiff_help.html
index b414f62..f4b9968 100644
--- a/docs/html/sdk/api_diff/4/changes/jdiff_help.html
+++ b/docs/html/sdk/api_diff/4/changes/jdiff_help.html
@@ -31,7 +31,7 @@
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<TABLE summary="Navigation bar" BORDER="0" CELLPADDING="0" CELLSPACING="3">
<TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../reference/index.html" target="_top"><FONT CLASS="NavBarFont1"><B><code>Donut</code></B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../reference/index.html" target="_top"><FONT CLASS="NavBarFont1"><B><code>4</code></B></FONT></A> </TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="changes-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT> </TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
diff --git a/docs/html/sdk/api_diff/4/changes/jdiff_statistics.html b/docs/html/sdk/api_diff/4/changes/jdiff_statistics.html
index 3fafb7a..3244a17 100644
--- a/docs/html/sdk/api_diff/4/changes/jdiff_statistics.html
+++ b/docs/html/sdk/api_diff/4/changes/jdiff_statistics.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Version:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Version:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -105,10 +105,6 @@
<TD><A HREF="pkg_android.telephony.html">android.telephony</A></TD>
</TR>
<TR>
- <TD ALIGN="center">21</TD>
- <TD><A HREF="pkg_android.html">android</A></TD>
-</TR>
-<TR>
<TD ALIGN="center">16</TD>
<TD><A HREF="pkg_android.opengl.html">android.opengl</A></TD>
</TR>
@@ -146,6 +142,14 @@
</TR>
<TR>
<TD ALIGN="center">1</TD>
+ <TD><A HREF="pkg_android.html">android</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="pkg_android.widget.html">android.widget</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
<TD><A HREF="pkg_android.app.html">android.app</A></TD>
</TR>
<TR>
@@ -178,10 +182,6 @@
</TR>
<TR>
<TD ALIGN="center"><1</TD>
- <TD><A HREF="pkg_android.widget.html">android.widget</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center"><1</TD>
<TD><A HREF="pkg_android.provider.html">android.provider</A></TD>
</TR>
<TR>
@@ -214,32 +214,12 @@
<TH><b>Class or <i>Interface</i></b></TH>
</TR>
<TR>
- <TD ALIGN="center">63</TD>
- <TD><A HREF="android.R.dimen.html">
-android.R.dimen</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">63</TD>
- <TD><A HREF="android.R.integer.html">
-android.R.integer</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">61</TD>
- <TD><A HREF="android.R.anim.html">
-android.R.anim</A></TD>
-</TR>
-<TR>
<TD ALIGN="center">55</TD>
<TD><A HREF="android.telephony.gsm.SmsMessage.html">
android.telephony.gsm.SmsMessage</A></TD>
</TR>
<TR>
<TD ALIGN="center">50</TD>
- <TD><A HREF="android.R.array.html">
-android.R.array</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">50</TD>
<TD><A HREF="android.media.ToneGenerator.html">
android.media.ToneGenerator</A></TD>
</TR>
@@ -259,21 +239,11 @@
android.graphics.drawable.NinePatchDrawable</A></TD>
</TR>
<TR>
- <TD ALIGN="center">44</TD>
- <TD><A HREF="android.R.color.html">
-android.R.color</A></TD>
-</TR>
-<TR>
<TD ALIGN="center">42</TD>
<TD><A HREF="android.media.MediaRecorder.AudioSource.html">
android.media.MediaRecorder.AudioSource</A></TD>
</TR>
<TR>
- <TD ALIGN="center">36</TD>
- <TD><A HREF="android.R.string.html">
-android.R.string</A></TD>
-</TR>
-<TR>
<TD ALIGN="center">33</TD>
<TD><A HREF="android.util.Config.html">
android.util.Config</A></TD>
@@ -290,8 +260,8 @@
</TR>
<TR>
<TD ALIGN="center">23</TD>
- <TD><A HREF="android.R.layout.html">
-android.R.layout</A></TD>
+ <TD><A HREF="android.R.anim.html">
+android.R.anim</A></TD>
</TR>
<TR>
<TD ALIGN="center">23</TD>
@@ -325,11 +295,6 @@
</TR>
<TR>
<TD ALIGN="center">20</TD>
- <TD><A HREF="android.R.id.html">
-android.R.id</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">20</TD>
<TD><A HREF="android.test.AndroidTestCase.html">
android.test.AndroidTestCase</A></TD>
</TR>
@@ -365,21 +330,11 @@
</TR>
<TR>
<TD ALIGN="center">11</TD>
- <TD><A HREF="android.R.drawable.html">
-android.R.drawable</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">11</TD>
<TD><A HREF="android.app.LauncherActivity.html">
android.app.LauncherActivity</A></TD>
</TR>
<TR>
<TD ALIGN="center">10</TD>
- <TD><A HREF="android.R.style.html">
-android.R.style</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">10</TD>
<TD><A HREF="android.content.res.Configuration.html">
android.content.res.Configuration</A></TD>
</TR>
@@ -475,11 +430,6 @@
</TR>
<TR>
<TD ALIGN="center">4</TD>
- <TD><A HREF="android.R.attr.html">
-android.R.attr</A></TD>
-</TR>
-<TR>
- <TD ALIGN="center">4</TD>
<TD><A HREF="android.content.pm.ProviderInfo.html">
android.content.pm.ProviderInfo</A></TD>
</TR>
@@ -510,6 +460,11 @@
</TR>
<TR>
<TD ALIGN="center">2</TD>
+ <TD><A HREF="android.R.attr.html">
+android.R.attr</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">2</TD>
<TD><A HREF="android.content.Intent.html">
android.content.Intent</A></TD>
</TR>
@@ -555,6 +510,11 @@
</TR>
<TR>
<TD ALIGN="center">1</TD>
+ <TD><A HREF="android.R.style.html">
+android.R.style</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
<TD><A HREF="android.widget.ListView.html">
android.widget.ListView</A></TD>
</TR>
@@ -605,6 +565,11 @@
</TR>
<TR>
<TD ALIGN="center"><1</TD>
+ <TD><A HREF="android.R.drawable.html">
+android.R.drawable</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center"><1</TD>
<TD><A HREF="android.provider.Settings.System.html">
android.provider.Settings.System</A></TD>
</TR>
@@ -642,9 +607,9 @@
<TR>
<TD>Classes and <i>Interfaces</i></TD>
<TD ALIGN="right">2</TD>
- <TD ALIGN="right">20</TD>
- <TD ALIGN="right">80</TD>
- <TD ALIGN="right">102</TD>
+ <TD ALIGN="right">22</TD>
+ <TD ALIGN="right">73</TD>
+ <TD ALIGN="right">97</TD>
</TR>
<TR>
<TD>Constructors</TD>
@@ -663,16 +628,16 @@
<TR>
<TD>Fields</TD>
<TD ALIGN="right">29</TD>
- <TD ALIGN="right">433</TD>
+ <TD ALIGN="right">202</TD>
<TD ALIGN="right">27</TD>
- <TD ALIGN="right">489</TD>
+ <TD ALIGN="right">258</TD>
</TR>
<TR>
<TD><b>Total</b></TD>
<TD ALIGN="right">34</TD>
- <TD ALIGN="right">543</TD>
- <TD ALIGN="right">197</TD>
- <TD ALIGN="right">774</TD>
+ <TD ALIGN="right">314</TD>
+ <TD ALIGN="right">190</TD>
+ <TD ALIGN="right">538</TD>
</TR>
</TABLE>
</div>
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.app.html b/docs/html/sdk/api_diff/4/changes/pkg_android.app.html
index 212abba..acd66f3 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.app.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.app.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.content.html b/docs/html/sdk/api_diff/4/changes/pkg_android.content.html
index 6b07fc4..db3f896 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.content.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.content.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.content.pm.html b/docs/html/sdk/api_diff/4/changes/pkg_android.content.pm.html
index c8f0d36..7bfd185 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.content.pm.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.content.pm.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.content.res.html b/docs/html/sdk/api_diff/4/changes/pkg_android.content.res.html
index 2b6d95a..8a07bb2 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.content.res.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.content.res.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.drawable.html b/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.drawable.html
index e8033a3..3fa65de 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.drawable.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.drawable.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.html b/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.html
index 3c69a1e..6d6caac 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.graphics.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.hardware.html b/docs/html/sdk/api_diff/4/changes/pkg_android.hardware.html
index 5a51d12..ddce23d 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.hardware.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.hardware.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.html b/docs/html/sdk/api_diff/4/changes/pkg_android.html
index 8ea8efe..596b5c1 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -102,13 +102,6 @@
</TR>
<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
<TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.array"></A>
- <nobr><A HREF="android.R.array.html">R.array</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
<A NAME="R.attr"></A>
<nobr><A HREF="android.R.attr.html">R.attr</A></nobr>
</TD>
@@ -116,20 +109,6 @@
</TR>
<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
<TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.color"></A>
- <nobr><A HREF="android.R.color.html">R.color</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.dimen"></A>
- <nobr><A HREF="android.R.dimen.html">R.dimen</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
<A NAME="R.drawable"></A>
<nobr><A HREF="android.R.drawable.html">R.drawable</A></nobr>
</TD>
@@ -137,34 +116,6 @@
</TR>
<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
<TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.id"></A>
- <nobr><A HREF="android.R.id.html">R.id</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.integer"></A>
- <nobr><A HREF="android.R.integer.html">R.integer</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.layout"></A>
- <nobr><A HREF="android.R.layout.html">R.layout</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
- <A NAME="R.string"></A>
- <nobr><A HREF="android.R.string.html">R.string</A></nobr>
- </TD>
- <TD> </TD>
-</TR>
-<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
- <TD VALIGN="TOP" WIDTH="25%">
<A NAME="R.style"></A>
<nobr><A HREF="android.R.style.html">R.style</A></nobr>
</TD>
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.inputmethodservice.html b/docs/html/sdk/api_diff/4/changes/pkg_android.inputmethodservice.html
index 57913d9..5027272 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.inputmethodservice.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.inputmethodservice.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.location.html b/docs/html/sdk/api_diff/4/changes/pkg_android.location.html
index 9c803b4..344b11f 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.location.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.location.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.media.html b/docs/html/sdk/api_diff/4/changes/pkg_android.media.html
index 4017876..19cf361 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.media.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.media.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.net.wifi.html b/docs/html/sdk/api_diff/4/changes/pkg_android.net.wifi.html
index ad844fd..50e52736 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.net.wifi.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.net.wifi.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.opengl.html b/docs/html/sdk/api_diff/4/changes/pkg_android.opengl.html
index ceb4326..d2483d41 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.opengl.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.opengl.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.os.html b/docs/html/sdk/api_diff/4/changes/pkg_android.os.html
index 175e365..dc22fd4 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.os.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.os.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.provider.html b/docs/html/sdk/api_diff/4/changes/pkg_android.provider.html
index 44458da..87aaaf2 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.provider.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.provider.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.gsm.html b/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.gsm.html
index 0c1fd78..176a343 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.gsm.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.gsm.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.html b/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.html
index b6e7b90..a40a526 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.telephony.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.test.html b/docs/html/sdk/api_diff/4/changes/pkg_android.test.html
index ad91cd4..7fa10be 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.test.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.test.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.test.mock.html b/docs/html/sdk/api_diff/4/changes/pkg_android.test.mock.html
index bea2724..6d5a183 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.test.mock.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.test.mock.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.text.style.html b/docs/html/sdk/api_diff/4/changes/pkg_android.text.style.html
index d248546..ab59848 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.text.style.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.text.style.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.util.html b/docs/html/sdk/api_diff/4/changes/pkg_android.util.html
index 1efbe7d..5a936ae 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.util.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.util.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.view.animation.html b/docs/html/sdk/api_diff/4/changes/pkg_android.view.animation.html
index ed53b79..a88e7fc 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.view.animation.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.view.animation.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.view.html b/docs/html/sdk/api_diff/4/changes/pkg_android.view.html
index dc852195..381a339 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.view.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.view.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_android.widget.html b/docs/html/sdk/api_diff/4/changes/pkg_android.widget.html
index 8a1cb3b..1388a0c 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_android.widget.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_android.widget.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
@@ -74,6 +74,28 @@
Package <A HREF="../../../../reference/android/widget/package-summary.html" target="_top"><font size="+1"><code>android.widget</code></font></A>
</H2>
<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Classes and Interfaces" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Classes and Interfaces</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ZoomButtonsController"></A>
+ <nobr><A HREF="../../../../reference/android/widget/ZoomButtonsController.html" target="_top"><code>ZoomButtonsController</code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ZoomButtonsController.OnZoomListener"></A>
+ <nobr><A HREF="../../../../reference/android/widget/ZoomButtonsController.OnZoomListener.html" target="_top"><code><I>ZoomButtonsController.<br>OnZoomListener</I></code></A></nobr>
+ </TD>
+ <TD> </TD>
+</TR>
+</TABLE>
+
+<p>
<a NAME="Changed"></a>
<TABLE summary="Changed Classes" WIDTH="100%">
<TR>
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_java.lang.html b/docs/html/sdk/api_diff/4/changes/pkg_java.lang.html
index 995f660..4206681 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_java.lang.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_java.lang.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_java.net.html b/docs/html/sdk/api_diff/4/changes/pkg_java.net.html
index 3bacffc..9d98155 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_java.net.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_java.net.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/changes/pkg_java.util.html b/docs/html/sdk/api_diff/4/changes/pkg_java.util.html
index 70db301e2..1702f22 100644
--- a/docs/html/sdk/api_diff/4/changes/pkg_java.util.html
+++ b/docs/html/sdk/api_diff/4/changes/pkg_java.util.html
@@ -46,7 +46,7 @@
</tr>
<tr>
<td class="diffspec" style="padding-top:.25em">To Level:</td>
- <td class="diffvaluenew" style="padding-top:.25em">Donut</td>
+ <td class="diffvaluenew" style="padding-top:.25em">4</td>
</tr>
<tr>
<td class="diffspec">From Level:</td>
@@ -54,7 +54,7 @@
</tr>
<tr>
<td class="diffspec">Generated</td>
- <td class="diffvalue">2009.08.05 19:20</td>
+ <td class="diffvalue">2009.09.02 18:26</td>
</tr>
</table>
</div><!-- End and-diff-id -->
diff --git a/docs/html/sdk/api_diff/4/missingSinces.txt b/docs/html/sdk/api_diff/4/missingSinces.txt
index 4d35e0f..2cdddf9 100644
--- a/docs/html/sdk/api_diff/4/missingSinces.txt
+++ b/docs/html/sdk/api_diff/4/missingSinces.txt
@@ -18,6 +18,8 @@
NO DOC BLOCK: android.telephony.SmsMessage.SubmitPdu Class
NO DOC BLOCK: android.view.ViewDebug.FlagToString Class
NO DOC BLOCK: android.net.wifi.WifiManager.MulticastLock Class
+NO DOC BLOCK: android.widget.ZoomButtonsController Class
+NO DOC BLOCK: android.widget.ZoomButtonsController.OnZoomListener Interface
NO DOC BLOCK: android.graphics.drawable.BitmapDrawable Constructor (android.content.res.Resources)
NO DOC BLOCK: android.graphics.drawable.BitmapDrawable Constructor (android.content.res.Resources, android.graphics.Bitmap)
NO DOC BLOCK: android.text.style.ImageSpan Constructor (android.content.Context, android.graphics.Bitmap)
@@ -134,237 +136,6 @@
NO DOC BLOCK: android.graphics.Bitmap Field DENSITY_NONE
NO DOC BLOCK: android.util.TypedValue Field DENSITY_NONE
NO DOC BLOCK: android.util.DisplayMetrics Field densityDpi
-NO DOC BLOCK: android.R.anim Field donut_resource_pad1
-NO DOC BLOCK: android.R.array Field donut_resource_pad1
-NO DOC BLOCK: android.R.attr Field donut_resource_pad1
-NO DOC BLOCK: android.R.color Field donut_resource_pad1
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad1
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad1
-NO DOC BLOCK: android.R.id Field donut_resource_pad1
-NO DOC BLOCK: android.R.integer Field donut_resource_pad1
-NO DOC BLOCK: android.R.layout Field donut_resource_pad1
-NO DOC BLOCK: android.R.string Field donut_resource_pad1
-NO DOC BLOCK: android.R.style Field donut_resource_pad1
-NO DOC BLOCK: android.R.anim Field donut_resource_pad10
-NO DOC BLOCK: android.R.array Field donut_resource_pad10
-NO DOC BLOCK: android.R.attr Field donut_resource_pad10
-NO DOC BLOCK: android.R.color Field donut_resource_pad10
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad10
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad10
-NO DOC BLOCK: android.R.id Field donut_resource_pad10
-NO DOC BLOCK: android.R.integer Field donut_resource_pad10
-NO DOC BLOCK: android.R.layout Field donut_resource_pad10
-NO DOC BLOCK: android.R.string Field donut_resource_pad10
-NO DOC BLOCK: android.R.style Field donut_resource_pad10
-NO DOC BLOCK: android.R.anim Field donut_resource_pad11
-NO DOC BLOCK: android.R.array Field donut_resource_pad11
-NO DOC BLOCK: android.R.attr Field donut_resource_pad11
-NO DOC BLOCK: android.R.color Field donut_resource_pad11
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad11
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad11
-NO DOC BLOCK: android.R.id Field donut_resource_pad11
-NO DOC BLOCK: android.R.integer Field donut_resource_pad11
-NO DOC BLOCK: android.R.layout Field donut_resource_pad11
-NO DOC BLOCK: android.R.string Field donut_resource_pad11
-NO DOC BLOCK: android.R.style Field donut_resource_pad11
-NO DOC BLOCK: android.R.anim Field donut_resource_pad12
-NO DOC BLOCK: android.R.array Field donut_resource_pad12
-NO DOC BLOCK: android.R.attr Field donut_resource_pad12
-NO DOC BLOCK: android.R.color Field donut_resource_pad12
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad12
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad12
-NO DOC BLOCK: android.R.id Field donut_resource_pad12
-NO DOC BLOCK: android.R.integer Field donut_resource_pad12
-NO DOC BLOCK: android.R.layout Field donut_resource_pad12
-NO DOC BLOCK: android.R.string Field donut_resource_pad12
-NO DOC BLOCK: android.R.style Field donut_resource_pad12
-NO DOC BLOCK: android.R.anim Field donut_resource_pad13
-NO DOC BLOCK: android.R.attr Field donut_resource_pad13
-NO DOC BLOCK: android.R.color Field donut_resource_pad13
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad13
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad13
-NO DOC BLOCK: android.R.id Field donut_resource_pad13
-NO DOC BLOCK: android.R.integer Field donut_resource_pad13
-NO DOC BLOCK: android.R.layout Field donut_resource_pad13
-NO DOC BLOCK: android.R.string Field donut_resource_pad13
-NO DOC BLOCK: android.R.style Field donut_resource_pad13
-NO DOC BLOCK: android.R.anim Field donut_resource_pad14
-NO DOC BLOCK: android.R.attr Field donut_resource_pad14
-NO DOC BLOCK: android.R.color Field donut_resource_pad14
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad14
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad14
-NO DOC BLOCK: android.R.id Field donut_resource_pad14
-NO DOC BLOCK: android.R.integer Field donut_resource_pad14
-NO DOC BLOCK: android.R.string Field donut_resource_pad14
-NO DOC BLOCK: android.R.style Field donut_resource_pad14
-NO DOC BLOCK: android.R.anim Field donut_resource_pad15
-NO DOC BLOCK: android.R.attr Field donut_resource_pad15
-NO DOC BLOCK: android.R.color Field donut_resource_pad15
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad15
-NO DOC BLOCK: android.R.id Field donut_resource_pad15
-NO DOC BLOCK: android.R.string Field donut_resource_pad15
-NO DOC BLOCK: android.R.style Field donut_resource_pad15
-NO DOC BLOCK: android.R.anim Field donut_resource_pad16
-NO DOC BLOCK: android.R.attr Field donut_resource_pad16
-NO DOC BLOCK: android.R.color Field donut_resource_pad16
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad16
-NO DOC BLOCK: android.R.id Field donut_resource_pad16
-NO DOC BLOCK: android.R.string Field donut_resource_pad16
-NO DOC BLOCK: android.R.style Field donut_resource_pad16
-NO DOC BLOCK: android.R.anim Field donut_resource_pad17
-NO DOC BLOCK: android.R.attr Field donut_resource_pad17
-NO DOC BLOCK: android.R.color Field donut_resource_pad17
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad17
-NO DOC BLOCK: android.R.id Field donut_resource_pad17
-NO DOC BLOCK: android.R.string Field donut_resource_pad17
-NO DOC BLOCK: android.R.style Field donut_resource_pad17
-NO DOC BLOCK: android.R.anim Field donut_resource_pad18
-NO DOC BLOCK: android.R.attr Field donut_resource_pad18
-NO DOC BLOCK: android.R.color Field donut_resource_pad18
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad18
-NO DOC BLOCK: android.R.id Field donut_resource_pad18
-NO DOC BLOCK: android.R.string Field donut_resource_pad18
-NO DOC BLOCK: android.R.style Field donut_resource_pad18
-NO DOC BLOCK: android.R.anim Field donut_resource_pad19
-NO DOC BLOCK: android.R.color Field donut_resource_pad19
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad19
-NO DOC BLOCK: android.R.id Field donut_resource_pad19
-NO DOC BLOCK: android.R.string Field donut_resource_pad19
-NO DOC BLOCK: android.R.style Field donut_resource_pad19
-NO DOC BLOCK: android.R.anim Field donut_resource_pad2
-NO DOC BLOCK: android.R.array Field donut_resource_pad2
-NO DOC BLOCK: android.R.attr Field donut_resource_pad2
-NO DOC BLOCK: android.R.color Field donut_resource_pad2
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad2
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad2
-NO DOC BLOCK: android.R.id Field donut_resource_pad2
-NO DOC BLOCK: android.R.integer Field donut_resource_pad2
-NO DOC BLOCK: android.R.layout Field donut_resource_pad2
-NO DOC BLOCK: android.R.string Field donut_resource_pad2
-NO DOC BLOCK: android.R.style Field donut_resource_pad2
-NO DOC BLOCK: android.R.anim Field donut_resource_pad20
-NO DOC BLOCK: android.R.color Field donut_resource_pad20
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad20
-NO DOC BLOCK: android.R.id Field donut_resource_pad20
-NO DOC BLOCK: android.R.string Field donut_resource_pad20
-NO DOC BLOCK: android.R.anim Field donut_resource_pad21
-NO DOC BLOCK: android.R.color Field donut_resource_pad21
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad21
-NO DOC BLOCK: android.R.id Field donut_resource_pad21
-NO DOC BLOCK: android.R.string Field donut_resource_pad21
-NO DOC BLOCK: android.R.color Field donut_resource_pad22
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad22
-NO DOC BLOCK: android.R.id Field donut_resource_pad22
-NO DOC BLOCK: android.R.string Field donut_resource_pad22
-NO DOC BLOCK: android.R.color Field donut_resource_pad23
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad23
-NO DOC BLOCK: android.R.string Field donut_resource_pad23
-NO DOC BLOCK: android.R.color Field donut_resource_pad24
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad24
-NO DOC BLOCK: android.R.string Field donut_resource_pad24
-NO DOC BLOCK: android.R.color Field donut_resource_pad25
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad25
-NO DOC BLOCK: android.R.string Field donut_resource_pad25
-NO DOC BLOCK: android.R.color Field donut_resource_pad26
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad26
-NO DOC BLOCK: android.R.string Field donut_resource_pad26
-NO DOC BLOCK: android.R.color Field donut_resource_pad27
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad27
-NO DOC BLOCK: android.R.string Field donut_resource_pad27
-NO DOC BLOCK: android.R.color Field donut_resource_pad28
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad28
-NO DOC BLOCK: android.R.color Field donut_resource_pad29
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad29
-NO DOC BLOCK: android.R.anim Field donut_resource_pad3
-NO DOC BLOCK: android.R.array Field donut_resource_pad3
-NO DOC BLOCK: android.R.attr Field donut_resource_pad3
-NO DOC BLOCK: android.R.color Field donut_resource_pad3
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad3
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad3
-NO DOC BLOCK: android.R.id Field donut_resource_pad3
-NO DOC BLOCK: android.R.integer Field donut_resource_pad3
-NO DOC BLOCK: android.R.layout Field donut_resource_pad3
-NO DOC BLOCK: android.R.string Field donut_resource_pad3
-NO DOC BLOCK: android.R.style Field donut_resource_pad3
-NO DOC BLOCK: android.R.color Field donut_resource_pad30
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad30
-NO DOC BLOCK: android.R.color Field donut_resource_pad31
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad31
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad32
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad33
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad34
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad35
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad36
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad37
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad38
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad39
-NO DOC BLOCK: android.R.anim Field donut_resource_pad4
-NO DOC BLOCK: android.R.array Field donut_resource_pad4
-NO DOC BLOCK: android.R.attr Field donut_resource_pad4
-NO DOC BLOCK: android.R.color Field donut_resource_pad4
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad4
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad4
-NO DOC BLOCK: android.R.id Field donut_resource_pad4
-NO DOC BLOCK: android.R.integer Field donut_resource_pad4
-NO DOC BLOCK: android.R.layout Field donut_resource_pad4
-NO DOC BLOCK: android.R.string Field donut_resource_pad4
-NO DOC BLOCK: android.R.style Field donut_resource_pad4
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad40
-NO DOC BLOCK: android.R.anim Field donut_resource_pad5
-NO DOC BLOCK: android.R.array Field donut_resource_pad5
-NO DOC BLOCK: android.R.attr Field donut_resource_pad5
-NO DOC BLOCK: android.R.color Field donut_resource_pad5
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad5
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad5
-NO DOC BLOCK: android.R.id Field donut_resource_pad5
-NO DOC BLOCK: android.R.integer Field donut_resource_pad5
-NO DOC BLOCK: android.R.layout Field donut_resource_pad5
-NO DOC BLOCK: android.R.string Field donut_resource_pad5
-NO DOC BLOCK: android.R.style Field donut_resource_pad5
-NO DOC BLOCK: android.R.anim Field donut_resource_pad6
-NO DOC BLOCK: android.R.array Field donut_resource_pad6
-NO DOC BLOCK: android.R.attr Field donut_resource_pad6
-NO DOC BLOCK: android.R.color Field donut_resource_pad6
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad6
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad6
-NO DOC BLOCK: android.R.id Field donut_resource_pad6
-NO DOC BLOCK: android.R.integer Field donut_resource_pad6
-NO DOC BLOCK: android.R.layout Field donut_resource_pad6
-NO DOC BLOCK: android.R.string Field donut_resource_pad6
-NO DOC BLOCK: android.R.style Field donut_resource_pad6
-NO DOC BLOCK: android.R.anim Field donut_resource_pad7
-NO DOC BLOCK: android.R.array Field donut_resource_pad7
-NO DOC BLOCK: android.R.attr Field donut_resource_pad7
-NO DOC BLOCK: android.R.color Field donut_resource_pad7
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad7
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad7
-NO DOC BLOCK: android.R.id Field donut_resource_pad7
-NO DOC BLOCK: android.R.integer Field donut_resource_pad7
-NO DOC BLOCK: android.R.layout Field donut_resource_pad7
-NO DOC BLOCK: android.R.string Field donut_resource_pad7
-NO DOC BLOCK: android.R.style Field donut_resource_pad7
-NO DOC BLOCK: android.R.anim Field donut_resource_pad8
-NO DOC BLOCK: android.R.array Field donut_resource_pad8
-NO DOC BLOCK: android.R.attr Field donut_resource_pad8
-NO DOC BLOCK: android.R.color Field donut_resource_pad8
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad8
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad8
-NO DOC BLOCK: android.R.id Field donut_resource_pad8
-NO DOC BLOCK: android.R.integer Field donut_resource_pad8
-NO DOC BLOCK: android.R.layout Field donut_resource_pad8
-NO DOC BLOCK: android.R.string Field donut_resource_pad8
-NO DOC BLOCK: android.R.style Field donut_resource_pad8
-NO DOC BLOCK: android.R.anim Field donut_resource_pad9
-NO DOC BLOCK: android.R.array Field donut_resource_pad9
-NO DOC BLOCK: android.R.attr Field donut_resource_pad9
-NO DOC BLOCK: android.R.color Field donut_resource_pad9
-NO DOC BLOCK: android.R.dimen Field donut_resource_pad9
-NO DOC BLOCK: android.R.drawable Field donut_resource_pad9
-NO DOC BLOCK: android.R.id Field donut_resource_pad9
-NO DOC BLOCK: android.R.integer Field donut_resource_pad9
-NO DOC BLOCK: android.R.layout Field donut_resource_pad9
-NO DOC BLOCK: android.R.string Field donut_resource_pad9
-NO DOC BLOCK: android.R.style Field donut_resource_pad9
NO DOC BLOCK: android.R.attr Field dropDownHeight
NO DOC BLOCK: android.provider.Settings.Secure Field ENABLED_ACCESSIBILITY_SERVICES
NO DOC BLOCK: android.R.attr Field eventsInterceptionEnabled
diff --git a/docs/html/sdk/api_diff/4/user_comments_for_3_to_Donut.xml b/docs/html/sdk/api_diff/4/user_comments_for_3_to_4.xml
similarity index 71%
rename from docs/html/sdk/api_diff/4/user_comments_for_3_to_Donut.xml
rename to docs/html/sdk/api_diff/4/user_comments_for_3_to_4.xml
index 5bbe945..b0aba96 100644
--- a/docs/html/sdk/api_diff/4/user_comments_for_3_to_Donut.xml
+++ b/docs/html/sdk/api_diff/4/user_comments_for_3_to_4.xml
@@ -2,7 +2,7 @@
<comments
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='comments.xsd'
- name="3_to_Donut"
+ name="3_to_4"
jdversion="1.1.0">
<!-- Use this file to enter an API change description. For example, when you remove a class,
@@ -130,132 +130,6 @@
</text>
</comment>
<comment>
- <identifier id="android.R.anim.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad19"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad20"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad21"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.anim.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.R.anim.linear_interpolator"/>
<text>
InsertCommentsHere
@@ -268,84 +142,6 @@
</text>
</comment>
<comment>
- <identifier id="android.R.array"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.array.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.R.attr"/>
<text>
InsertCommentsHere
@@ -382,114 +178,6 @@
</text>
</comment>
<comment>
- <identifier id="android.R.attr.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.attr.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.R.attr.dropDownHeight"/>
<text>
InsertCommentsHere
@@ -676,534 +364,12 @@
</text>
</comment>
<comment>
- <identifier id="android.R.color"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad19"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad20"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad21"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad22"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad23"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad24"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad25"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad26"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad27"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad28"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad29"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad30"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad31"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.color.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.dimen.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.R.drawable"/>
<text>
InsertCommentsHere
</text>
</comment>
<comment>
- <identifier id="android.R.drawable.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad19"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad20"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad21"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad22"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad23"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad24"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad25"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad26"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad27"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad28"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad29"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad30"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad31"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad32"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad33"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad34"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad35"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad36"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad37"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad38"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad39"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad40"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.drawable.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.R.drawable.stat_sys_vp_phone_call"/>
<text>
InsertCommentsHere
@@ -1216,486 +382,6 @@
</text>
</comment>
<comment>
- <identifier id="android.R.id"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad19"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad20"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad21"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad22"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.id.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.integer.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.layout.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad19"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad20"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad21"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad22"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad23"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad24"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad25"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad26"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad27"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.string.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.R.style"/>
<text>
InsertCommentsHere
@@ -1720,120 +406,6 @@
</text>
</comment>
<comment>
- <identifier id="android.R.style.donut_resource_pad1"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad10"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad11"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad12"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad13"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad14"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad15"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad16"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad17"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad18"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad19"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad2"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad3"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad4"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad5"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad6"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad7"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad8"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
- <identifier id="android.R.style.donut_resource_pad9"/>
- <text>
- InsertCommentsHere
- </text>
-</comment>
-<comment>
<identifier id="android.accessibilityservice"/>
<text>
InsertCommentsHere
@@ -4564,6 +3136,18 @@
</text>
</comment>
<comment>
+ <identifier id="android.widget.ZoomButtonsController"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
+ <identifier id="android.widget.ZoomButtonsController.OnZoomListener"/>
+ <text>
+ InsertCommentsHere
+ </text>
+</comment>
+<comment>
<identifier id="java.lang"/>
<text>
InsertCommentsHere
diff --git a/docs/html/sdk/preview/features.jd b/docs/html/sdk/preview/features.jd
new file mode 100644
index 0000000..81b4ff6
--- /dev/null
+++ b/docs/html/sdk/preview/features.jd
@@ -0,0 +1,4 @@
+sdk.redirect=true
+
+@jd:body
+
diff --git a/docs/html/sdk/preview/index.jd b/docs/html/sdk/preview/index.jd
index a6a6ca2..81b4ff6 100644
--- a/docs/html/sdk/preview/index.jd
+++ b/docs/html/sdk/preview/index.jd
@@ -1,194 +1,4 @@
-page.title=Android 1.6 Early Look SDK
-sdk.redirect=0
-sdk.version=1.6
-sdk.preview=true
-
-sdk.date=August 2009
-
-sdk.win_download=android-sdk-windows-1.5_r3.zip
-sdk.win_bytes=191477853
-sdk.win_checksum=1725fd6963ce69102ba7192568dfc711
-
-sdk.mac_download=android-sdk-mac_x86-1.5_r3.zip
-sdk.mac_bytes=183024673
-sdk.mac_checksum=b1bafdaefdcec89a14b604b504e7daec
-
-sdk.linux_download=android-sdk-linux_x86-1.5_r3.zip
-sdk.linux_bytes=178117561
-sdk.linux_checksum=350d0211678ced38da926b8c9ffa4fac
-
-adt.zip_download=ADT-0.9.2.zip
-adt.zip_version=0.9.2
-adt.zip_bytes=178117561
-adt.zip_checksum=350d0211678ced38da926b8c9ffa4fac
+sdk.redirect=true
@jd:body
-<h2 id="overview">SDK Overview</h2>
-
-<p>This Early Look SDK provides the tools, libraries, and system images that you need to start developing and testing applications on the next version of the Android platform — Android 1.6.</p>
-
-<p>The sections below provide information about the contents of the SDK, as well as any applicable release notes.</p>
-
-<p>This Early Look SDK is provided for development and testing purposes only. You can use it to get familiar with the new Android 1.6 framework APIs and the UI and features of the Android 1.6 system, and you can use it to begin testing your existing applications with the new API and system. However, this SDK is not suitable for compiling applications for deployment to Android-powered devices running the Android 1.6 platform, when such devices are available. For more information, see <a href="#provisional">Framework API and Provisional API Level</a>. </p>
-
-<p>The sections below provide information about the contents of the SDK, as well as any applicable release notes.</p>
-
-<p class="note"><strong>Note:</strong> This is an <em>early look SDK only</em>.
-The tools and documentation are not complete. The API reference documentation for the early look
-SDK is provided only in the downloadable SDK package — documentation for this early
-look release is <em>not</em> available at <a href="http://developer.android.com">http://developer.android.com</a>.
-To access the API reference for the early
-look SDK, see the documentation in your SDK's <em>docs/reference/</em> directory.
-<br/><br/>
-Additionally, note that the APIs provided in this SDK are subject to change until the final
-Android 1.6 SDK is released. You should not compile any applications for distribution using
-this version of the SDK. If you do so, your applications will not function properly when deployed
-to Android-powered devices running the final Android 1.6 platform. Please wait for the final
-Android 1.6 SDK before distributing applications built on the Android 1.6 system image.
-</p>
-
-<h3 id="provisional">Framework API and Provisional API Level</h3>
-
-<p>This SDK gives you early access to the framework API that will be offered in Android 1.6. However, at the time of this release, The API specification for Android 1.6 was not yet final, meaning that it is possible that the API could change before the final release of the Android 1.6 platform. </p>
-
-<p>To help distinguish the API offered in the Early Look SDK from that of the final Android 1.6 platform, this SDK assigns a provisional API Level identifier — <strong>Donut</strong> — to its Early Look framework API. When the Android 1.6 framework API specification is final, the API Level identifier will change to <strong>4</strong> and the "Donut" identifier will no longer be supported. </p>
-
-<p>The "Donut" framework API is for development only and is not supported as a platform for compiling applications for deployment or publishing. The API Level of "Donut" will not be supported by any Android-powered devices in the field, including those running the Android 1.6 platform. This means that when the final Android 1.6 platform is released, you will need to change your application's <code>android:minSdkVersion</code> manifest attribute to reference the API Level of "4", rather than "Donut", if your application is using Android 1.6 APIs. You would then need to recompile your application before publishing it. </p>
-
-<p>The use of a provisional API Level in this SDK is designed to protect developers and device users from inadvertently publishing or installing applications based on the Early Look framework API, which may not run properly on actual devices running Android 1.6.</p>
-
-<p>To develop using the Early Look framework API, you must reference an API Level of "Donut" in your application's manifest. </p>
-
-<p>Specifically, you must define a <code>android:minSdkVersion</code>
-attribute in a <code><uses-sdk></code> element as a child of
-<code><manifest></code> in the manifest file. When set, the
-attribute looks like this: </p>
-
-<pre><manifest>
- ...
- <uses-sdk android:minSdkVersion="Donut" />
- ...
-</manifest></pre>
-
-<p>If you are developing in Eclipse with ADT, please read the next section for information about the ADT upgrade that supports the Early Look SDK's provisional API Level. </p>
-
-
-<h3>ADT Plugin for Eclipse</h3>
-
-<p>An updated version of the ADT Plugin for Eclipse is available in connection with the Android 1.6 Early Look SDK. The new version, ADT 0.9.2, provides support for the provisional API Level "Donut" that is offered in the Early Look SDK and includes several new features and improvements. These changes mean that this Early Look SDK does not work with older Eclipse plugins (ADT 0.9.1).</li>
-
-<p>If you are developing in Eclipse with ADT and want to get started with Android 1.6 Early Look SDK, you <em>must</em> download and install the correct version of the ADT Plugin (0.9.2 or higher). </p>
-
-<p>The new version of ADT is downloadable from the usual remote update site or is separately downloadable as a .zip archive. For instructions on how to download the plugin, please see <a href="upgrading.html#UpdateAdt">Upgrading Your Eclipse Plugin</a>. </p>
-
-<h3>Android AVD Manager</h3>
-
-<p>The SDK offers a new tool called Android AVD Manager that lets you manage your AVDs more efficiently. For example, you can quickly create new AVDs, manage their properties, and run a target AVD from a single window.
-
-If you are developing in Eclipse with ADT, you can access the Android AVD Manager from the <strong>Window</strong> menu. </p>
-
-If you are developing in another IDE, you can access the AVD manager capabilities through the <code>android</code> command-line tool, located in the <sdk>/tools directory. You can launch the tool with a graphical UI by using the <code>android</code> command without specifying any options. The command-line version of the tool is also still available.</p>
-
-<h3>SDK Component Updater</h3>
-
-<p>This SDK includes a new SDK Component Updater tool that lets you download updated versions of SDK components individually into your environment, as soon as they become available. </p>
-
-<p>The Updater provides a graphical UI that lets you quickly check what Android platforms, add-ons, extras, and documentation packages are available in your SDK environment, what their versions are, and whether updated versions are available. Using the Updater, you can download one or more items from the remote repository and install them directly in your SDK environment. For example, the updater lets you receive updates to SDK tools incrementally, as they are made available, without having to wait for the next SDK release. </p>
-
-<p>To access the Updater, use the <code>android</code> command-line tool, located in the <sdk>/tools directory. You can launch the Updater by using the <code>android</code> command without specifying any options. </p>
-
-<p>In ADT, it you can also access the Updater through the Android AVD Manager tool. </p>
-
-<h3>Support for Test Packages in New Project Wizard</h3>
-
-<p>The New Project Wizard available in the ADT 0.9.2 now lets you add a test package containing JUnit or other classes of tests while you are creating or importing a new Android application project. </p>
-
-
-<h3>Other Notes and Resolved Issues</h3>
-
-<ul>
-<li>This SDK release adds support for Eclipse 3.5 (Galileo) and no longer formally supports Eclipse 3.3 (Europa). </li>
-<li>The issue preventing adb from recognizing Samsung Galaxy devices (linux SDK only) has been fixed.</li>
-</ul>
-
-<h2>SDK Contents</h2>
-
-<h4>Development tools</h4>
-
-<p>The SDK includes a full set of tools for developing and debugging application code and designing an application UI. You can read about the tools in the
-<a href="{@docRoot}guide/developing/tools/index.html">Dev Guide</a> and access them in the <code><sdk>/tools/</code> directory.
-
-<p>The tools package in this SDK includes updates from those provided in the previous SDK. The tools use the same project structure as in the previous SDK (Android 1.5), but have been updated to support the the provisional API Level identifier "donut". If you have application projects developed in the Android 1.5 SDK, you can migrate them to the latest SDK without modification. For more information about how to migrate, see <a href="upgrading.html">Upgrading the SDK</a>.
-
-<p>For more information about the new tools features, see the <a href="#overview">SDK Overview</a> section above.
-
-<h4 id="system_images">Android Platforms</h4>
-
-<p>This SDK includes multiple Android platform versions that you can use to develop applications. For each version, both a fully compliant Android library and system image are provided. The table below lists the platform versions included in this SDK. For more information about a platform version — features, applications included, localizations, API changes, and so on — see its Version Notes. </p>
-
-<table style="margin-right:1em;" width="80%">
-<tr>
-<th><nobr>Platform</nobr></th><th><nobr>API Level</nobr></th><th>Notes</th><th>Description</th>
-</tr>
-<tr>
-<td width="5%"><nobr>Android 1.6 Early Look (Android Donut)</nobr></td>
-<td width="5%">Donut</td>
-<td width="5%"></td>
-<td>Includes an Early Look Android 1.6 library and system image with a set of development applications. Does not include any external libraries (such as the Maps external library).</td>
-</tr>
-<tr>
-<td width="5%"><nobr>Android 1.5</nobr></td>
-<td width="5%">3</td>
-<td width="5%"><nobr><a href="{@docRoot}sdk/android-1.5.html">Version Notes</a></nobr></td>
-<td>Includes a standard Android 1.5 library and system image with a set of development applications. Does not include any external libraries (such as the Maps external library).</td>
-</tr>
-</table>
-
-<h4 id="system_images">SDK Add-Ons</h4>
-
-<p>An SDK add-on provides a development environment for an Android external library or a customized (but fully compliant) Android system image. This SDK includes the SDK add-on listed below. The Android system API Level required by the add-on is noted.</p>
-
-<table style="margin-right:1em;" width="80%">
-<tr>
-<th><nobr>Add-On</nobr></th><th><nobr>API Level</nobr></th><th>Notes</th><th>Description</th>
-</tr>
-<tr>
-<td width="5%"><nobr>Google APIs</nobr></td>
-<td width="5%">Donut</td>
-<td width="5%"> </td>
-<td>Includes the com.google.android.maps external library, an Early Look
-Android 1.6 system image, a {@link android.location.Geocoder Geocoder}
-backend service implementation, documentation, and sample code. </td>
-</tr>
-<tr>
-<td width="5%"><nobr>Google APIs</nobr></td>
-<td width="5%">3</td>
-<td width="5%"> </td>
-<td>Includes the com.google.android.maps external library, a compliant
-system image, a {@link android.location.Geocoder Geocoder}
-backend service implementation, documentation, and sample code. </td>
-</tr>
-</table>
-
-<h4>Sample Code and Applications</h4>
-
-<p>You can look at a variety of tutorials and samples in the <a href="{@docRoot}guide/samples/index.html">Dev Guide</a> and access the sample code itself
-in the <code><sdk>/platforms/<platform>/samples/</code> directory of the SDK package. Note the new location — the SDK now includes multiple platform versions that you can develop against and each has its own sample code directory. </p>
-
-<p>For example, to view or build the samples available for the Android
-1.6 Early Look platform (AVD target "Android Donut"), you will find the samples in the <code><sdk>/platforms/android-Donut/samples/</code> directory of the SDK package. </p>
-
-<h4>Documentation</h4>
-
-<p>The SDK package includes a full set of local documentation. To view it, open the <code><sdk>/documentation.html</code> file in a web browser. If you are developing in an IDE such as Eclipse, you can also view the reference documentation directly in the IDE. </p>
-
-
-<hr/>
-
-<div class="special">
-<p>Feedback on this preview SDK is welcome on the public Android Open Source forums:</p>
-<p style="margin-left:2em;"><a href="http://source.android.com/discuss">http://source.android.com/discuss</a></p>
-</div>
-
-
diff --git a/docs/html/sdk/preview/installing.jd b/docs/html/sdk/preview/installing.jd
index 05e7ab5..1e6b26b 100644
--- a/docs/html/sdk/preview/installing.jd
+++ b/docs/html/sdk/preview/installing.jd
@@ -1,346 +1,5 @@
-page.title=Installing the Android SDK
-sdk.version=1.6
-sdk.preview=true
-sdk.date=August 2009
+sdk.redirect=true
@jd:body
-<div id="qv-wrapper">
-<div id="qv">
-
- <h2>In this document</h2>
- <ol>
- <li><a href="#Preparing">Preparing for Installation</a></li>
- <li><a href="#Installing">Installing the SDK</a></li>
- <li><a href="#InstallingADT">Installing the ADT Plugin for Eclipse</a>
- <ol>
- <li><a href="#Troubleshooting">Troubleshooting ADT Installation</a></li>
- </ol>
- </li>
- <li><a href="#NextSteps">Next Steps</a></li>
- <li><a href="#InstallationNotes">Installation Notes</a></li>
- </ol>
-
-</div>
-</div>
-
-<p>This page describes how to install the Android Early Look SDK and set up your
-development environment.</p>
-
-<p>If you encounter any problems during installation, see the
-<a href="#InstallationNotes">Installation Notes</a> at the bottom of
-this page.</p>
-
-<h4 style="margin-top">Upgrading?</h4>
-<p>If you have already developed applications using an earlier version
-of the Android SDK, please read <a href="upgrading.html">Upgrading the SDK</a>, instead.
-</p>
-
-
-<h2 id="Preparing">Preparing for Installation</h2>
-
-<p>Before you begin, take a moment to confirm that your development machine meets the
-<a href="requirements.html">System Requirements</a>.
-</p>
-
-<p>If you will be developing on Eclipse with the Android Development
-Tools (ADT) Plugin — the recommended path if you are new to
-Android — make sure that you have a suitable version of Eclipse
-installed on your computer (3.4 or newer is recommended). If you need to install Eclipse, you can
-download it from this location: </p>
-
-<p style="margin-left:2em;"><a href=
-"http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a
-></p>
-
-<p>A Java or RCP version of Eclipse is recommended. </p>
-
-<h2 id="Installing">Installing the SDK</h2>
-
-<p>Unpack the Android SDK .zip archive to a suitable location on your machine.
-By default, the SDK files are unpacked into a directory named
-<code>android_sdk_<em><platform</em>>_<em><release></em></code>.
-The directory contains a local copy of the documentation (accessible by opening
-<code>documentation.html</code> in your browser) and the subdirectories
-<code>tools/</code>, <code>add-ons/</code>, <code>platforms/</code>, and others. Inside
-each subdirectory of <code>platforms/</code> you'll find <code>samples/</code>, which includes
-code samples that are specific to each version of the platform.</p>
-
-<p>Make a note of the name and location of the unpacked SDK directory on your system — you
-will need to refer to the SDK directory later, when setting up the Android plugin or when
-using the SDK tools.</p>
-
-<p>Optionally, you may want to add the location of the SDK's primary <code>tools</code> directory
-to your system <code>PATH</code>. The primary <code>tools/</code> directory is located at the root of the
-SDK folder. Adding <code>tools</code> to your path lets you run Android Debug Bridge (adb) and
-the other command line <a href="{@docRoot}guide/developing/tools/index.html">tools</a> without
-needing to supply the full path to the tools directory. </p>
-<ul>
- <li>On Linux, edit your <code>~/.bash_profile</code> or <code>~/.bashrc</code> file. Look
- for a line that sets the PATH environment variable and add the
- full path to the <code>tools/</code> directory to it. If you don't
- see a line setting the path, you can add one:</li>
-
- <ul><code>export PATH=${PATH}:<em><your_sdk_dir></em>/tools</code></ul>
-
- <li>On a Mac, look in your home directory for <code>.bash_profile</code> and
- proceed as for Linux. You can create the <code>.bash_profile</code> if
- you haven't already set one up on your machine. </li>
-
- <li>On Windows, right-click on My Computer, and select Properties.
- Under the Advanced tab, hit the Environment Variables button, and in the
- dialog that comes up, double-click on Path (under System Variables). Add the full path to the
- <code>tools/</code> directory to the path. </li>
- </ul>
-
-<p>Note that, if you update your SDK in the future, you
-should remember to update your <code>PATH</code> settings to point to the new location, if different.</p>
-
-<p>If you will be using the Eclipse IDE as your development environment,
-the next section describes how to install the Android Development Tools (ADT) plugin and set up Eclipse.
-If you choose not to use Eclipse, you can
-develop Android applications in an IDE of your choice and then compile, debug and deploy using
-the tools included in the SDK (skip to <a href="#NextSteps">Next Steps</a>).</p>
-
-
-<h2 id="InstallingADT">Installing the ADT Plugin for Eclipse</h2>
-
-<p>Android offers a custom plugin for the Eclipse IDE, called Android
-Development Tools (ADT), that is designed to give you a powerful,
-integrated environment in which to build Android applications. It
-extends the capabilites of Eclipse to let you quickly set up new Android
-projects, create an application UI, add components based on the Android
-Framework API, debug your applications using the Android SDK tools, and even export
-signed (or unsigned) APKs in order to distribute your application.</p>
-
-<p>In general, using Eclipse with ADT is a highly recommended
-approach to Android development and is the fastest way to get started.
-(If you prefer to work in an IDE other than Eclipse,
-you do not need to install Eclipse or ADT, instead, you can directly
-use the SDK tools to build and debug your application—skip to <a href="#NextSteps">Next Steps</a>.)</p>
-
-<p>Once you have Eclipse installed, as described in <a href="#Preparing">Preparing for
-Installation</a>, follow the steps below to
-download the ADT plugin and install it in your respective Eclipse
-environment. </p>
-
-<table style="font-size:100%">
-<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr>
-<tr>
-<td width="45%">
-<!-- 3.3 steps -->
-<ol>
- <li>Start Eclipse, then select <strong>Help</strong> > <strong>Software Updates</strong>
-> <strong>Find and Install...</strong>. </li>
- <li>In the dialog that appears, select <strong>Search for new features to install</strong>
-and click <strong>Next</strong>. </li>
- <li>Click <strong>New Remote Site</strong>. </li>
- <li>In the resulting dialog box, enter a name for the remote site (e.g. "Android Plugin") and
- enter the URL:
- <pre>https://dl-ssl.google.com/android/eclipse/</pre>
- <p>If you have trouble aqcuiring the plugin, try using "http" in the URL,
- instead of "https" (https is preferred for security reasons).</p>
- <p>Click <strong>OK</strong>.</p> </li>
- <li>You should now see the new site added to the search list (and checked).
- Click <strong>Finish</strong>. </li>
- <li>In the subsequent Search Results dialog box, select the checkbox for the
- "Android Plugin".
- This will select the nested tools: "Android DDMS" and "Android Development Tools".
- Click <strong>Next</strong>.</li>
- <li>Read and accept the license agreement, then click <strong>Next</strong>. </li>
- <li>On the following Installation window, click <strong>Finish</strong>. </li>
- <li>The ADT plugin is not digitally signed. Accept the installation anyway
- by clicking <strong>Install All</strong>. </li>
- <li>Restart Eclipse. </li>
-</ol>
-
-</td>
-<td>
-
-<!-- 3.4 steps -->
-<ol>
- <li>Start Eclipse, then select <strong>Help</strong> > <strong>Software Updates...</strong>.</li>
- <li>In the dialog that appears, click the <strong>Available Software</strong> tab. </li>
- <li>Click <strong>Add Site...</strong> </li>
- <li>Enter the Location:
- <pre>https://dl-ssl.google.com/android/eclipse/</pre>
- <p>If you have trouble aqcuiring the plugin, try using "http" in the Location URL,
- instead of "https" (https is preferred for security reasons).</p>
- <p>Click <strong>OK</strong>.</p></li>
- <li>Back in the Available Software view, you should see the plugin listed by the URL,
- with "Developer Tools" nested within it. Select the checkbox next to
- Developer Tools and click <strong>Install...</strong></li>
- <li>On the subsequent Install window, "Android DDMS" and "Android Development Tools"
- should both be checked. Click <strong>Next</strong>. </li>
- <li>Read and accept the license agreement, then click <strong>Finish</strong>.</li>
- <li>Restart Eclipse. </li>
-</ol>
-
-</td>
-</tr>
-</table>
-
-<p>Now modify your Eclipse preferences to point to the Android SDK directory:</p>
-<ol>
- <li>Select <strong>Window</strong> > <strong>Preferences...</strong> to open the Preferences
- panel (Mac: <strong>Eclipse</strong> > <strong>Preferences</strong>).</li>
- <li>Select <strong>Android</strong> from the left panel. </li>
- <li>For the <em>SDK Location</em> in the main panel, click <strong>Browse...</strong> and
-locate your downloaded SDK directory. </li>
- <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li>
-</ol>
-
-<p>Done! If you haven't encountered any problems, then you're ready to
-begin developing Android applications. See the
-<a href="#NextSteps">Next Steps</a> section for suggestions on how to start. </p>
-
-
-<h3 id="Troubleshooting">Troubleshooting ADT Installation</h3>
-<p>
-If you are having trouble downloading the ADT plugin after following the steps above, here are
-some suggestions: </p>
-
-<ul>
- <li>If Eclipse can not find the remote update site containing the ADT plugin, try changing
- the remote site URL to use http, rather than https. That is, set the Location for the remote site to:
- <pre>http://dl-ssl.google.com/android/eclipse/</pre></li>
- <li>If you are behind a firewall (such as a corporate firewall), make
- sure that you have properly configured your proxy settings in Eclipse.
- In Eclipse 3.3/3.4, you can configure proxy information from the main
- Eclipse menu in <strong>Window</strong> (on Mac, <strong>Eclipse</strong>) >
- <strong>Preferences</strong> > <strong>General</strong> >
- <strong>Network Connections</strong>.</li>
-</ul>
-<p>
-If you are still unable to use Eclipse to download the ADT plugin as a remote update site, you
-can download the ADT zip file to your local machine and manually install the it:
-</p>
-<ol>
- <li><a href="http://developer.android.com/sdk/preview/index.html">Download the ADT Plugin zip file</a> (do not unpack it).</li>
- <li>Follow steps 1 and 2 in the default install instructions (above).</li>
- <li>In Eclipse 3.3, click <strong>New Archive Site...</strong>. <br/>
- In Eclipse 3.4, click <strong>Add Site...</strong>, then <strong>Archive...</strong></li>
- <li>Browse and select the downloaded zip file.</li>
- <li>Follow the remaining procedures, above, starting from steps 5.</li>
-</ol>
-<p>To update your plugin once you've installed using the zip file, you will have to
-follow these steps again instead of the default update instructions.</p>
-
-<h4>Other install errors</h4>
-
-<p>Note that there are features of ADT that require some optional
-Eclipse components (for example, WST). If you encounter an error when
-installing ADT, your Eclipse installion might not include these components.
-For information about how to quickly add the necessary components to your
-Eclipse installation, see the troubleshooting topic
-<a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT
-Installation Error: "requires plug-in org.eclipse.wst.sse.ui"</a>.</p>
-
-<h4>For Linux users</h4>
-<p>If you encounter this error when installing the ADT Plugin for Eclipse:
-<pre>
-An error occurred during provisioning.
-Cannot connect to keystore.
-JKS</pre>
-<p>
-...then your development machine lacks a suitable Java VM. Installing Sun
-Java 6 will resolve this issue and you can then reinstall the ADT
-Plugin.</p>
-
-
-<h2 id="NextSteps">Next Steps</h2>
-<p>Once you have completed installation, you are ready to
-begin developing applications. Here are a few ways you can get started: </p>
-
-<p><strong>Learn about Android</strong></p>
-<ul>
- <li>Take a look at the <a href="{@docRoot}guide/index.html">Dev
- Guide</a> and the types of information it provides</li>
- <li>Read an introduction to Android as a platform in <a
- href="{@docRoot}guide/basics/what-is-android.html">What is
- Android?</a></li>
- <li>Learn about the Android framework and how applications run on it in
- <a href="{@docRoot}guide/topics/fundamentals.html">Application
- Fundamentals</a></li>
- <li>Take a look at the Android framework API specification in the <a
- href="{@docRoot}reference/packages.html">Reference</a> tab</li>
-</ul>
-
-<p><strong>Explore the SDK</strong></p>
-<ul>
- <li>Get an overview of the <a
- href="{@docRoot}guide/developing/tools/index.html">development
- tools</a> that are available to you</li>
- <li>Read how to develop <a
- href="{@docRoot}guide/developing/eclipse-adt.html">in Eclipse/ADT</a> or
- <a href="{@docRoot}guide/developing/other-ide.html">in other IDEs</a>
- </li>
-</ul>
-
-<p><strong>Explore some code</strong></p>
-<ul>
- <li>Set up a <a href="{@docRoot}guide/tutorials/hello-world.html">Hello
- World application</a> (highly recommended, especially for Eclipse users)</li>
- <li>Follow the <a href="{@docRoot}guide/tutorials/notepad/index.html">
- Notepad Tutorial</a> to build a full Android application </li>
- <li>Create a new project for one of the other sample applications
- included in <code><em><sdk></em>/platforms/<em><platfrom></em>/samples</code>,
- then compile and run it in your development environment</li>
-</ul>
-
-<p><strong>Visit the Android developer groups</strong></p>
-<ul>
- <li>Take a look at the <a
- href="{@docRoot}community/index.html">Community</a> tab to see a list of
- Android developers groups. In particular, you might want to look at the
- <a href="http://groups.google.com/group/android-developers">Android
- Developers</a> group to get a sense for what the Android developer
- community is like.</li>
-</ul>
-
-
-<h2 id="InstallationNotes">Installation Notes</h2>
-
-<h3>Ubuntu Linux Notes</h3>
-
-<ul>
- <li>If you need help installing and configuring Java on your
- development machine, you might find these resources helpful:
- <ul>
- <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/Java </a></li>
- <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/JavaInstallation</a></li>
- </ul>
- </li>
- <li>Here are the steps to install Java and Eclipse, prior to installing
- the Android SDK and ADT Plugin.
- <ol>
- <li>If you are running a 64-bit distribution on your development
- machine, you need to install the <code>ia32-libs</code> package using
- <code>apt-get:</code>:
- <pre>apt-get install ia32-libs</pre>
- </li>
- <li>Next, install Java: <pre>apt-get install sun-java6-bin</pre></li>
- <li>The Ubuntu package manager does not currently offer an Eclipse 3.3
- version for download, so we recommend that you download Eclipse from
- eclipse.org (<a
- href="http://www.eclipse.org/downloads/">http://www.eclipse.org/
- downloads/</a>). A Java or RCP version of Eclipse is recommended.</li>
- <li>Follow the steps given in previous sections to install the SDK
- and the ADT plugin. </li>
- </ol>
- </li>
-</ul>
-
-<h3>Other Linux Notes</h3>
-
-<ul>
- <li>If JDK is already installed on your development computer, please
- take a moment to make sure that it meets the version requirements listed
- in the <a href="{@docRoot}sdk/{@sdkCurrent}/requirements.html">System Requirements</a>.
- In particular, note that some Linux distributions may include JDK 1.4 or Gnu
- Compiler for Java, both of which are not supported for Android development.</li>
-</ul>
-
-
-
diff --git a/docs/html/sdk/preview/requirements.jd b/docs/html/sdk/preview/requirements.jd
index 15731e0..1e6b26b 100644
--- a/docs/html/sdk/preview/requirements.jd
+++ b/docs/html/sdk/preview/requirements.jd
@@ -1,45 +1,5 @@
-page.title=System Requirements
-sdk.version=1.6
-sdk.preview=true
+sdk.redirect=true
+
@jd:body
-<p>The sections below describe the system and software requirements for developing
-Android applications using the Android SDK tools included in Android
-<?cs var:sdk.version ?> SDK<?cs if:sdk.rel.id ?>, Release <?cs var:sdk.rel.id ?><?cs /if ?>. </p>
-<h3>Supported Operating Systems</h3>
-<ul>
- <li>Windows XP (32-bit) or Vista (32- or 64-bit)</li>
- <li>Mac OS X 10.4.8 or later (x86 only)</li>
- <li>Linux (tested on Linux Ubuntu Dapper Drake)</li>
-</ul>
-
-<h3>Supported Development Environments</h3>
-<ul>
- <li>Eclipse IDE
- <ul>
- <li><a href="http://www.eclipse.org/downloads/">Eclipse</a> 3.3 (Europa), 3.4 (Ganymede), 3.5 (Galileo)
- <ul>
- <li><strong>Note:</strong> Eclipse 3.3 has not been fully tested with ADT 0.9.2 and support can no longer be guaranteed. We suggest you upgrade to
- Eclipse 3.4 or 3.5.</li>
- <li>Recommended Eclipse IDE packages: Eclipse IDE for Java EE Developers, Eclipse IDE for Java Developers, Eclipse for RCP/Plug-in Developers</li>
- <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included in most Eclipse IDE packages) </li>
- <li>Eclipse Classic IDE package is not supported.</li>
- </ul>
- </li>
- <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li>
- <li><a href="installing.html#installingplugin">Android Development Tools plugin</a> (optional)</li>
- <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li>
- </ul>
- </li>
- <li>Other development environments or IDEs
- <ul>
- <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li>
- <li><a href="http://ant.apache.org/">Apache Ant</a> 1.6.5 or later for Linux and Mac, 1.7 or later for Windows</li>
- <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li>
- </ul>
- </li>
-</ul>
-
-<p class="note"><strong>Note:</strong> If JDK is already installed on your development computer, please take a moment to make sure that it meets the version requirements listed above. In
-particular, note that some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are not supported for Android development. </p>
\ No newline at end of file
diff --git a/docs/html/sdk/preview/upgrading.jd b/docs/html/sdk/preview/upgrading.jd
index da2eb25..1e6b26b 100644
--- a/docs/html/sdk/preview/upgrading.jd
+++ b/docs/html/sdk/preview/upgrading.jd
@@ -1,258 +1,5 @@
-page.title=Upgrading the SDK
-sdk.version=1.6
-sdk.preview=true
+sdk.redirect=true
+
@jd:body
-<div id="qv-wrapper">
-<div id="qv">
-
- <h2>Upgrading the SDK</h2>
- <ul>
- <li>ADT 0.9 / 0.9.1 is not compatible with the Android 1.6 Early Look SDK. You must upgrade
- ADT to 0.9.2.</li>
- <li>The Early Look SDK uses a special provisional API Level, "Donut", which is required
- to compile against the new Donut platform.</li>
- </ul>
-
- <h2>In this document</h2>
- <ol>
- <li><a href="#Install">Install the SDK</a></li>
- <li><a href="#UpdateAdt">Update Your Eclipse ADT Plugin</a></li>
- <li><a href="#RunYourApps">Run Your Applications</a></li>
- <li><a href="#ConvertYourApps">Convert Your Applications</a></li>
- </ol>
-
- <h2>Migrating references</h2>
- <ol>
- <li><a href="{@docRoot}sdk/api_diff/4/changes.html">Android 1.6 Early Look API Differences</a></li>
- </ol>
-
-</div>
-</div>
-
-<p>This document describes how to move your development environment and existing
-Android applications from an Android 1.5 SDK to the Android 1.6 Early Look SDK.
-If you are migrating applications from an SDK older than 1.5, please also read the upgrading
-document available in the Android 1.5 SDK package.</p>
-
-<p>There are several compelling reasons to upgrade, such as new SDK tools
-that make developing more efficient and new APIs that allow you to expand the feature-set
-of your applications. However, even if you or your applications don't require these enhancements,
-it's important that you upgrade to ensure that your applications run properly on the upcoming
-Android platform.</p>
-
-<p>The Android 1.6 platform will soon be deployable to devices around the world.
-If you have already released Android applications to the public, you should
-test the forward-compatibility of your applications on the latest version of the platform
-as soon as possible. It's unlikely that you'll encounter breakage in your applications, but
-in the interest of maintaining the best user experience, you should take no risks.
-So, please install the new Android SDK and test your applications on the new platform.</p>
-
-<!-- NOT AVAILABLE FOR THE PREVIEW
-<p>For more information on new SDK features and system changes,
-see the <a href="{@docRoot}sdk/android-1.5.html">Android 1.5 Version Notes</a>.</p>
--->
-
-<h2 id="Install">Install the SDK</h2>
-
-<!--
-<p>If you haven't yet downloaded the SDK, <a href="index.html">download from here</a>
-and unpack it into a safe location.</p>
--->
-<p>Now that you have the Android 1.6 Early Look SDK,
-you need to perform some of the regular installation steps.</p>
-
-
-<p>If you had previously setup your <code>PATH</code> variable to point to the SDK tools directory,
-then you need to update it to point to the new SDK. For example, for a
-<code>.bashrc</code> or <code>.bash_profile</code> file:</p>
-<pre>export PATH=$PATH:<em><your_sdk_dir></em>/tools</pre>
-
-
-<h2 id="UpdateAdt">Update Your Eclipse ADT Plugin</h2>
-
-<p>If you don't use Eclipse for development,
-skip to <a href="#RunYourApps">Run Your Applications</a>.</p>
-
-<!--
-<p><em>If you installed ADT 0.9.2 with the Android 1.6 Early Look SDK, there have been
-additional changes, so please continue with this guide and update ADT.</em></p>
--->
-
-<p>A new ADT plugin (version 0.9.2) is required for the Android 1.6 Early Look SDK.
-With ADT 0.9.2, you can still compile your applications against
-multiple platform versions, such as Android 1.5. However, previous versions
-of ADT will not work with the Android 1.6 Early Look SDK, so you must upgrade
-to ADT 0.9.2.</p>
-
-<p>If you're currently using a version of ADT <em>older</em> than version 0.9, then you must
-uninstall ADT before you proceed (read how to
-<a href="http://developer.android.com/sdk/1.5_r3/upgrading.html#uninstallAdt">Uninstall
-your previous ADT plugin</a>). If you currently have version 0.9 or 0.9.1, then you don't
-need to uninstall and can continue with the procedure below.</p>
-
-<h3 id="installAdt">Install the 0.9.2 ADT plugin</h3>
-
-<p>To install the new ADT plugin, follow the steps below for your respective version of Eclipse.</p>
-
-<table style="font-size:100%">
-<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr>
-<tr>
-<td width="50%">
-<!-- 3.3 steps -->
-<ol>
- <li>Select <strong>Help</strong> > <strong>Software Updates</strong> >
- <strong>Find and Install</strong>. </li>
- <li>Select <strong>Search for new features to install</strong>.</li>
- <li>Select the Android plugin entry by checking the box next to it,
- then click <strong>Finish</strong>.
- <p>(Your original entry for the plugin should still be here. If not, see the guide
- to <a href="installing.html#installingplugin">Installing the ADT Plugin</a>.)
- </p></li>
- <li>In the results, expand the entry for the Android plugin and
- be sure that "Developer Tools" is checked, then click <strong>Next</strong>.
- (This will install "Android DDMS" and "Android Development Tools".)</li>
- <li>Read and accept the license agreement, then click <strong>Next</strong>.
- <li>In the next window, click <strong>Finish</strong> to start installation.</li>
- <li>The ADT plugin is not digitally signed. Accept the installation anyway by clicking
- <strong>Install All</strong>.</li>
- <li>Restart Eclipse.</li>
-</ol>
-</td>
-<td>
-<!-- 3.4 steps -->
-<ol>
- <li>Select <strong>Help</strong> > <strong>Software Updates</strong>.</li>
- <li>Select the <strong>Available Software</strong> tab.</li>
- <li>Expand the entry for the Andriod plugin (may be listed as the location URL)
- and select "Developer Tools" by checking the box next to it, then click
- <strong>Install</strong>.</li>
- <li>On the next window, "Android DDMS" and "Android Development Tools"
- should both be checked. Click <strong>Finish</strong>.</li>
- <li>Restart Eclipse.</li>
-</ol>
-</td>
-</tr>
-</table>
-
-<p>If you encounter problems with this update procedure, try performing a fresh installation.
-Ensure your current ADT is fully uninstalled and then
-follow the guide to <a href="installing.html#InstallingADT">Installing the ADT Plugin
-for Eclipse</a>.</p>
-
-<h3 id="updateEclipsePrefs">Update your Eclipse SDK Preferences</h3>
-
-<p>The last step is to update your Eclipse preferences to point to the new SDK directory:</p>
-<ol>
- <li>Select <strong>Window</strong> > <strong>Preferences</strong> to open the Preferences
- panel (Mac: <strong>Eclipse</strong> > <strong>Preferences</strong>).</li>
- <li>Select <strong>Android</strong> from the left panel.</li>
- <li>For the SDK Location, click <strong>Browse</strong>
- and locate your SDK directory.</li>
- <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li>
-</ol>
-
-
-<h2 id="RunYourApps">Run Your Applications</h2>
-
-<p>Now that you have installed the Android 1.6 Early Look SDK, we encourage you
-to run each of your applications in an instance
-of the emulator that's running the new Android 1.6 system image. It's possible (however, unlikely)
-that you'll encounter unexpected behavior in your application when you run your applications on
-the new system image. Whether you believe your application will be affected by
-platform changes or not, it's very important that you test the application's
-forward-compatibility.</p>
-
-<p>To test forward-compatibility, simply run your application, as-is, on an instance of the Android
-Emulator that uses an AVD targeted to "Android Donut (Preview)":</p>
-
-<ol>
- <li>Make no changes to your application code.</li>
- <li>Create a new AVD that's targeted to the "Donut" platform.</li>
- <li>Launch your application in an emulator running the new AVD.</li>
- <li>Perform normal testing on your application to ensure everything works as expected.</li>
-</ol>
-
-<p>For more information on creating an AVD and launching your application refer to the
-<a href="{@docRoot}guide/developing/eclipse-adt.html#Running">Eclipse guide to
-Running Your Application</a> or the
-<a href="{@docRoot}guide/developing/other-ide.html#Running">Ant guide to
-Running Your Application</a>, depending on your development environment.</p>
-
-
-<h2 id="ConvertYourApps">Convert Your Applications</h2>
-
-<p>If you want to fully utilize new APIs introduced with the Android 1.6 Early Look SDK,
-then you'll need to convert your application to compile against the new "Donut" platform.</p>
-
-<p>First, you need to change the value of the <code>minSdkVersion</code> attribute in
-the <code><uses-sdk></code> manifest element. While
-running your application against the Donut platform included with the Early Look SDK, you
-<strong>must</strong> set the <code>minSdkVersion</code> value to "Donut". For example:</p>
-
-<pre>
-<manifest>
- ...
- <uses-sdk android:minSdkVersion="Donut" />
- ...
-</manifest>
-</pre>
-
-<p>This value is required only while compiling against the Donut platform included with
-the Android 1.6 Early Look SDK. Once the final SDK is made
-available for Android 1.6, you will need to change this value.
-For more information, read about the <a href="index.html#provisional">Framework API and
-Provisional API Level</a>.</p>
-
-<p>Once you've changed the <code>minSdkVersion</code> value in your application's manifest,
-continue with the procedures below to convert your applications.</p>
-
-<h3 id="EclipseUsers">Eclipse users</h3>
-
-<ol>
- <li>Right-click on the individual project (in the Package Explorer)
- and select <strong>Properties</strong>.</li>
- <li>In the properties, open the Android panel and select a new Project Build Target.
- Select "Android Donut (Preview)" to target the new
- platform (or "Google APIs" with the "Donut" platform if your application uses the Maps APIs).</li>
- <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li>
-</ol>
-
- <p>Remember that you must create an AVD that targets the same platform in order to run the emulator.
- Continue with the
- <a href="{@docRoot}guide/developing/eclipse-adt.html#Running">Eclipse guide to
- Running Your Application</a>. During the procedure to Running Your Application, select a "deployment
- target" or the AVD that includes the "Donut" platform. If your application utilizes the Google Maps APIs (i.e.,
- MapView), be certain to select a target that includes the Google APIs.</p>
-
-
-<h3 id="AntUsers">Ant users</h3>
-
- <p>Use the <code>android</code> tool (located in <code><em>your_sdk</em>/tools/</code>)
- to create a new <code>build.xml</code> that references
- the new platform target. To see a list of available targets, execute:</p>
-
- <pre>android list targets</pre>
-
- <p>Select the target <code>id</code> that corresponds to the "Donut" platform and pass it with the
- <code>--target</code> parameter when updating your project. For example:</p>
-
- <pre>android update project --path /path/to/my-project --target 2</pre>
-
-<p>Remember that you must create an Android Virtual Device (AVD) that's targeted to the
- same platform before you can run the updated application an instance
- of the emulator. Please continue with the
- <a href="{@docRoot}guide/developing/other-ide.html#Running">Ant guide to
- Running Your Application</a>. During the procedure to Running Your Application, select a "deployment
- target" for the AVD that includes the "Donut" platform.
- If your application utilizes the Google Maps APIs (i.e.,
- MapView), be certain to select a target that includes the Google APIs.</p>
-
-
-<div class="special">
-<p>If you have additional trouble updating your code, visit the
-<a href="http://groups.google.com/group/android-developers">Android Developers Group</a>
-to seek help from other Android developers.</p>
-</div>
-
diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs
index c08d75e..64af012 100644
--- a/docs/html/sdk/sdk_toc.cs
+++ b/docs/html/sdk/sdk_toc.cs
@@ -74,6 +74,7 @@
<span class="zh-TW">系統影像版本資訊</span>
</h2>
<ul>
+ <li><a href="<?cs var:toroot ?>sdk/android-1.6.html">Android 1.6 Version Notes</a></li>
<li><a href="<?cs var:toroot ?>sdk/android-1.5.html">Android 1.5 Version Notes</a></li>
<li><a href="<?cs var:toroot ?>sdk/android-1.1.html">Android 1.1 Version Notes</a></li>
</ul>
@@ -96,6 +97,7 @@
<span class="zh-TW">較舊的 SDK 發行版本</span>
</h2>
<ul>
+ <li><a href="<?cs var:toroot ?>sdk/1.5_r3/index.html">Android 1.5 SDK, r3</a></li>
<li><a href="<?cs var:toroot ?>sdk/1.1_r1/index.html">Android 1.1 SDK, r1</a></li>
<li><a href="<?cs var:toroot ?>sdk/1.0_r2/index.html">Android 1.0 SDK, r2</a></li>
<li><a href="<?cs var:toroot ?>sdk/older_releases.html">Other Releases</a></li>
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 536f71c..7749ad34 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -110,9 +110,12 @@
}
public void data(Object o) {
- mRS.nAllocationDataFromObject(mID, mType, o);
+ mRS.nAllocationSubDataFromObject(mID, mType, 0, o);
}
+ public void subData(int offset, Object o) {
+ mRS.nAllocationSubDataFromObject(mID, mType, offset, o);
+ }
public class Adapter1D extends BaseObj {
Adapter1D(int id, RenderScript rs) {
@@ -206,35 +209,24 @@
static public Allocation createSized(RenderScript rs, Element e, int count)
throws IllegalArgumentException {
- int id;
- if(e.mIsPredefined) {
- id = rs.nAllocationCreatePredefSized(e.mPredefinedID, count);
- } else {
- id = rs.nAllocationCreateSized(e.mID, count);
- if(id == 0) {
- throw new IllegalStateException("Bad element.");
- }
+ int id = rs.nAllocationCreateSized(e.mID, count);
+ if(id == 0) {
+ throw new IllegalStateException("Bad element.");
}
return new Allocation(id, rs, null);
}
static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
throws IllegalArgumentException {
- if(!dstFmt.mIsPredefined) {
- throw new IllegalStateException("Attempting to allocate a bitmap with a non-static element.");
- }
- int id = rs.nAllocationCreateFromBitmap(dstFmt.mPredefinedID, genMips, b);
+ int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b);
return new Allocation(id, rs, null);
}
static public Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
throws IllegalArgumentException {
- if(!dstFmt.mIsPredefined) {
- throw new IllegalStateException("Attempting to allocate a bitmap with a non-static element.");
- }
- int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mPredefinedID, genMips, b);
+ int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b);
return new Allocation(id, rs, null);
}
@@ -247,10 +239,10 @@
is = res.openRawResource(id, value);
int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
- int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mPredefinedID, genMips,
+ int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips,
asset);
- return new Allocation(allocationId, rs, null);
+ return new Allocation(allocationId, rs, null);
} catch (Exception e) {
// Ignore
} finally {
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index 0ca112c..04c36fd 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -23,62 +23,171 @@
*
**/
public class Element extends BaseObj {
- final int mPredefinedID;
- final boolean mIsPredefined;
- final int mSize;
+ int mSize;
+ Entry[] mEntries;
- public static final Element USER_U8 = new Element(0, 1);
- public static final Element USER_I8 = new Element(1, 1);
- public static final Element USER_U16 = new Element(2, 2);
- public static final Element USER_I16 = new Element(3, 2);
- public static final Element USER_U32 = new Element(4, 4);
- public static final Element USER_I32 = new Element(5, 4);
- public static final Element USER_FLOAT = new Element(6, 4);
+ static class Entry {
+ Element mElement;
+ Element.DataType mType;
+ Element.DataKind mKind;
+ boolean mIsNormalized;
+ int mBits;
+ String mName;
- public static final Element A_8 = new Element(7, 1);
- public static final Element RGB_565 = new Element(8, 2);
- public static final Element RGB_888 = new Element(11, 2);
- public static final Element RGBA_5551 = new Element(9, 2);
- public static final Element RGBA_4444 = new Element(10, 2);
- public static final Element RGBA_8888 = new Element(12, 4);
+ Entry(Element e, int bits) {
+ mElement = e;
+ int mBits = bits;
+ }
- public static final Element INDEX_16 = new Element(13, 2);
- public static final Element INDEX_32 = new Element(14, 2);
- public static final Element XY_F32 = new Element(15, 8);
- public static final Element XYZ_F32 = new Element(16, 12);
- public static final Element ST_XY_F32 = new Element(17, 16);
- public static final Element ST_XYZ_F32 = new Element(18, 20);
- public static final Element NORM_XYZ_F32 = new Element(19, 24);
- public static final Element NORM_ST_XYZ_F32 = new Element(20, 32);
-
- void initPredef(RenderScript rs) {
- mID = rs.nElementGetPredefined(mPredefinedID);
+ Entry(DataType dt, DataKind dk, boolean isNorm, int bits, String name) {
+ mType = dt;
+ mKind = dk;
+ mIsNormalized = isNorm;
+ mBits = bits;
+ mName = name;
+ }
}
- static void init(RenderScript rs) {
- USER_U8.initPredef(rs);
- USER_I8.initPredef(rs);
- USER_U16.initPredef(rs);
- USER_I16.initPredef(rs);
- USER_U32.initPredef(rs);
- USER_I32.initPredef(rs);
- USER_FLOAT.initPredef(rs);
+ public static final Element USER_U8 = new Element();
+ public static final Element USER_I8 = new Element();
+ public static final Element USER_U16 = new Element();
+ public static final Element USER_I16 = new Element();
+ public static final Element USER_U32 = new Element();
+ public static final Element USER_I32 = new Element();
+ public static final Element USER_FLOAT = new Element();
- A_8.initPredef(rs);
- RGB_565.initPredef(rs);
- RGB_888.initPredef(rs);
- RGBA_5551.initPredef(rs);
- RGBA_4444.initPredef(rs);
- RGBA_8888.initPredef(rs);
+ public static final Element A_8 = new Element();
+ public static final Element RGB_565 = new Element();
+ public static final Element RGB_888 = new Element();
+ public static final Element RGBA_5551 = new Element();
+ public static final Element RGBA_4444 = new Element();
+ public static final Element RGBA_8888 = new Element();
- INDEX_16.initPredef(rs);
- INDEX_32.initPredef(rs);
- XY_F32.initPredef(rs);
- XYZ_F32.initPredef(rs);
- ST_XY_F32.initPredef(rs);
- ST_XYZ_F32.initPredef(rs);
- NORM_XYZ_F32.initPredef(rs);
- NORM_ST_XYZ_F32.initPredef(rs);
+ public static final Element INDEX_16 = new Element();
+ public static final Element XY_F32 = new Element();
+ public static final Element XYZ_F32 = new Element();
+ public static final Element ST_XY_F32 = new Element();
+ public static final Element ST_XYZ_F32 = new Element();
+ public static final Element NORM_XYZ_F32 = new Element();
+ public static final Element NORM_ST_XYZ_F32 = new Element();
+
+ static void initPredefined(RenderScript rs) {
+ USER_U8.mEntries = new Entry[1];
+ USER_U8.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 8, null);
+ USER_U8.init(rs);
+
+ USER_I8.mEntries = new Entry[1];
+ USER_I8.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 8, null);
+ USER_I8.init(rs);
+
+ USER_U16.mEntries = new Entry[1];
+ USER_U16.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 16, null);
+ USER_U16.init(rs);
+
+ USER_I16.mEntries = new Entry[1];
+ USER_I16.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 16, null);
+ USER_I16.init(rs);
+
+ USER_U32.mEntries = new Entry[1];
+ USER_U32.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.USER, false, 32, null);
+ USER_U32.init(rs);
+
+ USER_I32.mEntries = new Entry[1];
+ USER_I32.mEntries[0] = new Entry(DataType.SIGNED, DataKind.USER, false, 32, null);
+ USER_I32.init(rs);
+
+ USER_FLOAT.mEntries = new Entry[1];
+ USER_FLOAT.mEntries[0] = new Entry(DataType.FLOAT, DataKind.USER, false, 32, null);
+ USER_FLOAT.init(rs);
+
+ A_8.mEntries = new Entry[1];
+ A_8.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 8, "a");
+ A_8.init(rs);
+
+ RGB_565.mEntries = new Entry[3];
+ RGB_565.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 5, "r");
+ RGB_565.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 6, "g");
+ RGB_565.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 5, "b");
+ RGB_565.init(rs);
+
+ RGB_888.mEntries = new Entry[3];
+ RGB_888.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 8, "r");
+ RGB_888.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 8, "g");
+ RGB_888.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 8, "b");
+ RGB_888.init(rs);
+
+ RGBA_5551.mEntries = new Entry[4];
+ RGBA_5551.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 5, "r");
+ RGBA_5551.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 5, "g");
+ RGBA_5551.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 5, "b");
+ RGBA_5551.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 1, "a");
+ RGBA_5551.init(rs);
+
+ RGBA_4444.mEntries = new Entry[4];
+ RGBA_4444.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 4, "r");
+ RGBA_4444.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 4, "g");
+ RGBA_4444.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 4, "b");
+ RGBA_4444.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 4, "a");
+ RGBA_4444.init(rs);
+
+ RGBA_8888.mEntries = new Entry[4];
+ RGBA_8888.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.RED, true, 8, "r");
+ RGBA_8888.mEntries[1] = new Entry(DataType.UNSIGNED, DataKind.GREEN, true, 8, "g");
+ RGBA_8888.mEntries[2] = new Entry(DataType.UNSIGNED, DataKind.BLUE, true, 8, "b");
+ RGBA_8888.mEntries[3] = new Entry(DataType.UNSIGNED, DataKind.ALPHA, true, 8, "a");
+ RGBA_8888.init(rs);
+
+ INDEX_16.mEntries = new Entry[1];
+ INDEX_16.mEntries[0] = new Entry(DataType.UNSIGNED, DataKind.INDEX, false, 16, "index");
+ INDEX_16.init(rs);
+
+ XY_F32.mEntries = new Entry[2];
+ XY_F32.mEntries[0] = new Entry(DataType.FLOAT, DataKind.X, false, 32, "x");
+ XY_F32.mEntries[1] = new Entry(DataType.FLOAT, DataKind.Y, false, 32, "y");
+ XY_F32.init(rs);
+
+ XYZ_F32.mEntries = new Entry[3];
+ XYZ_F32.mEntries[0] = new Entry(DataType.FLOAT, DataKind.X, false, 32, "x");
+ XYZ_F32.mEntries[1] = new Entry(DataType.FLOAT, DataKind.Y, false, 32, "y");
+ XYZ_F32.mEntries[2] = new Entry(DataType.FLOAT, DataKind.Z, false, 32, "z");
+ XYZ_F32.init(rs);
+
+ ST_XY_F32.mEntries = new Entry[4];
+ ST_XY_F32.mEntries[0] = new Entry(DataType.FLOAT, DataKind.S, false, 32, "s");
+ ST_XY_F32.mEntries[1] = new Entry(DataType.FLOAT, DataKind.T, false, 32, "t");
+ ST_XY_F32.mEntries[2] = new Entry(DataType.FLOAT, DataKind.X, false, 32, "x");
+ ST_XY_F32.mEntries[3] = new Entry(DataType.FLOAT, DataKind.Y, false, 32, "y");
+ ST_XY_F32.init(rs);
+
+ ST_XYZ_F32.mEntries = new Entry[5];
+ ST_XYZ_F32.mEntries[0] = new Entry(DataType.FLOAT, DataKind.S, false, 32, "s");
+ ST_XYZ_F32.mEntries[1] = new Entry(DataType.FLOAT, DataKind.T, false, 32, "t");
+ ST_XYZ_F32.mEntries[2] = new Entry(DataType.FLOAT, DataKind.X, false, 32, "x");
+ ST_XYZ_F32.mEntries[3] = new Entry(DataType.FLOAT, DataKind.Y, false, 32, "y");
+ ST_XYZ_F32.mEntries[4] = new Entry(DataType.FLOAT, DataKind.Z, false, 32, "z");
+ ST_XYZ_F32.init(rs);
+
+ NORM_XYZ_F32.mEntries = new Entry[6];
+ NORM_XYZ_F32.mEntries[0] = new Entry(DataType.FLOAT, DataKind.NX, false, 32, "nx");
+ NORM_XYZ_F32.mEntries[1] = new Entry(DataType.FLOAT, DataKind.NY, false, 32, "ny");
+ NORM_XYZ_F32.mEntries[2] = new Entry(DataType.FLOAT, DataKind.NZ, false, 32, "nz");
+ NORM_XYZ_F32.mEntries[3] = new Entry(DataType.FLOAT, DataKind.X, false, 32, "x");
+ NORM_XYZ_F32.mEntries[4] = new Entry(DataType.FLOAT, DataKind.Y, false, 32, "y");
+ NORM_XYZ_F32.mEntries[5] = new Entry(DataType.FLOAT, DataKind.Z, false, 32, "z");
+ NORM_XYZ_F32.init(rs);
+
+ NORM_ST_XYZ_F32.mEntries = new Entry[8];
+ NORM_ST_XYZ_F32.mEntries[0] = new Entry(DataType.FLOAT, DataKind.NX, false, 32, "nx");
+ NORM_ST_XYZ_F32.mEntries[1] = new Entry(DataType.FLOAT, DataKind.NY, false, 32, "ny");
+ NORM_ST_XYZ_F32.mEntries[2] = new Entry(DataType.FLOAT, DataKind.NZ, false, 32, "nz");
+ NORM_ST_XYZ_F32.mEntries[3] = new Entry(DataType.FLOAT, DataKind.S, false, 32, "s");
+ NORM_ST_XYZ_F32.mEntries[4] = new Entry(DataType.FLOAT, DataKind.T, false, 32, "t");
+ NORM_ST_XYZ_F32.mEntries[5] = new Entry(DataType.FLOAT, DataKind.X, false, 32, "x");
+ NORM_ST_XYZ_F32.mEntries[6] = new Entry(DataType.FLOAT, DataKind.Y, false, 32, "y");
+ NORM_ST_XYZ_F32.mEntries[7] = new Entry(DataType.FLOAT, DataKind.Z, false, 32, "z");
+ NORM_ST_XYZ_F32.init(rs);
+
+ rs.nInitElements(A_8.mID, RGBA_4444.mID, RGBA_8888.mID, RGB_565.mID);
}
@@ -121,27 +230,13 @@
}
}
-
- Element(int predef, int size) {
+ Element() {
super(null);
mID = 0;
- mPredefinedID = predef;
- mIsPredefined = true;
- mSize = size;
- }
-
- Element(int id, RenderScript rs, int size) {
- super(rs);
- mID = id;
- mPredefinedID = 0;
- mIsPredefined = false;
- mSize = size;
+ mSize = 0;
}
public void destroy() throws IllegalStateException {
- if(mIsPredefined) {
- throw new IllegalStateException("Attempting to destroy a predefined Element.");
- }
super.destroy();
}
@@ -166,27 +261,41 @@
return b.create();
}
+ static synchronized void internalCreate(RenderScript rs, Element e) {
+ rs.nElementBegin();
+ int bits = 0;
+ for (int ct=0; ct < e.mEntries.length; ct++) {
+ Entry en = e.mEntries[ct];
+ if(en.mElement != null) {
+ //rs.nElementAdd(en.mElement.mID);
+ } else {
+ int norm = 0;
+ if (en.mIsNormalized) {
+ norm = 1;
+ }
+ rs.nElementAdd(en.mKind.mID, en.mType.mID, norm, en.mBits, en.mName);
+ bits += en.mBits;
+ }
+ }
+ e.mID = rs.nElementCreate();
+ e.mSize = (bits + 7) >> 3;
+ }
+
+ void init(RenderScript rs) {
+ mRS = rs;
+ internalCreate(mRS, this);
+ }
+
public static class Builder {
RenderScript mRS;
Entry[] mEntries;
int mEntryCount;
- int mSizeBits;
-
- private class Entry {
- Element mElement;
- Element.DataType mType;
- Element.DataKind mKind;
- boolean mIsNormalized;
- int mBits;
- String mName;
- }
public Builder(RenderScript rs) {
mRS = rs;
mEntryCount = 0;
mEntries = new Entry[8];
- mSizeBits = 0;
}
void addEntry(Entry e) {
@@ -200,24 +309,13 @@
}
public Builder add(Element e) throws IllegalArgumentException {
- if(!e.mIsPredefined) {
- throw new IllegalArgumentException("add requires a predefined Element.");
- }
- Entry en = new Entry();
- en.mElement = e;
+ Entry en = new Entry(e, e.mSize * 8);
addEntry(en);
- mSizeBits += e.mSize * 8;
return this;
}
public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits, String name) {
- Entry en = new Entry();
- en.mType = dt;
- en.mKind = dk;
- en.mIsNormalized = isNormalized;
- en.mBits = bits;
- en.mName = name;
- mSizeBits += bits;
+ Entry en = new Entry(dt, dk, isNormalized, bits, name);
addEntry(en);
return this;
}
@@ -244,8 +342,8 @@
}
public Builder addFloatXY(String prefix) {
- add(DataType.FLOAT, DataKind.X, false, 32, prefix + "X");
- add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "Y");
+ add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x");
+ add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y");
return this;
}
@@ -257,9 +355,9 @@
}
public Builder addFloatXYZ(String prefix) {
- add(DataType.FLOAT, DataKind.X, false, 32, prefix + "X");
- add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "Y");
- add(DataType.FLOAT, DataKind.Z, false, 32, prefix + "Z");
+ add(DataType.FLOAT, DataKind.X, false, 32, prefix + "x");
+ add(DataType.FLOAT, DataKind.Y, false, 32, prefix + "y");
+ add(DataType.FLOAT, DataKind.Z, false, 32, prefix + "z");
return this;
}
@@ -270,8 +368,8 @@
}
public Builder addFloatST(String prefix) {
- add(DataType.FLOAT, DataKind.S, false, 32, prefix + "S");
- add(DataType.FLOAT, DataKind.T, false, 32, prefix + "T");
+ add(DataType.FLOAT, DataKind.S, false, 32, prefix + "s");
+ add(DataType.FLOAT, DataKind.T, false, 32, prefix + "t");
return this;
}
@@ -283,9 +381,9 @@
}
public Builder addFloatNorm(String prefix) {
- add(DataType.FLOAT, DataKind.NX, false, 32, prefix + "NX");
- add(DataType.FLOAT, DataKind.NY, false, 32, prefix + "NY");
- add(DataType.FLOAT, DataKind.NZ, false, 32, prefix + "NZ");
+ add(DataType.FLOAT, DataKind.NX, false, 32, prefix + "nx");
+ add(DataType.FLOAT, DataKind.NY, false, 32, prefix + "ny");
+ add(DataType.FLOAT, DataKind.NZ, false, 32, prefix + "nz");
return this;
}
@@ -294,8 +392,8 @@
return this;
}
- public Builder addFloatPointSize(String name) {
- add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, name);
+ public Builder addFloatPointSize(String prefix) {
+ add(DataType.FLOAT, DataKind.POINT_SIZE, false, 32, prefix + "pointSize");
return this;
}
@@ -307,9 +405,9 @@
}
public Builder addFloatRGB(String prefix) {
- add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "R");
- add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "G");
- add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "B");
+ add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "r");
+ add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "g");
+ add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "b");
return this;
}
@@ -322,10 +420,10 @@
}
public Builder addFloatRGBA(String prefix) {
- add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "R");
- add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "G");
- add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "B");
- add(DataType.FLOAT, DataKind.ALPHA, false, 32, prefix + "A");
+ add(DataType.FLOAT, DataKind.RED, false, 32, prefix + "r");
+ add(DataType.FLOAT, DataKind.GREEN, false, 32, prefix + "g");
+ add(DataType.FLOAT, DataKind.BLUE, false, 32, prefix + "b");
+ add(DataType.FLOAT, DataKind.ALPHA, false, 32, prefix + "a");
return this;
}
@@ -338,33 +436,19 @@
}
public Builder addUNorm8RGBA(String prefix) {
- add(DataType.UNSIGNED, DataKind.RED, true, 8, prefix + "R");
- add(DataType.UNSIGNED, DataKind.GREEN, true, 8, prefix + "G");
- add(DataType.UNSIGNED, DataKind.BLUE, true, 8, prefix + "B");
- add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, prefix + "A");
+ add(DataType.UNSIGNED, DataKind.RED, true, 8, prefix + "r");
+ add(DataType.UNSIGNED, DataKind.GREEN, true, 8, prefix + "g");
+ add(DataType.UNSIGNED, DataKind.BLUE, true, 8, prefix + "b");
+ add(DataType.UNSIGNED, DataKind.ALPHA, true, 8, prefix + "a");
return this;
}
- static synchronized Element internalCreate(RenderScript rs, Builder b) {
- rs.nElementBegin();
- for (int ct=0; ct < b.mEntryCount; ct++) {
- Entry en = b.mEntries[ct];
- if(en.mElement != null) {
- rs.nElementAddPredefined(en.mElement.mPredefinedID);
- } else {
- int norm = 0;
- if (en.mIsNormalized) {
- norm = 1;
- }
- rs.nElementAdd(en.mKind.mID, en.mType.mID, norm, en.mBits, en.mName);
- }
- }
- int id = rs.nElementCreate();
- return new Element(id, rs, (b.mSizeBits + 7) >> 3);
- }
-
public Element create() {
- return internalCreate(mRS, this);
+ Element e = new Element();
+ e.mEntries = new Entry[mEntryCount];
+ java.lang.System.arraycopy(mEntries, 0, e.mEntries, 0, mEntryCount);
+ e.init(mRS);
+ return e;
}
}
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 0f188f6..6f5b67e 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -57,6 +57,8 @@
}
}
+ native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
+
native int nDeviceCreate();
native void nDeviceDestroy(int dev);
native int nContextCreate(int dev, Surface sur, int ver, boolean useDepth);
@@ -78,10 +80,8 @@
native int nFileOpen(byte[] name);
native void nElementBegin();
- native void nElementAddPredefined(int predef);
native void nElementAdd(int kind, int type, int norm, int bits, String s);
native int nElementCreate();
- native int nElementGetPredefined(int predef);
native void nTypeBegin(int elementID);
native void nTypeAdd(int dim, int val);
@@ -90,7 +90,6 @@
native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs);
native int nAllocationCreateTyped(int type);
- native int nAllocationCreatePredefSized(int predef, int count);
native int nAllocationCreateSized(int elem, int count);
native int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp);
native int nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp);
@@ -106,7 +105,7 @@
native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
native void nAllocationRead(int id, int[] d);
native void nAllocationRead(int id, float[] d);
- native void nAllocationDataFromObject(int id, Type t, Object o);
+ native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o);
native void nTriangleMeshBegin(int vertex, int index);
native void nTriangleMeshAddVertex_XY (float x, float y);
@@ -203,7 +202,7 @@
// TODO: This should be protected by a lock
if(!mElementsInitialized) {
- Element.init(this);
+ Element.initPredefined(this);
mElementsInitialized = true;
}
}
@@ -227,7 +226,6 @@
}
public void triangleMeshBegin(Element vertex, Element index) {
- Log.e("rs", "vtx " + vertex.toString() + " " + vertex.mID + " " + vertex.mPredefinedID);
nTriangleMeshBegin(vertex.mID, index.mID);
}
diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java
index e66fb8a..5d87654 100644
--- a/graphics/java/android/renderscript/SimpleMesh.java
+++ b/graphics/java/android/renderscript/SimpleMesh.java
@@ -50,6 +50,13 @@
return Allocation.createTyped(mRS, mIndexType);
}
+ public Type getVertexType(int slot) {
+ return mVertexTypes[slot];
+ }
+
+ public Type getIndexType() {
+ return mIndexType;
+ }
public static class Builder {
RenderScript mRS;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 558146d..a94ccb1 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -58,6 +58,11 @@
static jfieldID gNativeBitmapID = 0;
static jfieldID gTypeNativeCache = 0;
+static RsElement g_A_8 = NULL;
+static RsElement g_RGBA_4444 = NULL;
+static RsElement g_RGBA_8888 = NULL;
+static RsElement g_RGB_565 = NULL;
+
static void _nInit(JNIEnv *_env, jclass _this)
{
gContextId = _env->GetFieldID(_this, "mContext", "I");
@@ -69,6 +74,13 @@
gTypeNativeCache = _env->GetFieldID(typeClass, "mNativeCache", "I");
}
+static void nInitElements(JNIEnv *_env, jobject _this, jint a8, jint rgba4444, jint rgba8888, jint rgb565)
+{
+ g_A_8 = reinterpret_cast<RsElement>(a8);
+ g_RGBA_4444 = reinterpret_cast<RsElement>(rgba4444);
+ g_RGBA_8888 = reinterpret_cast<RsElement>(rgba8888);
+ g_RGB_565 = reinterpret_cast<RsElement>(rgb565);
+}
// ---------------------------------------------------------------------------
@@ -167,13 +179,6 @@
rsElementBegin(con);
}
-static void
-nElementAddPredefined(JNIEnv *_env, jobject _this, jint predef)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nElementAddPredefined, con(%p), predef(%i)", con, predef);
- rsElementAddPredefined(con, (RsElementPredefined)predef);
-}
static void
nElementAdd(JNIEnv *_env, jobject _this, jint kind, jint type, jint norm, jint bits, jstring name)
@@ -198,14 +203,6 @@
return (jint)rsElementCreate(con);
}
-static jint
-nElementGetPredefined(JNIEnv *_env, jobject _this, jint predef)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nElementGetPredefined, con(%p) predef(%i)", con, predef);
- return (jint)rsElementGetPredefined(con, (RsElementPredefined)predef);
-}
-
// -----------------------------------
static void
@@ -328,14 +325,6 @@
}
static jint
-nAllocationCreatePredefSized(JNIEnv *_env, jobject _this, jint predef, jint count)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nAllocationCreatePredefSized, con(%p), predef(%i), count(%i)", con, predef, count);
- return (jint) rsAllocationCreatePredefSized(con, (RsElementPredefined)predef, count);
-}
-
-static jint
nAllocationCreateSized(JNIEnv *_env, jobject _this, jint e, jint count)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -359,24 +348,24 @@
rsAllocationUploadToBufferObject(con, (RsAllocation)a);
}
-static RsElementPredefined SkBitmapToPredefined(SkBitmap::Config cfg)
+static RsElement SkBitmapToPredefined(SkBitmap::Config cfg)
{
switch (cfg) {
case SkBitmap::kA8_Config:
- return RS_ELEMENT_A_8;
+ return g_A_8;
case SkBitmap::kARGB_4444_Config:
- return RS_ELEMENT_RGBA_4444;
+ return g_RGBA_4444;
case SkBitmap::kARGB_8888_Config:
- return RS_ELEMENT_RGBA_8888;
+ return g_RGBA_8888;
case SkBitmap::kRGB_565_Config:
- return RS_ELEMENT_RGB_565;
+ return g_RGB_565;
default:
break;
}
// If we don't have a conversion mark it as a user type.
LOGE("Unsupported bitmap type");
- return RS_ELEMENT_USER_U8;
+ return NULL;
}
static int
@@ -388,14 +377,13 @@
const SkBitmap& bitmap(*nativeBitmap);
SkBitmap::Config config = bitmap.getConfig();
- RsElementPredefined e = SkBitmapToPredefined(config);
-
- if (e != RS_ELEMENT_USER_U8) {
+ RsElement e = SkBitmapToPredefined(config);
+ if (e) {
bitmap.lockPixels();
const int w = bitmap.width();
const int h = bitmap.height();
const void* ptr = bitmap.getPixels();
- jint id = (jint)rsAllocationCreateFromBitmap(con, w, h, (RsElementPredefined)dstFmt, e, genMips, ptr);
+ jint id = (jint)rsAllocationCreateFromBitmap(con, w, h, (RsElement)dstFmt, e, genMips, ptr);
bitmap.unlockPixels();
return id;
}
@@ -414,14 +402,14 @@
SkBitmap::Config config = bitmap.getConfig();
- RsElementPredefined e = SkBitmapToPredefined(config);
+ RsElement e = SkBitmapToPredefined(config);
- if (e != RS_ELEMENT_USER_U8) {
+ if (e) {
bitmap.lockPixels();
const int w = bitmap.width();
const int h = bitmap.height();
const void* ptr = bitmap.getPixels();
- jint id = (jint)rsAllocationCreateFromBitmap(con, w, h, (RsElementPredefined)dstFmt, e, genMips, ptr);
+ jint id = (jint)rsAllocationCreateFromBitmap(con, w, h, (RsElement)dstFmt, e, genMips, ptr);
bitmap.unlockPixels();
return id;
}
@@ -437,14 +425,14 @@
const SkBitmap& bitmap(*nativeBitmap);
SkBitmap::Config config = bitmap.getConfig();
- RsElementPredefined e = SkBitmapToPredefined(config);
+ RsElement e = SkBitmapToPredefined(config);
- if (e != RS_ELEMENT_USER_U8) {
+ if (e) {
bitmap.lockPixels();
const int w = bitmap.width();
const int h = bitmap.height();
const void* ptr = bitmap.getPixels();
- jint id = (jint)rsAllocationCreateFromBitmapBoxed(con, w, h, (RsElementPredefined)dstFmt, e, genMips, ptr);
+ jint id = (jint)rsAllocationCreateFromBitmapBoxed(con, w, h, (RsElement)dstFmt, e, genMips, ptr);
bitmap.unlockPixels();
return id;
}
@@ -543,7 +531,7 @@
//{"nAllocationDataFromObject", "(ILandroid/renderscript/Type;Ljava/lang/Object;)V", (void*)nAllocationDataFromObject },
static void
-nAllocationDataFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _type, jobject _o)
+nAllocationSubDataFromObject(JNIEnv *_env, jobject _this, jint alloc, jobject _type, jint offset, jobject _o)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
LOG_API("nAllocationDataFromObject con(%p), alloc(%p)", con, (RsAllocation)alloc);
@@ -556,7 +544,7 @@
const TypeFieldCache *tfc = &tc->fields[ct];
buf = tfc->ptr(_env, _o, tfc->field, buf);
}
- rsAllocationData(con, (RsAllocation)alloc, bufAlloc, tc->size);
+ rsAllocation1DSubData(con, (RsAllocation)alloc, offset, 1, bufAlloc, tc->size);
const uint32_t * tmp = (const uint32_t *)bufAlloc;
free(bufAlloc);
}
@@ -1244,6 +1232,8 @@
static JNINativeMethod methods[] = {
{"_nInit", "()V", (void*)_nInit },
+{"nInitElements", "(IIII)V", (void*)nInitElements },
+
{"nDeviceCreate", "()I", (void*)nDeviceCreate },
{"nDeviceDestroy", "(I)V", (void*)nDeviceDestroy },
{"nContextCreate", "(ILandroid/view/Surface;IZ)I", (void*)nContextCreate },
@@ -1255,10 +1245,8 @@
{"nFileOpen", "([B)I", (void*)nFileOpen },
{"nElementBegin", "()V", (void*)nElementBegin },
-{"nElementAddPredefined", "(I)V", (void*)nElementAddPredefined },
{"nElementAdd", "(IIIILjava/lang/String;)V", (void*)nElementAdd },
{"nElementCreate", "()I", (void*)nElementCreate },
-{"nElementGetPredefined", "(I)I", (void*)nElementGetPredefined },
{"nTypeBegin", "(I)V", (void*)nTypeBegin },
{"nTypeAdd", "(II)V", (void*)nTypeAdd },
@@ -1267,7 +1255,6 @@
{"nTypeSetupFields", "(Landroid/renderscript/Type;[I[I[Ljava/lang/reflect/Field;)V", (void*)nTypeSetupFields },
{"nAllocationCreateTyped", "(I)I", (void*)nAllocationCreateTyped },
-{"nAllocationCreatePredefSized", "(II)I", (void*)nAllocationCreatePredefSized },
{"nAllocationCreateSized", "(II)I", (void*)nAllocationCreateSized },
{"nAllocationCreateFromBitmap", "(IZLandroid/graphics/Bitmap;)I", (void*)nAllocationCreateFromBitmap },
{"nAllocationCreateFromBitmapBoxed","(IZLandroid/graphics/Bitmap;)I", (void*)nAllocationCreateFromBitmapBoxed },
@@ -1282,7 +1269,7 @@
{"nAllocationSubData2D", "(IIIII[FI)V", (void*)nAllocationSubData2D_f },
{"nAllocationRead", "(I[I)V", (void*)nAllocationRead_i },
{"nAllocationRead", "(I[F)V", (void*)nAllocationRead_f },
-{"nAllocationDataFromObject", "(ILandroid/renderscript/Type;Ljava/lang/Object;)V", (void*)nAllocationDataFromObject },
+{"nAllocationSubDataFromObject", "(ILandroid/renderscript/Type;ILjava/lang/Object;)V", (void*)nAllocationSubDataFromObject },
{"nTriangleMeshBegin", "(II)V", (void*)nTriangleMeshBegin },
{"nTriangleMeshAddVertex_XY", "(FF)V", (void*)nTriangleMeshAddVertex_XY },
diff --git a/include/media/mediascanner.h b/include/media/mediascanner.h
index 7749566..cd0b86e 100644
--- a/include/media/mediascanner.h
+++ b/include/media/mediascanner.h
@@ -59,16 +59,17 @@
class MediaScannerClient
{
public:
- MediaScannerClient();
- virtual ~MediaScannerClient();
- void setLocale(const char* locale);
- void beginFile();
- bool addStringTag(const char* name, const char* value);
- void endFile();
-
- virtual bool scanFile(const char* path, long long lastModified, long long fileSize) = 0;
- virtual bool handleStringTag(const char* name, const char* value) = 0;
- virtual bool setMimeType(const char* mimeType) = 0;
+ MediaScannerClient();
+ virtual ~MediaScannerClient();
+ void setLocale(const char* locale);
+ void beginFile();
+ bool addStringTag(const char* name, const char* value);
+ void endFile();
+
+ virtual bool scanFile(const char* path, long long lastModified, long long fileSize) = 0;
+ virtual bool handleStringTag(const char* name, const char* value) = 0;
+ virtual bool setMimeType(const char* mimeType) = 0;
+ virtual bool addNoMediaFolder(const char* path) = 0;
protected:
void convertValues(uint32_t encoding);
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h
index be60565..abb45a9 100644
--- a/include/media/stagefright/MetaData.h
+++ b/include/media/stagefright/MetaData.h
@@ -45,7 +45,7 @@
kKeyPlatformPrivate = 'priv',
kKeyDecoderComponent = 'decC',
kKeyBufferID = 'bfID',
- kKeyCompressedSize = 'cmpS',
+ kKeyMaxInputSize = 'inpS',
};
enum {
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 29cdf21..ac45481 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -135,8 +135,10 @@
void addCodecSpecificData(const void *data, size_t size);
void clearCodecSpecificData();
+ void setComponentRole();
+
void setAMRFormat();
- void setAACFormat();
+ void setAACFormat(int32_t numChannels, int32_t sampleRate);
status_t setVideoPortFormatType(
OMX_U32 portIndex,
@@ -155,6 +157,11 @@
void setJPEGInputFormat(
OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize);
+ void setMinBufferSize(OMX_U32 portIndex, OMX_U32 size);
+
+ void setRawAudioFormat(
+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
+
status_t allocateBuffers();
status_t allocateBuffersOnPort(OMX_U32 portIndex);
diff --git a/keystore/java/android/security/CertTool.java b/keystore/java/android/security/CertTool.java
index d1174ad..6caeb3e 100644
--- a/keystore/java/android/security/CertTool.java
+++ b/keystore/java/android/security/CertTool.java
@@ -163,15 +163,9 @@
return ret;
}
}
- while ((pemData = this.popPkcs12CertificateStack(handle)) != null) {
- if (i++ > 0) {
- if ((ret = sKeystore.put(CA_CERTIFICATE, keyname + i, pemData)) != 0) {
- return ret;
- }
- } else {
- if ((ret = sKeystore.put(CA_CERTIFICATE, keyname, pemData)) != 0) {
- return ret;
- }
+ if ((pemData = this.popPkcs12CertificateStack(handle)) != null) {
+ if ((ret = sKeystore.put(CA_CERTIFICATE, keyname, pemData)) != 0) {
+ return ret;
}
}
return 0;
diff --git a/keystore/jni/cert.c b/keystore/jni/cert.c
index 006a0a3..91114d6 100644
--- a/keystore/jni/cert.c
+++ b/keystore/jni/cert.c
@@ -212,13 +212,14 @@
}
err:
if (bio) BIO_free(bio);
- return (len == 0) ? -1 : 0;
+ return len;
}
int get_pkcs12_certificate(PKCS12_KEYSTORE *p12store, char *buf, int size)
{
if ((p12store != NULL) && (p12store->cert != NULL)) {
- return convert_to_pem((void*)p12store->cert, 1, buf, size);
+ int len = convert_to_pem((void*)p12store->cert, 1, buf, size);
+ return (len == 0) ? -1 : 0;
}
return -1;
}
@@ -226,7 +227,8 @@
int get_pkcs12_private_key(PKCS12_KEYSTORE *p12store, char *buf, int size)
{
if ((p12store != NULL) && (p12store->pkey != NULL)) {
- return convert_to_pem((void*)p12store->pkey, 0, buf, size);
+ int len = convert_to_pem((void*)p12store->pkey, 0, buf, size);
+ return (len == 0) ? -1 : 0;
}
return -1;
}
@@ -234,12 +236,19 @@
int pop_pkcs12_certs_stack(PKCS12_KEYSTORE *p12store, char *buf, int size)
{
X509 *cert = NULL;
+ int len = 0;
- if ((p12store != NULL) && (p12store->certs != NULL) &&
- ((cert = sk_X509_pop(p12store->certs)) != NULL)) {
- int ret = convert_to_pem((void*)cert, 1, buf, size);
- X509_free(cert);
- return ret;
+ if ((p12store != NULL) && (p12store->certs != NULL)) {
+ while (((cert = sk_X509_pop(p12store->certs)) != NULL) && (len < size)) {
+ int s = convert_to_pem((void*)cert, 1, buf + len, size - len);
+ if (s == 0) {
+ LOGE("buffer size is too small. len=%d size=%d\n", len, size);
+ return -1;
+ }
+ len += s;
+ X509_free(cert);
+ }
+ return (len == 0) ? -1 : 0;
}
return -1;
}
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 3a419b5..8cb89c3 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -1319,19 +1319,20 @@
mAudioMixer->setBufferProvider(track);
mAudioMixer->enable(AudioMixer::MIXING);
- int param;
- if ( track->mFillingUpStatus == Track::FS_FILLED) {
+ int param = AudioMixer::VOLUME;
+ if (track->mFillingUpStatus == Track::FS_FILLED) {
// no ramp for the first volume setting
track->mFillingUpStatus = Track::FS_ACTIVE;
if (track->mState == TrackBase::RESUMING) {
track->mState = TrackBase::ACTIVE;
param = AudioMixer::RAMP_VOLUME;
- } else {
- param = AudioMixer::VOLUME;
}
- } else {
+ } else if (cblk->server != 0) {
+ // If the track is stopped before the first frame was mixed,
+ // do not apply ramp
param = AudioMixer::RAMP_VOLUME;
}
+
mAudioMixer->setParameter(param, AudioMixer::VOLUME0, left);
mAudioMixer->setParameter(param, AudioMixer::VOLUME1, right);
mAudioMixer->setParameter(
@@ -1365,7 +1366,7 @@
LOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
tracksToRemove->add(track);
}
- // For tracks using static shared memry buffer, make sure that we have
+ // For tracks using static shared memory buffer, make sure that we have
// written enough data to audio hardware before disabling the track
// NOTE: this condition with arrive before track->mRetryCount <= 0 so we
// don't care about code removing track from active list above.
@@ -1449,6 +1450,8 @@
int j = activeTracks.indexOf(t);
if (j >= 0) {
mActiveTracks.add(t);
+ // force buffer refilling and no ramp volume when the track is mixed for the first time
+ t->mFillingUpStatus = Track::FS_FILLING;
}
}
}
@@ -3512,10 +3515,11 @@
if (tracks.size()) {
dstThread->putTracks(tracks, activeTracks);
}
- dstThread->sendConfigEvent(AudioSystem::STREAM_CONFIG_CHANGED, stream);
}
}
+ dstThread->sendConfigEvent(AudioSystem::STREAM_CONFIG_CHANGED, stream);
+
return NO_ERROR;
}
diff --git a/libs/rs/java/Fall/res/raw/fall.c b/libs/rs/java/Fall/res/raw/fall.c
index f348a62..e04e1ff 100644
--- a/libs/rs/java/Fall/res/raw/fall.c
+++ b/libs/rs/java/Fall/res/raw/fall.c
@@ -47,13 +47,27 @@
// The higher, the smaller the ripple
#define RIPPLE_HEIGHT 10.0f
+float g_SkyOffsetX;
+float g_SkyOffsetY;
+
+struct vert_s {
+ float nx;
+ float ny;
+ float nz;
+ float s;
+ float t;
+ float x;
+ float y;
+ float z;
+};
+
int offset(int x, int y, int width) {
return x + 1 + (y + 1) * (width + 2);
}
void dropWithStrength(int x, int y, int r, int s) {
- int width = State_meshWidth;
- int height = State_meshHeight;
+ int width = State->meshWidth;
+ int height = State->meshHeight;
if (x < r) x = r;
if (y < r) y = r;
@@ -62,8 +76,8 @@
x = width - x;
- int rippleMapSize = State_rippleMapSize;
- int index = State_rippleIndex;
+ int rippleMapSize = State->rippleMapSize;
+ int index = State->rippleIndex;
int origin = offset(0, 0, width);
int* current = loadArrayI32(RSID_RIPPLE_MAP, index * rippleMapSize + origin);
@@ -94,10 +108,10 @@
}
void updateRipples() {
- int rippleMapSize = State_rippleMapSize;
- int width = State_meshWidth;
- int height = State_meshHeight;
- int index = State_rippleIndex;
+ int rippleMapSize = State->rippleMapSize;
+ int width = State->meshWidth;
+ int height = State->meshHeight;
+ int index = State->rippleIndex;
int origin = offset(0, 0, width);
int* current = loadArrayI32(RSID_RIPPLE_MAP, index * rippleMapSize + origin);
@@ -139,9 +153,9 @@
void generateRipples() {
int rippleMapSize = loadI32(RSID_STATE, OFFSETOF_WorldState_rippleMapSize);
- int width = State_meshWidth;
- int height = State_meshHeight;
- int index = State_rippleIndex;
+ int width = State->meshWidth;
+ int height = State->meshHeight;
+ int index = State->rippleIndex;
int origin = offset(0, 0, width);
int b = width + 2;
@@ -149,9 +163,10 @@
int* current = loadArrayI32(RSID_RIPPLE_MAP, index * rippleMapSize + origin);
int *map = loadArrayI32(RSID_REFRACTION_MAP, 0);
float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh);
+ struct vert_s *vert = (struct vert_s *)vertices;
- float fw = (float) width;
- float fh = (float) height;
+ float fw = 1.f / width;
+ float fh = 1.f / height;
float fy = (1.0f / 512.0f) * (1.0f / RIPPLE_HEIGHT);
int h = height - 1;
@@ -159,6 +174,8 @@
int w = width - 1;
int wave = *current;
int offset = h * width;
+ struct vert_s *vtx = vert + offset + w;
+
while (w >= 0) {
int nextWave = current[1];
int dx = nextWave - wave;
@@ -174,13 +191,11 @@
v &= ~(v >> 31);
if (v >= height) v = height - 1;
- int index = (offset + w) << 3;
- vertices[index + 3] = u / fw;
- vertices[index + 4] = v / fh;
+ vtx->s = u * fw;
+ vtx->t = v * fh;
+ vtx->z = dy * fy;
+ vtx --;
- // Update Z coordinate of the vertex
- vertices[index + 7] = dy * fy;
-
w -= 1;
current += 1;
wave = nextWave;
@@ -191,82 +206,29 @@
// Compute the normals for lighting
int y = 0;
- int w8 = width << 3;
for ( ; y < height; y += 1) {
int x = 0;
int yOffset = y * width;
+ struct vert_s *v = vert;
+
for ( ; x < width; x += 1) {
- int o = (yOffset + x) << 3;
- int o1 = o + 8;
- int ow = o + w8;
- int ow1 = ow + 8;
-
- // V1
- float v1x = vertices[o + 5];
- float v1y = vertices[o + 6];
- float v1z = vertices[o + 7];
-
- // V2
- float v2x = vertices[o1 + 5];
- float v2y = vertices[o1 + 6];
- float v2z = vertices[o1 + 7];
-
- // V3
- float v3x = vertices[ow + 5];
- float v3y = vertices[ow + 6];
- float v3z = vertices[ow + 7];
-
- // N1
- float n1x = v2x - v1x;
- float n1y = v2y - v1y;
- float n1z = v2z - v1z;
-
- // N2
- float n2x = v3x - v1x;
- float n2y = v3y - v1y;
- float n2z = v3z - v1z;
-
- // N1 x N2
- float n3x = n1y * n2z - n1z * n2y;
- float n3y = n1z * n2x - n1x * n2z;
- float n3z = n1x * n2y - n1y * n2x;
-
- // Normalize
- float len = 1.0f / magf3(n3x, n3y, n3z);
- n3x *= len;
- n3y *= len;
- n3z *= len;
-
- // V2
- v2x = vertices[ow1 + 5];
- v2y = vertices[ow1 + 6];
- v2z = vertices[ow1 + 7];
-
- // N1
- n1x = v2x - v1x;
- n1y = v2y - v1y;
- n1z = v2z - v1z;
-
- // N2
- n2x = v3x - v1x;
- n2y = v3y - v1y;
- n2z = v3z - v1z;
+ struct vec3_s n1, n2, n3;
+ vec3Sub(&n1, (struct vec3_s *)&(v+1)->x, (struct vec3_s *)&v->x);
+ vec3Sub(&n2, (struct vec3_s *)&(v+width)->x, (struct vec3_s *)&v->x);
+ vec3Cross(&n3, &n1, &n2);
+ vec3Norm(&n3);
// Average of previous normal and N1 x N2
- n3x = n3x * 0.5f + (n1y * n2z - n1z * n2y) * 0.5f;
- n3y = n3y * 0.5f + (n1z * n2x - n1x * n2z) * 0.5f;
- n3z = n3z * 0.5f + (n1x * n2y - n1y * n2x) * 0.5f;
+ vec3Sub(&n1, (struct vec3_s *)&(v+width+1)->x, (struct vec3_s *)&v->x);
+ vec3Cross(&n2, &n1, &n2);
+ vec3Add(&n3, &n3, &n2);
+ vec3Norm(&n3);
- // Normalize
- len = 1.0f / magf3(n3x, n3y, n3z);
- n3x *= len;
- n3y *= len;
- n3z *= len;
+ v->nx = n3.x;
+ v->ny = n3.y;
+ v->nz = -n3.z;
+ v += 1;
- vertices[o + 0] = n3x;
- vertices[o + 1] = n3y;
- vertices[o + 2] = -n3z;
-
// reset Z
//vertices[(yOffset + x) << 3 + 7] = 0.0f;
}
@@ -322,7 +284,7 @@
float z2 = 0.0f;
float z3 = 0.0f;
float z4 = 0.0f;
-
+
float a = leafStruct[LEAF_STRUCT_ALTITUDE];
float s = leafStruct[LEAF_STRUCT_SCALE];
float r = leafStruct[LEAF_STRUCT_ANGLE];
@@ -384,7 +346,7 @@
LEAF_SIZE * s + y < -glHeight / 2.0f) {
int sprite = randf(LEAVES_TEXTURES_COUNT);
- leafStruct[LEAF_STRUCT_X] = randf2(-1.0f, 1.0f);
+ leafStruct[LEAF_STRUCT_X] = randf2(-1.0f, 1.0f);
leafStruct[LEAF_STRUCT_Y] = glHeight / 2.0f + LEAF_SIZE * 2 * randf(1.0f);
leafStruct[LEAF_STRUCT_SCALE] = randf2(0.4f, 0.5f);
leafStruct[LEAF_STRUCT_SPIN] = degf(randf2(-0.02f, 0.02f)) / 4.0f;
@@ -401,20 +363,20 @@
bindProgramVertex(NAMED_PVSky);
bindTexture(NAMED_PFBackground, 0, NAMED_TLeaves);
- int leavesCount = State_leavesCount;
+ int leavesCount = State->leavesCount;
int count = leavesCount * LEAF_STRUCT_FIELDS_COUNT;
- int width = State_meshWidth;
- int height = State_meshHeight;
- float glWidth = State_glWidth;
- float glHeight = State_glHeight;
+ int width = State->meshWidth;
+ int height = State->meshHeight;
+ float glWidth = State->glWidth;
+ float glHeight = State->glHeight;
- float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh);
+ float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh);
int i = 0;
for ( ; i < count; i += LEAF_STRUCT_FIELDS_COUNT) {
drawLeaf(i, vertices, width, height, glWidth, glHeight);
}
-
+
float matrix[16];
matrixLoadIdentity(matrix);
vpLoadModelMatrix(matrix);
@@ -433,15 +395,15 @@
bindProgramFragmentStore(NAMED_PFSLeaf);
bindTexture(NAMED_PFSky, 0, NAMED_TSky);
- float x = State_skyOffsetX + State_skySpeedX;
- float y = State_skyOffsetY + State_skySpeedY;
+ float x = g_SkyOffsetX + State->skySpeedX;
+ float y = g_SkyOffsetY + State->skySpeedY;
if (x > 1.0f) x = 0.0f;
if (x < -1.0f) x = 0.0f;
if (y > 1.0f) y = 0.0f;
- storeF(RSID_STATE, OFFSETOF_WorldState_skyOffsetX, x);
- storeF(RSID_STATE, OFFSETOF_WorldState_skyOffsetY, y);
+ g_SkyOffsetX = x;
+ g_SkyOffsetY = y;
float matrix[16];
matrixLoadTranslate(matrix, x, y, 0.0f);
@@ -467,8 +429,8 @@
}
void drawNormals() {
- int width = State_meshWidth;
- int height = State_meshHeight;
+ int width = State->meshWidth;
+ int height = State->meshHeight;
float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh);
@@ -496,12 +458,10 @@
}
int main(int index) {
- int dropX = Drop_dropX;
- if (dropX != -1) {
- int dropY = Drop_dropY;
- drop(dropX, dropY, DROP_RADIUS);
- storeI32(RSID_DROP, OFFSETOF_DropState_dropX, -1);
- storeI32(RSID_DROP, OFFSETOF_DropState_dropY, -1);
+ if (Drop->dropX != -1) {
+ drop(Drop->dropX, Drop->dropY, DROP_RADIUS);
+ Drop->dropX = -1;
+ Drop->dropY = -1;
}
updateRipples();
diff --git a/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java b/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java
index 8a33d66..33aa9ab 100644
--- a/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java
+++ b/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java
@@ -44,7 +44,7 @@
private static final int MESH_RESOLUTION = 48;
private static final int RSID_STATE = 0;
-
+
private static final int TEXTURES_COUNT = 3;
private static final int LEAVES_TEXTURES_COUNT = 4;
private static final int RSID_TEXTURE_RIVERBED = 0;
@@ -52,7 +52,7 @@
private static final int RSID_TEXTURE_SKY = 2;
private static final int RSID_RIPPLE_MAP = 1;
-
+
private static final int RSID_REFRACTION_MAP = 2;
private static final int RSID_LEAVES = 3;
@@ -70,7 +70,21 @@
private static final int LEAF_STRUCT_DELTAX = 9;
private static final int LEAF_STRUCT_DELTAY = 10;
- private static final int RSID_DROP = 4;
+ class Leaf {
+ float x;
+ float y;
+ float scale;
+ float angle;
+ float spin;
+ float u1;
+ float u2;
+ float altitude;
+ float rippled;
+ float deltaX;
+ float deltaY;
+ }
+
+ private static final int RSID_DROP = 4;
private Resources mResources;
private RenderScript mRS;
@@ -175,10 +189,10 @@
float quadWidth = 2.0f / (float) wResolution;
float quadHeight = glHeight / (float) hResolution;
-
+
wResolution += 2;
- hResolution += 2;
-
+ hResolution += 2;
+
for (int y = 0; y <= hResolution; y++) {
final boolean shift = (y & 0x1) == 0;
final float yOffset = y * quadHeight - glHeight / 2.0f - quadHeight;
@@ -267,12 +281,10 @@
public int leavesCount;
public float glWidth;
public float glHeight;
- public float skyOffsetX;
- public float skyOffsetY;
public float skySpeedX;
public float skySpeedY;
}
-
+
static class DropState {
public int dropX;
public int dropY;
@@ -295,11 +307,11 @@
mStateType = Type.createFromClass(mRS, WorldState.class, 1, "WorldState");
mState = Allocation.createTyped(mRS, mStateType);
mState.data(worldState);
-
+
mDrop = new DropState();
mDrop.dropX = -1;
mDrop.dropY = -1;
-
+
mDropType = Type.createFromClass(mRS, DropState.class, 1, "DropState");
mDropState = Allocation.createTyped(mRS, mDropType);
mDropState.data(mDrop);
@@ -346,7 +358,7 @@
final Allocation allocation = Allocation.createFromBitmap(mRS, b, RGBA_8888, false);
allocation.setName(name);
return allocation;
- }
+ }
private void createProgramFragment() {
Sampler.Builder sampleBuilder = new Sampler.Builder(mRS);
@@ -368,7 +380,7 @@
mPfLighting = builder.create();
mPfLighting.setName("PFLighting");
mPfLighting.bindSampler(sampler, 0);
-
+
builder = new ProgramFragment.Builder(mRS, null, null);
builder.setTexEnable(true, 0);
builder.setTexEnvMode(MODULATE, 0);
@@ -407,7 +419,7 @@
mPvLight = builder.create();
mPvLight.bindAllocation(pvOrthoAlloc);
mPvLight.setName("PVLight");
-
+
builder = new ProgramVertex.Builder(mRS, null, null);
builder.setTextureMatrixEnable(true);
mPvSky = builder.create();
diff --git a/libs/rs/java/Film/res/raw/filmstrip.c b/libs/rs/java/Film/res/raw/filmstrip.c
index 8f3d930..8fbfee1 100644
--- a/libs/rs/java/Film/res/raw/filmstrip.c
+++ b/libs/rs/java/Film/res/raw/filmstrip.c
@@ -5,10 +5,6 @@
#pragma stateFragment(PFBackground)
#pragma stateFragmentStore(PSBackground)
-#define POS_TRANSLATE 0
-#define POS_ROTATE 1
-#define POS_FOCUS 2
-
#define STATE_TRIANGLE_OFFSET_COUNT 0
#define STATE_LAST_FOCUS 1
@@ -18,12 +14,14 @@
// bank1: (r) The position information
// bank2: (rw) The temporary texture state
+int lastFocus;
+
int main(int index)
{
float mat1[16];
- float trans = Pos_translate;
- float rot = Pos_rotate;
+ float trans = Pos->translate;
+ float rot = Pos->rotate;
matrixLoadScale(mat1, 2.f, 2.f, 2.f);
matrixTranslate(mat1, 0.f, 0.f, trans);
@@ -39,7 +37,7 @@
bindProgramFragment(NAMED_PFImages);
bindProgramVertex(NAMED_PVImages);
- float focusPos = Pos_focus;
+ float focusPos = Pos->focus;
int focusID = 0;
int lastFocusID = loadI32(2, STATE_LAST_FOCUS);
int imgCount = 13;
@@ -63,9 +61,9 @@
}
}
*/
- storeI32(2, STATE_LAST_FOCUS, focusID);
+ lastFocus = focusID;
- int triangleOffsetsCount = Pos_triangleOffsetCount;
+ int triangleOffsetsCount = Pos->triangleOffsetCount;
int imgId = 0;
for (imgId=1; imgId <= imgCount; imgId++) {
diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c
index 8c1cad4..36516c2 100644
--- a/libs/rs/java/Fountain/res/raw/fountain.c
+++ b/libs/rs/java/Fountain/res/raw/fountain.c
@@ -4,48 +4,52 @@
#pragma stateFragment(default)
#pragma stateFragmentStore(default)
+int newPart = 0;
+
int main(int launchID) {
int ct;
- int count = Control_count - 1;
- int rate = Control_rate;
- float *dataF = loadArrayF(1, 0);
+ int count = Control->count;
+ int rate = Control->rate;
float height = getHeight();
+ struct point_s * p = (struct point_s *)point;
if (rate) {
- int *dataI = loadArrayI32(1, 0);
float rMax = ((float)rate) * 0.005f;
- int x = Control_x;
- int y = Control_y;
- int newPart = loadI32(1, count * 5);
- int c = colorFloatRGBAtoUNorm8(Control_r, Control_g, Control_b, 0.99f);
+ int x = Control->x;
+ int y = Control->y;
+ char r = Control->r * 255.f;
+ char g = Control->g * 255.f;
+ char b = Control->b * 255.f;
+ char a = 0xf0;
while (rate--) {
- int idx = newPart * 5;
- vec2Rand(dataF + idx, rMax);
- dataF[idx + 2] = x;
- dataF[idx + 3] = y;
- dataI[idx + 4] = c;
+ vec2Rand((float *)(p + newPart), rMax);
+ p[newPart].x = x;
+ p[newPart].y = y;
+ p[newPart].r = r;
+ p[newPart].g = g;
+ p[newPart].b = b;
+ p[newPart].a = a;
newPart++;
if (newPart >= count) {
newPart = 0;
}
}
- storeI32(1, count * 5, newPart);
}
for (ct=0; ct < count; ct++) {
- float dy = dataF[1] + 0.15f;
- float posy = dataF[3] + dy;
+ float dy = p->dy + 0.15f;
+ float posy = p->y + dy;
if ((posy > height) && (dy > 0)) {
dy *= -0.3f;
}
- dataF[1] = dy;
- dataF[2] += dataF[0];
- dataF[3] = posy;
- dataF += 5;
+ p->dy = dy;
+ p->x += p->dx;
+ p->y = posy;
+ p++;
}
uploadToBufferObject(NAMED_PartBuffer);
- drawSimpleMeshRange(NAMED_PartMesh, 0, count);
+ drawSimpleMesh(NAMED_PartMesh);
return 1;
}
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
index 6d400c5..f4f9b0c 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -79,10 +79,10 @@
mIntAlloc.data(mSD);
Element.Builder eb = new Element.Builder(mRS);
- eb.addFloat(Element.DataKind.USER); //dx
- eb.addFloat(Element.DataKind.USER); //dy
- eb.addFloatXY();
- eb.addUNorm8RGBA();
+ eb.addFloat(Element.DataKind.USER, "dx");
+ eb.addFloat(Element.DataKind.USER, "dy");
+ eb.addFloatXY("");
+ eb.addUNorm8RGBA("");
Element primElement = eb.create();
@@ -102,6 +102,7 @@
sb.setScript(mRes, R.raw.fountain);
sb.setRoot(true);
sb.setType(mSDType, "Control", 0);
+ sb.setType(mSM.getVertexType(0), "point", 1);
Script script = sb.create();
script.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index cb4dd00..ac2e738 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -39,10 +39,6 @@
ElementBegin {
}
-ElementAddPredefined {
- param RsElementPredefined predef
- }
-
ElementAdd {
param RsDataKind dataKind
param RsDataType dataType
@@ -99,8 +95,8 @@
AllocationCreateFromBitmap {
param uint32_t width
param uint32_t height
- param RsElementPredefined dstFmt
- param RsElementPredefined srcFmt
+ param RsElement dstFmt
+ param RsElement srcFmt
param bool genMips
param const void * data
ret RsAllocation
@@ -109,8 +105,8 @@
AllocationCreateFromBitmapBoxed {
param uint32_t width
param uint32_t height
- param RsElementPredefined dstFmt
- param RsElementPredefined srcFmt
+ param RsElement dstFmt
+ param RsElement srcFmt
param bool genMips
param const void * data
ret RsAllocation
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index 1f49ca1..c267e16 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -310,40 +310,54 @@
}
}
-static ElementConverter_t pickConverter(RsElementPredefined dstFmt, RsElementPredefined srcFmt)
+static ElementConverter_t pickConverter(const Element *dst, const Element *src)
{
- if ((dstFmt == RS_ELEMENT_RGB_565) &&
- (srcFmt == RS_ELEMENT_RGB_565)) {
- return elementConverter_cpy_16;
+ GLenum srcGLType = src->getGLType();
+ GLenum srcGLFmt = src->getGLFormat();
+ GLenum dstGLType = dst->getGLType();
+ GLenum dstGLFmt = dst->getGLFormat();
+
+ if (srcGLFmt == dstGLFmt && srcGLType == dstGLType) {
+ switch(dst->getSizeBytes()) {
+ case 4:
+ return elementConverter_cpy_32;
+ case 2:
+ return elementConverter_cpy_16;
+ case 1:
+ return elementConverter_cpy_8;
+ }
}
- if ((dstFmt == RS_ELEMENT_RGB_565) &&
- (srcFmt == RS_ELEMENT_RGB_888)) {
+ if (srcGLType == GL_UNSIGNED_BYTE &&
+ srcGLFmt == GL_RGB &&
+ dstGLType == GL_UNSIGNED_SHORT_5_6_5 &&
+ dstGLType == GL_RGB) {
+
return elementConverter_888_to_565;
}
- if ((dstFmt == RS_ELEMENT_RGB_565) &&
- (srcFmt == RS_ELEMENT_RGBA_8888)) {
+ if (srcGLType == GL_UNSIGNED_BYTE &&
+ srcGLFmt == GL_RGBA &&
+ dstGLType == GL_UNSIGNED_SHORT_5_6_5 &&
+ dstGLType == GL_RGB) {
+
return elementConverter_8888_to_565;
}
- if ((dstFmt == RS_ELEMENT_RGBA_8888) &&
- (srcFmt == RS_ELEMENT_RGBA_8888)) {
- return elementConverter_cpy_32;
- }
-
- LOGE("pickConverter, unsuported combo, src %i, dst %i", srcFmt, dstFmt);
+ LOGE("pickConverter, unsuported combo, src %p, dst %p", src, dst);
return 0;
}
-RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, uint32_t w, uint32_t h, RsElementPredefined dstFmt, RsElementPredefined srcFmt, bool genMips, const void *data)
+RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, uint32_t w, uint32_t h, RsElement _dst, RsElement _src, bool genMips, const void *data)
{
+ const Element *src = static_cast<const Element *>(_src);
+ const Element *dst = static_cast<const Element *>(_dst);
rsAssert(!(w & (w-1)));
rsAssert(!(h & (h-1)));
//LOGE("rsi_AllocationCreateFromBitmap %i %i %i %i %i", w, h, dstFmt, srcFmt, genMips);
- rsi_TypeBegin(rsc, rsi_ElementGetPredefined(rsc, dstFmt));
+ rsi_TypeBegin(rsc, _dst);
rsi_TypeAdd(rsc, RS_DIMENSION_X, w);
rsi_TypeAdd(rsc, RS_DIMENSION_Y, h);
if (genMips) {
@@ -359,7 +373,7 @@
}
texAlloc->incUserRef();
- ElementConverter_t cvt = pickConverter(dstFmt, srcFmt);
+ ElementConverter_t cvt = pickConverter(dst, src);
cvt(texAlloc->getPtr(), data, w * h);
if (genMips) {
@@ -375,21 +389,18 @@
return texAlloc;
}
-static uint32_t fmtToBits(RsElementPredefined fmt)
+RsAllocation rsi_AllocationCreateFromBitmapBoxed(Context *rsc, uint32_t w, uint32_t h, RsElement _dst, RsElement _src, bool genMips, const void *data)
{
- return 16;
-}
-
-RsAllocation rsi_AllocationCreateFromBitmapBoxed(Context *rsc, uint32_t w, uint32_t h, RsElementPredefined dstFmt, RsElementPredefined srcFmt, bool genMips, const void *data)
-{
+ const Element *srcE = static_cast<const Element *>(_src);
+ const Element *dstE = static_cast<const Element *>(_dst);
uint32_t w2 = rsHigherPow2(w);
uint32_t h2 = rsHigherPow2(h);
if ((w2 == w) && (h2 == h)) {
- return rsi_AllocationCreateFromBitmap(rsc, w, h, dstFmt, srcFmt, genMips, data);
+ return rsi_AllocationCreateFromBitmap(rsc, w, h, _dst, _src, genMips, data);
}
- uint32_t bpp = fmtToBits(srcFmt) >> 3;
+ uint32_t bpp = srcE->getSizeBytes();
size_t size = w2 * h2 * bpp;
uint8_t *tmp = static_cast<uint8_t *>(malloc(size));
memset(tmp, 0, size);
@@ -401,7 +412,7 @@
src += w * bpp;
}
- RsAllocation ret = rsi_AllocationCreateFromBitmap(rsc, w2, h2, dstFmt, srcFmt, genMips, tmp);
+ RsAllocation ret = rsi_AllocationCreateFromBitmap(rsc, w2, h2, _dst, _src, genMips, tmp);
free(tmp);
return ret;
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index c28bd02..04f6e07 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -116,6 +116,7 @@
//glEnable(GL_LIGHT0);
glViewport(0, 0, mEGL.mWidth, mEGL.mHeight);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glEnable(GL_POINT_SMOOTH);
glClearColor(mRootScript->mEnviroment.mClearColor[0],
mRootScript->mEnviroment.mClearColor[1],
@@ -153,10 +154,18 @@
void Context::timerInit()
{
mTimeLast = getTime();
+ mTimeFrame = mTimeLast;
+ mTimeLastFrame = mTimeLast;
mTimerActive = RS_TIMER_INTERNAL;
timerReset();
}
+void Context::timerFrame()
+{
+ mTimeLastFrame = mTimeFrame;
+ mTimeFrame = getTime();
+}
+
void Context::timerSet(Timers tm)
{
uint64_t last = mTimeLast;
@@ -171,12 +180,14 @@
for (int ct = 0; ct < _RS_TIMER_TOTAL; ct++) {
total += mTimers[ct];
}
+ uint64_t frame = mTimeFrame - mTimeLastFrame;
- LOGV("RS Time Data: Idle %2.1f (%lli), Internal %2.1f (%lli), Script %2.1f (%lli), Clear & Swap %2.1f (%lli)",
- 100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000,
- 100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000,
+ LOGV("RS: Frame (%lli), Script %2.1f (%lli), Clear & Swap %2.1f (%lli), Idle %2.1f (%lli), Internal %2.1f (%lli)",
+ frame / 1000000,
100.0 * mTimers[RS_TIMER_SCRIPT] / total, mTimers[RS_TIMER_SCRIPT] / 1000000,
- 100.0 * mTimers[RS_TIMER_CLEAR_SWAP] / total, mTimers[RS_TIMER_CLEAR_SWAP] / 1000000);
+ 100.0 * mTimers[RS_TIMER_CLEAR_SWAP] / total, mTimers[RS_TIMER_CLEAR_SWAP] / 1000000,
+ 100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000,
+ 100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000);
}
void Context::setupCheck()
@@ -232,6 +243,7 @@
#endif
eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface);
#if RS_LOG_TIMES
+ rsc->timerFrame();
rsc->timerSet(RS_TIMER_INTERNAL);
rsc->timerPrint();
rsc->timerReset();
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index c58a88c..634416b 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -131,6 +131,7 @@
void timerReset();
void timerSet(Timers);
void timerPrint();
+ void timerFrame();
bool checkVersion1_1() const {return (mGL.mMajorVersion > 1) || (mGL.mMinorVersion >= 1); }
bool checkVersion2_0() const {return mGL.mMajorVersion >= 2; }
@@ -202,6 +203,8 @@
uint64_t mTimers[_RS_TIMER_TOTAL];
Timers mTimerActive;
uint64_t mTimeLast;
+ uint64_t mTimeFrame;
+ uint64_t mTimeLastFrame;
};
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index 0adce75..6cf64a4 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -56,6 +56,11 @@
glEnable(GL_TEXTURE_2D);
if (rsc->checkVersion1_1()) {
+ if (mPointSpriteEnable) {
+ glEnable(GL_POINT_SPRITE_OES);
+ } else {
+ glDisable(GL_POINT_SPRITE_OES);
+ }
glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable);
}
glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID());
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 0c7ac18..8230cbc 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -67,6 +67,12 @@
= nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
}
+ for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
+ if (mProgram.mSlotPointers[ct]) {
+ *mProgram.mSlotPointers[ct] = mSlots[ct]->getPtr();
+ }
+ }
+
bool ret = false;
tls->mScript = this;
ret = mProgram.mScript(launchIndex) != 0;
@@ -139,6 +145,7 @@
accRegisterSymbolCallback(mAccScript, symbolLookup, NULL);
accCompileScript(mAccScript);
accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
+ accGetScriptLabel(mAccScript, "init", (ACCvoid**) &mProgram.mInit);
rsAssert(mProgram.mScript);
if (!mProgram.mScript) {
@@ -148,6 +155,19 @@
LOGE(buf);
}
+ if (mProgram.mInit) {
+ mProgram.mInit();
+ }
+
+ for (int ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
+ if (mSlotNames[ct].length() > 0) {
+ accGetScriptLabel(mAccScript,
+ mSlotNames[ct].string(),
+ (ACCvoid**) &mProgram.mSlotPointers[ct]);
+ LOGE("var %s %p", mSlotNames[ct].string(), mProgram.mSlotPointers[ct]);
+ }
+ }
+
mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
@@ -224,6 +244,19 @@
}
}
+static void appendElementBody(String8 *s, const Element *e)
+{
+ s->append(" {\n");
+ for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
+ const Component *c = e->getComponent(ct2);
+ s->append(" ");
+ s->append(c->getCType());
+ s->append(" ");
+ s->append(c->getComponentName());
+ s->append(";\n");
+ }
+ s->append("}");
+}
void ScriptCState::appendVarDefines(String8 *str)
{
@@ -246,17 +279,36 @@
}
}
+
+
void ScriptCState::appendTypes(String8 *str)
{
char buf[256];
String8 tmp;
+ str->append("struct vec2_s {float x; float y;};");
+ str->append("struct vec3_s {float x; float y; float z;};");
+ str->append("struct vec4_s {float x; float y; float z; float w;};");
+
for (size_t ct=0; ct < MAX_SCRIPT_BANKS; ct++) {
const Type *t = mConstantBufferTypes[ct].get();
if (!t) {
continue;
}
const Element *e = t->getElement();
+ if (e->getName() && (e->getComponentCount() > 1)) {
+ String8 s("struct struct_");
+ s.append(e->getName());
+ appendElementBody(&s, e);
+ s.append(";\n");
+ s.append("#define ");
+ s.append(e->getName());
+ s.append("_t struct struct_");
+ s.append(e->getName());
+ s.append("\n\n");
+ LOGD(s);
+ str->append(s);
+ }
if (t->getName()) {
for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
@@ -267,12 +319,39 @@
tmp.append(c->getComponentName());
sprintf(buf, " %i\n", ct2);
tmp.append(buf);
- //LOGD(tmp);
+ LOGD(tmp);
str->append(tmp);
}
}
if (mSlotNames[ct].length() > 0) {
+ String8 s;
+ if (e->getComponentCount() > 1) {
+ if (e->getName()) {
+ // Use the named struct
+ s.setTo(e->getName());
+ s.append("_t *");
+ } else {
+ // create an struct named from the slot.
+ s.setTo("struct ");
+ s.append(mSlotNames[ct]);
+ s.append("_s");
+ appendElementBody(&s, e);
+ s.append(";\n");
+ s.append("struct ");
+ s.append(mSlotNames[ct]);
+ s.append("_s * ");
+ }
+ } else {
+ // Just make an array
+ s.setTo(e->getComponent(0)->getCType());
+ s.append("_t *");
+ }
+ s.append(mSlotNames[ct]);
+ s.append(";\n");
+ LOGD(s);
+ str->append(s);
+#if 0
for (size_t ct2=0; ct2 < e->getComponentCount(); ct2++) {
const Component *c = e->getComponent(ct2);
tmp.setTo("#define ");
@@ -295,12 +374,12 @@
sprintf(buf, "%i, %i)\n", ct, ct2);
tmp.append(buf);
- //LOGD(tmp);
+ LOGD(tmp);
str->append(tmp);
}
+#endif
}
}
-
}
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 302515e..8aa99ef 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -35,6 +35,7 @@
{
public:
typedef int (*RunScript_t)(uint32_t launchIndex);
+ typedef void (*VoidFunc_t)();
ScriptC();
virtual ~ScriptC();
@@ -48,6 +49,9 @@
int mVersionMinor;
RunScript_t mScript;
+ VoidFunc_t mInit;
+
+ void ** mSlotPointers[MAX_SCRIPT_BANKS];
};
Program_t mProgram;
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 84a39aa..d10076b 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -36,6 +36,23 @@
Context * rsc = tls->mContext; \
ScriptC * sc = (ScriptC *) tls->mScript
+typedef struct {
+ float x;
+ float y;
+ float z;
+} vec3_t;
+
+typedef struct {
+ float x;
+ float y;
+ float z;
+ float w;
+} vec4_t;
+
+typedef struct {
+ float x;
+ float y;
+} vec2_t;
//////////////////////////////////////////////////////////////////////////////
// IO routines
@@ -161,6 +178,60 @@
memcpy(&f[offset], m, sizeof(rsc_Matrix));
}
+//////////////////////////////////////////////////////////////////////////////
+// Vec3 routines
+//////////////////////////////////////////////////////////////////////////////
+
+static void SC_vec3Norm(vec3_t *v)
+{
+ float len = sqrtf(v->x * v->x + v->y * v->y + v->z * v->z);
+ len = 1 / len;
+ v->x *= len;
+ v->y *= len;
+ v->z *= len;
+}
+
+static float SC_vec3Length(const vec3_t *v)
+{
+ return sqrtf(v->x * v->x + v->y * v->y + v->z * v->z);
+}
+
+static void SC_vec3Add(vec3_t *dest, const vec3_t *lhs, const vec3_t *rhs)
+{
+ dest->x = lhs->x + rhs->x;
+ dest->y = lhs->y + rhs->y;
+ dest->z = lhs->z + rhs->z;
+}
+
+static void SC_vec3Sub(vec3_t *dest, const vec3_t *lhs, const vec3_t *rhs)
+{
+ dest->x = lhs->x - rhs->x;
+ dest->y = lhs->y - rhs->y;
+ dest->z = lhs->z - rhs->z;
+}
+
+static void SC_vec3Cross(vec3_t *dest, const vec3_t *lhs, const vec3_t *rhs)
+{
+ float x = lhs->y * rhs->z - lhs->z * rhs->y;
+ float y = lhs->z * rhs->x - lhs->x * rhs->z;
+ float z = lhs->x * rhs->y - lhs->y * rhs->x;
+ dest->x = x;
+ dest->y = y;
+ dest->z = z;
+}
+
+static float SC_vec3Dot(const vec3_t *lhs, const vec3_t *rhs)
+{
+ return lhs->x * rhs->x + lhs->y * rhs->y + lhs->z * rhs->z;
+}
+
+static void SC_vec3Scale(vec3_t *lhs, float scale)
+{
+ lhs->x *= scale;
+ lhs->y *= scale;
+ lhs->z *= scale;
+}
+
//////////////////////////////////////////////////////////////////////////////
// Math routines
@@ -175,15 +246,15 @@
const float A = 1.0f / (2.0f * M_PI);
const float B = -16.0f;
const float C = 8.0f;
-
+
// scale angle for easy argument reduction
x *= A;
-
+
if (fabsf(x) >= 0.5f) {
// argument reduction
x = x - ceilf(x + 0.5f) + 1.0f;
}
-
+
const float y = B * x * fabsf(x) + C * x;
return 0.2215f * (y * fabsf(y) - y) + y;
}
@@ -195,15 +266,15 @@
const float A = 1.0f / (2.0f * M_PI);
const float B = -16.0f;
const float C = 8.0f;
-
+
// scale angle for easy argument reduction
x *= A;
-
+
if (fabsf(x) >= 0.5f) {
// argument reduction
x = x - ceilf(x + 0.5f) + 1.0f;
}
-
+
const float y = B * x * fabsf(x) + C * x;
return 0.2215f * (y * fabsf(y) - y) + y;
}
@@ -729,6 +800,12 @@
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, s);
}
+static void SC_pointAttenuation(float a, float b, float c)
+{
+ GLfloat params[] = { a, b, c };
+ glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, params);
+}
+
static void SC_hsbToRgb(float h, float s, float b, float* rgb)
{
float red = 0.0f;
@@ -1038,6 +1115,22 @@
{ "vec2Rand", (void *)&SC_vec2Rand,
"void", "(float *vec, float maxLen)" },
+ // vec3
+ { "vec3Norm", (void *)&SC_vec3Norm,
+ "void", "(struct vec3_s *)" },
+ { "vec3Length", (void *)&SC_vec3Length,
+ "float", "(struct vec3_s *)" },
+ { "vec3Add", (void *)&SC_vec3Add,
+ "void", "(struct vec3_s *dest, struct vec3_s *lhs, struct vec3_s *rhs)" },
+ { "vec3Sub", (void *)&SC_vec3Sub,
+ "void", "(struct vec3_s *dest, struct vec3_s *lhs, struct vec3_s *rhs)" },
+ { "vec3Cross", (void *)&SC_vec3Cross,
+ "void", "(struct vec3_s *dest, struct vec3_s *lhs, struct vec3_s *rhs)" },
+ { "vec3Dot", (void *)&SC_vec3Dot,
+ "float", "(struct vec3_s *lhs, struct vec3_s *rhs)" },
+ { "vec3Scale", (void *)&SC_vec3Scale,
+ "void", "(struct vec3_s *lhs, float scale)" },
+
// context
{ "bindProgramFragment", (void *)&SC_bindProgramFragment,
"void", "(int)" },
@@ -1098,6 +1191,8 @@
"void", "(float, float, float, float)" },
{ "shininess", (void *)&SC_shininess,
"void", "(float)" },
+ { "pointAttenuation", (void *)&SC_pointAttenuation,
+ "void", "(float, float, float)" },
{ "uploadToTexture", (void *)&SC_uploadToTexture,
"void", "(int, int)" },
diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp
index fd54e35..ec38fe9 100644
--- a/libs/surfaceflinger/LayerBase.cpp
+++ b/libs/surfaceflinger/LayerBase.cpp
@@ -354,11 +354,13 @@
return textureName;
}
-void LayerBase::clearWithOpenGL(const Region& clip) const
+void LayerBase::clearWithOpenGL(const Region& clip, GLclampx red,
+ GLclampx green, GLclampx blue,
+ GLclampx alpha) const
{
const DisplayHardware& hw(graphicPlane(0).displayHardware());
const uint32_t fbHeight = hw.getHeight();
- glColor4x(0,0,0,0);
+ glColor4x(red,green,blue,alpha);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glDisable(GL_DITHER);
@@ -377,6 +379,11 @@
}
}
+void LayerBase::clearWithOpenGL(const Region& clip) const
+{
+ clearWithOpenGL(clip,0,0,0,0);
+}
+
void LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
{
const DisplayHardware& hw(graphicPlane(0).displayHardware());
@@ -391,7 +398,8 @@
glEnable(GL_TEXTURE_2D);
// Dithering...
- if (s.flags & ISurfaceComposer::eLayerDither) {
+ bool fast = !(mFlags & DisplayHardware::SLOW_CONFIG);
+ if (fast || s.flags & ISurfaceComposer::eLayerDither) {
glEnable(GL_DITHER);
} else {
glDisable(GL_DITHER);
diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h
index 7791941..2168de0 100644
--- a/libs/surfaceflinger/LayerBase.h
+++ b/libs/surfaceflinger/LayerBase.h
@@ -251,7 +251,9 @@
uint32_t transform;
bool dirty;
};
-
+
+ void clearWithOpenGL(const Region& clip, GLclampx r, GLclampx g,
+ GLclampx b, GLclampx alpha) const;
void clearWithOpenGL(const Region& clip) const;
void drawWithOpenGL(const Region& clip, const Texture& texture) const;
void loadTexture(Texture* texture, GLint textureName,
diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp
index bd6d472f..8a55a3f 100644
--- a/libs/surfaceflinger/LayerBuffer.cpp
+++ b/libs/surfaceflinger/LayerBuffer.cpp
@@ -600,7 +600,11 @@
void LayerBuffer::OverlaySource::onDraw(const Region& clip) const
{
- mLayer.clearWithOpenGL(clip);
+ GLclampx color = 0x000018; //dark blue
+ GLclampx red = 0;
+ GLclampx green = 0;
+ GLclampx blue = 0x1818;
+ mLayer.clearWithOpenGL(clip, red, green, blue, 0);
}
void LayerBuffer::OverlaySource::onTransaction(uint32_t flags)
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp
index a72294a..c78921a 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -573,8 +573,10 @@
// do this without lock held
const size_t count = ditchedLayers.size();
for (size_t i=0 ; i<count ; i++) {
- //LOGD("ditching layer %p", ditchedLayers[i].get());
- ditchedLayers[i]->ditch();
+ if (ditchedLayers[i] != 0) {
+ //LOGD("ditching layer %p", ditchedLayers[i].get());
+ ditchedLayers[i]->ditch();
+ }
}
}
@@ -1082,6 +1084,8 @@
status_t SurfaceFlinger::addLayer_l(const sp<LayerBase>& layer)
{
+ if (layer == 0)
+ return BAD_VALUE;
ssize_t i = mCurrentState.layersSortedByZ.add(
layer, &LayerBase::compareCurrentStateZ);
sp<LayerBaseClient> lbc = LayerBase::dynamicCast< LayerBaseClient* >(layer.get());
diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp
index 60c177b..e39a357 100644
--- a/libs/ui/EventHub.cpp
+++ b/libs/ui/EventHub.cpp
@@ -781,12 +781,21 @@
if(strcmp(mDevices[i]->path.string(), deviceName) == 0) {
//LOGD("remove device %d: %s\n", i, deviceName);
device_t* device = mDevices[i];
- int count = mFDCount - i - 1;
+
+ LOGI("Removed device: path=%s name=%s id=0x%x (of 0x%x) index=%d fd=%d classes=0x%x\n",
+ device->path.string(), device->name.string(), device->id,
+ mNumDevicesById, mFDCount, mFDs[i].fd, device->classes);
+
+ // Clear this device's entry.
int index = (device->id&ID_MASK);
mDevicesById[index].device = NULL;
+
+ // Close the file descriptor and compact the fd array.
close(mFDs[i].fd);
+ int count = mFDCount - i - 1;
memmove(mDevices + i, mDevices + i + 1, sizeof(mDevices[0]) * count);
memmove(mFDs + i, mFDs + i + 1, sizeof(mFDs[0]) * count);
+ mFDCount--;
#ifdef EV_SW
for (int j=0; j<EV_SW; j++) {
@@ -799,8 +808,6 @@
device->next = mClosingDevices;
mClosingDevices = device;
- mFDCount--;
-
uint32_t publicID;
if (device->id == mFirstKeyboardId) {
LOGW("built-in keyboard device %s (id=%d) is closing! the apps will not like this",
@@ -817,7 +824,7 @@
return 0;
}
}
- LOGE("remote device: %s not found\n", deviceName);
+ LOGE("remove device: %s not found\n", deviceName);
return -1;
}
@@ -832,7 +839,7 @@
int event_pos = 0;
struct inotify_event *event;
-LOGD("EventHub::read_notify nfd: %d\n", nfd);
+ LOGV("EventHub::read_notify nfd: %d\n", nfd);
res = read(nfd, event_buf, sizeof(event_buf));
if(res < (int)sizeof(*event)) {
if(errno == EINTR)
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 0831f4a..f80843d 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -3284,7 +3284,16 @@
break;
}
if (c == '\'' && (quoted == 0 || quoted == '\'')) {
- break;
+ /*
+ * In practice, when people write ' instead of \'
+ * in a string, they are doing it by accident
+ * instead of really meaning to use ' as a quoting
+ * character. Warn them so they don't lose it.
+ */
+ if (outErrorMsg) {
+ *outErrorMsg = "Apostrophe not preceded by \\";
+ }
+ return false;
}
}
p++;
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 8326361..94ced22 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -105,9 +105,6 @@
*/
public static final String KEY_LOCATION_CHANGED = "location";
- /** @hide */
- public static final String SYSTEM_DIR = "/data/system/location";
-
// Map from LocationListeners to their associated ListenerTransport objects
private HashMap<LocationListener,ListenerTransport> mListeners =
new HashMap<LocationListener,ListenerTransport>();
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index de944ee..1dd644b 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -156,13 +156,13 @@
/** @hide Default volume index values for audio streams */
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
4, // STREAM_VOICE_CALL
- 5, // STREAM_SYSTEM
+ 7, // STREAM_SYSTEM
5, // STREAM_RING
11, // STREAM_MUSIC
6, // STREAM_ALARM
5, // STREAM_NOTIFICATION
7, // STREAM_BLUETOOTH_SCO
- 5, // STREAM_SYSTEM_ENFORCED
+ 7, // STREAM_SYSTEM_ENFORCED
11, // STREAM_DTMF
11 // STREAM_TTS
};
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index d578c81..aba40b3 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -340,6 +340,7 @@
ParsePosition pos = new ParsePosition(0);
try {
Date date = sFormatter.parse(dateTimeString, pos);
+ if (date == null) return -1;
return date.getTime();
} catch (IllegalArgumentException ex) {
return -1;
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 3d5aae3..fcc76ca5 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -825,6 +825,22 @@
}
}
+ public void addNoMediaFolder(String path) {
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.Images.ImageColumns.DATA, "");
+ String [] pathSpec = new String[] {path + '%'};
+ try {
+ mMediaProvider.update(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values,
+ MediaStore.Images.ImageColumns.DATA + " LIKE ?", pathSpec);
+ mMediaProvider.update(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values,
+ MediaStore.Images.ImageColumns.DATA + " LIKE ?", pathSpec);
+ mMediaProvider.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values,
+ MediaStore.Images.ImageColumns.DATA + " LIKE ?", pathSpec);
+ } catch (RemoteException e) {
+ throw new RuntimeException();
+ }
+ }
+
}; // end of anonymous MediaScannerClient instance
private void prescan(String filePath) throws RemoteException {
diff --git a/media/java/android/media/MediaScannerClient.java b/media/java/android/media/MediaScannerClient.java
index cf1a8da..258c3b4 100644
--- a/media/java/android/media/MediaScannerClient.java
+++ b/media/java/android/media/MediaScannerClient.java
@@ -25,11 +25,13 @@
public void scanFile(String path, String mimeType, long lastModified, long fileSize);
+ public void addNoMediaFolder(String path);
+
/**
* Called by native code to return metadata extracted from media files.
*/
public void handleStringTag(String name, String value);
-
+
/**
* Called by native code to return mime type extracted from DRM content.
*/
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index 97de486..6a5404e3 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -65,6 +65,8 @@
"(Ljava/lang/String;Ljava/lang/String;)V");
mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface, "setMimeType",
"(Ljava/lang/String;)V");
+ mAddNoMediaFolderMethodID = env->GetMethodID(mediaScannerClientInterface, "addNoMediaFolder",
+ "(Ljava/lang/String;)V");
}
}
@@ -111,12 +113,26 @@
return (!mEnv->ExceptionCheck());
}
+ // returns true if it succeeded, false if an exception occured in the Java code
+ virtual bool addNoMediaFolder(const char* path)
+ {
+ jstring pathStr;
+ if ((pathStr = mEnv->NewStringUTF(path)) == NULL) return false;
+
+ mEnv->CallVoidMethod(mClient, mAddNoMediaFolderMethodID, pathStr);
+
+ mEnv->DeleteLocalRef(pathStr);
+ return (!mEnv->ExceptionCheck());
+ }
+
+
private:
JNIEnv *mEnv;
jobject mClient;
jmethodID mScanFileMethodID;
jmethodID mHandleStringTagMethodID;
jmethodID mSetMimeTypeMethodID;
+ jmethodID mAddNoMediaFolderMethodID;
};
diff --git a/media/libstagefright/HTTPStream.cpp b/media/libstagefright/HTTPStream.cpp
index 098ddbd..6af7df9 100644
--- a/media/libstagefright/HTTPStream.cpp
+++ b/media/libstagefright/HTTPStream.cpp
@@ -174,7 +174,7 @@
*http_status = -1;
mHeaders.clear();
- char line[256];
+ char line[1024];
status_t err = receive_line(line, sizeof(line));
if (err != OK) {
return err;
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 3a065ae..de808e55 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -77,6 +77,8 @@
{ "video/avc", "OMX.PV.avcenc" },
};
+#define CODEC_LOGV(x, ...) LOGV("[%s] "x, mComponentName, ##__VA_ARGS__)
+
struct OMXCodecObserver : public BnOMXObserver {
OMXCodecObserver(const wp<OMXCodec> &target)
: mTarget(target) {
@@ -150,6 +152,15 @@
}
}
+template<class T>
+static void InitOMXParams(T *params) {
+ params->nSize = sizeof(T);
+ params->nVersion.s.nVersionMajor = 1;
+ params->nVersion.s.nVersionMinor = 0;
+ params->nVersion.s.nRevision = 0;
+ params->nVersion.s.nStep = 0;
+}
+
// static
sp<OMXCodec> OMXCodec::Create(
const sp<IOMX> &omx,
@@ -180,6 +191,7 @@
status_t err = omx->allocate_node(componentName, &node);
if (err == OK) {
+ LOGV("Successfully allocated OMX node '%s'", componentName);
break;
}
}
@@ -301,8 +313,12 @@
if (!strcasecmp("audio/3gpp", mime)) {
codec->setAMRFormat();
}
- if (!createEncoder && !strcasecmp("audio/mp4a-latm", mime)) {
- codec->setAACFormat();
+ if (!strcasecmp("audio/mp4a-latm", mime)) {
+ int32_t numChannels, sampleRate;
+ CHECK(meta->findInt32(kKeyChannelCount, &numChannels));
+ CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
+
+ codec->setAACFormat(numChannels, sampleRate);
}
if (!strncasecmp(mime, "video/", 6)) {
int32_t width, height;
@@ -330,7 +346,7 @@
int32_t compressedSize;
success = success && meta->findInt32(
- kKeyCompressedSize, &compressedSize);
+ kKeyMaxInputSize, &compressedSize);
CHECK(success);
CHECK(compressedSize > 0);
@@ -339,19 +355,46 @@
codec->setJPEGInputFormat(width, height, (OMX_U32)compressedSize);
}
+ int32_t maxInputSize;
+ if (createEncoder && meta->findInt32(kKeyMaxInputSize, &maxInputSize)) {
+ codec->setMinBufferSize(kPortIndexInput, (OMX_U32)maxInputSize);
+ }
+
+ if (!strcmp(componentName, "OMX.TI.AMR.encode")
+ || !strcmp(componentName, "OMX.TI.WBAMR.encode")) {
+ codec->setMinBufferSize(kPortIndexOutput, 8192); // XXX
+ }
+
codec->initOutputFormat(meta);
return codec;
}
+void OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) {
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOMXParams(&def);
+ def.nPortIndex = portIndex;
+
+ status_t err = mOMX->get_parameter(
+ mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+ CHECK_EQ(err, OK);
+
+ if (def.nBufferSize < size) {
+ def.nBufferSize = size;
+
+ }
+
+ err = mOMX->set_parameter(
+ mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+ CHECK_EQ(err, OK);
+}
+
status_t OMXCodec::setVideoPortFormatType(
OMX_U32 portIndex,
OMX_VIDEO_CODINGTYPE compressionFormat,
OMX_COLOR_FORMATTYPE colorFormat) {
OMX_VIDEO_PARAM_PORTFORMATTYPE format;
- format.nSize = sizeof(format);
- format.nVersion.s.nVersionMajor = 1;
- format.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&format);
format.nPortIndex = portIndex;
format.nIndex = 0;
bool found = false;
@@ -443,13 +486,11 @@
kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused);
OMX_PARAM_PORTDEFINITIONTYPE def;
- OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;
-
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexOutput;
+ OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;
+
status_t err = mOMX->get_parameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
@@ -468,9 +509,7 @@
////////////////////////////////////////////////////////////////////////////
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexInput;
err = mOMX->get_parameter(
@@ -478,7 +517,7 @@
CHECK_EQ(err, OK);
def.nBufferSize = (width * height * 2); // (width * height * 3) / 2;
- LOGI("setting nBufferSize = %ld", def.nBufferSize);
+ LOGI("Setting nBufferSize = %ld", def.nBufferSize);
CHECK_EQ(def.eDomain, OMX_PortDomainVideo);
@@ -496,37 +535,6 @@
const char *mime, OMX_U32 width, OMX_U32 height) {
LOGI("setVideoOutputFormat width=%ld, height=%ld", width, height);
- // Enabling this code appears to be the right thing(tm), but,...
- // the TI decoder then loses the ability to output YUV420 and only outputs
- // YCbYCr (16bit)
-
-#if 1
- if (!strcmp("OMX.TI.Video.Decoder", mComponentName)) {
- OMX_PARAM_COMPONENTROLETYPE role;
- role.nSize = sizeof(role);
- role.nVersion.s.nVersionMajor = 1;
- role.nVersion.s.nVersionMinor = 1;
-
- if (!strcasecmp("video/avc", mime)) {
- strncpy((char *)role.cRole, "video_decoder.avc",
- OMX_MAX_STRINGNAME_SIZE - 1);
- } else if (!strcasecmp("video/mp4v-es", mime)) {
- strncpy((char *)role.cRole, "video_decoder.mpeg4",
- OMX_MAX_STRINGNAME_SIZE - 1);
- } else if (!strcasecmp("video/3gpp", mime)) {
- strncpy((char *)role.cRole, "video_decoder.h263",
- OMX_MAX_STRINGNAME_SIZE - 1);
- }
-
- role.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0';
-
- status_t err = mOMX->set_parameter(
- mNode, OMX_IndexParamStandardComponentRole,
- &role, sizeof(role));
- CHECK_EQ(err, OK);
- }
-#endif
-
OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused;
if (!strcasecmp("video/avc", mime)) {
compressionFormat = OMX_VIDEO_CodingAVC;
@@ -545,9 +553,7 @@
#if 1
{
OMX_VIDEO_PARAM_PORTFORMATTYPE format;
- format.nSize = sizeof(format);
- format.nVersion.s.nVersionMajor = 1;
- format.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&format);
format.nPortIndex = kPortIndexOutput;
format.nIndex = 0;
@@ -572,13 +578,11 @@
#endif
OMX_PARAM_PORTDEFINITIONTYPE def;
- OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;
-
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexInput;
+ OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;
+
status_t err = mOMX->get_parameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
@@ -605,9 +609,7 @@
////////////////////////////////////////////////////////////////////////////
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexOutput;
err = mOMX->get_parameter(
@@ -653,6 +655,63 @@
mObserver = new OMXCodecObserver(this);
mOMX->observe_node(mNode, mObserver);
+
+ setComponentRole();
+}
+
+void OMXCodec::setComponentRole() {
+ struct MimeToRole {
+ const char *mime;
+ const char *decoderRole;
+ const char *encoderRole;
+ };
+
+ static const MimeToRole kMimeToRole[] = {
+ { "audio/mpeg", "audio_decoder.mp3", "audio_encoder.mp3" },
+ { "audio/3gpp", "audio_decoder.amrnb", "audio_encoder.amrnb" },
+ { "audio/mp4a-latm", "audio_decoder.aac", "audio_encoder.aac" },
+ { "video/avc", "video_decoder.avc", "video_encoder.avc" },
+ { "video/mp4v-es", "video_decoder.mpeg4", "video_encoder.mpeg4" },
+ { "video/3gpp", "video_decoder.h263", "video_encoder.h263" },
+ };
+
+ static const size_t kNumMimeToRole =
+ sizeof(kMimeToRole) / sizeof(kMimeToRole[0]);
+
+ size_t i;
+ for (i = 0; i < kNumMimeToRole; ++i) {
+ if (!strcasecmp(mMIME, kMimeToRole[i].mime)) {
+ break;
+ }
+ }
+
+ if (i == kNumMimeToRole) {
+ return;
+ }
+
+ const char *role =
+ mIsEncoder ? kMimeToRole[i].encoderRole
+ : kMimeToRole[i].decoderRole;
+
+ if (role != NULL) {
+ CODEC_LOGV("Setting component role '%s'.", role);
+
+ OMX_PARAM_COMPONENTROLETYPE roleParams;
+ InitOMXParams(&roleParams);
+
+ strncpy((char *)roleParams.cRole,
+ role, OMX_MAX_STRINGNAME_SIZE - 1);
+
+ roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0';
+
+ status_t err = mOMX->set_parameter(
+ mNode, OMX_IndexParamStandardComponentRole,
+ &roleParams, sizeof(roleParams));
+
+ if (err != OK) {
+ LOGW("Failed to set standard component role '%s'.", role);
+ }
+ }
}
OMXCodec::~OMXCodec() {
@@ -685,7 +744,6 @@
if (!(mQuirks & kRequiresLoadedToIdleAfterAllocation)) {
err = mOMX->send_command(mNode, OMX_CommandStateSet, OMX_StateIdle);
CHECK_EQ(err, OK);
-
setState(LOADED_TO_IDLE);
}
@@ -727,11 +785,7 @@
status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
OMX_PARAM_PORTDEFINITIONTYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
- def.nVersion.s.nRevision = 0;
- def.nVersion.s.nStep = 0;
+ InitOMXParams(&def);
def.nPortIndex = portIndex;
status_t err = mOMX->get_parameter(
@@ -779,7 +833,7 @@
mPortBuffers[portIndex].push(info);
- LOGV("allocated buffer %p on %s port", buffer,
+ CODEC_LOGV("allocated buffer %p on %s port", buffer,
portIndex == kPortIndexInput ? "input" : "output");
}
@@ -805,7 +859,7 @@
{
IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer;
- LOGV("EMPTY_BUFFER_DONE(buffer: %p)", buffer);
+ CODEC_LOGV("EMPTY_BUFFER_DONE(buffer: %p)", buffer);
Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput];
size_t i = 0;
@@ -822,7 +876,7 @@
buffers->editItemAt(i).mOwnedByComponent = false;
if (mPortStatus[kPortIndexInput] == DISABLING) {
- LOGV("Port is disabled, freeing buffer %p", buffer);
+ CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
status_t err =
mOMX->free_buffer(mNode, kPortIndexInput, buffer);
@@ -842,12 +896,12 @@
IOMX::buffer_id buffer = msg.u.extended_buffer_data.buffer;
OMX_U32 flags = msg.u.extended_buffer_data.flags;
- LOGV("FILL_BUFFER_DONE(buffer: %p, size: %ld, flags: 0x%08lx)",
+ CODEC_LOGV("FILL_BUFFER_DONE(buffer: %p, size: %ld, flags: 0x%08lx)",
buffer,
msg.u.extended_buffer_data.range_length,
flags);
- LOGV("FILL_BUFFER_DONE(timestamp: %lld us (%.2f secs))",
+ CODEC_LOGV("FILL_BUFFER_DONE(timestamp: %lld us (%.2f secs))",
msg.u.extended_buffer_data.timestamp,
msg.u.extended_buffer_data.timestamp / 1E6);
@@ -868,7 +922,7 @@
info->mOwnedByComponent = false;
if (mPortStatus[kPortIndexOutput] == DISABLING) {
- LOGV("Port is disabled, freeing buffer %p", buffer);
+ CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
status_t err =
mOMX->free_buffer(mNode, kPortIndexOutput, buffer);
@@ -877,7 +931,7 @@
buffers->removeAt(i);
} else if (mPortStatus[kPortIndexOutput] == ENABLED
&& (flags & OMX_BUFFERFLAG_EOS)) {
- LOGV("No more output data.");
+ CODEC_LOGV("No more output data.");
mNoMoreOutputData = true;
mBufferFilled.signal();
} else if (mPortStatus[kPortIndexOutput] != SHUTTING_DOWN) {
@@ -949,7 +1003,7 @@
case OMX_EventBufferFlag:
{
- LOGV("EVENT_BUFFER_FLAG(%ld)", data1);
+ CODEC_LOGV("EVENT_BUFFER_FLAG(%ld)", data1);
if (data1 == kPortIndexOutput) {
mNoMoreOutputData = true;
@@ -959,7 +1013,7 @@
default:
{
- LOGV("EVENT(%d, %ld, %ld)", event, data1, data2);
+ CODEC_LOGV("EVENT(%d, %ld, %ld)", event, data1, data2);
break;
}
}
@@ -976,7 +1030,7 @@
case OMX_CommandPortDisable:
{
OMX_U32 portIndex = data;
- LOGV("PORT_DISABLED(%ld)", portIndex);
+ CODEC_LOGV("PORT_DISABLED(%ld)", portIndex);
CHECK(mState == EXECUTING || mState == RECONFIGURING);
CHECK_EQ(mPortStatus[portIndex], DISABLING);
@@ -998,7 +1052,7 @@
case OMX_CommandPortEnable:
{
OMX_U32 portIndex = data;
- LOGV("PORT_ENABLED(%ld)", portIndex);
+ CODEC_LOGV("PORT_ENABLED(%ld)", portIndex);
CHECK(mState == EXECUTING || mState == RECONFIGURING);
CHECK_EQ(mPortStatus[portIndex], ENABLING);
@@ -1019,7 +1073,7 @@
{
OMX_U32 portIndex = data;
- LOGV("FLUSH_DONE(%ld)", portIndex);
+ CODEC_LOGV("FLUSH_DONE(%ld)", portIndex);
CHECK_EQ(mPortStatus[portIndex], SHUTTING_DOWN);
mPortStatus[portIndex] = ENABLED;
@@ -1034,7 +1088,7 @@
} else if (mState == EXECUTING_TO_IDLE) {
if (mPortStatus[kPortIndexInput] == ENABLED
&& mPortStatus[kPortIndexOutput] == ENABLED) {
- LOGV("Finished flushing both ports, now completing "
+ CODEC_LOGV("Finished flushing both ports, now completing "
"transition from EXECUTING to IDLE.");
mPortStatus[kPortIndexInput] = SHUTTING_DOWN;
@@ -1049,7 +1103,7 @@
if (mPortStatus[kPortIndexInput] == ENABLED
&& mPortStatus[kPortIndexOutput] == ENABLED) {
- LOGV("Finished flushing both ports, now continuing from"
+ CODEC_LOGV("Finished flushing both ports, now continuing from"
" seek-time.");
drainInputBuffers();
@@ -1062,7 +1116,7 @@
default:
{
- LOGV("CMD_COMPLETE(%d, %ld)", cmd, data);
+ CODEC_LOGV("CMD_COMPLETE(%d, %ld)", cmd, data);
break;
}
}
@@ -1072,7 +1126,7 @@
switch (newState) {
case OMX_StateIdle:
{
- LOGV("Now Idle.");
+ CODEC_LOGV("Now Idle.");
if (mState == LOADED_TO_IDLE) {
status_t err = mOMX->send_command(
mNode, OMX_CommandStateSet, OMX_StateExecuting);
@@ -1114,7 +1168,7 @@
{
CHECK_EQ(mState, IDLE_TO_EXECUTING);
- LOGV("Now Executing.");
+ CODEC_LOGV("Now Executing.");
setState(EXECUTING);
@@ -1130,7 +1184,7 @@
{
CHECK_EQ(mState, IDLE_TO_LOADED);
- LOGV("Now Loaded.");
+ CODEC_LOGV("Now Loaded.");
setState(LOADED);
break;
@@ -1196,7 +1250,7 @@
}
void OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) {
- LOGV("PORT_SETTINGS_CHANGED(%ld)", portIndex);
+ CODEC_LOGV("PORT_SETTINGS_CHANGED(%ld)", portIndex);
CHECK_EQ(mState, EXECUTING);
CHECK_EQ(portIndex, kPortIndexOutput);
@@ -1215,7 +1269,7 @@
CHECK(mState == EXECUTING || mState == RECONFIGURING
|| mState == EXECUTING_TO_IDLE);
- LOGV("flushPortAsync(%ld): we own %d out of %d buffers already.",
+ CODEC_LOGV("flushPortAsync(%ld): we own %d out of %d buffers already.",
portIndex, countBuffersWeOwn(mPortBuffers[portIndex]),
mPortBuffers[portIndex].size());
@@ -1321,10 +1375,6 @@
return;
}
- // We're going to temporarily give up the lock while reading data
- // from the source. A certain client unfortunately chose to have the
- // thread supplying input data and reading output data be the same...
-
MediaBuffer *srcBuffer;
status_t err;
if (mSeekTimeUs >= 0) {
@@ -1332,20 +1382,17 @@
options.setSeekTo(mSeekTimeUs);
mSeekTimeUs = -1;
- mLock.unlock();
err = mSource->read(&srcBuffer, &options);
} else {
- mLock.unlock();
err = mSource->read(&srcBuffer);
}
- mLock.lock();
OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME;
OMX_TICKS timestamp = 0;
size_t srcLength = 0;
if (err != OK) {
- LOGV("signalling end of input stream.");
+ CODEC_LOGV("signalling end of input stream.");
flags |= OMX_BUFFERFLAG_EOS;
mSignalledEOS = true;
@@ -1366,9 +1413,9 @@
&& srcBuffer->meta_data()->findInt32(kKeyTimeScale, &scale)) {
timestamp = ((OMX_TICKS)units * 1000000) / scale;
- LOGV("Calling empty_buffer on buffer %p (length %d)",
+ CODEC_LOGV("Calling empty_buffer on buffer %p (length %d)",
info->mBuffer, srcLength);
- LOGV("Calling empty_buffer with timestamp %lld us (%.2f secs)",
+ CODEC_LOGV("Calling empty_buffer with timestamp %lld us (%.2f secs)",
timestamp, timestamp / 1E6);
}
}
@@ -1389,12 +1436,12 @@
CHECK_EQ(info->mOwnedByComponent, false);
if (mNoMoreOutputData) {
- LOGV("There is no more output data available, not "
+ CODEC_LOGV("There is no more output data available, not "
"calling fillOutputBuffer");
return;
}
- LOGV("Calling fill_buffer on buffer %p", info->mBuffer);
+ CODEC_LOGV("Calling fill_buffer on buffer %p", info->mBuffer);
mOMX->fill_buffer(mNode, info->mBuffer);
info->mOwnedByComponent = true;
@@ -1433,12 +1480,43 @@
mBufferFilled.signal();
}
+void OMXCodec::setRawAudioFormat(
+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) {
+ OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
+ InitOMXParams(&pcmParams);
+ pcmParams.nPortIndex = portIndex;
+
+ status_t err = mOMX->get_parameter(
+ mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+
+ CHECK_EQ(err, OK);
+
+ pcmParams.nChannels = numChannels;
+ pcmParams.eNumData = OMX_NumericalDataSigned;
+ pcmParams.bInterleaved = OMX_TRUE;
+ pcmParams.nBitPerSample = 16;
+ pcmParams.nSamplingRate = sampleRate;
+ pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear;
+
+ if (numChannels == 1) {
+ pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF;
+ } else {
+ CHECK_EQ(numChannels, 2);
+
+ pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+ pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+ }
+
+ err = mOMX->set_parameter(
+ mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+
+ CHECK_EQ(err, OK);
+}
+
void OMXCodec::setAMRFormat() {
if (!mIsEncoder) {
OMX_AUDIO_PARAM_AMRTYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexInput;
status_t err =
@@ -1462,60 +1540,35 @@
CHECK(format->findInt32(kKeySampleRate, &sampleRate));
CHECK(format->findInt32(kKeyChannelCount, &numChannels));
- OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
- pcmParams.nSize = sizeof(pcmParams);
- pcmParams.nVersion.s.nVersionMajor = 1;
- pcmParams.nVersion.s.nVersionMinor = 1;
- pcmParams.nPortIndex = kPortIndexInput;
+ setRawAudioFormat(kPortIndexInput, sampleRate, numChannels);
+ }
+}
+
+void OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate) {
+ if (mIsEncoder) {
+ setRawAudioFormat(kPortIndexInput, sampleRate, numChannels);
+ } else {
+ OMX_AUDIO_PARAM_AACPROFILETYPE profile;
+ InitOMXParams(&profile);
+ profile.nPortIndex = kPortIndexInput;
status_t err = mOMX->get_parameter(
- mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
-
+ mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile));
CHECK_EQ(err, OK);
- pcmParams.nChannels = numChannels;
- pcmParams.eNumData = OMX_NumericalDataSigned;
- pcmParams.bInterleaved = OMX_TRUE;
- pcmParams.nBitPerSample = 16;
- pcmParams.nSamplingRate = sampleRate;
- pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear;
-
- if (numChannels == 1) {
- pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF;
- } else {
- CHECK_EQ(numChannels, 2);
-
- pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
- pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
- }
+ profile.nChannels = numChannels;
+ profile.nSampleRate = sampleRate;
+ profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS;
err = mOMX->set_parameter(
- mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
-
+ mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile));
CHECK_EQ(err, OK);
}
}
-void OMXCodec::setAACFormat() {
- OMX_AUDIO_PARAM_AACPROFILETYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
- def.nPortIndex = kPortIndexInput;
-
- status_t err =
- mOMX->get_parameter(mNode, OMX_IndexParamAudioAac, &def, sizeof(def));
- CHECK_EQ(err, OK);
-
- def.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS;
-
- err = mOMX->set_parameter(mNode, OMX_IndexParamAudioAac, &def, sizeof(def));
- CHECK_EQ(err, OK);
-}
-
void OMXCodec::setImageOutputFormat(
OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height) {
- LOGV("setImageOutputFormat(%ld, %ld)", width, height);
+ CODEC_LOGV("setImageOutputFormat(%ld, %ld)", width, height);
#if 0
OMX_INDEXTYPE index;
@@ -1528,9 +1581,7 @@
#endif
OMX_PARAM_PORTDEFINITIONTYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexOutput;
status_t err = mOMX->get_parameter(
@@ -1581,9 +1632,7 @@
void OMXCodec::setJPEGInputFormat(
OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize) {
OMX_PARAM_PORTDEFINITIONTYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexInput;
status_t err = mOMX->get_parameter(
@@ -1651,7 +1700,7 @@
}
status_t OMXCodec::stop() {
- LOGV("stop");
+ CODEC_LOGV("stop");
Mutex::Autolock autoLock(mLock);
@@ -1669,7 +1718,7 @@
setState(EXECUTING_TO_IDLE);
if (mQuirks & kRequiresFlushBeforeShutdown) {
- LOGV("This component requires a flush before transitioning "
+ CODEC_LOGV("This component requires a flush before transitioning "
"from EXECUTING to IDLE...");
bool emulateInputFlushCompletion =
@@ -1741,7 +1790,7 @@
int64_t seekTimeUs;
if (options && options->getSeekTo(&seekTimeUs)) {
- LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6);
+ CODEC_LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6);
mSignalledEOS = false;
mNoMoreOutputData = false;
@@ -1970,9 +2019,7 @@
void OMXCodec::dumpPortStatus(OMX_U32 portIndex) {
OMX_PARAM_PORTDEFINITIONTYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = portIndex;
status_t err = mOMX->get_parameter(
@@ -2038,9 +2085,7 @@
if (audioDef->eEncoding == OMX_AUDIO_CodingPCM) {
OMX_AUDIO_PARAM_PCMMODETYPE params;
- params.nSize = sizeof(params);
- params.nVersion.s.nVersionMajor = 1;
- params.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(¶ms);
params.nPortIndex = portIndex;
err = mOMX->get_parameter(
@@ -2077,9 +2122,7 @@
mOutputFormat->setCString(kKeyDecoderComponent, mComponentName);
OMX_PARAM_PORTDEFINITIONTYPE def;
- def.nSize = sizeof(def);
- def.nVersion.s.nVersionMajor = 1;
- def.nVersion.s.nVersionMinor = 1;
+ InitOMXParams(&def);
def.nPortIndex = kPortIndexOutput;
status_t err = mOMX->get_parameter(
@@ -2103,29 +2146,44 @@
{
OMX_AUDIO_PORTDEFINITIONTYPE *audio_def = &def.format.audio;
- CHECK_EQ(audio_def->eEncoding, OMX_AUDIO_CodingPCM);
+ if (audio_def->eEncoding == OMX_AUDIO_CodingPCM) {
+ OMX_AUDIO_PARAM_PCMMODETYPE params;
+ InitOMXParams(¶ms);
+ params.nPortIndex = kPortIndexOutput;
- OMX_AUDIO_PARAM_PCMMODETYPE params;
- params.nSize = sizeof(params);
- params.nVersion.s.nVersionMajor = 1;
- params.nVersion.s.nVersionMinor = 1;
- params.nPortIndex = kPortIndexOutput;
+ err = mOMX->get_parameter(
+ mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params));
+ CHECK_EQ(err, OK);
- err = mOMX->get_parameter(
- mNode, OMX_IndexParamAudioPcm, ¶ms, sizeof(params));
- CHECK_EQ(err, OK);
+ CHECK_EQ(params.eNumData, OMX_NumericalDataSigned);
+ CHECK_EQ(params.nBitPerSample, 16);
+ CHECK_EQ(params.ePCMMode, OMX_AUDIO_PCMModeLinear);
- CHECK_EQ(params.eNumData, OMX_NumericalDataSigned);
- CHECK_EQ(params.nBitPerSample, 16);
- CHECK_EQ(params.ePCMMode, OMX_AUDIO_PCMModeLinear);
+ int32_t numChannels, sampleRate;
+ inputFormat->findInt32(kKeyChannelCount, &numChannels);
+ inputFormat->findInt32(kKeySampleRate, &sampleRate);
- int32_t numChannels, sampleRate;
- inputFormat->findInt32(kKeyChannelCount, &numChannels);
- inputFormat->findInt32(kKeySampleRate, &sampleRate);
+ if ((OMX_U32)numChannels != params.nChannels) {
+ LOGW("Codec outputs a different number of channels than "
+ "the input stream contains.");
+ }
- mOutputFormat->setCString(kKeyMIMEType, "audio/raw");
- mOutputFormat->setInt32(kKeyChannelCount, numChannels);
- mOutputFormat->setInt32(kKeySampleRate, sampleRate);
+ mOutputFormat->setCString(kKeyMIMEType, "audio/raw");
+
+ // Use the codec-advertised number of channels, as some
+ // codecs appear to output stereo even if the input data is
+ // mono.
+ mOutputFormat->setInt32(kKeyChannelCount, params.nChannels);
+
+ // The codec-reported sampleRate is not reliable...
+ mOutputFormat->setInt32(kKeySampleRate, sampleRate);
+ } else if (audio_def->eEncoding == OMX_AUDIO_CodingAMR) {
+ mOutputFormat->setCString(kKeyMIMEType, "audio/3gpp");
+ } else if (audio_def->eEncoding == OMX_AUDIO_CodingAAC) {
+ mOutputFormat->setCString(kKeyMIMEType, "audio/mp4a-latm");
+ } else {
+ CHECK(!"Should not be here. Unknown audio encoding.");
+ }
break;
}
diff --git a/opengl/tests/gl2_basic/Android.mk b/opengl/tests/gl2_basic/Android.mk
new file mode 100644
index 0000000..a642eaf
--- /dev/null
+++ b/opengl/tests/gl2_basic/Android.mk
@@ -0,0 +1,19 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+ gl2_basic.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libEGL \
+ libGLESv2 \
+ libui
+
+LOCAL_MODULE:= test-opengl-gl2_basic
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_CFLAGS := -DGL_GLEXT_PROTOTYPES
+
+include $(BUILD_EXECUTABLE)
diff --git a/opengl/tests/gl2_basic/gl2_basic.cpp b/opengl/tests/gl2_basic/gl2_basic.cpp
new file mode 100644
index 0000000..705794a
--- /dev/null
+++ b/opengl/tests/gl2_basic/gl2_basic.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <sched.h>
+#include <sys/resource.h>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+
+#include <utils/Timers.h>
+
+#include <ui/FramebufferNativeWindow.h>
+#include <ui/EGLUtils.h>
+
+using namespace android;
+
+static void printGLString(const char *name, GLenum s)
+{
+ const char *v = (const char *)glGetString(s);
+ if (v)
+ printf("GL %s = %s\n", name, v);
+ else
+ printf("GL %s = (null)\n", name);
+}
+
+int main(int argc, char** argv)
+{
+ EGLint s_configAttribs[] = {
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_RED_SIZE, 5,
+ EGL_GREEN_SIZE, 6,
+ EGL_BLUE_SIZE, 5,
+ EGL_NONE
+ };
+
+ EGLint numConfigs = -1;
+ EGLint majorVersion;
+ EGLint minorVersion;
+ EGLConfig config;
+ EGLContext context;
+ EGLSurface surface;
+ EGLint w, h;
+
+ EGLDisplay dpy;
+
+ EGLNativeWindowType window = 0;
+ window = android_createDisplaySurface();
+
+ dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ eglInitialize(dpy, &majorVersion, &minorVersion);
+ EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &config);
+ surface = eglCreateWindowSurface(dpy, config, window, NULL);
+
+ EGLint gl2_0Attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
+
+ context = eglCreateContext(dpy, config, NULL, gl2_0Attribs);
+ eglMakeCurrent(dpy, surface, surface, context);
+ eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
+ eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
+ GLint dim = w<h ? w : h;
+
+ printGLString("Version", GL_VERSION);
+ printGLString("Vendor", GL_VENDOR);
+ printGLString("Renderer", GL_RENDERER);
+ printGLString("Extensions", GL_EXTENSIONS);
+
+ return 0;
+}
diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml
index af0a1bd..1e1d729 100644
--- a/packages/SettingsProvider/AndroidManifest.xml
+++ b/packages/SettingsProvider/AndroidManifest.xml
@@ -8,6 +8,7 @@
android:label="@string/app_label"
android:process="system"
android:backupAgent="SettingsBackupAgent"
+ android:killAfterRestore="false"
android:icon="@drawable/ic_launcher_settings">
<provider android:name="SettingsProvider" android:authorities="settings"
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 071a90d..0ec8dab 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -41,7 +41,7 @@
#define FILTER_LOWSHELF_ATTENUATION -18.0f // in dB
#define FILTER_TRANSITION_FREQ 1100.0f // in Hz
#define FILTER_SHELF_SLOPE 1.0f // Q
-#define FILTER_GAIN 6.0f // linear gain
+#define FILTER_GAIN 5.5f // linear gain
// such a huge gain is justified by how much energy in the low frequencies is "wasted" at the output
// of the synthesis. The low shelving filter removes it, leaving room for amplification.
diff --git a/preloaded-classes b/preloaded-classes
index 6eb3cf2..3da4797 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -843,24 +843,32 @@
java.util.Formatter
java.util.GregorianCalendar
java.util.HashMap
-java.util.HashMap$1
-java.util.HashMap$2
-java.util.HashMap$AbstractMapIterator
-java.util.HashMap$Entry
java.util.HashMap$EntryIterator
-java.util.HashMap$HashMapEntrySet
+java.util.HashMap$EntrySet
+java.util.HashMap$HashIterator
+java.util.HashMap$HashMapEntry
java.util.HashMap$KeyIterator
+java.util.HashMap$KeySet
java.util.HashMap$ValueIterator
+java.util.HashMap$Values
java.util.HashSet
java.util.Hashtable
-java.util.Hashtable$6
-java.util.Hashtable$6$1
-java.util.Hashtable$Entry
-java.util.Hashtable$HashEnumIterator
+java.util.Hashtable$EntryIterator
+java.util.Hashtable$EntrySet
java.util.Hashtable$HashIterator
+java.util.Hashtable$HashtableEntry
+java.util.Hashtable$KeyEnumeration
+java.util.Hashtable$KeyIterator
+java.util.Hashtable$KeySet
+java.util.Hashtable$ValueEnumeration
+java.util.Hashtable$ValueIterator
+java.util.Hashtable$Values
java.util.IdentityHashMap
java.util.LinkedHashMap
-java.util.LinkedHashMap$LinkedHashMapEntry
+java.util.LinkedHashMap$EntryIterator
+java.util.LinkedHashMap$KeyIterator
+java.util.LinkedHashMap$LinkedEntry
+java.util.LinkedHashMap$ValueIterator
java.util.LinkedList
java.util.LinkedList$Link
java.util.List
diff --git a/services/java/com/android/server/AccessibilityManagerService.java b/services/java/com/android/server/AccessibilityManagerService.java
index 55007ba..f67a7ae 100644
--- a/services/java/com/android/server/AccessibilityManagerService.java
+++ b/services/java/com/android/server/AccessibilityManagerService.java
@@ -25,6 +25,7 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceConnection;
import android.accessibilityservice.IEventListener;
+import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -615,6 +616,10 @@
mId = sIdCounter++;
mComponentName = componentName;
mIntent = new Intent().setComponent(mComponentName);
+ mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
+ com.android.internal.R.string.accessibility_binding_label);
+ mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
+ mContext, 0, new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0));
}
/**
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 4eed7fe..0e60dd6 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -557,7 +557,12 @@
Log.v(TAG, "Adding " + targetPkgs.size() + " backup participants:");
for (PackageInfo p : targetPkgs) {
Log.v(TAG, " " + p + " agent=" + p.applicationInfo.backupAgentName
- + " uid=" + p.applicationInfo.uid);
+ + " uid=" + p.applicationInfo.uid
+ + " killAfterRestore="
+ + (((p.applicationInfo.flags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) ? "true" : "false")
+ + " restoreNeedsApplication="
+ + (((p.applicationInfo.flags & ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION) != 0) ? "true" : "false")
+ );
}
}
@@ -1244,11 +1249,21 @@
+ "] is compatible with installed version ["
+ packageInfo.versionCode + "]");
- // Now perform the actual restore
+ // Now perform the actual restore: first clear the app's data
+ // if appropriate
clearApplicationDataSynchronous(packageName);
+
+ // Then set up and bind the agent (with a restricted Application object
+ // unless the application says otherwise)
+ boolean useRealApp = (packageInfo.applicationInfo.flags
+ & ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION) != 0;
+ if (DEBUG && useRealApp) {
+ Log.v(TAG, "agent requires real Application subclass for restore");
+ }
IBackupAgent agent = bindToAgentSynchronous(
packageInfo.applicationInfo,
- IApplicationThread.BACKUP_MODE_RESTORE);
+ (useRealApp ? IApplicationThread.BACKUP_MODE_INCREMENTAL
+ : IApplicationThread.BACKUP_MODE_RESTORE));
if (agent == null) {
Log.w(TAG, "Can't find backup agent for " + packageName);
EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName,
@@ -1256,12 +1271,26 @@
continue;
}
+ // And then finally run the restore on this agent
try {
processOneRestore(packageInfo, metaInfo.versionCode, agent);
++count;
} finally {
- // unbind even on timeout or failure, just in case
+ // unbind and tidy up even on timeout or failure, just in case
mActivityManager.unbindBackupAgent(packageInfo.applicationInfo);
+
+ // The agent was probably running with a stub Application object,
+ // which isn't a valid run mode for the main app logic. Shut
+ // down the app so that next time it's launched, it gets the
+ // usual full initialization.
+ if ((packageInfo.applicationInfo.flags
+ & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) {
+ if (DEBUG) Log.d(TAG, "Restore complete, killing host process of "
+ + packageInfo.applicationInfo.processName);
+ mActivityManager.killApplicationProcess(
+ packageInfo.applicationInfo.processName,
+ packageInfo.applicationInfo.uid);
+ }
}
}
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 4198154..1da2b47 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -32,6 +32,7 @@
import android.app.ActivityManagerNative;
import android.app.AlertDialog;
+import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -180,6 +181,11 @@
= new HashMap<IBinder, ClientState>();
/**
+ * Set once the system is ready to run third party code.
+ */
+ boolean mSystemReady;
+
+ /**
* Id of the currently selected input method.
*/
String mCurMethodId;
@@ -508,6 +514,16 @@
}
public void systemReady() {
+ synchronized (mMethodMap) {
+ if (!mSystemReady) {
+ mSystemReady = true;
+ try {
+ startInputInnerLocked();
+ } catch (RuntimeException e) {
+ Log.w(TAG, "Unexpected exception", e);
+ }
+ }
+ }
}
public List<InputMethodInfo> getInputMethodList() {
@@ -727,6 +743,20 @@
}
}
+ return startInputInnerLocked();
+ }
+
+ InputBindResult startInputInnerLocked() {
+ if (mCurMethodId == null) {
+ return mNoBinding;
+ }
+
+ if (!mSystemReady) {
+ // If the system is not yet ready, we shouldn't be running third
+ // party code.
+ return new InputBindResult(null, mCurMethodId, mCurSeq);
+ }
+
InputMethodInfo info = mMethodMap.get(mCurMethodId);
if (info == null) {
throw new IllegalArgumentException("Unknown id: " + mCurMethodId);
@@ -736,6 +766,10 @@
mCurIntent = new Intent(InputMethod.SERVICE_INTERFACE);
mCurIntent.setComponent(info.getComponent());
+ mCurIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
+ com.android.internal.R.string.input_method_binding_label);
+ mCurIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
+ mContext, 0, new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS), 0));
if (mContext.bindService(mCurIntent, this, Context.BIND_AUTO_CREATE)) {
mLastBindTime = SystemClock.uptimeMillis();
mHaveConnection = true;
@@ -777,17 +811,20 @@
synchronized (mMethodMap) {
if (mCurIntent != null && name.equals(mCurIntent.getComponent())) {
mCurMethod = IInputMethod.Stub.asInterface(service);
+ if (mCurToken == null) {
+ Log.w(TAG, "Service connected without a token!");
+ unbindCurrentMethodLocked(false);
+ return;
+ }
+ if (DEBUG) Log.v(TAG, "Initiating attach with token: " + mCurToken);
+ executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
+ MSG_ATTACH_TOKEN, mCurMethod, mCurToken));
if (mCurClient != null) {
- if (DEBUG) Log.v(TAG, "Initiating attach with token: " + mCurToken);
+ if (DEBUG) Log.v(TAG, "Creating first session while with client "
+ + mCurClient);
executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
- MSG_ATTACH_TOKEN, mCurMethod, mCurToken));
- if (mCurClient != null) {
- if (DEBUG) Log.v(TAG, "Creating first session while with client "
- + mCurClient);
- executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
- MSG_CREATE_SESSION, mCurMethod,
- new MethodCallback(mCurMethod)));
- }
+ MSG_CREATE_SESSION, mCurMethod,
+ new MethodCallback(mCurMethod)));
}
}
}
@@ -977,6 +1014,11 @@
mShowExplicitlyRequested = true;
mShowForced = true;
}
+
+ if (!mSystemReady) {
+ return false;
+ }
+
boolean res = false;
if (mCurMethod != null) {
executeOrSendMessage(mCurMethod, mCaller.obtainMessageIOO(
@@ -1612,7 +1654,7 @@
+ " mShowExplicitlyRequested=" + mShowExplicitlyRequested
+ " mShowForced=" + mShowForced
+ " mInputShown=" + mInputShown);
- p.println(" mScreenOn=" + mScreenOn);
+ p.println(" mSystemReady=" + mSystemReady + " mScreenOn=" + mScreenOn);
}
if (client != null) {
diff --git a/services/java/com/android/server/KeyInputQueue.java b/services/java/com/android/server/KeyInputQueue.java
index 7ca12f21..244e136 100644
--- a/services/java/com/android/server/KeyInputQueue.java
+++ b/services/java/com/android/server/KeyInputQueue.java
@@ -54,6 +54,7 @@
private static final String EXCLUDED_DEVICES_PATH = "etc/excluded-input-devices.xml";
final SparseArray<InputDevice> mDevices = new SparseArray<InputDevice>();
+ final SparseArray<InputDevice> mIgnoredDevices = new SparseArray<InputDevice>();
final ArrayList<VirtualKey> mVirtualKeys = new ArrayList<VirtualKey>();
final HapticFeedbackCallback mHapticFeedbackCallback;
@@ -391,26 +392,50 @@
if (ev.type == RawInputEvent.EV_DEVICE_ADDED) {
synchronized (mFirst) {
di = newInputDevice(ev.deviceId);
- mDevices.put(ev.deviceId, di);
- if ((di.classes & RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
- readVirtualKeys(di.name);
+ if (di.classes != 0) {
+ // If this device is some kind of input class,
+ // we care about it.
+ mDevices.put(ev.deviceId, di);
+ if ((di.classes & RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
+ readVirtualKeys(di.name);
+ }
+ // The configuration may have changed because
+ // of this device.
+ configChanged = true;
+ } else {
+ // We won't do anything with this device.
+ mIgnoredDevices.put(ev.deviceId, di);
+ Log.i(TAG, "Ignoring non-input device: id=0x"
+ + Integer.toHexString(di.id)
+ + ", name=" + di.name);
}
- configChanged = true;
}
} else if (ev.type == RawInputEvent.EV_DEVICE_REMOVED) {
synchronized (mFirst) {
- Log.i(TAG, "Device removed: id=0x"
- + Integer.toHexString(ev.deviceId));
+ if (false) {
+ Log.i(TAG, "Device removed: id=0x"
+ + Integer.toHexString(ev.deviceId));
+ }
di = mDevices.get(ev.deviceId);
if (di != null) {
mDevices.delete(ev.deviceId);
+ // The configuration may have changed because
+ // of this device.
configChanged = true;
+ } else if ((di=mIgnoredDevices.get(ev.deviceId)) != null) {
+ mIgnoredDevices.remove(ev.deviceId);
} else {
- Log.w(TAG, "Bad device id: " + ev.deviceId);
+ Log.w(TAG, "Removing bad device id: "
+ + Integer.toHexString(ev.deviceId));
+ continue;
}
}
} else {
di = getInputDevice(ev.deviceId);
+ if (di == null) {
+ // This may be some junk from an ignored device.
+ continue;
+ }
// first crack at it
send = preprocessEvent(di, ev);
@@ -422,10 +447,6 @@
}
}
- if (di == null) {
- continue;
- }
-
if (configChanged) {
synchronized (mFirst) {
addLocked(di, System.nanoTime(), 0,
@@ -1056,28 +1077,33 @@
private InputDevice newInputDevice(int deviceId) {
int classes = getDeviceClasses(deviceId);
String name = getDeviceName(deviceId);
- Log.i(TAG, "Device added: id=0x" + Integer.toHexString(deviceId)
- + ", name=" + name
- + ", classes=" + Integer.toHexString(classes));
- InputDevice.AbsoluteInfo absX;
- InputDevice.AbsoluteInfo absY;
- InputDevice.AbsoluteInfo absPressure;
- InputDevice.AbsoluteInfo absSize;
- if ((classes&RawInputEvent.CLASS_TOUCHSCREEN_MT) != 0) {
- absX = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_POSITION_X, "X");
- absY = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_POSITION_Y, "Y");
- absPressure = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_TOUCH_MAJOR, "Pressure");
- absSize = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_WIDTH_MAJOR, "Size");
- } else if ((classes&RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
- absX = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_X, "X");
- absY = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_Y, "Y");
- absPressure = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_PRESSURE, "Pressure");
- absSize = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_TOOL_WIDTH, "Size");
- } else {
- absX = null;
- absY = null;
- absPressure = null;
- absSize = null;
+ InputDevice.AbsoluteInfo absX = null;
+ InputDevice.AbsoluteInfo absY = null;
+ InputDevice.AbsoluteInfo absPressure = null;
+ InputDevice.AbsoluteInfo absSize = null;
+ if (classes != 0) {
+ Log.i(TAG, "Device added: id=0x" + Integer.toHexString(deviceId)
+ + ", name=" + name
+ + ", classes=" + Integer.toHexString(classes));
+ if ((classes&RawInputEvent.CLASS_TOUCHSCREEN_MT) != 0) {
+ absX = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_MT_POSITION_X, "X");
+ absY = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_MT_POSITION_Y, "Y");
+ absPressure = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_MT_TOUCH_MAJOR, "Pressure");
+ absSize = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_MT_WIDTH_MAJOR, "Size");
+ } else if ((classes&RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
+ absX = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_X, "X");
+ absY = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_Y, "Y");
+ absPressure = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_PRESSURE, "Pressure");
+ absSize = loadAbsoluteInfo(deviceId,
+ RawInputEvent.ABS_TOOL_WIDTH, "Size");
+ }
}
return new InputDevice(deviceId, classes, name, absX, absY, absPressure, absSize);
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 7c33e37..af60556 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -16,12 +16,7 @@
package com.android.server;
-import java.io.BufferedReader;
-import java.io.File;
import java.io.FileDescriptor;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -31,7 +26,6 @@
import java.util.Observable;
import java.util.Observer;
import java.util.Set;
-import java.util.regex.Pattern;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@@ -64,7 +58,6 @@
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
-import android.os.SystemClock;
import android.provider.Settings;
import android.util.Log;
import android.util.PrintWriterPrinter;
@@ -84,17 +77,9 @@
private static final String TAG = "LocationManagerService";
private static final boolean LOCAL_LOGV = false;
- // Minimum time interval between last known location writes, in milliseconds.
- private static final long MIN_LAST_KNOWN_LOCATION_TIME = 60L * 1000L;
-
- // Max time to hold wake lock for, in milliseconds.
- private static final long MAX_TIME_FOR_WAKE_LOCK = 60 * 1000L;
-
// The last time a location was written, by provider name.
private HashMap<String,Long> mLastWriteTime = new HashMap<String,Long>();
- private static final Pattern PATTERN_COMMA = Pattern.compile(",");
-
private static final String ACCESS_FINE_LOCATION =
android.Manifest.permission.ACCESS_FINE_LOCATION;
private static final String ACCESS_COARSE_LOCATION =
@@ -416,97 +401,6 @@
}
}
- private Location readLastKnownLocationLocked(String provider) {
- Location location = null;
- String s = null;
- try {
- File f = new File(LocationManager.SYSTEM_DIR + "/location."
- + provider);
- if (!f.exists()) {
- return null;
- }
- BufferedReader reader = new BufferedReader(new FileReader(f), 256);
- s = reader.readLine();
- } catch (IOException e) {
- Log.w(TAG, "Unable to read last known location", e);
- }
-
- if (s == null) {
- return null;
- }
- try {
- String[] tokens = PATTERN_COMMA.split(s);
- int idx = 0;
- long time = Long.parseLong(tokens[idx++]);
- double latitude = Double.parseDouble(tokens[idx++]);
- double longitude = Double.parseDouble(tokens[idx++]);
- double altitude = Double.parseDouble(tokens[idx++]);
- float bearing = Float.parseFloat(tokens[idx++]);
- float speed = Float.parseFloat(tokens[idx++]);
-
- location = new Location(provider);
- location.setTime(time);
- location.setLatitude(latitude);
- location.setLongitude(longitude);
- location.setAltitude(altitude);
- location.setBearing(bearing);
- location.setSpeed(speed);
- } catch (NumberFormatException nfe) {
- Log.e(TAG, "NumberFormatException reading last known location", nfe);
- return null;
- }
-
- return location;
- }
-
- private void writeLastKnownLocationLocked(String provider,
- Location location) {
- long now = SystemClock.elapsedRealtime();
- Long last = mLastWriteTime.get(provider);
- if ((last != null)
- && (now - last.longValue() < MIN_LAST_KNOWN_LOCATION_TIME)) {
- return;
- }
- mLastWriteTime.put(provider, now);
-
- StringBuilder sb = new StringBuilder(100);
- sb.append(location.getTime());
- sb.append(',');
- sb.append(location.getLatitude());
- sb.append(',');
- sb.append(location.getLongitude());
- sb.append(',');
- sb.append(location.getAltitude());
- sb.append(',');
- sb.append(location.getBearing());
- sb.append(',');
- sb.append(location.getSpeed());
-
- FileWriter writer = null;
- try {
- File d = new File(LocationManager.SYSTEM_DIR);
- if (!d.exists()) {
- if (!d.mkdirs()) {
- Log.w(TAG, "Unable to create directory to write location");
- return;
- }
- }
- File f = new File(LocationManager.SYSTEM_DIR + "/location." + provider);
- writer = new FileWriter(f);
- writer.write(sb.toString());
- } catch (IOException e) {
- Log.w(TAG, "Unable to write location", e);
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException e) {
- Log.w(TAG, "Exception closing file", e);
- }
- }
- }
- }
-
private void addProvider(LocationProviderProxy provider) {
mProviders.add(provider);
mProvidersByName.put(provider.getName(), provider);
@@ -854,7 +748,9 @@
*/
void disposeLocked() {
ArrayList<UpdateRecord> records = mRecordsByProvider.get(this.mProvider);
- records.remove(this);
+ if (records != null) {
+ records.remove(this);
+ }
}
@Override
@@ -873,15 +769,6 @@
mLastFixBroadcast.dump(new PrintWriterPrinter(pw), prefix + " ");
pw.println(prefix + "mLastStatusBroadcast=" + mLastStatusBroadcast);
}
-
- /**
- * Calls dispose().
- */
- @Override protected void finalize() {
- synchronized (mLock) {
- disposeLocked();
- }
- }
}
private Receiver getReceiver(ILocationListener listener) {
@@ -1512,16 +1399,7 @@
return null;
}
- Location location = mLastKnownLocation.get(provider);
- if (location == null) {
- // Get the persistent last known location for the provider
- location = readLastKnownLocationLocked(provider);
- if (location != null) {
- mLastKnownLocation.put(provider, location);
- }
- }
-
- return location;
+ return mLastKnownLocation.get(provider);
}
private static boolean shouldBroadcastSafe(Location loc, Location lastLoc, UpdateRecord record) {
@@ -1566,7 +1444,6 @@
} else {
lastLocation.set(location);
}
- writeLastKnownLocationLocked(provider, location);
// Fetch latest status update time
long newStatusUpdateTime = p.getStatusUpdateTime();
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
old mode 100644
new mode 100755
index d0f6eee..696ef31
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -957,8 +957,15 @@
{
// Battery low always shows, other states only show if charging.
if (mBatteryLow) {
- mHardware.setLightFlashing_UNCHECKED(HardwareService.LIGHT_ID_BATTERY, BATTERY_LOW_ARGB,
- HardwareService.LIGHT_FLASH_TIMED, BATTERY_BLINK_ON, BATTERY_BLINK_OFF);
+ if (mBatteryCharging) {
+ mHardware.setLightColor_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
+ BATTERY_LOW_ARGB);
+ } else {
+ // Flash when battery is low and not charging
+ mHardware.setLightFlashing_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
+ BATTERY_LOW_ARGB, HardwareService.LIGHT_FLASH_TIMED,
+ BATTERY_BLINK_ON, BATTERY_BLINK_OFF);
+ }
} else if (mBatteryCharging) {
if (mBatteryFull) {
mHardware.setLightColor_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 8ec6ec3..82cf1bc 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -62,6 +62,8 @@
import android.os.Build;
import android.os.Bundle;
import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.Environment;
@@ -110,6 +112,7 @@
private static final boolean MULTIPLE_APPLICATION_UIDS = true;
private static final int RADIO_UID = Process.PHONE_UID;
+ private static final int LOG_UID = Process.LOG_UID;
private static final int FIRST_APPLICATION_UID =
Process.FIRST_APPLICATION_UID;
private static final int MAX_APPLICATION_UIDS = 1000;
@@ -140,7 +143,7 @@
final HandlerThread mHandlerThread = new HandlerThread("PackageManager",
Process.THREAD_PRIORITY_BACKGROUND);
- final Handler mHandler;
+ final PackageHandler mHandler;
final int mSdkVersion = Build.VERSION.SDK_INT;
final String mSdkCodename = "REL".equals(Build.VERSION.CODENAME)
@@ -272,6 +275,49 @@
ComponentName mResolveComponentName;
PackageParser.Package mPlatformPackage;
+ // Set of pending broadcasts for aggregating enable/disable of components.
+ final HashMap<String, String> mPendingBroadcasts = new HashMap<String, String>();
+ static final int SEND_PENDING_BROADCAST = 1;
+ // Delay time in millisecs
+ static final int BROADCAST_DELAY = 10 * 1000;
+
+ class PackageHandler extends Handler {
+ PackageHandler(Looper looper) {
+ super(looper);
+ }
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case SEND_PENDING_BROADCAST : {
+ int size = 0;
+ String broadcastList[];
+ HashMap<String, String> tmpMap;
+ int uids[];
+ synchronized (mPackages) {
+ size = mPendingBroadcasts.size();
+ if (size <= 0) {
+ // Nothing to be done. Just return
+ return;
+ }
+ broadcastList = new String[size];
+ mPendingBroadcasts.keySet().toArray(broadcastList);
+ tmpMap = new HashMap<String, String>(mPendingBroadcasts);
+ uids = new int[size];
+ for (int i = 0; i < size; i++) {
+ PackageSetting ps = mSettings.mPackages.get(mPendingBroadcasts.get(broadcastList[i]));
+ uids[i] = (ps != null) ? ps.userId : -1;
+ }
+ mPendingBroadcasts.clear();
+ }
+ // Send broadcasts
+ for (int i = 0; i < size; i++) {
+ String className = broadcastList[i];
+ sendPackageChangedBroadcast(className, true, tmpMap.get(className), uids[i]);
+ }
+ break;
+ }
+ }
+ }
+ }
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
@@ -319,6 +365,10 @@
MULTIPLE_APPLICATION_UIDS
? RADIO_UID : FIRST_APPLICATION_UID,
ApplicationInfo.FLAG_SYSTEM);
+ mSettings.addSharedUserLP("android.uid.log",
+ MULTIPLE_APPLICATION_UIDS
+ ? LOG_UID : FIRST_APPLICATION_UID,
+ ApplicationInfo.FLAG_SYSTEM);
String separateProcesses = SystemProperties.get("debug.separate_processes");
if (separateProcesses != null && separateProcesses.length() > 0) {
@@ -355,7 +405,7 @@
synchronized (mInstallLock) {
synchronized (mPackages) {
mHandlerThread.start();
- mHandler = new Handler(mHandlerThread.getLooper());
+ mHandler = new PackageHandler(mHandlerThread.getLooper());
File dataDir = Environment.getDataDirectory();
mAppDataDir = new File(dataDir, "data");
@@ -4866,7 +4916,7 @@
}
private void setEnabledSetting(
- final String packageNameStr, String classNameStr, int newState, final int flags) {
+ final String packageName, String className, int newState, final int flags) {
if (!(newState == COMPONENT_ENABLED_STATE_DEFAULT
|| newState == COMPONENT_ENABLED_STATE_ENABLED
|| newState == COMPONENT_ENABLED_STATE_DISABLED)) {
@@ -4878,17 +4928,20 @@
final int permission = mContext.checkCallingPermission(
android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
+ boolean sendNow = false;
+ boolean isApp = (className == null);
+ String key = isApp ? packageName : className;
int packageUid = -1;
synchronized (mPackages) {
- pkgSetting = mSettings.mPackages.get(packageNameStr);
+ pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting == null) {
- if (classNameStr == null) {
+ if (className == null) {
throw new IllegalArgumentException(
- "Unknown package: " + packageNameStr);
+ "Unknown package: " + packageName);
}
throw new IllegalArgumentException(
- "Unknown component: " + packageNameStr
- + "/" + classNameStr);
+ "Unknown component: " + packageName
+ + "/" + className);
}
if (!allowedByPermission && (uid != pkgSetting.userId)) {
throw new SecurityException(
@@ -4896,41 +4949,67 @@
+ Binder.getCallingPid()
+ ", uid=" + uid + ", package uid=" + pkgSetting.userId);
}
- packageUid = pkgSetting.userId;
- if (classNameStr == null) {
+ if (className == null) {
// We're dealing with an application/package level state change
pkgSetting.enabled = newState;
} else {
// We're dealing with a component level state change
switch (newState) {
case COMPONENT_ENABLED_STATE_ENABLED:
- pkgSetting.enableComponentLP(classNameStr);
+ pkgSetting.enableComponentLP(className);
break;
case COMPONENT_ENABLED_STATE_DISABLED:
- pkgSetting.disableComponentLP(classNameStr);
+ pkgSetting.disableComponentLP(className);
break;
case COMPONENT_ENABLED_STATE_DEFAULT:
- pkgSetting.restoreComponentLP(classNameStr);
+ pkgSetting.restoreComponentLP(className);
break;
default:
Log.e(TAG, "Invalid new component state: " + newState);
+ return;
}
}
mSettings.writeLP();
+ packageUid = pkgSetting.userId;
+ if ((flags&PackageManager.DONT_KILL_APP) == 0) {
+ sendNow = true;
+ // Purge entry from pending broadcast list if another one exists already
+ // since we are sending one right away.
+ if (mPendingBroadcasts.get(key) != null) {
+ mPendingBroadcasts.remove(key);
+ // Can ignore empty list since its handled in the handler anyway
+ }
+ } else {
+ if (mPendingBroadcasts.get(key) == null) {
+ mPendingBroadcasts.put(key, packageName);
+ }
+ if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) {
+ // Schedule a message
+ mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY);
+ }
+ }
}
-
+
long callingId = Binder.clearCallingIdentity();
try {
- Bundle extras = new Bundle(2);
- extras.putBoolean(Intent.EXTRA_DONT_KILL_APP,
- (flags&PackageManager.DONT_KILL_APP) != 0);
- extras.putInt(Intent.EXTRA_UID, packageUid);
- sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageNameStr, extras);
+ if (sendNow) {
+ sendPackageChangedBroadcast(packageName,
+ (flags&PackageManager.DONT_KILL_APP) != 0, key, packageUid);
+ }
} finally {
Binder.restoreCallingIdentity(callingId);
}
}
+ private void sendPackageChangedBroadcast(String packageName,
+ boolean killFlag, String componentName, int packageUid) {
+ Bundle extras = new Bundle(2);
+ extras.putString(Intent.EXTRA_CHANGED_COMPONENT_NAME, componentName);
+ extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, killFlag);
+ extras.putInt(Intent.EXTRA_UID, packageUid);
+ sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras);
+ }
+
public String getInstallerPackageName(String packageName) {
synchronized (mPackages) {
PackageSetting pkg = mSettings.mPackages.get(packageName);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index df01c61..7c2a7ac 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -18,6 +18,7 @@
import com.android.server.am.ActivityManagerService;
import com.android.server.status.StatusBarService;
+import com.android.internal.os.SamplingProfilerIntegration;
import dalvik.system.VMRuntime;
@@ -41,6 +42,9 @@
import android.util.Log;
import android.accounts.AccountManagerService;
+import java.util.Timer;
+import java.util.TimerTask;
+
class ServerThread extends Thread {
private static final String TAG = "SystemServer";
private final static boolean INCLUDE_DEMO = false;
@@ -92,22 +96,22 @@
// Critical services...
try {
- Log.i(TAG, "Starting Entropy Service.");
+ Log.i(TAG, "Entropy Service");
ServiceManager.addService("entropy", new EntropyService());
- Log.i(TAG, "Starting Power Manager.");
+ Log.i(TAG, "Power Manager");
power = new PowerManagerService();
ServiceManager.addService(Context.POWER_SERVICE, power);
- Log.i(TAG, "Starting Activity Manager.");
+ Log.i(TAG, "Activity Manager");
context = ActivityManagerService.main(factoryTest);
- Log.i(TAG, "Starting telephony registry");
+ Log.i(TAG, "Telephony Registry");
ServiceManager.addService("telephony.registry", new TelephonyRegistry(context));
AttributeCache.init(context);
- Log.i(TAG, "Starting Package Manager.");
+ Log.i(TAG, "Package Manager");
pm = PackageManagerService.main(context,
factoryTest != SystemServer.FACTORY_TEST_OFF);
@@ -116,25 +120,25 @@
mContentResolver = context.getContentResolver();
try {
- Log.i(TAG, "Starting Account Manager.");
+ Log.i(TAG, "Account Manager");
ServiceManager.addService(Context.ACCOUNT_SERVICE,
new AccountManagerService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Account Manager", e);
}
- Log.i(TAG, "Starting Content Manager.");
+ Log.i(TAG, "Content Manager");
ContentService.main(context,
factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL);
- Log.i(TAG, "Starting System Content Providers.");
+ Log.i(TAG, "System Content Providers");
ActivityManagerService.installSystemProviders();
- Log.i(TAG, "Starting Battery Service.");
+ Log.i(TAG, "Battery Service");
battery = new BatteryService(context);
ServiceManager.addService("battery", battery);
- Log.i(TAG, "Starting Hardware Service.");
+ Log.i(TAG, "Hardware Service");
hardware = new HardwareService(context);
ServiceManager.addService("hardware", hardware);
@@ -142,18 +146,19 @@
// hardware service, content providers and the battery service.
power.init(context, hardware, ActivityManagerService.getDefault(), battery);
- Log.i(TAG, "Starting Alarm Manager.");
+ Log.i(TAG, "Alarm Manager");
AlarmManagerService alarm = new AlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE, alarm);
+ Log.i(TAG, "Init Watchdog");
Watchdog.getInstance().init(context, battery, power, alarm,
ActivityManagerService.self());
// Sensor Service is needed by Window Manager, so this goes first
- Log.i(TAG, "Starting Sensor Service.");
+ Log.i(TAG, "Sensor Service");
ServiceManager.addService(Context.SENSOR_SERVICE, new SensorService(context));
- Log.i(TAG, "Starting Window Manager.");
+ Log.i(TAG, "Window Manager");
wm = WindowManagerService.main(context, power,
factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
@@ -171,7 +176,7 @@
Log.i(TAG, "Registering null Bluetooth Service (factory test)");
ServiceManager.addService(Context.BLUETOOTH_SERVICE, null);
} else {
- Log.i(TAG, "Starting Bluetooth Service.");
+ Log.i(TAG, "Bluetooth Service");
bluetooth = new BluetoothService(context);
ServiceManager.addService(Context.BLUETOOTH_SERVICE, bluetooth);
bluetooth.initAfterRegistration();
@@ -198,7 +203,7 @@
if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
try {
- Log.i(TAG, "Starting Status Bar Service.");
+ Log.i(TAG, "Status Bar");
statusBar = new StatusBarService(context);
ServiceManager.addService("statusbar", statusBar);
} catch (Throwable e) {
@@ -206,14 +211,14 @@
}
try {
- Log.i(TAG, "Starting Clipboard Service.");
+ Log.i(TAG, "Clipboard Service");
ServiceManager.addService("clipboard", new ClipboardService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Clipboard Service", e);
}
try {
- Log.i(TAG, "Starting Input Method Service.");
+ Log.i(TAG, "Input Method Service");
imm = new InputMethodManagerService(context, statusBar);
ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);
} catch (Throwable e) {
@@ -221,14 +226,14 @@
}
try {
- Log.i(TAG, "Starting NetStat Service.");
+ Log.i(TAG, "NetStat Service");
ServiceManager.addService("netstat", new NetStatService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting NetStat Service", e);
}
try {
- Log.i(TAG, "Starting Connectivity Service.");
+ Log.i(TAG, "Connectivity Service");
connectivity = ConnectivityService.getInstance(context);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
} catch (Throwable e) {
@@ -236,7 +241,7 @@
}
try {
- Log.i(TAG, "Starting Accessibility Manager.");
+ Log.i(TAG, "Accessibility Manager");
ServiceManager.addService(Context.ACCESSIBILITY_SERVICE,
new AccessibilityManagerService(context));
} catch (Throwable e) {
@@ -244,7 +249,7 @@
}
try {
- Log.i(TAG, "Starting Notification Manager.");
+ Log.i(TAG, "Notification Manager");
notification = new NotificationManagerService(context, statusBar, hardware);
ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);
} catch (Throwable e) {
@@ -253,14 +258,14 @@
try {
// MountService must start after NotificationManagerService
- Log.i(TAG, "Starting Mount Service.");
+ Log.i(TAG, "Mount Service");
ServiceManager.addService("mount", new MountService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Mount Service", e);
}
try {
- Log.i(TAG, "Starting DeviceStorageMonitor service");
+ Log.i(TAG, "Device Storage Monitor");
ServiceManager.addService(DeviceStorageMonitorService.SERVICE,
new DeviceStorageMonitorService(context));
} catch (Throwable e) {
@@ -268,14 +273,14 @@
}
try {
- Log.i(TAG, "Starting Location Manager.");
+ Log.i(TAG, "Location Manager");
ServiceManager.addService(Context.LOCATION_SERVICE, new LocationManagerService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Location Manager", e);
}
try {
- Log.i(TAG, "Starting Search Service.");
+ Log.i(TAG, "Search Service");
ServiceManager.addService( Context.SEARCH_SERVICE, new SearchManagerService(context) );
} catch (Throwable e) {
Log.e(TAG, "Failure starting Search Service", e);
@@ -287,7 +292,7 @@
}
try {
- Log.i(TAG, "Starting Checkin Service.");
+ Log.i(TAG, "Checkin Service");
Intent intent = new Intent().setComponent(new ComponentName(
"com.google.android.server.checkin",
"com.google.android.server.checkin.CheckinService"));
@@ -300,7 +305,7 @@
}
try {
- Log.i(TAG, "Starting Wallpaper Service");
+ Log.i(TAG, "Wallpaper Service");
wallpaper = new WallpaperManagerService(context);
ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);
} catch (Throwable e) {
@@ -308,14 +313,14 @@
}
try {
- Log.i(TAG, "Starting Audio Service");
+ Log.i(TAG, "Audio Service");
ServiceManager.addService(Context.AUDIO_SERVICE, new AudioService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Audio Service", e);
}
try {
- Log.i(TAG, "Starting HeadsetObserver");
+ Log.i(TAG, "Headset Observer");
// Listen for wired headset changes
headset = new HeadsetObserver(context);
} catch (Throwable e) {
@@ -323,7 +328,7 @@
}
try {
- Log.i(TAG, "Starting DockObserver");
+ Log.i(TAG, "Dock Observer");
// Listen for dock station changes
dock = new DockObserver(context);
} catch (Throwable e) {
@@ -331,14 +336,14 @@
}
try {
- Log.i(TAG, "Starting Backup Service");
+ Log.i(TAG, "Backup Service");
ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Backup Service", e);
}
try {
- Log.i(TAG, "Starting AppWidget Service");
+ Log.i(TAG, "AppWidget Service");
appWidget = new AppWidgetService(context);
ServiceManager.addService(Context.APPWIDGET_SERVICE, appWidget);
} catch (Throwable e) {
@@ -361,7 +366,7 @@
false, new AdbSettingsObserver());
// It is now time to start up the app processes...
- boolean safeMode = wm.detectSafeMode();
+ final boolean safeMode = wm.detectSafeMode();
if (notification != null) {
notification.systemReady();
@@ -370,31 +375,45 @@
if (statusBar != null) {
statusBar.systemReady();
}
- if (imm != null) {
- imm.systemReady();
- }
wm.systemReady();
power.systemReady();
try {
pm.systemReady();
} catch (RemoteException e) {
}
- if (appWidget != null) {
- appWidget.systemReady(safeMode);
- }
- // After making the following code, third party code may be running...
- try {
- ActivityManagerNative.getDefault().systemReady();
- } catch (RemoteException e) {
- }
+ // These are needed to propagate to the runnable below.
+ final BatteryService batteryF = battery;
+ final ConnectivityService connectivityF = connectivity;
+ final DockObserver dockF = dock;
+ final AppWidgetService appWidgetF = appWidget;
+ final WallpaperManagerService wallpaperF = wallpaper;
+ final InputMethodManagerService immF = imm;
+
+ // We now tell the activity manager it is okay to run third party
+ // code. It will call back into us once it has gotten to the state
+ // where third party code can really run (but before it has actually
+ // started launching the initial applications), for us to complete our
+ // initialization.
+ ((ActivityManagerService)ActivityManagerNative.getDefault())
+ .systemReady(new Runnable() {
+ public void run() {
+ Log.i(TAG, "Making services ready");
+
+ if (batteryF != null) batteryF.systemReady();
+ if (connectivityF != null) connectivityF.systemReady();
+ if (dockF != null) dockF.systemReady();
+ Watchdog.getInstance().start();
- if (wallpaper != null) wallpaper.systemReady();
- if (battery != null) battery.systemReady();
- if (connectivity != null) connectivity.systemReady();
- if (dock != null) dock.systemReady();
- Watchdog.getInstance().start();
-
+ // It is now okay to let the various system services start their
+ // third party code...
+
+ if (appWidgetF != null) appWidgetF.systemReady(safeMode);
+ if (wallpaperF != null) wallpaperF.systemReady();
+ if (immF != null) immF.systemReady();
+ }
+ });
+
Looper.loop();
Log.d(TAG, "System ServerThread is exiting!");
}
@@ -437,6 +456,9 @@
public static final int FACTORY_TEST_LOW_LEVEL = 1;
public static final int FACTORY_TEST_HIGH_LEVEL = 2;
+ static Timer timer;
+ static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr
+
/**
* This method is called from Zygote to initialize the system. This will cause the native
* services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back
@@ -445,6 +467,17 @@
native public static void init1(String[] args);
public static void main(String[] args) {
+ if (SamplingProfilerIntegration.isEnabled()) {
+ SamplingProfilerIntegration.start();
+ timer = new Timer();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ SamplingProfilerIntegration.writeSnapshot("system_server");
+ }
+ }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
+ }
+
// The system server has to run all of the time, so it needs to be
// as efficient as possible with its memory usage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index c101463..cc977b0 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -21,6 +21,7 @@
import android.app.IWallpaperManager;
import android.app.IWallpaperManagerCallback;
+import android.app.PendingIntent;
import android.backup.BackupManager;
import android.content.ComponentName;
import android.content.Context;
@@ -40,6 +41,7 @@
import android.os.RemoteCallbackList;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.provider.Settings;
import android.service.wallpaper.IWallpaperConnection;
import android.service.wallpaper.IWallpaperEngine;
import android.service.wallpaper.IWallpaperService;
@@ -376,6 +378,10 @@
// Bind the service!
WallpaperConnection newConn = new WallpaperConnection();
intent.setComponent(realName);
+ intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
+ com.android.internal.R.string.wallpaper_binding_label);
+ intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
+ mContext, 0, new Intent(Intent.ACTION_SET_WALLPAPER), 0));
if (!mContext.bindService(intent, newConn,
Context.BIND_AUTO_CREATE)) {
throw new IllegalArgumentException("Unable to bind service: "
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 81e0136..b4f4768 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -135,6 +135,7 @@
static final boolean DEBUG_INPUT = false;
static final boolean DEBUG_INPUT_METHOD = false;
static final boolean DEBUG_VISIBILITY = false;
+ static final boolean DEBUG_WINDOW_MOVEMENT = false;
static final boolean DEBUG_ORIENTATION = false;
static final boolean DEBUG_APP_TRANSITIONS = false;
static final boolean DEBUG_STARTING_WINDOW = false;
@@ -375,11 +376,14 @@
// made visible or hidden at the next transition.
int mNextAppTransition = WindowManagerPolicy.TRANSIT_NONE;
boolean mAppTransitionReady = false;
+ boolean mAppTransitionRunning = false;
boolean mAppTransitionTimeout = false;
boolean mStartingIconInTransition = false;
boolean mSkipAppTransitionAnimation = false;
final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
+ final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>();
+ final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>();
//flag to detect fat touch events
boolean mFatTouch = false;
@@ -690,7 +694,11 @@
i--;
break;
}
- if (t.windows.size() > 0) {
+
+ // We haven't reached the token yet; if this token
+ // is not going to the bottom and has windows, we can
+ // use it as an anchor for when we do reach the token.
+ if (!t.sendingToBottom && t.windows.size() > 0) {
pos = t.windows.get(0);
}
}
@@ -712,6 +720,8 @@
}
placeWindowBefore(pos, win);
} else {
+ // Continue looking down until we find the first
+ // token that has windows.
while (i >= 0) {
AppWindowToken t = mAppTokens.get(i);
final int NW = t.windows.size();
@@ -1183,6 +1193,20 @@
moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true));
}
+ final boolean isWallpaperVisible(WindowState wallpaperTarget) {
+ if (DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper vis: target obscured="
+ + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
+ + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
+ ? wallpaperTarget.mAppToken.animation : null)
+ + " upper=" + mUpperWallpaperTarget
+ + " lower=" + mLowerWallpaperTarget);
+ return (wallpaperTarget != null
+ && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null
+ && wallpaperTarget.mAppToken.animation != null)))
+ || mUpperWallpaperTarget != null
+ || mLowerWallpaperTarget != null;
+ }
+
boolean adjustWallpaperWindowsLocked() {
boolean changed = false;
@@ -1342,7 +1366,7 @@
if (visible) {
// The window is visible to the compositor... but is it visible
// to the user? That is what the wallpaper cares about.
- visible = !foundW.mObscured;
+ visible = isWallpaperVisible(foundW);
if (DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper visibility: " + visible);
// If the wallpaper target is animating, we may need to copy
@@ -1367,6 +1391,8 @@
foundW = wb;
foundI--;
}
+ } else {
+ if (DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper not visible");
}
// Okay i is the position immediately above the wallpaper. Look at
@@ -1384,6 +1410,8 @@
while (curTokenIndex > 0) {
curTokenIndex--;
WindowToken token = mWallpaperTokens.get(curTokenIndex);
+ token.hidden = !visible;
+
int curWallpaperIndex = token.windows.size();
while (curWallpaperIndex > 0) {
curWallpaperIndex--;
@@ -1538,8 +1566,7 @@
}
void updateWallpaperVisibilityLocked() {
- final boolean visible = mWallpaperTarget != null
- && !mWallpaperTarget.mObscured;
+ final boolean visible = isWallpaperVisible(mWallpaperTarget);
final int dw = mDisplay.getWidth();
final int dh = mDisplay.getHeight();
@@ -1547,6 +1574,8 @@
while (curTokenIndex > 0) {
curTokenIndex--;
WindowToken token = mWallpaperTokens.get(curTokenIndex);
+ token.hidden = !visible;
+
int curWallpaperIndex = token.windows.size();
while (curWallpaperIndex > 0) {
curWallpaperIndex--;
@@ -1559,7 +1588,7 @@
wallpaper.mWallpaperVisible = visible;
try {
if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Log.v(TAG,
- "Setting visibility of wallpaper " + wallpaper
+ "Updating visibility of wallpaper " + wallpaper
+ ": " + visible);
wallpaper.mClient.dispatchAppVisibility(visible);
} catch (RemoteException e) {
@@ -1894,6 +1923,12 @@
moveInputMethodWindowsIfNeededLocked(false);
}
+ if (false) {
+ RuntimeException e = new RuntimeException("here");
+ e.fillInStackTrace();
+ Log.w(TAG, "Removing window " + win, e);
+ }
+
mPolicy.removeWindowLw(win);
win.removeLocked();
@@ -2392,15 +2427,25 @@
? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
: com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_WALLPAPER_ACTIVITY_OPEN:
+ case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_wallpaperActivityOpenEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_wallpaperActivityOpenExitAnimation;
+ ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
+ : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_WALLPAPER_ACTIVITY_CLOSE:
+ case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_wallpaperActivityCloseEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_wallpaperActivityCloseExitAnimation;
+ ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
+ : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
+ break;
+ case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN:
+ animAttr = enter
+ ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
+ : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
+ break;
+ case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE:
+ animAttr = enter
+ ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
+ : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
break;
}
a = loadAnimation(lp, animAttr);
@@ -2707,10 +2752,10 @@
Configuration config;
synchronized(mWindowMap) {
config = updateOrientationFromAppTokensLocked(currentConfig, freezeThisOneIfNeeded);
- }
- if (config != null) {
- mLayoutNeeded = true;
- performLayoutAndPlaceSurfacesLocked();
+ if (config != null) {
+ mLayoutNeeded = true;
+ performLayoutAndPlaceSurfacesLocked();
+ }
}
return config;
}
@@ -2760,7 +2805,6 @@
mTempConfiguration.setToDefaults();
if (computeNewConfigurationLocked(mTempConfiguration)) {
if (appConfig.diff(mTempConfiguration) != 0) {
- Log.i(TAG, "Config changed: " + mTempConfiguration);
return new Configuration(mTempConfiguration);
}
}
@@ -3198,12 +3242,14 @@
wtoken.setDummyAnimation();
mOpeningApps.remove(wtoken);
mClosingApps.remove(wtoken);
+ wtoken.waitingToShow = wtoken.waitingToHide = false;
wtoken.inPendingTransaction = true;
if (visible) {
mOpeningApps.add(wtoken);
wtoken.allDrawn = false;
wtoken.startingDisplayed = false;
wtoken.startingMoved = false;
+ wtoken.waitingToShow = true;
if (wtoken.clientHidden) {
// In the case where we are making an app visible
@@ -3217,6 +3263,7 @@
}
} else {
mClosingApps.add(wtoken);
+ wtoken.waitingToHide = true;
}
return;
}
@@ -3351,10 +3398,12 @@
delayed = setTokenVisibilityLocked(wtoken, null, false, WindowManagerPolicy.TRANSIT_NONE, true);
wtoken.inPendingTransaction = false;
mOpeningApps.remove(wtoken);
+ wtoken.waitingToShow = false;
if (mClosingApps.contains(wtoken)) {
delayed = true;
} else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
mClosingApps.add(wtoken);
+ wtoken.waitingToHide = true;
delayed = true;
}
if (DEBUG_APP_TRANSITIONS) Log.v(
@@ -3399,11 +3448,15 @@
final int NW = token.windows.size();
for (int i=0; i<NW; i++) {
WindowState win = token.windows.get(i);
+ if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Tmp removing window " + win);
mWindows.remove(win);
int j = win.mChildWindows.size();
while (j > 0) {
j--;
- mWindows.remove(win.mChildWindows.get(j));
+ WindowState cwin = (WindowState)win.mChildWindows.get(j);
+ if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
+ "Tmp removing child window " + cwin);
+ mWindows.remove(cwin);
}
}
return NW > 0;
@@ -3441,6 +3494,12 @@
final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
if (DEBUG_REORDER) Log.v(TAG, "Looking for lower windows @ "
+ tokenPos + " -- " + wtoken.token);
+ if (wtoken.sendingToBottom) {
+ if (DEBUG_REORDER) Log.v(TAG,
+ "Skipping token -- currently sending to bottom");
+ tokenPos--;
+ continue;
+ }
int i = wtoken.windows.size();
while (i > 0) {
i--;
@@ -3449,7 +3508,7 @@
while (j > 0) {
j--;
WindowState cwin = (WindowState)win.mChildWindows.get(j);
- if (cwin.mSubLayer >= 0 ) {
+ if (cwin.mSubLayer >= 0) {
for (int pos=NW-1; pos>=0; pos--) {
if (mWindows.get(pos) == cwin) {
if (DEBUG_REORDER) Log.v(TAG,
@@ -3478,14 +3537,20 @@
for (int j=0; j<NCW; j++) {
WindowState cwin = (WindowState)win.mChildWindows.get(j);
if (!added && cwin.mSubLayer >= 0) {
+ if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Re-adding child window at "
+ + index + ": " + cwin);
mWindows.add(index, win);
index++;
added = true;
}
+ if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Re-adding window at "
+ + index + ": " + cwin);
mWindows.add(index, cwin);
index++;
}
if (!added) {
+ if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Re-adding window at "
+ + index + ": " + win);
mWindows.add(index, win);
index++;
}
@@ -3553,6 +3618,26 @@
}
}
+ private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
+ boolean updateFocusAndLayout) {
+ // First remove all of the windows from the list.
+ tmpRemoveAppWindowsLocked(wtoken);
+
+ // Where to start adding?
+ int pos = findWindowOffsetLocked(tokenPos);
+
+ // And now add them back at the correct place.
+ pos = reAddAppWindowsLocked(pos, wtoken);
+
+ if (updateFocusAndLayout) {
+ if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
+ assignLayersLocked();
+ }
+ mLayoutNeeded = true;
+ performLayoutAndPlaceSurfacesLocked();
+ }
+ }
+
private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
// First remove all of the windows from the list.
final int N = tokens.size();
@@ -3575,7 +3660,9 @@
}
}
- updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
+ if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
+ assignLayersLocked();
+ }
mLayoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
@@ -3596,9 +3683,19 @@
AppWindowToken wt = findAppWindowToken(tokens.get(i));
if (wt != null) {
mAppTokens.add(wt);
+ if (mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
+ mToTopApps.remove(wt);
+ mToBottomApps.remove(wt);
+ mToTopApps.add(wt);
+ wt.sendingToBottom = false;
+ wt.sendingToTop = true;
+ }
}
}
- moveAppWindowsLocked(tokens, mAppTokens.size());
+
+ if (mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
+ moveAppWindowsLocked(tokens, mAppTokens.size());
+ }
}
Binder.restoreCallingIdentity(origId);
}
@@ -3618,10 +3715,20 @@
AppWindowToken wt = findAppWindowToken(tokens.get(i));
if (wt != null) {
mAppTokens.add(pos, wt);
+ if (mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
+ mToTopApps.remove(wt);
+ mToBottomApps.remove(wt);
+ mToBottomApps.add(i, wt);
+ wt.sendingToTop = false;
+ wt.sendingToBottom = true;
+ }
pos++;
}
}
- moveAppWindowsLocked(tokens, 0);
+
+ if (mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
+ moveAppWindowsLocked(tokens, 0);
+ }
}
Binder.restoreCallingIdentity(origId);
}
@@ -4253,19 +4360,6 @@
if (!computeNewConfigurationLocked(config)) {
return null;
}
- Log.i(TAG, "Config changed: " + config);
- long now = SystemClock.uptimeMillis();
- //Log.i(TAG, "Config changing, gc pending: " + mFreezeGcPending + ", now " + now);
- if (mFreezeGcPending != 0) {
- if (now > (mFreezeGcPending+1000)) {
- //Log.i(TAG, "Gc! " + now + " > " + (mFreezeGcPending+1000));
- mH.removeMessages(H.FORCE_GC);
- Runtime.getRuntime().gc();
- mFreezeGcPending = now;
- }
- } else {
- mFreezeGcPending = now;
- }
return config;
}
@@ -7213,6 +7307,10 @@
* of a transition that has not yet been started.
*/
boolean isReadyForDisplay() {
+ if (mRootToken.waitingToShow &&
+ mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
+ return false;
+ }
final AppWindowToken atoken = mAppToken;
final boolean animating = atoken != null
? (atoken.animation != null) : false;
@@ -7277,11 +7375,15 @@
}
/**
- * Return true if the window is opaque and fully drawn.
+ * Return true if the window is opaque and fully drawn. This indicates
+ * it may obscure windows behind it.
*/
boolean isOpaqueDrawn() {
- return mAttrs.format == PixelFormat.OPAQUE && mSurface != null
- && mAnimation == null && !mDrawPending && !mCommitDrawPending;
+ return (mAttrs.format == PixelFormat.OPAQUE
+ || mAttrs.type == TYPE_WALLPAPER)
+ && mSurface != null && mAnimation == null
+ && (mAppToken == null || mAppToken.animation == null)
+ && !mDrawPending && !mCommitDrawPending;
}
boolean needsBackgroundFiller(int screenWidth, int screenHeight) {
@@ -7547,6 +7649,22 @@
// Temporary for finding which tokens no longer have visible windows.
boolean hasVisible;
+ // Set to true when this token is in a pending transaction where it
+ // will be shown.
+ boolean waitingToShow;
+
+ // Set to true when this token is in a pending transaction where it
+ // will be hidden.
+ boolean waitingToHide;
+
+ // Set to true when this token is in a pending transaction where its
+ // windows will be put to the bottom of the list.
+ boolean sendingToBottom;
+
+ // Set to true when this token is in a pending transaction where its
+ // windows will be put to the top of the list.
+ boolean sendingToTop;
+
WindowToken(IBinder _token, int type, boolean _explicit) {
token = _token;
windowType = type;
@@ -7559,6 +7677,12 @@
pw.print(prefix); pw.print("windowType="); pw.print(windowType);
pw.print(" hidden="); pw.print(hidden);
pw.print(" hasVisible="); pw.println(hasVisible);
+ if (waitingToShow || waitingToHide || sendingToBottom || sendingToTop) {
+ pw.print(prefix); pw.print("waitingToShow="); pw.print(waitingToShow);
+ pw.print(" waitingToHide="); pw.print(waitingToHide);
+ pw.print(" sendingToBottom="); pw.print(sendingToBottom);
+ pw.print(" sendingToTop="); pw.println(sendingToTop);
+ }
}
@Override
@@ -7868,7 +7992,7 @@
pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows);
}
pw.print(prefix); pw.print("groupId="); pw.print(groupId);
- pw.print(" appFullscreen="); pw.println(appFullscreen);
+ pw.print(" appFullscreen="); pw.print(appFullscreen);
pw.print(" requestedOrientation="); pw.println(requestedOrientation);
pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested);
pw.print(" clientHidden="); pw.print(clientHidden);
@@ -8434,6 +8558,40 @@
return win;
}
+ final void rebuildAppWindowListLocked() {
+ int NW = mWindows.size();
+ int i;
+
+ // First remove all existing app windows.
+ i=0;
+ while (i < NW) {
+ if (((WindowState)mWindows.get(i)).mAppToken != null) {
+ WindowState win = (WindowState)mWindows.remove(i);
+ if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
+ "Rebuild removing window: " + win);
+ NW--;
+ continue;
+ }
+ i++;
+ }
+
+ // First add all of the exiting app tokens... these are no longer
+ // in the main app list, but still have windows shown. We put them
+ // in the back because now that the animation is over we no longer
+ // will care about them.
+ int NT = mExitingAppTokens.size();
+ i = 0;
+ for (int j=0; j<NT; j++) {
+ i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j));
+ }
+
+ // And add in the still active app tokens in Z order.
+ NT = mAppTokens.size();
+ for (int j=0; j<NT; j++) {
+ i = reAddAppWindowsLocked(i, mAppTokens.get(j));
+ }
+ }
+
private final void assignLayersLocked() {
int N = mWindows.size();
int curBaseLayer = 0;
@@ -8611,7 +8769,6 @@
final int dw = mDisplay.getWidth();
final int dh = mDisplay.getHeight();
- final int N = mWindows.size();
int i;
// FIRST LOOP: Perform a layout, if needed.
@@ -8671,6 +8828,8 @@
mPolicy.beginAnimationLw(dw, dh);
+ final int N = mWindows.size();
+
for (i=N-1; i>=0; i--) {
WindowState w = (WindowState)mWindows.get(i);
@@ -8814,12 +8973,32 @@
}
mNextAppTransition = WindowManagerPolicy.TRANSIT_NONE;
mAppTransitionReady = false;
+ mAppTransitionRunning = true;
mAppTransitionTimeout = false;
mStartingIconInTransition = false;
mSkipAppTransitionAnimation = false;
mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
+ // If there are applications waiting to come to the
+ // top of the stack, now is the time to move their windows.
+ // (Note that we don't do apps going to the bottom
+ // here -- we want to keep their windows in the old
+ // Z-order until the animation completes.)
+ if (mToTopApps.size() > 0) {
+ NN = mAppTokens.size();
+ for (i=0; i<NN; i++) {
+ AppWindowToken wtoken = mAppTokens.get(i);
+ if (wtoken.sendingToTop) {
+ wtoken.sendingToTop = false;
+ moveAppWindowsLocked(wtoken, NN, false);
+ }
+ }
+ mToTopApps.clear();
+ }
+
+ WindowState oldWallpaper = mWallpaperTarget;
+
adjustWallpaperWindowsLocked();
wallpaperMayChange = false;
@@ -8827,54 +9006,66 @@
"New wallpaper target=" + mWallpaperTarget
+ ", lower target=" + mLowerWallpaperTarget
+ ", upper target=" + mUpperWallpaperTarget);
+ int foundWallpapers = 0;
if (mLowerWallpaperTarget != null) {
// Need to determine if both the closing and
// opening app token sets are wallpaper targets,
// in which case special animations are needed
// (since the wallpaper needs to stay static
// behind them).
- int found = 0;
- NN = mOpeningApps.size();
- for (i=0; i<NN; i++) {
- AppWindowToken wtoken = mOpeningApps.get(i);
- if (mLowerWallpaperTarget.mAppToken == wtoken) {
- found |= 1;
- }
- if (mUpperWallpaperTarget.mAppToken == wtoken) {
- found |= 1;
- }
- }
NN = mClosingApps.size();
for (i=0; i<NN; i++) {
AppWindowToken wtoken = mClosingApps.get(i);
if (mLowerWallpaperTarget.mAppToken == wtoken) {
- found |= 2;
+ foundWallpapers |= 1;
}
if (mUpperWallpaperTarget.mAppToken == wtoken) {
- found |= 2;
+ foundWallpapers |= 1;
}
}
-
- if (found == 3) {
- if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
- "Wallpaper animation!");
- switch (transit) {
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
- case WindowManagerPolicy.TRANSIT_TASK_OPEN:
- case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
- transit = WindowManagerPolicy.TRANSIT_WALLPAPER_ACTIVITY_OPEN;
- break;
- case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
- case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
- case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
- transit = WindowManagerPolicy.TRANSIT_WALLPAPER_ACTIVITY_CLOSE;
- break;
+ NN = mOpeningApps.size();
+ for (i=0; i<NN; i++) {
+ AppWindowToken wtoken = mOpeningApps.get(i);
+ if (mLowerWallpaperTarget.mAppToken == wtoken) {
+ foundWallpapers |= 2;
}
- if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
- "New transit: " + transit);
+ if (mUpperWallpaperTarget.mAppToken == wtoken) {
+ foundWallpapers |= 2;
+ }
}
}
+ if (foundWallpapers == 3) {
+ if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+ "Wallpaper animation!");
+ switch (transit) {
+ case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
+ case WindowManagerPolicy.TRANSIT_TASK_OPEN:
+ case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
+ transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN;
+ break;
+ case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
+ case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
+ case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
+ transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
+ break;
+ }
+ if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+ "New transit: " + transit);
+ } else if (oldWallpaper != null) {
+ // We are transitioning from an activity with
+ // a wallpaper to one without.
+ transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
+ if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+ "New transit away from wallpaper: " + transit);
+ } else if (mWallpaperTarget != null) {
+ // We are transitioning from an activity without
+ // a wallpaper to now showing the wallpaper
+ transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
+ if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+ "New transit into wallpaper: " + transit);
+ }
+
// We need to figure out which animation to use...
WindowManager.LayoutParams lp = findAnimations(mAppTokens,
mOpeningApps, mClosingApps);
@@ -8889,6 +9080,7 @@
wtoken.animation = null;
setTokenVisibilityLocked(wtoken, lp, true, transit, false);
wtoken.updateReportedVisibilityLocked();
+ wtoken.waitingToShow = false;
wtoken.showAllWindowsLocked();
}
NN = mClosingApps.size();
@@ -8900,6 +9092,7 @@
wtoken.animation = null;
setTokenVisibilityLocked(wtoken, lp, false, transit, false);
wtoken.updateReportedVisibilityLocked();
+ wtoken.waitingToHide = false;
// Force the allDrawn flag, because we want to start
// this guy's animations regardless of whether it's
// gotten drawn.
@@ -8922,10 +9115,31 @@
}
}
+ if (!animating && mAppTransitionRunning) {
+ // We have finished the animation of an app transition. To do
+ // this, we have delayed a lot of operations like showing and
+ // hiding apps, moving apps in Z-order, etc. The app token list
+ // reflects the correct Z-order, but the window list may now
+ // be out of sync with it. So here we will just rebuild the
+ // entire app window list. Fun!
+ mAppTransitionRunning = false;
+ // Clear information about apps that were moving.
+ mToBottomApps.clear();
+
+ rebuildAppWindowListLocked();
+ restart = true;
+ moveInputMethodWindowsIfNeededLocked(false);
+ wallpaperMayChange = true;
+ mLayoutNeeded = true;
+ }
+
if (wallpaperMayChange) {
if (adjustWallpaperWindowsLocked()) {
assignLayersLocked();
}
+ if (mLayoutNeeded) {
+ performLayoutLockedInner();
+ }
}
} while (restart);
@@ -8941,6 +9155,8 @@
boolean syswin = false;
boolean backgroundFillerShown = false;
+ final int N = mWindows.size();
+
for (i=N-1; i>=0; i--) {
WindowState w = (WindowState)mWindows.get(i);
@@ -9212,9 +9428,8 @@
}
}
- boolean opaqueDrawn = w.isOpaqueDrawn();
- if ((opaqueDrawn && w.isFullscreen(dw, dh))
- || attrs.type == TYPE_WALLPAPER) {
+ boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn();
+ if (opaqueDrawn && w.isFullscreen(dw, dh)) {
// This window completely covers everything behind it,
// so we want to leave all of them as unblurred (for
// performance reasons).
@@ -9407,13 +9622,29 @@
}
}
+ boolean needRelayout = false;
+
+ if (!animating && mAppTransitionRunning) {
+ // We have finished the animation of an app transition. To do
+ // this, we have delayed a lot of operations like showing and
+ // hiding apps, moving apps in Z-order, etc. The app token list
+ // reflects the correct Z-order, but the window list may now
+ // be out of sync with it. So here we will just rebuild the
+ // entire app window list. Fun!
+ mAppTransitionRunning = false;
+ needRelayout = true;
+ rebuildAppWindowListLocked();
+ // Clear information about apps that were moving.
+ mToBottomApps.clear();
+ }
+
if (focusDisplayed) {
mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
}
if (wallpaperDestroyed) {
- wallpaperDestroyed = adjustWallpaperWindowsLocked();
+ needRelayout = adjustWallpaperWindowsLocked();
}
- if (wallpaperDestroyed) {
+ if (needRelayout) {
requestAnimationLocked(0);
} else if (animating) {
requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
@@ -9909,6 +10140,7 @@
pw.print(" mNextAppTransition=0x");
pw.print(Integer.toHexString(mNextAppTransition));
pw.print(", mAppTransitionReady="); pw.print(mAppTransitionReady);
+ pw.print(", mAppTransitionRunning="); pw.print(mAppTransitionRunning);
pw.print(", mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition);
pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
@@ -9918,6 +10150,12 @@
if (mClosingApps.size() > 0) {
pw.print(" mClosingApps="); pw.println(mClosingApps);
}
+ if (mToTopApps.size() > 0) {
+ pw.print(" mToTopApps="); pw.println(mToTopApps);
+ }
+ if (mToBottomApps.size() > 0) {
+ pw.print(" mToBottomApps="); pw.println(mToBottomApps);
+ }
pw.print(" DisplayWidth="); pw.print(mDisplay.getWidth());
pw.print(" DisplayHeight="); pw.println(mDisplay.getHeight());
pw.println(" KeyWaiter state:");
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index d4e69c0..9554a22 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -68,6 +68,7 @@
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Debug;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
@@ -4895,6 +4896,52 @@
Binder.restoreCallingIdentity(origId);
}
+ public void getProcessMemoryInfo(int pid, Debug.MemoryInfo mi)
+ throws RemoteException {
+ ProcessRecord proc;
+ synchronized (mPidsSelfLocked) {
+ proc = mPidsSelfLocked.get(pid);
+ }
+
+ if (proc == null) {
+ throw new RemoteException();
+ }
+
+ IApplicationThread thread = proc.thread;
+ if (thread == null) {
+ throw new RemoteException();
+ }
+
+ thread.getMemoryInfo(mi);
+ }
+
+ public void killApplicationProcess(String processName, int uid) {
+ if (processName == null) {
+ return;
+ }
+
+ int callerUid = Binder.getCallingUid();
+ // Only the system server can kill an application
+ if (callerUid == Process.SYSTEM_UID) {
+ synchronized (this) {
+ ProcessRecord app = getProcessRecordLocked(processName, uid);
+ if (app != null) {
+ try {
+ app.thread.scheduleSuicide();
+ } catch (RemoteException e) {
+ // If the other end already died, then our work here is done.
+ }
+ } else {
+ Log.w(TAG, "Process/uid not found attempting kill of "
+ + processName + " / " + uid);
+ }
+ }
+ } else {
+ throw new SecurityException(callerUid + " cannot kill app process: " +
+ processName);
+ }
+ }
+
private void restartPackageLocked(final String packageName, int uid) {
uninstallPackageLocked(packageName, uid, false);
Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED,
@@ -8141,7 +8188,7 @@
}
}
- systemReady();
+ systemReady(null);
}
private void retrieveSettings() {
@@ -8171,7 +8218,7 @@
return mSystemReady;
}
- public void systemReady() {
+ public void systemReady(final Runnable goingCallback) {
// In the simulator, startRunning will never have been called, which
// normally sets a few crucial variables. Do it here instead.
if (!Process.supportsProcesses()) {
@@ -8181,6 +8228,7 @@
synchronized(this) {
if (mSystemReady) {
+ if (goingCallback != null) goingCallback.run();
return;
}
@@ -8216,7 +8264,7 @@
synchronized (ActivityManagerService.this) {
mDidUpdate = true;
}
- systemReady();
+ systemReady(goingCallback);
}
};
}
@@ -8263,7 +8311,7 @@
}
}
- if (Config.LOGD) Log.d(TAG, "Start running!");
+ Log.i(TAG, "System now ready");
EventLog.writeEvent(LOG_BOOT_PROGRESS_AMS_READY,
SystemClock.uptimeMillis());
@@ -8305,6 +8353,8 @@
retrieveSettings();
+ if (goingCallback != null) goingCallback.run();
+
synchronized (this) {
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
try {
@@ -8816,6 +8866,16 @@
} else {
currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
}
+ currApp.importanceReasonCode = app.adjTypeCode;
+ if (app.adjSource instanceof ProcessRecord) {
+ currApp.importanceReasonPid = ((ProcessRecord)app.adjSource).pid;
+ } else if (app.adjSource instanceof HistoryRecord) {
+ HistoryRecord r = (HistoryRecord)app.adjSource;
+ if (r.app != null) currApp.importanceReasonPid = r.app.pid;
+ }
+ if (app.adjTarget instanceof ComponentName) {
+ currApp.importanceReasonComponent = (ComponentName)app.adjTarget;
+ }
//Log.v(TAG, "Proc " + app.processName + ": imp=" + currApp.importance
// + " lru=" + currApp.lru);
if (runList == null) {
@@ -9818,6 +9878,7 @@
if (r.app != null) {
info.pid = r.app.pid;
}
+ info.uid = r.appInfo.uid;
info.process = r.processName;
info.foreground = r.isForeground;
info.activeSince = r.createTime;
@@ -9825,6 +9886,25 @@
info.clientCount = r.connections.size();
info.crashCount = r.crashCount;
info.lastActivityTime = r.lastActivity;
+ if (r.isForeground) {
+ info.flags |= ActivityManager.RunningServiceInfo.FLAG_FOREGROUND;
+ }
+ if (r.startRequested) {
+ info.flags |= ActivityManager.RunningServiceInfo.FLAG_STARTED;
+ }
+ if (r.app != null && r.app.pid == Process.myPid()) {
+ info.flags |= ActivityManager.RunningServiceInfo.FLAG_SYSTEM_PROCESS;
+ }
+ if (r.app != null && r.app.persistent) {
+ info.flags |= ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS;
+ }
+ for (ConnectionRecord conn : r.connections.values()) {
+ if (conn.clientLabel != 0) {
+ info.clientPackage = conn.binding.client.info.packageName;
+ info.clientLabel = conn.clientLabel;
+ break;
+ }
+ }
return info;
}
@@ -9853,6 +9933,20 @@
}
}
+ public PendingIntent getRunningServiceControlPanel(ComponentName name) {
+ synchronized (this) {
+ ServiceRecord r = mServices.get(name);
+ if (r != null) {
+ for (ConnectionRecord conn : r.connections.values()) {
+ if (conn.clientIntent != null) {
+ return conn.clientIntent;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
private final ServiceRecord findServiceLocked(ComponentName name,
IBinder token) {
ServiceRecord r = mServices.get(name);
@@ -10720,6 +10814,29 @@
activity = (HistoryRecord)mHistory.get(aindex);
}
+ int clientLabel = 0;
+ PendingIntent clientIntent = null;
+
+ if (callerApp.info.uid == Process.SYSTEM_UID) {
+ // Hacky kind of thing -- allow system stuff to tell us
+ // what they are, so we can report this elsewhere for
+ // others to know why certain services are running.
+ try {
+ clientIntent = (PendingIntent)service.getParcelableExtra(
+ Intent.EXTRA_CLIENT_INTENT);
+ } catch (RuntimeException e) {
+ }
+ if (clientIntent != null) {
+ clientLabel = service.getIntExtra(Intent.EXTRA_CLIENT_LABEL, 0);
+ if (clientLabel != 0) {
+ // There are no useful extras in the intent, trash them.
+ // System code calling with this stuff just needs to know
+ // this will happen.
+ service = service.cloneFilter();
+ }
+ }
+ }
+
ServiceLookupResult res =
retrieveServiceLocked(service, resolvedType,
Binder.getCallingPid(), Binder.getCallingUid());
@@ -10740,7 +10857,7 @@
AppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);
ConnectionRecord c = new ConnectionRecord(b, activity,
- connection, flags);
+ connection, flags, clientLabel, clientIntent);
IBinder binder = connection.asBinder();
s.connections.put(binder, c);
@@ -12484,6 +12601,7 @@
}
mConfiguration = newConfig;
+ Log.i(TAG, "Config changed: " + newConfig);
Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
msg.obj = new Configuration(mConfiguration);
@@ -12712,6 +12830,7 @@
return (app.curAdj=app.maxAdj);
}
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN;
app.adjSource = null;
app.adjTarget = null;
@@ -12845,6 +12964,8 @@
adj = clientAdj > VISIBLE_APP_ADJ
? clientAdj : VISIBLE_APP_ADJ;
app.adjType = "service";
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo
+ .REASON_SERVICE_IN_USE;
app.adjSource = cr.binding.client;
app.adjTarget = s.serviceInfo.name;
}
@@ -12858,6 +12979,8 @@
|| a.state == ActivityState.PAUSING)) {
adj = FOREGROUND_APP_ADJ;
app.adjType = "service";
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo
+ .REASON_SERVICE_IN_USE;
app.adjSource = a;
app.adjTarget = s.serviceInfo.name;
}
@@ -12900,6 +13023,8 @@
adj = clientAdj > FOREGROUND_APP_ADJ
? clientAdj : FOREGROUND_APP_ADJ;
app.adjType = "provider";
+ app.adjTypeCode = ActivityManager.RunningAppProcessInfo
+ .REASON_PROVIDER_IN_USE;
app.adjSource = client;
app.adjTarget = cpr.info.name;
}
diff --git a/services/java/com/android/server/am/ConnectionRecord.java b/services/java/com/android/server/am/ConnectionRecord.java
index b3343dd..f613b00 100644
--- a/services/java/com/android/server/am/ConnectionRecord.java
+++ b/services/java/com/android/server/am/ConnectionRecord.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import android.app.IServiceConnection;
+import android.app.PendingIntent;
import java.io.PrintWriter;
@@ -28,6 +29,8 @@
final HistoryRecord activity; // If non-null, the owning activity.
final IServiceConnection conn; // The client connection.
final int flags; // Binding options.
+ final int clientLabel; // String resource labeling this client.
+ final PendingIntent clientIntent; // How to launch the client.
String stringName; // Caching of toString.
void dump(PrintWriter pw, String prefix) {
@@ -40,11 +43,14 @@
}
ConnectionRecord(AppBindRecord _binding, HistoryRecord _activity,
- IServiceConnection _conn, int _flags) {
+ IServiceConnection _conn, int _flags,
+ int _clientLabel, PendingIntent _clientIntent) {
binding = _binding;
activity = _activity;
conn = _conn;
flags = _flags;
+ clientLabel = _clientLabel;
+ clientIntent = _clientIntent;
}
public String toString() {
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 76fdf09..d05b44b 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -75,6 +75,7 @@
boolean reportLowMemory; // Set to true when waiting to report low mem
int lastPss; // Last pss size reported by app.
String adjType; // Debugging: primary thing impacting oom_adj.
+ int adjTypeCode; // Debugging: adj code to report to app.
Object adjSource; // Debugging: option dependent object.
Object adjTarget; // Debugging: target component impacting oom_adj.
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index 14b1563d..80de074 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -81,9 +81,14 @@
throw new IllegalArgumentException("Invalid message body");
}
- SmsMessage.SubmitPdu pdus = SmsMessage.getSubmitPdu(
- scAddress, destinationAddress, text, (deliveryIntent != null));
- sendRawPdu(pdus.encodedScAddress, pdus.encodedMessage, sentIntent, deliveryIntent);
+ try {
+ ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
+ if (iccISms != null) {
+ iccISms.sendText(destinationAddress, scAddress, text, sentIntent, deliveryIntent);
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }
}
/**
@@ -202,43 +207,11 @@
throw new IllegalArgumentException("Invalid message data");
}
- SmsMessage.SubmitPdu pdus = SmsMessage.getSubmitPdu(
- scAddress, destinationAddress,
- destinationPort, data, (deliveryIntent != null));
- sendRawPdu(pdus.encodedScAddress, pdus.encodedMessage, sentIntent, deliveryIntent);
- }
-
- /**
- * Send a raw SMS PDU.
- * A PDU is a protocol data unit. It contains the message and the
- * associated meta information.
- *
- * @param smsc the SMSC to send the message through, or NULL for the
- * default SMSC
- * @param pdu the raw PDU to send
- * @param sentIntent if not NULL this <code>PendingIntent</code> is
- * broadcast when the message is successfully sent, or failed.
- * The result code will be <code>Activity.RESULT_OK<code> for success,
- * or one of these errors:<br>
- * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
- * <code>RESULT_ERROR_RADIO_OFF</code><br>
- * <code>RESULT_ERROR_NULL_PDU</code><br>
- * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
- * the extra "errorCode" containing a radio technology specific value,
- * generally only useful for troubleshooting.<br>
- * The per-application based SMS control checks sentIntent. If sentIntent
- * is NULL the caller will be checked against all unknown applications,
- * which cause smaller number of SMS to be sent in checking period.
- * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
- * broadcast when the message is delivered to the recipient. The
- * raw pdu of the status report is in the extended data ("pdu").
- */
- private void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,
- PendingIntent deliveryIntent) {
try {
ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
if (iccISms != null) {
- iccISms.sendRawPdu(smsc, pdu, sentIntent, deliveryIntent);
+ iccISms.sendData(destinationAddress, scAddress, destinationPort & 0xFFFF,
+ data, sentIntent, deliveryIntent);
}
} catch (RemoteException ex) {
// ignore it
diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java
index 0617dad..7a10512 100644
--- a/telephony/java/android/telephony/SmsMessage.java
+++ b/telephony/java/android/telephony/SmsMessage.java
@@ -309,8 +309,13 @@
while (pos < textLen) {
int nextPos = 0; // Counts code units.
if (ted.codeUnitSize == ENCODING_7BIT) {
- // For multi-segment messages, CDMA 7bit equals GSM 7bit encoding (EMS mode).
- nextPos = GsmAlphabet.findGsmSeptetLimitIndex(text, pos, limit);
+ if (activePhone == PHONE_TYPE_CDMA && ted.msgCount == 1) {
+ // For a singleton CDMA message, the encoding must be ASCII...
+ nextPos = pos + Math.min(limit, textLen - pos);
+ } else {
+ // For multi-segment messages, CDMA 7bit equals GSM 7bit encoding (EMS mode).
+ nextPos = GsmAlphabet.findGsmSeptetLimitIndex(text, pos, limit);
+ }
} else { // Assume unicode.
nextPos = pos + Math.min(limit / 2, textLen - pos);
}
@@ -345,6 +350,25 @@
return calculateLength((CharSequence)messageBody, use7bitOnly);
}
+ /*
+ * TODO(cleanup): It looks like there is now no useful reason why
+ * apps should generate pdus themselves using these routines,
+ * instead of handing the raw data to SMSDispatcher (and thereby
+ * have the phone process do the encoding). Moreover, CDMA now
+ * has shared state (in the form of the msgId system property)
+ * which can only be modified by the phone process, and hence
+ * makes the output of these routines incorrect. Since they now
+ * serve no purpose, they should probably just return null
+ * directly, and be deprecated. Going further in that direction,
+ * the above parsers of serialized pdu data should probably also
+ * be gotten rid of, hiding all but the necessarily visible
+ * structured data from client apps. A possible concern with
+ * doing this is that apps may be using these routines to generate
+ * pdus that are then sent elsewhere, some network server, for
+ * example, and that always returning null would thereby break
+ * otherwise useful apps.
+ */
+
/**
* Get an SMS-SUBMIT PDU for a destination address and a message
*
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index f3304a3..a744486 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -481,6 +481,18 @@
public static final int SIM_STATE_READY = 5;
/**
+ * @return true if a ICC card is present
+ */
+ public boolean hasIccCard() {
+ try {
+ return getITelephony().hasIccCard();
+ } catch (RemoteException ex) {
+ // Assume no ICC card if remote exception which shouldn't happen
+ return false;
+ }
+ }
+
+ /**
* Returns a constant indicating the state of the
* device SIM card.
*
diff --git a/telephony/java/com/android/internal/telephony/AdnRecord.java b/telephony/java/com/android/internal/telephony/AdnRecord.java
index 5f40579..0896ba6 100644
--- a/telephony/java/com/android/internal/telephony/AdnRecord.java
+++ b/telephony/java/com/android/internal/telephony/AdnRecord.java
@@ -23,6 +23,8 @@
import com.android.internal.telephony.GsmAlphabet;
+import java.util.Arrays;
+
/**
*
@@ -38,6 +40,7 @@
String alphaTag = "";
String number = "";
+ String[] emails;
int extRecord = 0xff;
int efid; // or 0 if none
int recordNumber; // or 0 if none
@@ -74,13 +77,15 @@
int recordNumber;
String alphaTag;
String number;
+ String[] emails;
efid = source.readInt();
recordNumber = source.readInt();
alphaTag = source.readString();
number = source.readString();
+ emails = source.readStringArray();
- return new AdnRecord(efid, recordNumber, alphaTag, number);
+ return new AdnRecord(efid, recordNumber, alphaTag, number, emails);
}
public AdnRecord[] newArray(int size) {
@@ -90,29 +95,38 @@
//***** Constructor
- public
- AdnRecord (byte[] record) {
+ public AdnRecord (byte[] record) {
this(0, 0, record);
}
- public
- AdnRecord (int efid, int recordNumber, byte[] record) {
+ public AdnRecord (int efid, int recordNumber, byte[] record) {
this.efid = efid;
this.recordNumber = recordNumber;
parseRecord(record);
}
- public
- AdnRecord (String alphaTag, String number) {
+ public AdnRecord (String alphaTag, String number) {
this(0, 0, alphaTag, number);
}
- public
- AdnRecord (int efid, int recordNumber, String alphaTag, String number) {
+ public AdnRecord (String alphaTag, String number, String[] emails) {
+ this(0, 0, alphaTag, number, emails);
+ }
+
+ public AdnRecord (int efid, int recordNumber, String alphaTag, String number, String[] emails) {
this.efid = efid;
this.recordNumber = recordNumber;
this.alphaTag = alphaTag;
this.number = number;
+ this.emails = emails;
+ }
+
+ public AdnRecord(int efid, int recordNumber, String alphaTag, String number) {
+ this.efid = efid;
+ this.recordNumber = recordNumber;
+ this.alphaTag = alphaTag;
+ this.number = number;
+ this.emails = null;
}
//***** Instance Methods
@@ -125,12 +139,20 @@
return number;
}
+ public String[] getEmails() {
+ return emails;
+ }
+
+ public void setEmails(String[] emails) {
+ this.emails = emails;
+ }
+
public String toString() {
- return "ADN Record '" + alphaTag + "' '" + number + "'";
+ return "ADN Record '" + alphaTag + "' '" + number + " " + emails + "'";
}
public boolean isEmpty() {
- return alphaTag.equals("") && number.equals("");
+ return alphaTag.equals("") && number.equals("") && emails == null;
}
public boolean hasExtendedRecord() {
@@ -139,7 +161,8 @@
public boolean isEqual(AdnRecord adn) {
return ( alphaTag.equals(adn.getAlphaTag()) &&
- number.equals(adn.getNumber()) );
+ number.equals(adn.getNumber()) &&
+ Arrays.equals(emails, adn.getEmails()));
}
//***** Parcelable Implementation
@@ -152,6 +175,7 @@
dest.writeInt(recordNumber);
dest.writeString(alphaTag);
dest.writeString(number);
+ dest.writeStringArray(emails);
}
/**
@@ -274,10 +298,13 @@
extRecord = 0xff & record[record.length - 1];
+ emails = null;
+
} catch (RuntimeException ex) {
Log.w(LOG_TAG, "Error parsing AdnRecord", ex);
number = "";
alphaTag = "";
+ emails = null;
}
}
}
diff --git a/telephony/java/com/android/internal/telephony/AdnRecordCache.java b/telephony/java/com/android/internal/telephony/AdnRecordCache.java
index c270ae5..c8c0658 100644
--- a/telephony/java/com/android/internal/telephony/AdnRecordCache.java
+++ b/telephony/java/com/android/internal/telephony/AdnRecordCache.java
@@ -16,14 +16,16 @@
package com.android.internal.telephony;
-import android.util.SparseArray;
-import android.util.Log;
-import android.os.Message;
-import android.os.Handler;
import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.util.SparseArray;
+
+import com.android.internal.telephony.gsm.UsimPhoneBookManager;
+
import java.util.ArrayList;
import java.util.Iterator;
-import com.android.internal.telephony.IccConstants;
/**
* {@hide}
@@ -32,6 +34,7 @@
//***** Instance Variables
PhoneBase phone;
+ private UsimPhoneBookManager mUsimPhoneBookManager;
// Indexed by EF ID
SparseArray<ArrayList<AdnRecord>> adnLikeFiles
@@ -55,6 +58,7 @@
public AdnRecordCache(PhoneBase phone) {
this.phone = phone;
+ mUsimPhoneBookManager = new UsimPhoneBookManager(phone, this);
}
//***** Called from SIMRecords
@@ -64,6 +68,7 @@
*/
public void reset() {
adnLikeFiles.clear();
+ mUsimPhoneBookManager.reset();
clearWaiters();
clearUserWriters();
@@ -103,14 +108,14 @@
*
* See 3GPP TS 51.011 for this mapping
*/
- private int
- extensionEfForEf(int efid) {
+ int extensionEfForEf(int efid) {
switch (efid) {
case EF_MBDN: return EF_EXT6;
case EF_ADN: return EF_EXT1;
case EF_SDN: return EF_EXT3;
case EF_FDN: return EF_EXT2;
case EF_MSISDN: return EF_EXT1;
+ case EF_PBR: return 0; // The EF PBR doesn't have an extension record
default: return -1;
}
}
@@ -223,11 +228,15 @@
* record
*/
public void
- requestLoadAllAdnLike (int efid, Message response) {
+ requestLoadAllAdnLike (int efid, int extensionEf, Message response) {
ArrayList<Message> waiters;
ArrayList<AdnRecord> result;
- result = getRecordsIfLoaded(efid);
+ if (efid == EF_PBR) {
+ result = mUsimPhoneBookManager.loadEfFilesFromUsim();
+ } else {
+ result = getRecordsIfLoaded(efid);
+ }
// Have we already loaded this efid?
if (result != null) {
@@ -258,9 +267,8 @@
adnLikeWaiters.put(efid, waiters);
- int extensionEF = extensionEfForEf(efid);
- if (extensionEF < 0) {
+ if (extensionEf < 0) {
// respond with error if not known ADN-like record
if (response != null) {
@@ -272,7 +280,7 @@
return;
}
- new AdnRecordLoader(phone).loadAllFromEF(efid, extensionEF,
+ new AdnRecordLoader(phone).loadAllFromEF(efid, extensionEf,
obtainMessage(EVENT_LOAD_ALL_ADN_LIKE_DONE, efid, 0));
}
@@ -311,7 +319,7 @@
adnLikeWaiters.delete(efid);
if (ar.exception == null) {
- adnLikeFiles.put(efid, (ArrayList<AdnRecord>) (ar.result));
+ adnLikeFiles.put(efid, (ArrayList<AdnRecord>) ar.result);
}
notifyWaiters(waiters, ar);
break;
diff --git a/telephony/java/com/android/internal/telephony/CommandsInterface.java b/telephony/java/com/android/internal/telephony/CommandsInterface.java
index ed8bc1e..63bdc2c 100644
--- a/telephony/java/com/android/internal/telephony/CommandsInterface.java
+++ b/telephony/java/com/android/internal/telephony/CommandsInterface.java
@@ -144,7 +144,8 @@
static final int GSM_SMS_FAIL_CAUSE_MEMORY_CAPACITY_EXCEEDED = 0xD3;
static final int GSM_SMS_FAIL_CAUSE_UNSPECIFIED_ERROR = 0xFF;
- // CDMA SMS fail cause for acknowledgeLastIncomingCdmaSms. From TS N.S00005, 6.5.2.125.
+ // CDMA SMS fail cause for acknowledgeLastIncomingCdmaSms. From TS N.S0005, 6.5.2.125.
+ static final int CDMA_SMS_FAIL_CAUSE_INVALID_TELESERVICE_ID = 4;
static final int CDMA_SMS_FAIL_CAUSE_RESOURCE_SHORTAGE = 35;
static final int CDMA_SMS_FAIL_CAUSE_OTHER_TERMINAL_PROBLEM = 39;
diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl
index 257f1e6..65bad96 100644
--- a/telephony/java/com/android/internal/telephony/ISms.aidl
+++ b/telephony/java/com/android/internal/telephony/ISms.aidl
@@ -67,24 +67,56 @@
boolean copyMessageToIccEf(int status, in byte[] pdu, in byte[] smsc);
/**
- * Send a SMS
+ * Send a data SMS.
*
* @param smsc the SMSC to send the message through, or NULL for the
* default SMSC
- * @param pdu the raw PDU to send
- * @param sentIntent if not NULL this <code>Intent</code> is
- * broadcast when the message is successfully sent, or failed.
+ * @param data the body of the message to send
+ * @param sentIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is sucessfully sent, or failed.
* The result code will be <code>Activity.RESULT_OK<code> for success,
- * or one of these errors:
- * <code>RESULT_ERROR_GENERIC_FAILURE</code>
- * <code>RESULT_ERROR_RADIO_OFF</code>
- * <code>RESULT_ERROR_NULL_PDU</code>.
- * @param deliveryIntent if not NULL this <code>Intent</code> is
+ * or one of these errors:<br>
+ * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
+ * <code>RESULT_ERROR_RADIO_OFF</code><br>
+ * <code>RESULT_ERROR_NULL_PDU</code><br>
+ * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
+ * the extra "errorCode" containing a radio technology specific value,
+ * generally only useful for troubleshooting.<br>
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applicaitons,
+ * which cause smaller number of SMS to be sent in checking period.
+ * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is delivered to the recipient. The
* raw pdu of the status report is in the extended data ("pdu").
*/
- void sendRawPdu(in byte[] smsc, in byte[] pdu, in PendingIntent sentIntent,
- in PendingIntent deliveryIntent);
+ void sendData(in String destAddr, in String scAddr, in int destPort,
+ in byte[] data, in PendingIntent sentIntent, in PendingIntent deliveryIntent);
+
+ /**
+ * Send an SMS.
+ *
+ * @param smsc the SMSC to send the message through, or NULL for the
+ * default SMSC
+ * @param text the body of the message to send
+ * @param sentIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is sucessfully sent, or failed.
+ * The result code will be <code>Activity.RESULT_OK<code> for success,
+ * or one of these errors:<br>
+ * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
+ * <code>RESULT_ERROR_RADIO_OFF</code><br>
+ * <code>RESULT_ERROR_NULL_PDU</code><br>
+ * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
+ * the extra "errorCode" containing a radio technology specific value,
+ * generally only useful for troubleshooting.<br>
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applications,
+ * which cause smaller number of SMS to be sent in checking period.
+ * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is delivered to the recipient. The
+ * raw pdu of the status report is in the extended data ("pdu").
+ */
+ void sendText(in String destAddr, in String scAddr, in String text,
+ in PendingIntent sentIntent, in PendingIntent deliveryIntent);
/**
* Send a multi-part text based SMS.
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 63c23ae..2328717 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -252,5 +252,10 @@
* Returns the network type
*/
int getNetworkType();
+
+ /**
+ * Return true if an ICC card is present
+ */
+ boolean hasIccCard();
}
diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java
index 6657060..0f76633 100644
--- a/telephony/java/com/android/internal/telephony/IccCard.java
+++ b/telephony/java/com/android/internal/telephony/IccCard.java
@@ -655,7 +655,7 @@
}
- public boolean hasApplicationType(IccCardApplication.AppType type) {
+ public boolean isApplicationOnIcc(IccCardApplication.AppType type) {
if (mIccCardStatus == null) return false;
for (int i = 0 ; i < mIccCardStatus.getNumApplications(); i++) {
@@ -667,6 +667,19 @@
return false;
}
+ /**
+ * @return true if a ICC card is present
+ */
+ public boolean hasIccCard() {
+ boolean isIccPresent;
+ if (mPhone.getPhoneName().equals("GSM")) {
+ return mIccCardStatus.getCardState().isCardPresent();
+ } else {
+ // TODO: Make work with a CDMA device with a RUIM card.
+ return false;
+ }
+ }
+
private void log(String msg) {
Log.d(mLogTag, "[IccCard] " + msg);
}
diff --git a/telephony/java/com/android/internal/telephony/IccConstants.java b/telephony/java/com/android/internal/telephony/IccConstants.java
index 7eafafd..acc9197 100644
--- a/telephony/java/com/android/internal/telephony/IccConstants.java
+++ b/telephony/java/com/android/internal/telephony/IccConstants.java
@@ -42,6 +42,9 @@
static final int EF_CFIS = 0x6FCB;
static final int EF_IMG = 0x4f20;
+ // USIM SIM file ids from TS 31.102
+ public static final int EF_PBR = 0x4F30;
+
// GSM SIM file ids from CPHS (phase 2, version 4.2) CPHS4_2.WW6
static final int EF_MAILBOX_CPHS = 0x6F17;
static final int EF_VOICE_MAIL_INDICATOR_CPHS = 0x6F11;
@@ -59,6 +62,7 @@
static final String MF_SIM = "3F00";
static final String DF_TELECOM = "7F10";
+ static final String DF_PHONEBOOK = "5F3A";
static final String DF_GRAPHICS = "5F50";
static final String DF_GSM = "7F20";
static final String DF_CDMA = "7F25";
diff --git a/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java b/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java
index 0bcaaa6..31cf6a7 100644
--- a/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java
+++ b/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java
@@ -115,7 +115,8 @@
* Replace oldAdn with newAdn in ADN-like record in EF
*
* getAdnRecordsInEf must be called at least once before this function,
- * otherwise an error will be returned
+ * otherwise an error will be returned. Currently the email field
+ * if set in the ADN record is ignored.
* throws SecurityException if no WRITE_CONTACTS permission
*
* @param efid must be one among EF_ADN, EF_FDN, and EF_SDN
@@ -167,7 +168,8 @@
* Update an ADN-like EF record by record index
*
* This is useful for iteration the whole ADN file, such as write the whole
- * phone book or erase/format the whole phonebook
+ * phone book or erase/format the whole phonebook. Currently the email field
+ * if set in the ADN record is ignored.
* throws SecurityException if no WRITE_CONTACTS permission
*
* @param efid must be one among EF_ADN, EF_FDN, and EF_SDN
@@ -237,12 +239,13 @@
"Requires android.permission.READ_CONTACTS permission");
}
+ efid = updateEfForIccType(efid);
if (DBG) logd("getAdnRecordsInEF: efid=" + efid);
synchronized(mLock) {
checkThread();
Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE);
- adnCache.requestLoadAllAdnLike(efid, response);
+ adnCache.requestLoadAllAdnLike(efid, adnCache.extensionEfForEf(efid), response);
try {
mLock.wait();
} catch (InterruptedException e) {
@@ -262,5 +265,15 @@
}
}
}
+
+ private int updateEfForIccType(int efid) {
+ // Check if we are trying to read ADN records
+ if (efid == IccConstants.EF_ADN) {
+ if (phone.getIccCard().isApplicationOnIcc(IccCardApplication.AppType.APPTYPE_USIM)) {
+ return IccConstants.EF_PBR;
+ }
+ }
+ return efid;
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/IccProvider.java b/telephony/java/com/android/internal/telephony/IccProvider.java
index 4cbd7797..ffcfe6f 100644
--- a/telephony/java/com/android/internal/telephony/IccProvider.java
+++ b/telephony/java/com/android/internal/telephony/IccProvider.java
@@ -46,7 +46,8 @@
private static final String[] ADDRESS_BOOK_COLUMN_NAMES = new String[] {
"name",
- "number"
+ "number",
+ "emails"
};
private static final int ADN = 1;
@@ -55,6 +56,7 @@
private static final String STR_TAG = "tag";
private static final String STR_NUMBER = "number";
+ private static final String STR_EMAILS = "emails";
private static final String STR_PIN2 = "pin2";
private static final UriMatcher URL_MATCHER =
@@ -172,7 +174,8 @@
String tag = initialValues.getAsString("tag");
String number = initialValues.getAsString("number");
- boolean success = addIccRecordToEf(efType, tag, number, pin2);
+ // TODO(): Read email instead of sending null.
+ boolean success = addIccRecordToEf(efType, tag, number, null, pin2);
if (!success) {
return null;
@@ -238,6 +241,7 @@
// parse where clause
String tag = null;
String number = null;
+ String[] emails = null;
String pin2 = null;
String[] tokens = where.split("AND");
@@ -261,6 +265,9 @@
tag = normalizeValue(val);
} else if (STR_NUMBER.equals(key)) {
number = normalizeValue(val);
+ } else if (STR_EMAILS.equals(key)) {
+ //TODO(): Email is null.
+ emails = null;
} else if (STR_PIN2.equals(key)) {
pin2 = normalizeValue(val);
}
@@ -274,7 +281,7 @@
return 0;
}
- boolean success = deleteIccRecordFromEf(efType, tag, number, pin2);
+ boolean success = deleteIccRecordFromEf(efType, tag, number, emails, pin2);
if (!success) {
return 0;
}
@@ -307,9 +314,11 @@
String tag = values.getAsString("tag");
String number = values.getAsString("number");
+ String[] emails = null;
String newTag = values.getAsString("newTag");
String newNumber = values.getAsString("newNumber");
-
+ String[] newEmails = null;
+ // TODO(): Update for email.
boolean success = updateIccRecordInEf(efType, tag, number,
newTag, newNumber, pin2);
@@ -355,9 +364,9 @@
}
private boolean
- addIccRecordToEf(int efType, String name, String number, String pin2) {
+ addIccRecordToEf(int efType, String name, String number, String[] emails, String pin2) {
if (DBG) log("addIccRecordToEf: efType=" + efType + ", name=" + name +
- ", number=" + number);
+ ", number=" + number + ", emails=" + emails);
boolean success = false;
@@ -384,7 +393,7 @@
private boolean
updateIccRecordInEf(int efType, String oldName, String oldNumber,
- String newName, String newNumber,String pin2) {
+ String newName, String newNumber, String pin2) {
if (DBG) log("updateIccRecordInEf: efType=" + efType +
", oldname=" + oldName + ", oldnumber=" + oldNumber +
", newname=" + newName + ", newnumber=" + newNumber);
@@ -407,9 +416,10 @@
}
- private boolean deleteIccRecordFromEf(int efType, String name, String number, String pin2) {
+ private boolean deleteIccRecordFromEf(int efType, String name, String number, String[] emails,
+ String pin2) {
if (DBG) log("deleteIccRecordFromEf: efType=" + efType +
- ", name=" + name + ", number=" + number + ", pin2=" + pin2);
+ ", name=" + name + ", number=" + number + ", emails=" + emails + ", pin2=" + pin2);
boolean success = false;
@@ -438,13 +448,26 @@
private void loadRecord(AdnRecord record,
ArrayList<ArrayList> results) {
if (!record.isEmpty()) {
- ArrayList<String> contact = new ArrayList<String>(2);
+ ArrayList<String> contact = new ArrayList<String>();
String alphaTag = record.getAlphaTag();
String number = record.getNumber();
+ String[] emails = record.getEmails();
- if (DBG) log("loadRecord: " + alphaTag + ", " + number);
+ if (DBG) log("loadRecord: " + alphaTag + ", " + number + ",");
contact.add(alphaTag);
contact.add(number);
+ StringBuilder emailString = new StringBuilder();
+
+ if (emails != null) {
+ for (String email: emails) {
+ if (DBG) log("Adding email:" + email);
+ emailString.append(email);
+ emailString.append(",");
+ }
+ contact.add(emailString.toString());
+ } else {
+ contact.add(null);
+ }
results.add(contact);
}
}
diff --git a/telephony/java/com/android/internal/telephony/IccRecords.java b/telephony/java/com/android/internal/telephony/IccRecords.java
index ea24c25..b8d9e3c 100644
--- a/telephony/java/com/android/internal/telephony/IccRecords.java
+++ b/telephony/java/com/android/internal/telephony/IccRecords.java
@@ -31,7 +31,7 @@
public abstract class IccRecords extends Handler implements IccConstants {
protected static final boolean DBG = true;
- //***** Instance Variables
+ // ***** Instance Variables
protected PhoneBase phone;
protected RegistrantList recordsLoadedRegistrants = new RegistrantList();
@@ -40,7 +40,7 @@
protected AdnRecordCache adnCache;
- //***** Cached SIM State; cleared on channel close
+ // ***** Cached SIM State; cleared on channel close
protected boolean recordsRequested = false; // true if we've made requests for the sim records
@@ -54,23 +54,26 @@
protected boolean isVoiceMailFixed = false;
protected int countVoiceMessages = 0;
- protected int mncLength = 0; // 0 is used to indicate that the value
- // is not initialized
+ protected int mncLength = UNINITIALIZED;
protected int mailboxIndex = 0; // 0 is no mailbox dailing number associated
protected String spn;
protected int spnDisplayCondition;
- //***** Constants
+ // ***** Constants
+
+ // Markers for mncLength
+ protected static final int UNINITIALIZED = -1;
+ protected static final int UNKNOWN = 0;
// Bitmasks for SPN display rules.
protected static final int SPN_RULE_SHOW_SPN = 0x01;
protected static final int SPN_RULE_SHOW_PLMN = 0x02;
- //***** Event Constants
+ // ***** Event Constants
protected static final int EVENT_SET_MSISDN_DONE = 30;
- //***** Constructor
+ // ***** Constructor
public IccRecords(PhoneBase p) {
this.phone = p;
@@ -234,4 +237,3 @@
protected abstract void log(String s);
}
-
diff --git a/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java b/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java
index 620f2de..8a5a6ae 100644
--- a/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java
+++ b/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java
@@ -20,6 +20,8 @@
import android.content.Context;
import android.util.Log;
+import com.android.internal.util.HexDump;
+
import java.util.ArrayList;
import java.util.List;
@@ -30,8 +32,6 @@
* access Sms in Icc.
*/
public abstract class IccSmsInterfaceManager extends ISms.Stub {
- static final boolean DBG = true;
-
protected PhoneBase mPhone;
protected Context mContext;
protected SMSDispatcher mDispatcher;
@@ -49,40 +49,85 @@
}
/**
- * Send a Raw PDU SMS
+ * Send a data based SMS to a specific application port.
*
- * @param smsc the SMSC to send the message through, or NULL for the
- * defatult SMSC
- * @param pdu the raw PDU to send
- * @param sentIntent if not NULL this <code>Intent</code> is
+ * @param destAddr the address to send the message to
+ * @param scAddr is the service center address or null to use
+ * the current default SMSC
+ * @param destPort the port to deliver the message to
+ * @param data the body of the message to send
+ * @param sentIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is sucessfully sent, or failed.
* The result code will be <code>Activity.RESULT_OK<code> for success,
- * or one of these errors:
- * <code>RESULT_ERROR_GENERIC_FAILURE</code>
- * <code>RESULT_ERROR_RADIO_OFF</code>
- * <code>RESULT_ERROR_NULL_PDU</code>.
- * @param deliveryIntent if not NULL this <code>Intent</code> is
+ * or one of these errors:<br>
+ * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
+ * <code>RESULT_ERROR_RADIO_OFF</code><br>
+ * <code>RESULT_ERROR_NULL_PDU</code><br>
+ * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
+ * the extra "errorCode" containing a radio technology specific value,
+ * generally only useful for troubleshooting.<br>
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applicaitons,
+ * which cause smaller number of SMS to be sent in checking period.
+ * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is delivered to the recipient. The
* raw pdu of the status report is in the extended data ("pdu").
*/
- public void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,
- PendingIntent deliveryIntent) {
- Context context = mPhone.getContext();
-
- context.enforceCallingPermission(
+ public void sendData(String destAddr, String scAddr, int destPort,
+ byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ mPhone.getContext().enforceCallingPermission(
"android.permission.SEND_SMS",
"Sending SMS message");
- if (DBG) log("sendRawPdu: smsc=" + smsc +
- " pdu="+ pdu + " sentIntent" + sentIntent +
- " deliveryIntent" + deliveryIntent);
- mDispatcher.sendRawPdu(smsc, pdu, sentIntent, deliveryIntent);
+ if (Log.isLoggable("SMS", Log.VERBOSE)) {
+ log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" +
+ destPort + " data='"+ HexDump.toHexString(data) + "' sentIntent=" +
+ sentIntent + " deliveryIntent=" + deliveryIntent);
+ }
+ mDispatcher.sendData(destAddr, scAddr, destPort, data, sentIntent, deliveryIntent);
+ }
+
+ /**
+ * Send a text based SMS.
+ *
+ * @param destAddr the address to send the message to
+ * @param scAddr is the service center address or null to use
+ * the current default SMSC
+ * @param text the body of the message to send
+ * @param sentIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is sucessfully sent, or failed.
+ * The result code will be <code>Activity.RESULT_OK<code> for success,
+ * or one of these errors:<br>
+ * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
+ * <code>RESULT_ERROR_RADIO_OFF</code><br>
+ * <code>RESULT_ERROR_NULL_PDU</code><br>
+ * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
+ * the extra "errorCode" containing a radio technology specific value,
+ * generally only useful for troubleshooting.<br>
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applications,
+ * which cause smaller number of SMS to be sent in checking period.
+ * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is delivered to the recipient. The
+ * raw pdu of the status report is in the extended data ("pdu").
+ */
+ public void sendText(String destAddr, String scAddr,
+ String text, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ mPhone.getContext().enforceCallingPermission(
+ "android.permission.SEND_SMS",
+ "Sending SMS message");
+ if (Log.isLoggable("SMS", Log.VERBOSE)) {
+ log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr +
+ " text='"+ text + "' sentIntent=" +
+ sentIntent + " deliveryIntent=" + deliveryIntent);
+ }
+ mDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent);
}
/**
* Send a multi-part text based SMS.
*
- * @param destinationAddress the address to send the message to
- * @param scAddress is the service center address or null to use
+ * @param destAddr the address to send the message to
+ * @param scAddr is the service center address or null to use
* the current default SMSC
* @param parts an <code>ArrayList</code> of strings that, in order,
* comprise the original message
@@ -94,21 +139,28 @@
* <code>RESULT_ERROR_GENERIC_FAILURE</code>
* <code>RESULT_ERROR_RADIO_OFF</code>
* <code>RESULT_ERROR_NULL_PDU</code>.
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applicaitons,
+ * which cause smaller number of SMS to be sent in checking period.
* @param deliveryIntents if not null, an <code>ArrayList</code> of
* <code>PendingIntent</code>s (one for each message part) that is
* broadcast when the corresponding message part has been delivered
* to the recipient. The raw pdu of the status report is in the
* extended data ("pdu").
*/
- public void sendMultipartText(String destinationAddress, String scAddress, List<String> parts,
+ public void sendMultipartText(String destAddr, String scAddr, List<String> parts,
List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) {
- Context context = mPhone.getContext();
-
- context.enforceCallingPermission(
+ mPhone.getContext().enforceCallingPermission(
"android.permission.SEND_SMS",
"Sending SMS message");
- if (DBG) log("sendMultipartText");
- mDispatcher.sendMultipartText(destinationAddress, scAddress, (ArrayList<String>) parts,
+ if (Log.isLoggable("SMS", Log.VERBOSE)) {
+ int i = 0;
+ for (String part : parts) {
+ log("sendMultipartText: destAddr=" + destAddr + ", srAddr=" + scAddr +
+ ", part[" + (i++) + "]=" + part);
+ }
+ }
+ mDispatcher.sendMultipartText(destAddr, scAddr, (ArrayList<String>) parts,
(ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents);
}
@@ -163,4 +215,3 @@
protected abstract void log(String msg);
}
-
diff --git a/telephony/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java b/telephony/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java
index a51d074..1910a9c 100644
--- a/telephony/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java
+++ b/telephony/java/com/android/internal/telephony/IccSmsInterfaceManagerProxy.java
@@ -50,16 +50,21 @@
return mIccSmsInterfaceManager.getAllMessagesFromIccEf();
}
- public void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,
- PendingIntent deliveryIntent) throws android.os.RemoteException {
- mIccSmsInterfaceManager.sendRawPdu(smsc, pdu, sentIntent,
- deliveryIntent);
+ public void sendData(String destAddr, String scAddr, int destPort,
+ byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ mIccSmsInterfaceManager.sendData(destAddr, scAddr, destPort, data,
+ sentIntent, deliveryIntent);
}
- public void sendMultipartText(String destinationAddress, String scAddress,
+ public void sendText(String destAddr, String scAddr,
+ String text, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ mIccSmsInterfaceManager.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent);
+ }
+
+ public void sendMultipartText(String destAddr, String scAddr,
List<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> deliveryIntents) throws android.os.RemoteException {
- mIccSmsInterfaceManager.sendMultipartText(destinationAddress, scAddress,
+ mIccSmsInterfaceManager.sendMultipartText(destAddr, scAddr,
parts, sentIntents, deliveryIntents);
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/MccTable.java b/telephony/java/com/android/internal/telephony/MccTable.java
similarity index 84%
rename from telephony/java/com/android/internal/telephony/gsm/MccTable.java
rename to telephony/java/com/android/internal/telephony/MccTable.java
index 9343f44..0d11f8c 100644
--- a/telephony/java/com/android/internal/telephony/gsm/MccTable.java
+++ b/telephony/java/com/android/internal/telephony/MccTable.java
@@ -14,7 +14,17 @@
* limitations under the License.
*/
-package com.android.internal.telephony.gsm;
+package com.android.internal.telephony;
+
+import android.app.ActivityManagerNative;
+import android.app.AlarmManager;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.net.wifi.WifiManager;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.util.Log;
import java.util.Arrays;
@@ -475,8 +485,10 @@
0x65630400, 0x67660400, 0x70790400, 0x73720400, 0x75790400, 0x666b0400
};
+ static final String LOG_TAG = "MccTable";
+
/**
- * Given a GSM Mobile Country Code, returns a default time zone ID
+ * Given a Mobile Country Code, returns a default time zone ID
* if available. Returns null if unavailable.
*/
public static String defaultTimeZoneForMcc(int mcc) {
@@ -494,7 +506,7 @@
}
/**
- * Given a GSM Mobile Country Code, returns an ISO two-character
+ * Given a Mobile Country Code, returns an ISO two-character
* country code if available. Returns "" if unavailable.
*/
public static String countryCodeForMcc(int mcc) {
@@ -553,4 +565,95 @@
return wifi;
}
+ /**
+ * Updates MCC and MNC device configuration information for application retrieving
+ * correct version of resources. If either MCC or MNC is 0, they will be ignored (not set).
+ * @param phone PhoneBae to act on.
+ * @param mccmnc truncated imsi with just the MCC and MNC - MNC assumed to be from 4th to end
+ */
+ public static void updateMccMncConfiguration(PhoneBase phone, String mccmnc) {
+ Configuration config = new Configuration();
+ int mcc, mnc;
+
+ try {
+ mcc = Integer.parseInt(mccmnc.substring(0,3));
+ mnc = Integer.parseInt(mccmnc.substring(3));
+ } catch (NumberFormatException e) {
+ Log.e(LOG_TAG, "Error parsing IMSI");
+ return;
+ }
+
+ Log.d(LOG_TAG, "updateMccMncConfiguration: mcc=" + mcc + ", mnc=" + mnc);
+
+ if (mcc != 0) {
+ config.mcc = mcc;
+ setTimezoneFromMccIfNeeded(phone, mcc);
+ setLocaleFromMccIfNeeded(phone, mcc);
+ setWifiChannelsFromMccIfNeeded(phone, mcc);
+ }
+ if (mnc != 0) {
+ config.mnc = mnc;
+ }
+ try {
+ ActivityManagerNative.getDefault().updateConfiguration(config);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Can't update configuration", e);
+ }
+ }
+
+ /**
+ * If the timezone is not already set, set it based on the MCC of the SIM.
+ * @param phone PhoneBase to act on (get context from).
+ * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
+ */
+ private static void setTimezoneFromMccIfNeeded(PhoneBase phone, int mcc) {
+ String timezone = SystemProperties.get(ServiceStateTracker.TIMEZONE_PROPERTY);
+ if (timezone == null || timezone.length() == 0) {
+ String zoneId = defaultTimeZoneForMcc(mcc);
+ if (zoneId != null && zoneId.length() > 0) {
+ Context context = phone.getContext();
+ // Set time zone based on MCC
+ AlarmManager alarm =
+ (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ alarm.setTimeZone(zoneId);
+ Log.d(LOG_TAG, "timezone set to "+zoneId);
+ }
+ }
+ }
+
+ /**
+ * If the locale is not already set, set it based on the MCC of the SIM.
+ * @param phone PhoneBase to act on.
+ * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
+ */
+ private static void setLocaleFromMccIfNeeded(PhoneBase phone, int mcc) {
+ String language = MccTable.defaultLanguageForMcc(mcc);
+ String country = MccTable.countryCodeForMcc(mcc);
+
+ Log.d(LOG_TAG, "locale set to "+language+"_"+country);
+ phone.setSystemLocale(language, country);
+ }
+
+ /**
+ * If the number of allowed wifi channels has not been set, set it based on
+ * the MCC of the SIM.
+ * @param phone PhoneBase to act on (get context from).
+ * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
+ */
+ private static void setWifiChannelsFromMccIfNeeded(PhoneBase phone, int mcc) {
+ int wifiChannels = MccTable.wifiChannelsForMcc(mcc);
+ if (wifiChannels != 0) {
+ Context context = phone.getContext();
+ // only set to this default if the user hasn't manually set it
+ try {
+ Settings.Secure.getInt(context.getContentResolver(),
+ Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS);
+ } catch (Settings.SettingNotFoundException e) {
+ Log.d(LOG_TAG, "WIFI_NUM_ALLOWED_CHANNESL set to " + wifiChannels);
+ WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ // don't persist
+ wM.setNumAllowedChannels(wifiChannels, false);
+ }
+ }
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/SMSDispatcher.java b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
index bbfc6c9..d26a092 100644
--- a/telephony/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/SMSDispatcher.java
@@ -150,7 +150,8 @@
private static SmsMessage mSmsMessage;
private static SmsMessageBase mSmsMessageBase;
private SmsMessageBase.SubmitPduBase mSubmitPduBase;
- private boolean mStorageAvailable = true;
+
+ protected boolean mStorageAvailable = true;
protected static int getNextConcatenatedRef() {
sConcatenatedRef += 1;
@@ -294,19 +295,15 @@
sms = (SmsMessage) ar.result;
try {
- if (mStorageAvailable) {
- int result = dispatchMessage(sms.mWrappedSmsMessage);
- if (result != Activity.RESULT_OK) {
- // RESULT_OK means that message was broadcast for app(s) to handle.
- // Any other result, we should ack here.
- boolean handled = (result == Intents.RESULT_SMS_HANDLED);
- acknowledgeLastIncomingSms(handled, result, null);
- }
- } else {
- acknowledgeLastIncomingSms(false, Intents.RESULT_SMS_OUT_OF_MEMORY, null);
+ int result = dispatchMessage(sms.mWrappedSmsMessage);
+ if (result != Activity.RESULT_OK) {
+ // RESULT_OK means that message was broadcast for app(s) to handle.
+ // Any other result, we should ack here.
+ boolean handled = (result == Intents.RESULT_SMS_HANDLED);
+ notifyAndAcknowledgeLastIncomingSms(handled, result, null);
}
} catch (RuntimeException ex) {
- acknowledgeLastIncomingSms(false, Intents.RESULT_SMS_GENERIC_ERROR, null);
+ notifyAndAcknowledgeLastIncomingSms(false, Intents.RESULT_SMS_GENERIC_ERROR, null);
}
break;
@@ -635,12 +632,66 @@
dispatch(intent, "android.permission.RECEIVE_SMS");
}
+ /**
+ * Send a data based SMS to a specific application port.
+ *
+ * @param destAddr the address to send the message to
+ * @param scAddr is the service center address or null to use
+ * the current default SMSC
+ * @param destPort the port to deliver the message to
+ * @param data the body of the message to send
+ * @param sentIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is sucessfully sent, or failed.
+ * The result code will be <code>Activity.RESULT_OK<code> for success,
+ * or one of these errors:<br>
+ * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
+ * <code>RESULT_ERROR_RADIO_OFF</code><br>
+ * <code>RESULT_ERROR_NULL_PDU</code><br>
+ * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
+ * the extra "errorCode" containing a radio technology specific value,
+ * generally only useful for troubleshooting.<br>
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applicaitons,
+ * which cause smaller number of SMS to be sent in checking period.
+ * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is delivered to the recipient. The
+ * raw pdu of the status report is in the extended data ("pdu").
+ */
+ protected abstract void sendData(String destAddr, String scAddr, int destPort,
+ byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent);
+
+ /**
+ * Send a text based SMS.
+ *
+ * @param destAddr the address to send the message to
+ * @param scAddr is the service center address or null to use
+ * the current default SMSC
+ * @param text the body of the message to send
+ * @param sentIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is sucessfully sent, or failed.
+ * The result code will be <code>Activity.RESULT_OK<code> for success,
+ * or one of these errors:<br>
+ * <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
+ * <code>RESULT_ERROR_RADIO_OFF</code><br>
+ * <code>RESULT_ERROR_NULL_PDU</code><br>
+ * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
+ * the extra "errorCode" containing a radio technology specific value,
+ * generally only useful for troubleshooting.<br>
+ * The per-application based SMS control checks sentIntent. If sentIntent
+ * is NULL the caller will be checked against all unknown applications,
+ * which cause smaller number of SMS to be sent in checking period.
+ * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
+ * broadcast when the message is delivered to the recipient. The
+ * raw pdu of the status report is in the extended data ("pdu").
+ */
+ protected abstract void sendText(String destAddr, String scAddr,
+ String text, PendingIntent sentIntent, PendingIntent deliveryIntent);
/**
* Send a multi-part text based SMS.
*
- * @param destinationAddress the address to send the message to
- * @param scAddress is the service center address or null to use
+ * @param destAddr the address to send the message to
+ * @param scAddr is the service center address or null to use
* the current default SMSC
* @param parts an <code>ArrayList</code> of strings that, in order,
* comprise the original message
@@ -661,7 +712,7 @@
* to the recipient. The raw pdu of the status report is in the
* extended data ("pdu").
*/
- protected abstract void sendMultipartText(String destinationAddress, String scAddress,
+ protected abstract void sendMultipartText(String destAddr, String scAddr,
ArrayList<String> parts, ArrayList<PendingIntent> sentIntents,
ArrayList<PendingIntent> deliveryIntents);
@@ -812,6 +863,25 @@
int result, Message response);
/**
+ * Notify interested apps if the framework has rejected an incoming SMS,
+ * and send an acknowledge message to the network.
+ * @param success indicates that last message was successfully received.
+ * @param result result code indicating any error
+ * @param response callback message sent when operation completes.
+ */
+ private void notifyAndAcknowledgeLastIncomingSms(boolean success,
+ int result, Message response) {
+ if (!success) {
+ // broadcast SMS_REJECTED_ACTION intent
+ Intent intent = new Intent(Intents.SMS_REJECTED_ACTION);
+ intent.putExtra("result", result);
+ mWakeLock.acquire(WAKE_LOCK_TIMEOUT);
+ mContext.sendBroadcast(intent, "android.permission.RECEIVE_SMS");
+ }
+ acknowledgeLastIncomingSms(success, result, response);
+ }
+
+ /**
* Check if a SmsTracker holds multi-part Sms
*
* @param tracker a SmsTracker could hold a multi-part Sms
diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
index c74bb8d..cc13450 100644
--- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -28,20 +28,9 @@
* {@hide}
*/
public abstract class ServiceStateTracker extends Handler {
+
/**
- * The access technology currently in use:
- * 0 = unknown
- * 1 = GPRS only
- * 2 = EDGE
- * 3 = UMTS
- * 4 = IS95A
- * 5 = IS95B
- * 6 = 1xRTT
- * 7 = EvDo_0
- * 8 = EvDo_A
- * 9 = HSDPA
- * 10 = HSUPA
- * 11 = HSPA
+ * Access technology currently in use.
*/
protected static final int DATA_ACCESS_UNKNOWN = 0;
protected static final int DATA_ACCESS_GPRS = 1;
@@ -55,7 +44,6 @@
protected static final int DATA_ACCESS_HSDPA = 9;
protected static final int DATA_ACCESS_HSUPA = 10;
protected static final int DATA_ACCESS_HSPA = 11;
- //***** Instance Variables
protected CommandsInterface cm;
@@ -64,33 +52,36 @@
public SignalStrength mSignalStrength;
- // Used as a unique identifier to track requests associated with a poll
- // and ignore stale responses.The value is a count-down of expected responses
- // in this pollingContext
+ /**
+ * A unique identifier to track requests associated with a poll
+ * and ignore stale responses. The value is a count-down of
+ * expected responses in this pollingContext.
+ */
protected int[] pollingContext;
protected boolean mDesiredPowerState;
- protected boolean dontPollSignalStrength = false; // Default is to poll strength
- // If we're getting unsolicited signal strength updates from the radio,
- // set value to true and don't bother polling any more
+ /**
+ * By default, strength polling is enabled. However, if we're
+ * getting unsolicited signal strength updates from the radio, set
+ * value to true and don't bother polling any more.
+ */
+ protected boolean dontPollSignalStrength = false;
protected RegistrantList networkAttachedRegistrants = new RegistrantList();
protected RegistrantList roamingOnRegistrants = new RegistrantList();
protected RegistrantList roamingOffRegistrants = new RegistrantList();
- //***** Constants
-
protected static final boolean DBG = true;
- // signal strength poll rate
+ /** Signal strength poll rate. */
protected static final int POLL_PERIOD_MILLIS = 20 * 1000;
- // waiting period before recheck gprs and voice registration
+ /** Waiting period before recheck gprs and voice registration. */
public static final int DEFAULT_GPRS_CHECK_PERIOD_MILLIS = 60 * 1000;
public static final int DATA_STATE_POLL_SLEEP_MS = 100;
- //*****GSM events
+ /** GSM events */
protected static final int EVENT_RADIO_STATE_CHANGED = 1;
protected static final int EVENT_NETWORK_STATE_CHANGED = 2;
protected static final int EVENT_GET_SIGNAL_STRENGTH = 3;
@@ -112,7 +103,7 @@
protected static final int EVENT_CHECK_REPORT_GPRS = 22;
protected static final int EVENT_RESTRICTED_STATE_CHANGED = 23;
- //*****CDMA events:
+ /** CDMA events */
protected static final int EVENT_POLL_STATE_REGISTRATION_CDMA = 24;
protected static final int EVENT_POLL_STATE_OPERATOR_CDMA = 25;
protected static final int EVENT_RUIM_READY = 26;
@@ -129,13 +120,14 @@
protected static final int EVENT_OTA_PROVISION_STATUS_CHANGE = 37;
protected static final int EVENT_SET_RADIO_POWER_OFF = 38;
- //***** Time Zones
protected static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
- // List of ISO codes for countries that can have an offset of GMT+0
- // when not in daylight savings time. This ignores some small places
- // such as the Canary Islands (Spain) and Danmarkshavn (Denmark).
- // The list must be sorted by code.
+ /**
+ * List of ISO codes for countries that can have an offset of
+ * GMT+0 when not in daylight savings time. This ignores some
+ * small places such as the Canary Islands (Spain) and
+ * Danmarkshavn (Denmark). The list must be sorted by code.
+ */
protected static final String[] GMT_COUNTRY_CODES = {
"bf", // Burkina Faso
"ci", // Cote d'Ivoire
@@ -159,11 +151,10 @@
"uk", // U.K
};
- //***** Registration denied reason
+ /** Reason for registration denial. */
protected static final String REGISTRATION_DENIED_GEN = "General";
protected static final String REGISTRATION_DENIED_AUTH = "Authentication Failure";
- //***** Constructors
public ServiceStateTracker() {
}
@@ -228,8 +219,6 @@
obtainMessage(EVENT_GET_PREFERRED_NETWORK_TYPE, onComplete));
}
-
- //***** Called from Phone
public void
setRadioPower(boolean power) {
mDesiredPowerState = power;
@@ -237,7 +226,6 @@
setPowerStateToDesired();
}
-
public void enableLocationUpdates() {
cm.setLocationUpdates(true, obtainMessage(EVENT_LOCATION_UPDATES_ENABLED));
}
@@ -246,17 +234,15 @@
cm.setLocationUpdates(false, null);
}
- //***** Overridden from Handler
public abstract void handleMessage(Message msg);
- //***** Protected abstract Methods
protected abstract void handlePollStateResult(int what, AsyncResult ar);
protected abstract void updateSpnDisplay();
protected abstract void setPowerStateToDesired();
/** Cancel a pending (if any) pollState() operation */
protected void cancelPollState() {
- // This will effectively cancel the rest of the poll requests
+ // This will effectively cancel the rest of the poll requests.
pollingContext = new int[1];
}
}
diff --git a/telephony/java/com/android/internal/telephony/SmsMessageBase.java b/telephony/java/com/android/internal/telephony/SmsMessageBase.java
index 6177c8a..3f0213b 100644
--- a/telephony/java/com/android/internal/telephony/SmsMessageBase.java
+++ b/telephony/java/com/android/internal/telephony/SmsMessageBase.java
@@ -116,6 +116,16 @@
* android.telephony.SmsMessage ENCODING_*).
*/
public int codeUnitSize;
+
+ @Override
+ public String toString() {
+ return "TextEncodingDetails " +
+ "{ msgCount=" + msgCount +
+ ", codeUnitCount=" + codeUnitCount +
+ ", codeUnitsRemaining=" + codeUnitsRemaining +
+ ", codeUnitSize=" + codeUnitSize +
+ " }";
+ }
}
// TODO(): This class is duplicated in SmsMessage.java. Refactor accordingly.
@@ -373,7 +383,7 @@
* 2. [x@y][ ]/[body]
*/
String[] parts = messageBody.split("( /)|( )", 2);
- if (parts.length < 1 || parts[0].indexOf('@') == -1) return;
+ if (parts.length < 1) return;
emailFrom = parts[0];
emailBody = parts[1];
isEmail = true;
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index de5bbc1..55ba149 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -130,4 +130,10 @@
* The number of milli-seconds between CALL_RING notifications.
*/
static final String PROPERTY_CALL_RING_DELAY = "ro.telephony.call_ring.delay";
+
+ /**
+ * Track CDMA SMS message id numbers to ensure they increment
+ * monotonically, regardless of reboots.
+ */
+ static final String PROPERTY_CDMA_MSG_ID = "persist.radio.cdma.msgid";
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
index ebe3e096..ff06bc0 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -48,10 +48,7 @@
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.DataConnection;
-// TODO(Moto): need to move MccTable from telephony.gsm to telephony
-// since there is no difference between CDMA and GSM for MccTable and
-// CDMA uses gsm's MccTable is not good.
-import com.android.internal.telephony.gsm.MccTable;
+import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.IccCard;
import com.android.internal.telephony.IccException;
import com.android.internal.telephony.IccFileHandler;
@@ -179,6 +176,10 @@
// This is needed to handle phone process crashes
String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
mIsPhoneInEcmState = inEcm.equals("true");
+ if (mIsPhoneInEcmState) {
+ // Send a message which will invoke handleExitEmergencyCallbackMode
+ mCM.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
+ }
// get the string that specifies the carrier OTA Sp number
mCarrierOtaSpNumSchema = SystemProperties.get(
@@ -199,7 +200,7 @@
updateCurrentCarrierInProvider(operatorNumeric);
// Updates MCC MNC device configuration information
- updateMccMncConfiguration(operatorNumeric);
+ MccTable.updateMccMncConfiguration(this, operatorNumeric);
// Notify voicemails.
@@ -340,15 +341,6 @@
dial (String dialString) throws CallStateException {
// Need to make sure dialString gets parsed properly
String newDialString = PhoneNumberUtils.stripSeparators(dialString);
-
- if (!mCT.foregroundCall.isIdle()) {
- FeatureCode fc = FeatureCode.newFromDialString(newDialString, this);
- if (fc != null) {
- //mMmiRegistrants.notifyRegistrants(new AsyncResult(null, fc, null));
- fc.processCode();
- return null;
- }
- }
return mCT.dial(newDialString);
}
@@ -846,21 +838,6 @@
mRuimRecords.setVoiceMessageWaiting(1, mwi);
}
- /**
- * Removes the given FC from the pending list and notifies
- * registrants that it is complete.
- * @param fc FC that is done
- */
- /*package*/ void onFeatureCodeDone(FeatureCode fc) {
- /* Only notify complete if it's on the pending list.
- * Otherwise, it's already been handled (eg, previously canceled).
- * The exception is cancellation of an incoming USSD-REQUEST, which is
- * not on the list.
- */
- mMmiCompleteRegistrants.notifyRegistrants(new AsyncResult(null, fc, null));
- }
-
-
@Override
public void exitEmergencyCallbackMode() {
if (mWakeLock.isHeld()) {
@@ -1035,7 +1012,6 @@
Log.d(LOG_TAG, "ERI read, notify registrants");
mEriFileLoadedRegistrants.notifyRegistrants();
}
- setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE,"false");
}
break;
@@ -1427,21 +1403,4 @@
return false;
}
- /**
- * Updates MCC and MNC device configuration information for application retrieving
- * correct version of resources
- *
- */
- private void updateMccMncConfiguration(String operatorNumeric) {
- if (operatorNumeric.length() >= 5) {
- Configuration config = new Configuration();
- config.mcc = Integer.parseInt(operatorNumeric.substring(0,3));
- config.mnc = Integer.parseInt(operatorNumeric.substring(3));
- try {
- ActivityManagerNative.getDefault().updateConfiguration(config);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Can't update configuration", e);
- }
- }
- }
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
index 88cccd3..bf42257 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
@@ -33,6 +33,7 @@
import android.util.Config;
import android.util.Log;
import android.telephony.SmsManager;
+import android.telephony.SmsMessage.MessageClass;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.telephony.CommandsInterface;
@@ -91,23 +92,8 @@
int teleService = sms.getTeleService();
boolean handled = false;
- if ((sms.getUserData() == null) && (SmsEnvelope.TELESERVICE_MWI != teleService) &&
- (SmsEnvelope.TELESERVICE_VMN != teleService)) {
- if (Config.LOGD) {
- Log.d(TAG, "Received SMS without user data");
- }
- handled = true;
- }
-
- if (handled) {
- return Intents.RESULT_SMS_HANDLED;
- }
-
- if (SmsEnvelope.TELESERVICE_WAP == teleService) {
- return processCdmaWapPdu(sms.getUserData(), sms.messageRef,
- sms.getOriginatingAddress());
- } else if ((SmsEnvelope.TELESERVICE_VMN == teleService) ||
- (SmsEnvelope.TELESERVICE_MWI == teleService)) {
+ if ((SmsEnvelope.TELESERVICE_VMN == teleService) ||
+ (SmsEnvelope.TELESERVICE_MWI == teleService)) {
// handling Voicemail
int voicemailCount = sms.getNumOfVoicemails();
Log.d(TAG, "Voicemail count=" + voicemailCount);
@@ -118,10 +104,39 @@
editor.putInt(CDMAPhone.VM_COUNT_CDMA, voicemailCount);
editor.commit();
((CDMAPhone) mPhone).updateMessageWaitingIndicator(voicemailCount);
+ handled = true;
+ } else if ((sms.getUserData() == null)) {
+ if (Config.LOGD) {
+ Log.d(TAG, "Received SMS without user data");
+ }
+ handled = true;
+ }
+
+ if (handled) {
return Intents.RESULT_SMS_HANDLED;
}
- /**
+ if (!mStorageAvailable && (sms.getMessageClass() != MessageClass.CLASS_0)) {
+ // It's a storable message and there's no storage available. Bail.
+ // (See C.S0015-B v2.0 for a description of "Immediate Display"
+ // messages, which we represent as CLASS_0.)
+ return Intents.RESULT_SMS_OUT_OF_MEMORY;
+ }
+
+ if (SmsEnvelope.TELESERVICE_WAP == teleService) {
+ return processCdmaWapPdu(sms.getUserData(), sms.messageRef,
+ sms.getOriginatingAddress());
+ }
+
+ // Reject (NAK) any messages with teleservice ids that have
+ // not yet been handled and also do not correspond to the two
+ // kinds that are processed below.
+ if ((SmsEnvelope.TELESERVICE_WMT != teleService) &&
+ (SmsEnvelope.TELESERVICE_WEMT != teleService)) {
+ return Intents.RESULT_SMS_UNSUPPORTED;
+ }
+
+ /*
* TODO(cleanup): Why are we using a getter method for this
* (and for so many other sms fields)? Trivial getters and
* setters like this are direct violations of the style guide.
@@ -134,11 +149,12 @@
*/
SmsHeader smsHeader = sms.getUserDataHeader();
- /**
+ /*
* TODO(cleanup): Since both CDMA and GSM use the same header
* format, this dispatch processing is naturally identical,
* and code should probably not be replicated explicitly.
*/
+
// See if message is partial or port addressed.
if ((smsHeader == null) || (smsHeader.concatRef == null)) {
// Message is not partial (not part of concatenated sequence).
@@ -286,6 +302,22 @@
}
/** {@inheritDoc} */
+ protected void sendData(String destAddr, String scAddr, int destPort,
+ byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
+ scAddr, destAddr, destPort, data, (deliveryIntent != null));
+ sendSubmitPdu(pdu, sentIntent, deliveryIntent);
+ }
+
+ /** {@inheritDoc} */
+ protected void sendText(String destAddr, String scAddr, String text,
+ PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
+ scAddr, destAddr, text, (deliveryIntent != null), null);
+ sendSubmitPdu(pdu, sentIntent, deliveryIntent);
+ }
+
+ /** {@inheritDoc} */
protected void sendMultipartText(String destAddr, String scAddr,
ArrayList<String> parts, ArrayList<PendingIntent> sentIntents,
ArrayList<PendingIntent> deliveryIntents) {
@@ -329,16 +361,9 @@
}
}
- protected void sendSubmitPdu(SmsMessage.SubmitPdu submitPdu, PendingIntent sentIntent,
- PendingIntent deliveryIntent) {
- sendRawPdu(submitPdu.encodedScAddress, submitPdu.encodedMessage,
- sentIntent, deliveryIntent);
- }
-
- protected void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,
- PendingIntent deliveryIntent) {
- String inEcm = SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE);
- if (Boolean.parseBoolean(inEcm)) {
+ protected void sendSubmitPdu(SmsMessage.SubmitPdu pdu,
+ PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ if (SystemProperties.getBoolean(TelephonyProperties.PROPERTY_INECM_MODE, false)) {
if (sentIntent != null) {
try {
sentIntent.send(SmsManager.RESULT_ERROR_NO_SERVICE);
@@ -349,8 +374,7 @@
}
return;
}
-
- super.sendRawPdu(smsc, pdu, sentIntent, deliveryIntent);
+ sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
}
/** {@inheritDoc} */
@@ -401,15 +425,17 @@
private int resultToCause(int rc) {
switch (rc) {
- case Activity.RESULT_OK:
- case Intents.RESULT_SMS_HANDLED:
- // Cause code is ignored on success.
- return 0;
- case Intents.RESULT_SMS_OUT_OF_MEMORY:
- return CommandsInterface.CDMA_SMS_FAIL_CAUSE_RESOURCE_SHORTAGE;
- case Intents.RESULT_SMS_GENERIC_ERROR:
- default:
- return CommandsInterface.CDMA_SMS_FAIL_CAUSE_OTHER_TERMINAL_PROBLEM;
+ case Activity.RESULT_OK:
+ case Intents.RESULT_SMS_HANDLED:
+ // Cause code is ignored on success.
+ return 0;
+ case Intents.RESULT_SMS_OUT_OF_MEMORY:
+ return CommandsInterface.CDMA_SMS_FAIL_CAUSE_RESOURCE_SHORTAGE;
+ case Intents.RESULT_SMS_UNSUPPORTED:
+ return CommandsInterface.CDMA_SMS_FAIL_CAUSE_INVALID_TELESERVICE_ID;
+ case Intents.RESULT_SMS_GENERIC_ERROR:
+ default:
+ return CommandsInterface.CDMA_SMS_FAIL_CAUSE_OTHER_TERMINAL_PROBLEM;
}
}
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index b4de09b..46e360b 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -41,28 +41,19 @@
import android.util.Log;
import android.util.Config;
import android.util.TimeUtils;
-import java.util.Calendar;
import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.DataConnectionTracker;
-// pretty sure importing stuff from GSM is bad:
-import com.android.internal.telephony.gsm.MccTable;
-import com.android.internal.telephony.PhoneProxy;
+import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyEventLog;
import com.android.internal.telephony.TelephonyIntents;
-
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ALPHA;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISMANUAL;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISROAMING;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_NUMERIC;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
+import com.android.internal.telephony.TelephonyProperties;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
@@ -70,14 +61,14 @@
* {@hide}
*/
final class CdmaServiceStateTracker extends ServiceStateTracker {
+ static final String LOG_TAG = "CDMA";
- //***** Instance Variables
CDMAPhone phone;
CdmaCellLocation cellLoc;
CdmaCellLocation newCellLoc;
/**
- * The access technology currently in use: DATA_ACCESS_
+ * Values correspond to ServiceStateTracker.DATA_ACCESS_ definitions.
*/
private int networkType = 0;
private int newNetworkType = 0;
@@ -87,7 +78,9 @@
private boolean mIsInPrl;
private int mDefaultRoamingIndicator;
- // Initially we assume no data connection
+ /**
+ * Initially assume no data connection.
+ */
private int cdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
private int newCdmaDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE;
private int mRegistrationState = -1;
@@ -95,9 +88,11 @@
private RegistrantList cdmaDataConnectionDetachedRegistrants = new RegistrantList();
private RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList();
- // Sometimes we get the NITZ time before we know what country we are in.
- // Keep the time zone information from the NITZ string so we can fix
- // the time zone once know the country.
+ /**
+ * Sometimes we get the NITZ time before we know what country we
+ * are in. Keep the time zone information from the NITZ string so
+ * we can fix the time zone once know the country.
+ */
private boolean mNeedFixZone = false;
private int mZoneOffset;
private boolean mZoneDst;
@@ -107,20 +102,23 @@
long mSavedTime;
long mSavedAtTime;
- // We can't register for SIM_RECORDS_LOADED immediately because the
- // SIMRecords object may not be instantiated yet.
+ /**
+ * We can't register for SIM_RECORDS_LOADED immediately because the
+ * SIMRecords object may not be instantiated yet.
+ */
private boolean mNeedToRegForRuimLoaded = false;
- // Wake lock used while setting time of day.
+ /** Wake lock used while setting time of day. */
private PowerManager.WakeLock mWakeLock;
private static final String WAKELOCK_TAG = "ServiceStateTracker";
- // Keep track of SPN display rules, so we only broadcast intent if something changes.
+ /** Track of SPN display rules, so we only broadcast intent if something changes. */
private String curSpn = null;
- private String curPlmn = null; // it contains the name of the registered network in CDMA can
- // be the ONS or ERI text
private int curSpnRule = 0;
+ /** Contains the name of the registered network in CDMA (either ONS or ERI text). */
+ private String curPlmn = null;
+
private String mMdn;
private int mHomeSystemId[] = null;
private int mHomeNetworkId[] = null;
@@ -133,12 +131,9 @@
private boolean mPendingRadioPowerOffAfterDataOff = false;
- // Registration Denied Reason, General/Authentication Failure, used only for debugging purposes
+ /* Used only for debugging purposes. */
private String mRegistrationDeniedReason;
- //***** Constants
- static final String LOG_TAG = "CDMA";
-
private ContentResolver cr;
private String currentCarrier = null;
@@ -151,9 +146,6 @@
}
};
-
- //***** Constructors
-
public CdmaServiceStateTracker(CDMAPhone phone) {
super();
@@ -182,7 +174,7 @@
phone.registerForEriFileLoaded(this, EVENT_ERI_FILE_LOADED, null);
cm.registerForCdmaOtaProvision(this,EVENT_OTA_PROVISION_STATUS_CHANGE, null);
- // system setting property AIRPLANE_MODE_ON is set in Settings.
+ // System setting property AIRPLANE_MODE_ON is set in Settings.
int airplaneMode = Settings.System.getInt(
phone.getContext().getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0);
@@ -198,7 +190,7 @@
}
public void dispose() {
- //Unregister for all events
+ // Unregister for all events.
cm.unregisterForAvailable(this);
cm.unregisterForRadioStateChanged(this);
cm.unregisterForNetworkStateChanged(this);
@@ -236,8 +228,7 @@
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
- /*protected*/ void
- registerForCdmaDataConnectionAttached(Handler h, int what, Object obj) {
+ void registerForCdmaDataConnectionAttached(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj);
cdmaDataConnectionAttachedRegistrants.add(r);
@@ -245,6 +236,7 @@
r.notifyRegistrant();
}
}
+
void unregisterForCdmaDataConnectionAttached(Handler h) {
cdmaDataConnectionAttachedRegistrants.remove(h);
}
@@ -255,8 +247,7 @@
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
- /*protected*/ void
- registerForCdmaDataConnectionDetached(Handler h, int what, Object obj) {
+ void registerForCdmaDataConnectionDetached(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj);
cdmaDataConnectionDetachedRegistrants.add(r);
@@ -264,6 +255,7 @@
r.notifyRegistrant();
}
}
+
void unregisterForCdmaDataConnectionDetached(Handler h) {
cdmaDataConnectionDetachedRegistrants.remove(h);
}
@@ -287,7 +279,6 @@
cdmaForSubscriptionInfoReadyRegistrants.remove(h);
}
- //***** Called from CDMAPhone
public void
getLacAndCid(Message onComplete) {
cm.getRegistrationState(obtainMessage(
@@ -302,14 +293,11 @@
switch (msg.what) {
case EVENT_RADIO_AVAILABLE:
- //this is unnecessary
- //setPowerStateToDesired();
break;
case EVENT_RUIM_READY:
- // The RUIM is now ready i.e if it was locked
- // it has been unlocked. At this stage, the radio is already
- // powered on.
+ // The RUIM is now ready i.e if it was locked it has been
+ // unlocked. At this stage, the radio is already powered on.
isSubscriptionFromRuim = true;
if (mNeedToRegForRuimLoaded) {
phone.mRuimRecords.registerForRecordsLoaded(this,
@@ -320,10 +308,10 @@
cm.getCDMASubscription(obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION));
if (DBG) log("Receive EVENT_RUIM_READY and Send Request getCDMASubscription.");
- // restore the previous network selection.
+ // Restore the previous network selection.
pollState();
- // Signal strength polling stops when radio is off
+ // Signal strength polling stops when radio is off.
queueNextSignalStrengthPoll();
break;
@@ -334,13 +322,12 @@
// subscription info.
cm.getCDMASubscription( obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION));
pollState();
- // Signal strength polling stops when radio is off
+ // Signal strength polling stops when radio is off.
queueNextSignalStrengthPoll();
break;
case EVENT_RADIO_STATE_CHANGED:
- // This will do nothing in the radio not
- // available case
+ // This will do nothing in the 'radio not available' case.
setPowerStateToDesired();
pollState();
break;
@@ -351,10 +338,10 @@
case EVENT_GET_SIGNAL_STRENGTH:
// This callback is called when signal strength is polled
- // all by itself
+ // all by itself.
if (!(cm.getRadioState().isOn()) || (cm.getRadioState().isGsm())) {
- // Polling will continue when radio turns back on
+ // Polling will continue when radio turns back on.
return;
}
ar = (AsyncResult) msg.obj;
@@ -390,7 +377,7 @@
}
}
- // only update if cell location really changed
+ // Only update if cell location really changed.
if (cellLoc.getBaseStationId() != baseStationData[0]
|| cellLoc.getBaseStationLatitude() != baseStationData[1]
|| cellLoc.getBaseStationLongitude() != baseStationData[2]) {
@@ -456,6 +443,8 @@
if (!mIsMinInfoReady) {
mIsMinInfoReady = true;
}
+ phone.getIccCard().broadcastIccStateChangedIntent(IccCard.INTENT_VALUE_ICC_IMSI,
+ null);
} else {
Log.w(LOG_TAG,"error parsing cdmaSubscription params num="
+ cdmaSubscription.length);
@@ -479,13 +468,12 @@
break;
case EVENT_SIGNAL_STRENGTH_UPDATE:
- // This is a notification from
- // CommandsInterface.setOnSignalStrengthUpdate
+ // This is a notification from CommandsInterface.setOnSignalStrengthUpdate.
ar = (AsyncResult) msg.obj;
- // The radio is telling us about signal strength changes
- // we don't have to ask it
+ // The radio is telling us about signal strength changes,
+ // so we don't have to ask it.
dontPollSignalStrength = true;
onSignalStrengthResult(ar);
@@ -504,7 +492,7 @@
break;
case EVENT_ERI_FILE_LOADED:
- // Repoll the state once the ERI file has been loaded
+ // Repoll the state once the ERI file has been loaded.
if (DBG) log("[CdmaServiceStateTracker] ERI file has been loaded, repolling.");
pollState();
break;
@@ -627,7 +615,7 @@
int ints[];
String states[];
- // Ignore stale requests from last poll
+ // Ignore stale requests from last poll.
if (ar.userObj != pollingContext) return;
if (ar.exception != null) {
@@ -638,13 +626,13 @@
}
if (err == CommandException.Error.RADIO_NOT_AVAILABLE) {
- // Radio has crashed or turned off
+ // Radio has crashed or turned off.
cancelPollState();
return;
}
if (!cm.getRadioState().isOn()) {
- // Radio has crashed or turned off
+ // Radio has crashed or turned off.
cancelPollState();
return;
}
@@ -698,13 +686,15 @@
}
mRegistrationState = registrationState;
- // mCdmaRoaming is true when registration state is roaming and TSB58 roaming
- // indicator is not in the carrier-specified list of ERIs for home system
+ // When registration state is roaming and TSB58
+ // roaming indicator is not in the carrier-specified
+ // list of ERIs for home system, mCdmaRoaming is true.
mCdmaRoaming =
regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
newSS.setState (regCodeToServiceState(registrationState));
- this.newCdmaDataConnectionState = radioTechnologyToDataServiceState(radioTechnology);
+ this.newCdmaDataConnectionState =
+ radioTechnologyToDataServiceState(radioTechnology);
newSS.setRadioTechnology(radioTechnology);
newNetworkType = radioTechnology;
@@ -715,7 +705,7 @@
mDefaultRoamingIndicator = defaultRoamingIndicator;
- // values are -1 if not available
+ // Values are -1 if not available.
newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
baseStationLongitude, systemId, networkId);
@@ -737,8 +727,8 @@
if (opNames != null && opNames.length >= 3) {
if (cm.getRadioState().isNVReady()) {
- // In CDMA in case on NV the ss.mOperatorAlphaLong is set later with the
- // ERI text, so here it is ignored what is coming from the modem
+ // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
+ // ERI text, so here it is ignored what is coming from the modem.
newSS.setOperatorName(null, opNames[1], opNames[2]);
} else {
newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
@@ -803,9 +793,8 @@
}
}
-
- // NOTE: Some operator may require to override the mCdmaRoaming (set by the modem)
- // depending on the mRoamingIndicator.
+ // NOTE: Some operator may require overriding mCdmaRoaming
+ // (set by the modem), depending on the mRoamingIndicator.
if (DBG) {
log("Set CDMA Roaming Indicator to: " + newSS.getCdmaRoamingIndicator()
@@ -865,13 +854,13 @@
setSignalStrengthDefaultValues();
mGotCountryCode = false;
- //NOTE: pollStateDone() is not needed in this case
+ // NOTE: pollStateDone() is not needed in this case
break;
default:
- // Issue all poll-related commands at once
- // then count down the responses, which
- // are allowed to arrive out-of-order
+ // Issue all poll-related commands at once, then count
+ // down the responses which are allowed to arrive
+ // out-of-order.
pollingContext[0]++;
// RIL_REQUEST_OPERATOR is necessary for CDMA
@@ -1000,7 +989,7 @@
newSS.setStateOutOfService(); // clean slate for next time
if (hasNetworkTypeChanged) {
- phone.setSystemProperty(PROPERTY_DATA_NETWORK_TYPE,
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
networkTypeToString(networkType));
}
@@ -1027,14 +1016,14 @@
String operatorNumeric;
- phone.setSystemProperty(PROPERTY_OPERATOR_ALPHA,
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
ss.getOperatorAlphaLong());
operatorNumeric = ss.getOperatorNumeric();
- phone.setSystemProperty(PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
if (operatorNumeric == null) {
- phone.setSystemProperty(PROPERTY_OPERATOR_ISO_COUNTRY, "");
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
} else {
String isoCountryCode = "";
try{
@@ -1046,14 +1035,15 @@
Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
}
- phone.setSystemProperty(PROPERTY_OPERATOR_ISO_COUNTRY, isoCountryCode);
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY,
+ isoCountryCode);
mGotCountryCode = true;
if (mNeedFixZone) {
fixTimeZone(isoCountryCode);
}
}
- phone.setSystemProperty(PROPERTY_OPERATOR_ISROAMING,
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
ss.getRoaming() ? "true" : "false");
updateSpnDisplay();
@@ -1282,7 +1272,7 @@
*/
private
boolean isRoamingBetweenOperators(boolean cdmaRoaming, ServiceState s) {
- String spn = SystemProperties.get(PROPERTY_ICC_OPERATOR_ALPHA, "empty");
+ String spn = SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, "empty");
// NOTE: in case of RUIM we should completely ignore the ERI data file and
// mOperatorAlphaLong is set from RIL_REQUEST_OPERATOR response 0 (alpha ONS)
@@ -1366,7 +1356,7 @@
zone = TimeZone.getTimeZone( tzname );
}
- String iso = SystemProperties.get(PROPERTY_OPERATOR_ISO_COUNTRY);
+ String iso = SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY);
if (zone == null) {
@@ -1549,7 +1539,6 @@
* that could support voice and data simultaneously.
*/
boolean isConcurrentVoiceAndData() {
-
// Note: it needs to be confirmed which CDMA network types
// can support voice and data calls concurrently.
// For the time-being, the return value will be false.
@@ -1576,11 +1565,12 @@
/**
* Returns IMSI as MCC + MNC + MIN
*/
- /*package*/ String getImsi() {
+ String getImsi() {
// TODO(Moto): When RUIM is enabled, IMSI will come from RUIM
// not build-time props. Moto will provide implementation
// for RUIM-ready case later.
- String operatorNumeric = SystemProperties.get(PROPERTY_ICC_OPERATOR_NUMERIC, "");
+ String operatorNumeric = SystemProperties.get(
+ TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "");
if (!TextUtils.isEmpty(operatorNumeric) && getCdmaMin() != null) {
return (operatorNumeric + getCdmaMin());
diff --git a/telephony/java/com/android/internal/telephony/cdma/FeatureCode.java b/telephony/java/com/android/internal/telephony/cdma/FeatureCode.java
deleted file mode 100644
index 23a4ac7..0000000
--- a/telephony/java/com/android/internal/telephony/cdma/FeatureCode.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.telephony.cdma;
-
-import android.content.Context;
-import android.os.*;
-import android.util.Log;
-
-import com.android.internal.telephony.*;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- *
- * {@hide}
- *
- */
-public final class FeatureCode extends Handler implements MmiCode {
- static final String LOG_TAG = "CDMA";
-
- //***** Constants
-
- // Call Forwarding
- static final String FC_CF_ACTIVATE = "72";
- static final String FC_CF_DEACTIVATE = "73";
- static final String FC_CF_FORWARD_TO_NUMBER = "56";
-
- // Call Forwarding Busy Line
- static final String FC_CFBL_ACTIVATE = "90";
- static final String FC_CFBL_DEACTIVATE = "91";
- static final String FC_CFBL_FORWARD_TO_NUMBER = "40";
-
- // Call Forwarding Don't Answer
- static final String FC_CFDA_ACTIVATE = "92";
- static final String FC_CFDA_DEACTIVATE = "93";
- static final String FC_CFDA_FORWARD_TO_NUMBER = "42";
-
- // Cancel Call Waiting
- static final String FC_CCW = "70";
-
- // Usage Sensitive Three-way Calling
- static final String FC_3WC = "71";
-
- // Do Not Disturb
- static final String FC_DND_ACTIVATE = "78";
- static final String FC_DND_DEACTIVATE = "79";
-
- // Who Called Me?
- static final String FC_WHO = "51";
-
- // Rejection of Undesired Annoying Calls
- static final String FC_RUAC_ACTIVATE = "60";
- static final String FC_RUAC_DEACTIVATE = "80";
-
- // Calling Number Delivery
- // Calling Number Identification Presentation
- static final String FC_CNIP = "65";
- // Calling Number Identification Restriction
- static final String FC_CNIR = "85";
-
-
- //***** Event Constants
-
- static final int EVENT_SET_COMPLETE = 1;
- static final int EVENT_CDMA_FLASH_COMPLETED = 2;
-
-
- //***** Instance Variables
-
- CDMAPhone phone;
- Context context;
- String action; // '*' in CDMA
- String sc; // Service Code
- String poundString; // Entire Flash string
- String dialingNumber;
-
- /** Set to true in processCode, not at newFromDialString time */
-
- State state = State.PENDING;
- CharSequence message;
-
- //***** Class Variables
-
-
- // Flash Code Pattern
-
- static Pattern sPatternSuppService = Pattern.compile(
- "((\\*)(\\d{2,3})(#?)([^*#]*)?)(.*)");
-/* 1 2 3 4 5 6
-
- 1 = Full string up to and including #
- 2 = action
- 3 = service code
- 4 = separator
- 5 = dialing number
-*/
-
- static final int MATCH_GROUP_POUND_STRING = 1;
- static final int MATCH_GROUP_ACTION_STRING = 2;
- static final int MATCH_GROUP_SERVICE_CODE = 3;
- static final int MATCH_GROUP_DIALING_NUMBER = 5;
-
-
- //***** Public Class methods
-
- /**
- * Some dial strings in CDMA are defined to do non-call setup
- * things, such as set supplementary service settings (eg, call
- * forwarding). These are generally referred to as "Feature Codes".
- * We look to see if the dial string contains a valid Feature code (potentially
- * with a dial string at the end as well) and return info here.
- *
- * If the dial string contains no Feature code, we return an instance with
- * only "dialingNumber" set
- *
- * Please see also S.R0006-000-A v2.0 "Wireless Features Description"
- */
-
- static FeatureCode newFromDialString(String dialString, CDMAPhone phone) {
- Matcher m;
- FeatureCode ret = null;
-
- m = sPatternSuppService.matcher(dialString);
-
- // Is this formatted like a standard supplementary service code?
- if (m.matches()) {
- ret = new FeatureCode(phone);
- ret.poundString = makeEmptyNull(m.group(MATCH_GROUP_POUND_STRING));
- ret.action = makeEmptyNull(m.group(MATCH_GROUP_ACTION_STRING));
- ret.sc = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE));
- ret.dialingNumber = makeEmptyNull(m.group(MATCH_GROUP_DIALING_NUMBER));
- }
-
- return ret;
- }
-
- //***** Private Class methods
-
- /** make empty strings be null.
- * Java regexp returns empty strings for empty groups
- */
- private static String makeEmptyNull (String s) {
- if (s != null && s.length() == 0) return null;
-
- return s;
- }
-
- /** returns true of the string is empty or null */
- private static boolean isEmptyOrNull(CharSequence s) {
- return s == null || (s.length() == 0);
- }
-
- static boolean isServiceCodeCallForwarding(String sc) {
- return sc != null &&
- (sc.equals(FC_CF_ACTIVATE)
- || sc.equals(FC_CF_DEACTIVATE) || sc.equals(FC_CF_FORWARD_TO_NUMBER)
- || sc.equals(FC_CFBL_ACTIVATE) || sc.equals(FC_CFBL_DEACTIVATE)
- || sc.equals(FC_CFBL_FORWARD_TO_NUMBER) || sc.equals(FC_CFDA_ACTIVATE)
- || sc.equals(FC_CFDA_DEACTIVATE) || sc.equals(FC_CFDA_FORWARD_TO_NUMBER));
- }
-
- static boolean isServiceCodeCallWaiting(String sc) {
- return sc != null && sc.equals(FC_CCW);
- }
-
- static boolean isServiceCodeThreeWayCalling(String sc) {
- return sc != null && sc.equals(FC_3WC);
- }
-
- static boolean isServiceCodeAnnoyingCalls(String sc) {
- return sc != null &&
- (sc.equals(FC_RUAC_ACTIVATE)
- || sc.equals(FC_RUAC_DEACTIVATE));
- }
-
- static boolean isServiceCodeCallingNumberDelivery(String sc) {
- return sc != null &&
- (sc.equals(FC_CNIP)
- || sc.equals(FC_CNIR));
- }
-
- static boolean isServiceCodeDoNotDisturb(String sc) {
- return sc != null &&
- (sc.equals(FC_DND_ACTIVATE)
- || sc.equals(FC_DND_DEACTIVATE));
- }
-
-
- //***** Constructor
-
- FeatureCode (CDMAPhone phone) {
- super(phone.getHandler().getLooper());
- this.phone = phone;
- this.context = phone.getContext();
- }
-
-
- //***** MmiCode implementation
-
- public State getState() {
- return state;
- }
-
- public CharSequence getMessage() {
- return message;
- }
-
- // inherited javadoc suffices
- public void cancel() {
- //Not used here
- }
-
- public boolean isCancelable() {
- Log.e(LOG_TAG, "isCancelable: not used in CDMA");
- return false;
- }
-
- public boolean isUssdRequest() {
- Log.e(LOG_TAG, "isUssdRequest: not used in CDMA");
- return false;
- }
-
- /** Process a Flash Code...anything that isn't a dialing number */
- void processCode() {
- Log.d(LOG_TAG, "send feature code...");
- phone.mCM.sendCDMAFeatureCode(this.poundString, obtainMessage(EVENT_CDMA_FLASH_COMPLETED));
- }
-
- /** Called from CDMAPhone.handleMessage; not a Handler subclass */
- public void handleMessage (Message msg) {
- AsyncResult ar;
-
- switch (msg.what) {
- case EVENT_SET_COMPLETE:
- ar = (AsyncResult) (msg.obj);
- onSetComplete(ar);
- break;
- case EVENT_CDMA_FLASH_COMPLETED:
- ar = (AsyncResult) (msg.obj);
-
- if (ar.exception != null) {
- state = State.FAILED;
- message = context.getText(com.android.internal.R.string.fcError);
- } else {
- state = State.COMPLETE;
- message = context.getText(com.android.internal.R.string.fcComplete);
- }
- phone.onFeatureCodeDone(this);
- break;
- }
- }
-
-
- //***** Private instance methods
-
- private CharSequence getScString() {
- if (sc != null) {
- if (isServiceCodeCallForwarding(sc)) {
- return context.getText(com.android.internal.R.string.CfMmi);
- } else if (isServiceCodeCallWaiting(sc)) {
- return context.getText(com.android.internal.R.string.CwMmi);
- } else if (sc.equals(FC_CNIP)) {
- return context.getText(com.android.internal.R.string.CnipMmi);
- } else if (sc.equals(FC_CNIR)) {
- return context.getText(com.android.internal.R.string.CnirMmi);
- } else if (isServiceCodeThreeWayCalling(sc)) {
- return context.getText(com.android.internal.R.string.ThreeWCMmi);
- } else if (isServiceCodeAnnoyingCalls(sc)) {
- return context.getText(com.android.internal.R.string.RuacMmi);
- } else if (isServiceCodeCallingNumberDelivery(sc)) {
- return context.getText(com.android.internal.R.string.CndMmi);
- } else if (isServiceCodeDoNotDisturb(sc)) {
- return context.getText(com.android.internal.R.string.DndMmi);
- }
- }
-
- return "";
- }
-
- private void onSetComplete(AsyncResult ar){
- StringBuilder sb = new StringBuilder(getScString());
- sb.append("\n");
-
- if (ar.exception != null) {
- state = State.FAILED;
- sb.append(context.getText(com.android.internal.R.string.mmiError));
- } else {
- state = State.FAILED;
- sb.append(context.getText(com.android.internal.R.string.mmiError));
- }
-
- message = sb;
- phone.onFeatureCodeDone(this);
- }
-}
diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
index 7c74314..b9ece8b 100644
--- a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
+++ b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
@@ -28,7 +28,7 @@
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.telephony.cdma.RuimCard;
-import com.android.internal.telephony.gsm.MccTable;
+import com.android.internal.telephony.MccTable;
// can't be used since VoiceMailConstants is not public
//import com.android.internal.telephony.gsm.VoiceMailConstants;
@@ -47,7 +47,7 @@
private static final boolean DBG = true;
private boolean m_ota_commited=false;
- //***** Instance Variables
+ // ***** Instance Variables
private String mImsi;
private String mMyMobileNumber;
@@ -55,7 +55,7 @@
private String mPrlVersion;
- //***** Event Constants
+ // ***** Event Constants
private static final int EVENT_RUIM_READY = 1;
private static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 2;
@@ -109,7 +109,7 @@
@Override
protected void onRadioOffOrNotAvailable() {
countVoiceMessages = 0;
- mncLength = 0;
+ mncLength = UNINITIALIZED;
iccid = null;
adnCache.reset();
@@ -167,7 +167,7 @@
}
// TODO(Moto): mncLength is not set anywhere.
- if (mncLength != 0) {
+ if (mncLength != UNINITIALIZED && mncLength != UNKNOWN) {
// Length = length of MCC + length of MNC
// TODO: change spec name
// length of mcc = 3 (3GPP2 C.S0005 - Section 2.3)
diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
index 1597427..2c20784 100755
--- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -17,6 +17,7 @@
package com.android.internal.telephony.cdma;
import android.os.Parcel;
+import android.os.SystemProperties;
import android.text.format.Time;
import android.util.Config;
import android.util.Log;
@@ -25,6 +26,7 @@
import com.android.internal.telephony.IccUtils;
import com.android.internal.telephony.SmsHeader;
import com.android.internal.telephony.SmsMessageBase;
+import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.telephony.cdma.sms.BearerData;
import com.android.internal.telephony.cdma.sms.CdmaSmsAddress;
import com.android.internal.telephony.cdma.sms.SmsEnvelope;
@@ -38,7 +40,6 @@
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-import java.util.Random;
/**
* TODO(cleanup): these constants are disturbing... are they not just
@@ -78,14 +79,6 @@
*/
private int status;
- /** The next message ID for the BearerData. Shall be a random value on first use.
- * (See C.S0015-B, v2.0, 4.3.1.5)
- */
- private static int nextMessageId = 0;
-
- /** Specifies if this is the first SMS message submit */
- private static boolean firstSMS = true;
-
/** Specifies if a return of an acknowledgment is requested for send SMS */
private static final int RETURN_NO_ACK = 0;
private static final int RETURN_ACK = 1;
@@ -331,7 +324,7 @@
* address, if applicable, and the encoded message.
* Returns null on encode error.
*/
- public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, short destPort,
+ public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, int destPort,
byte[] data, boolean statusReportRequested) {
/**
@@ -605,18 +598,28 @@
}
/**
- * Set the nextMessageId to a random value between 0 and 65536
- * See C.S0015-B, v2.0, 4.3.1.5
+ * Calculate the next message id, starting at 0 and iteratively
+ * incrementing within the range 0..65535 remembering the state
+ * via a persistent system property. (See C.S0015-B, v2.0,
+ * 4.3.1.5)
*/
- private static void setNextMessageId() {
- // Message ID, modulo 65536
- if(firstSMS) {
- Random generator = new Random();
- nextMessageId = generator.nextInt(65536);
- firstSMS = false;
- } else {
- nextMessageId = ++nextMessageId & 0xFFFF;
+ private synchronized static int getNextMessageId() {
+ // The only (meaningful) way this code can be called is via
+ // binder-call into the Phone process. All other calls will
+ // assumedly not be as with UID radio, and hence will be
+ // unable to modify the system property. Synchronization has
+ // thus been added to this function conservatively -- if it
+ // can be conclusively reasoned to be unnecessary, it should
+ // be removed.
+ int msgId = SystemProperties.getInt(TelephonyProperties.PROPERTY_CDMA_MSG_ID, 0);
+ String nextMsgId = Integer.toString((msgId + 1) & 0xFFFF);
+ SystemProperties.set(TelephonyProperties.PROPERTY_CDMA_MSG_ID, nextMsgId);
+ if (DBG_SMS) {
+ Log.d(LOG_TAG, "next " + TelephonyProperties.PROPERTY_CDMA_MSG_ID + " = " + nextMsgId);
+ Log.d(LOG_TAG, "readback gets " +
+ SystemProperties.get(TelephonyProperties.PROPERTY_CDMA_MSG_ID));
}
+ return msgId;
}
/**
@@ -642,8 +645,7 @@
BearerData bearerData = new BearerData();
bearerData.messageType = BearerData.MESSAGE_TYPE_SUBMIT;
- if (userData != null) setNextMessageId();
- bearerData.messageId = nextMessageId;
+ bearerData.messageId = getNextMessageId();
bearerData.deliveryAckReq = statusReportRequested;
bearerData.userAckReq = false;
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java b/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
index 2770ddc..0ca3148 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java
@@ -37,6 +37,7 @@
import java.util.ArrayList;
import java.util.HashMap;
+import static android.telephony.SmsMessage.MessageClass;
final class GsmSMSDispatcher extends SMSDispatcher {
private static final String TAG = "GSM";
@@ -111,6 +112,12 @@
return Intents.RESULT_SMS_HANDLED;
}
+ if (!mStorageAvailable && (sms.getMessageClass() != MessageClass.CLASS_0)) {
+ // It's a storable message and there's no storage available. Bail.
+ // (See TS 23.038 for a description of class 0 messages.)
+ return Intents.RESULT_SMS_OUT_OF_MEMORY;
+ }
+
SmsHeader smsHeader = sms.getUserDataHeader();
// See if message is partial or port addressed.
if ((smsHeader == null) || (smsHeader.concatRef == null)) {
@@ -137,6 +144,22 @@
}
/** {@inheritDoc} */
+ protected void sendData(String destAddr, String scAddr, int destPort,
+ byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
+ scAddr, destAddr, destPort, data, (deliveryIntent != null));
+ sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
+ }
+
+ /** {@inheritDoc} */
+ protected void sendText(String destAddr, String scAddr, String text,
+ PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
+ scAddr, destAddr, text, (deliveryIntent != null));
+ sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
+ }
+
+ /** {@inheritDoc} */
protected void sendMultipartText(String destinationAddress, String scAddress,
ArrayList<String> parts, ArrayList<PendingIntent> sentIntents,
ArrayList<PendingIntent> deliveryIntents) {
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index e7406e2..65463e5 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -16,13 +16,6 @@
package com.android.internal.telephony.gsm;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ALPHA;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISROAMING;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_NUMERIC;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
@@ -56,10 +49,12 @@
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.DataConnectionTracker;
import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.ServiceStateTracker;
import com.android.internal.telephony.TelephonyEventLog;
import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.TelephonyProperties;
import java.util.Arrays;
import java.util.Calendar;
@@ -70,8 +65,9 @@
* {@hide}
*/
final class GsmServiceStateTracker extends ServiceStateTracker {
+ static final String LOG_TAG = "GSM";
+ static final boolean DBG = true;
- //***** Instance Variables
GSMPhone phone;
GsmCellLocation cellLoc;
GsmCellLocation newCellLoc;
@@ -82,13 +78,15 @@
private int newGPRSState = ServiceState.STATE_OUT_OF_SERVICE;
/**
- * The access technology currently in use: DATA_ACCESS_
+ * Values correspond to ServiceStateTracker.DATA_ACCESS_ definitions.
*/
private int networkType = 0;
private int newNetworkType = 0;
- /* gsm roaming status solely based on TS 27.007 7.2 CREG */
+
+ /** GSM roaming status solely based on TS 27.007 7.2 CREG. */
private boolean mGsmRoaming = false;
- /* data roaming status solely based on TS 27.007 10.1.19 CGREG */
+
+ /** Data roaming status solely based on TS 27.007 10.1.19 CGREG. */
private boolean mDataRoaming = false;
private boolean newDataRoaming = false;
@@ -97,9 +95,11 @@
private RegistrantList psRestrictEnabledRegistrants = new RegistrantList();
private RegistrantList psRestrictDisabledRegistrants = new RegistrantList();
- // Sometimes we get the NITZ time before we know what country we are in.
- // Keep the time zone information from the NITZ string so we can fix
- // the time zone once know the country.
+ /**
+ * Sometimes we get the NITZ time before we know what country we
+ * are in. Keep the time zone information from the NITZ string so
+ * we can fix the time zone once know the country.
+ */
private boolean mNeedFixZone = false;
private int mZoneOffset;
private boolean mZoneDst;
@@ -111,13 +111,16 @@
long mSavedTime;
long mSavedAtTime;
- // We can't register for SIM_RECORDS_LOADED immediately because the
- // SIMRecords object may not be instantiated yet.
+ /**
+ * We can't register for SIM_RECORDS_LOADED immediately because the
+ * SIMRecords object may not be instantiated yet.
+ */
private boolean mNeedToRegForSimLoaded;
- // Started the recheck process after finding gprs should registerd but not
+ /** Started the recheck process after finding gprs should registerd but not. */
private boolean mStartedGprsRegCheck = false;
- // Already sent the event-log for no gprs register
+
+ /** Already sent the event-log for no gprs register. */
private boolean mReportedGprsNoReg = false;
/**
@@ -125,34 +128,29 @@
*/
private Notification mNotification;
- // Wake lock used while setting time of day.
+ /** Wake lock used while setting time of day. */
private PowerManager.WakeLock mWakeLock;
private static final String WAKELOCK_TAG = "ServiceStateTracker";
- // Keep track of SPN display rules, so we only broadcast intent if something changes.
+ /** Keep track of SPN display rules, so we only broadcast intent if something changes. */
private String curSpn = null;
private String curPlmn = null;
private int curSpnRule = 0;
- //***** Constants
-
- static final boolean DBG = true;
- static final String LOG_TAG = "GSM";
-
- // waiting period before recheck gprs and voice registration
+ /** waiting period before recheck gprs and voice registration. */
static final int DEFAULT_GPRS_CHECK_PERIOD_MILLIS = 60 * 1000;
- // notification type
- static final int PS_ENABLED = 1001; // Access Control blocks data service
- static final int PS_DISABLED = 1002; // Access Control enables data service
- static final int CS_ENABLED = 1003; // Access Control blocks all voice/sms service
- static final int CS_DISABLED = 1004; // Access Control enables all voice/sms service
- static final int CS_NORMAL_ENABLED = 1005; // Access Control blocks normal voice/sms service
- static final int CS_EMERGENCY_ENABLED = 1006; // Access Control blocks emergency call service
+ /** Notification type. */
+ static final int PS_ENABLED = 1001; // Access Control blocks data service
+ static final int PS_DISABLED = 1002; // Access Control enables data service
+ static final int CS_ENABLED = 1003; // Access Control blocks all voice/sms service
+ static final int CS_DISABLED = 1004; // Access Control enables all voice/sms service
+ static final int CS_NORMAL_ENABLED = 1005; // Access Control blocks normal voice/sms service
+ static final int CS_EMERGENCY_ENABLED = 1006; // Access Control blocks emergency call service
- // notification id
- static final int PS_NOTIFICATION = 888; //id to update and cancel PS restricted
- static final int CS_NOTIFICATION = 999; //id to update and cancel CS restricted
+ /** Notification id. */
+ static final int PS_NOTIFICATION = 888; // Id to update and cancel PS restricted
+ static final int CS_NOTIFICATION = 999; // Id to update and cancel CS restricted
static final int MAX_NUM_DATA_STATE_READS = 15;
@@ -164,9 +162,6 @@
}
};
-
- //***** Constructors
-
public GsmServiceStateTracker(GSMPhone phone) {
super();
@@ -207,7 +202,7 @@
}
public void dispose() {
- //Unregister for all events
+ // Unregister for all events.
cm.unregisterForAvailable(this);
cm.unregisterForRadioStateChanged(this);
cm.unregisterForNetworkStateChanged(this);
@@ -230,7 +225,7 @@
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
- /*protected*/ void registerForGprsAttached(Handler h, int what, Object obj) {
+ void registerForGprsAttached(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj);
gprsAttachedRegistrants.add(r);
@@ -239,11 +234,11 @@
}
}
- /*protected*/ void unregisterForGprsAttached(Handler h) {
+ void unregisterForGprsAttached(Handler h) {
gprsAttachedRegistrants.remove(h);
}
- /*protected*/ void registerForNetworkAttach(Handler h, int what, Object obj) {
+ void registerForNetworkAttach(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj);
networkAttachedRegistrants.add(r);
@@ -252,16 +247,17 @@
}
}
- /*protected*/ void unregisterForNetworkAttach(Handler h) {
+ void unregisterForNetworkAttach(Handler h) {
networkAttachedRegistrants.remove(h);
}
+
/**
* Registration point for transition into GPRS detached.
* @param h handler to notify
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
- /*protected*/ void registerForGprsDetached(Handler h, int what, Object obj) {
+ void registerForGprsDetached(Handler h, int what, Object obj) {
Registrant r = new Registrant(h, what, obj);
gprsDetachedRegistrants.add(r);
@@ -270,7 +266,7 @@
}
}
- /*protected*/ void unregisterForGprsDetached(Handler h) {
+ void unregisterForGprsDetached(Handler h) {
gprsDetachedRegistrants.remove(h);
}
@@ -280,7 +276,7 @@
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
- /*protected*/ void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
+ void registerForPsRestrictedEnabled(Handler h, int what, Object obj) {
Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedEnabled ");
Registrant r = new Registrant(h, what, obj);
psRestrictEnabledRegistrants.add(r);
@@ -290,7 +286,7 @@
}
}
- /*protected*/ void unregisterForPsRestrictedEnabled(Handler h) {
+ void unregisterForPsRestrictedEnabled(Handler h) {
psRestrictEnabledRegistrants.remove(h);
}
@@ -300,7 +296,7 @@
* @param what what code of message when delivered
* @param obj placed in Message.obj
*/
- /*protected*/ void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
+ void registerForPsRestrictedDisabled(Handler h, int what, Object obj) {
Log.d(LOG_TAG, "[DSAC DEB] " + "registerForPsRestrictedDisabled ");
Registrant r = new Registrant(h, what, obj);
psRestrictDisabledRegistrants.add(r);
@@ -310,25 +306,20 @@
}
}
- /*protected*/ void unregisterForPsRestrictedDisabled(Handler h) {
+ void unregisterForPsRestrictedDisabled(Handler h) {
psRestrictDisabledRegistrants.remove(h);
}
- /*protected*/ boolean getDataRoaming() {
+ boolean getDataRoaming() {
return mDataRoaming;
}
- //***** Called from GSMPhone
- public void
- getLacAndCid(Message onComplete) {
+ public void getLacAndCid(Message onComplete) {
cm.getRegistrationState(obtainMessage(
EVENT_GET_LOC_DONE, onComplete));
}
-
- //***** Overridden from ServiceStateTracker
- public void
- handleMessage (Message msg) {
+ public void handleMessage (Message msg) {
AsyncResult ar;
int[] ints;
String[] strings;
@@ -529,10 +520,7 @@
}
}
- //***** Private Instance Methods
-
- protected void setPowerStateToDesired()
- {
+ protected void setPowerStateToDesired() {
// If we want it on and it's off, turn it on
if (mDesiredPowerState
&& cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
@@ -593,9 +581,7 @@
/**
* Handle the result of one of the pollState()-related requests
*/
-
- protected void
- handlePollStateResult (int what, AsyncResult ar) {
+ protected void handlePollStateResult (int what, AsyncResult ar) {
int ints[];
String states[];
@@ -726,9 +712,7 @@
* and start over again if the radio notifies us that some
* event has changed
*/
-
- private void
- pollState() {
+ private void pollState() {
pollingContext = new int[1];
pollingContext[0] = 0;
@@ -828,8 +812,7 @@
return ret;
}
- private void
- pollStateDone() {
+ private void pollStateDone() {
if (DBG) {
Log.d(LOG_TAG, "Poll ServiceState done: " +
" oldSS=[" + ss + "] newSS=[" + newSS +
@@ -882,7 +865,7 @@
newSS.setStateOutOfService(); // clean slate for next time
if (hasNetworkTypeChanged) {
- phone.setSystemProperty(PROPERTY_DATA_NETWORK_TYPE,
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
networkTypeToString(networkType));
}
@@ -895,14 +878,14 @@
if (hasChanged) {
String operatorNumeric;
- phone.setSystemProperty(PROPERTY_OPERATOR_ALPHA,
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
ss.getOperatorAlphaLong());
operatorNumeric = ss.getOperatorNumeric();
- phone.setSystemProperty(PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
if (operatorNumeric == null) {
- phone.setSystemProperty(PROPERTY_OPERATOR_ISO_COUNTRY, "");
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
} else {
String iso = "";
try{
@@ -914,7 +897,7 @@
Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
}
- phone.setSystemProperty(PROPERTY_OPERATOR_ISO_COUNTRY, iso);
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, iso);
mGotCountryCode = true;
if (mNeedFixZone) {
@@ -957,7 +940,7 @@
}
}
- phone.setSystemProperty(PROPERTY_OPERATOR_ISROAMING,
+ phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
ss.getRoaming() ? "true" : "false");
updateSpnDisplay();
@@ -1052,8 +1035,7 @@
return guess;
}
- private void
- queueNextSignalStrengthPoll() {
+ private void queueNextSignalStrengthPoll() {
if (dontPollSignalStrength || (cm.getRadioState().isCdma())) {
// The radio is telling us about signal strength changes
// we don't have to ask it
@@ -1075,8 +1057,7 @@
* send signal-strength-changed notification if changed
* Called both for solicited and unsolicited signal stength updates
*/
- private void
- onSignalStrengthResult(AsyncResult ar) {
+ private void onSignalStrengthResult(AsyncResult ar) {
SignalStrength oldSignalStrength = mSignalStrength;
int rssi = 99;
@@ -1117,8 +1098,7 @@
*
* @param ar an int value of RIL_RESTRICTED_STATE_*
*/
- private void onRestrictedStateChanged(AsyncResult ar)
- {
+ private void onRestrictedStateChanged(AsyncResult ar) {
Log.d(LOG_TAG, "[DSAC DEB] " + "onRestrictedStateChanged");
RestrictedState newRs = new RestrictedState();
@@ -1207,8 +1187,7 @@
}
/** code is registration state 0-5 from TS 27.007 7.2 */
- private int
- regCodeToServiceState(int code) {
+ private int regCodeToServiceState(int code) {
switch (code) {
case 0:
case 2: // 2 is "searching"
@@ -1234,8 +1213,7 @@
* code is registration state 0-5 from TS 27.007 7.2
* returns true if registered roam, false otherwise
*/
- private boolean
- regCodeIsRoaming (int code) {
+ private boolean regCodeIsRoaming (int code) {
// 5 is "in service -- roam"
return 5 == code;
}
@@ -1247,9 +1225,8 @@
* @param s ServiceState hold current ons
* @return true for roaming state set
*/
- private
- boolean isRoamingBetweenOperators(boolean gsmRoaming, ServiceState s) {
- String spn = SystemProperties.get(PROPERTY_ICC_OPERATOR_ALPHA, "empty");
+ private boolean isRoamingBetweenOperators(boolean gsmRoaming, ServiceState s) {
+ String spn = SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, "empty");
String onsl = s.getOperatorAlphaLong();
String onss = s.getOperatorAlphaShort();
@@ -1257,7 +1234,8 @@
boolean equalsOnsl = onsl != null && spn.equals(onsl);
boolean equalsOnss = onss != null && spn.equals(onss);
- String simNumeric = SystemProperties.get(PROPERTY_ICC_OPERATOR_NUMERIC, "");
+ String simNumeric = SystemProperties.get(
+ TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "");
String operatorNumeric = s.getOperatorNumeric();
boolean equalsMcc = true;
@@ -1270,8 +1248,7 @@
return gsmRoaming && !(equalsMcc && (equalsOnsl || equalsOnss));
}
- private static
- int twoDigitsAt(String s, int offset) {
+ private static int twoDigitsAt(String s, int offset) {
int a, b;
a = Character.digit(s.charAt(offset), 10);
@@ -1289,7 +1266,7 @@
* @return The current GPRS state. IN_SERVICE is the same as "attached"
* and OUT_OF_SERVICE is the same as detached.
*/
- /*package*/ int getCurrentGprsState() {
+ int getCurrentGprsState() {
return gprsState;
}
@@ -1337,10 +1314,7 @@
/**
* nitzReceiveTime is time_t that the NITZ time was posted
*/
-
- private
- void setTimeFromNITZString (String nitz, long nitzReceiveTime)
- {
+ private void setTimeFromNITZString (String nitz, long nitzReceiveTime) {
// "yy/mm/dd,hh:mm:ss(+/-)tz"
// tz is in number of quarter-hours
@@ -1404,7 +1378,7 @@
zone = TimeZone.getTimeZone( tzname );
}
- String iso = SystemProperties.get(PROPERTY_OPERATOR_ISO_COUNTRY);
+ String iso = SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY);
if (zone == null) {
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java b/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java
index a08cdde..206e62f 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java
@@ -19,15 +19,18 @@
import android.os.Message;
import android.util.Log;
+import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.IccCardApplication;
import com.android.internal.telephony.IccConstants;
import com.android.internal.telephony.IccFileHandler;
+import com.android.internal.telephony.Phone;
/**
* {@hide}
*/
public final class SIMFileHandler extends IccFileHandler implements IccConstants {
static final String LOG_TAG = "GSM";
-
+ private Phone mPhone;
//***** Instance Variables
@@ -35,6 +38,7 @@
SIMFileHandler(GSMPhone phone) {
super(phone);
+ mPhone = phone;
}
public void dispose() {
@@ -53,7 +57,6 @@
}
protected String getEFPath(int efid) {
- // TODO(): Make changes when USIM is supported
// TODO(): DF_GSM can be 7F20 or 7F21 to handle backward compatibility.
// Implement this after discussion with OEMs.
switch(efid) {
@@ -79,8 +82,23 @@
case EF_SPN_SHORT_CPHS:
case EF_INFO_CPHS:
return MF_SIM + DF_GSM;
+
+ case EF_PBR:
+ // we only support global phonebook.
+ return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
}
- return getCommonIccEFPath(efid);
+ String path = getCommonIccEFPath(efid);
+ if (path == null) {
+ // The EFids in USIM phone book entries are decided by the card manufacturer.
+ // So if we don't match any of the cases above and if its a USIM return
+ // the phone book path.
+ IccCard card = phone.getIccCard();
+ if (card != null && card.isApplicationOnIcc(IccCardApplication.AppType.APPTYPE_USIM)) {
+ return MF_SIM + DF_TELECOM + DF_PHONEBOOK;
+ }
+ Log.e(LOG_TAG, "Error: EF Path being returned in null");
+ }
+ return path;
}
protected void logd(String msg) {
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
index 4272faa..d711a80 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
@@ -19,13 +19,10 @@
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
-import android.app.AlarmManager;
import android.content.Context;
-import android.net.wifi.WifiManager;
import android.os.AsyncResult;
import android.os.Message;
import android.os.SystemProperties;
-import android.provider.Settings;
import android.util.Log;
import com.android.internal.telephony.AdnRecord;
@@ -37,6 +34,7 @@
import com.android.internal.telephony.IccUtils;
import com.android.internal.telephony.IccVmFixedException;
import com.android.internal.telephony.IccVmNotSupportedException;
+import com.android.internal.telephony.MccTable;
import java.util.ArrayList;
@@ -51,14 +49,14 @@
private static final boolean DBG = true;
- //***** Instance Variables
+ // ***** Instance Variables
VoiceMailConstants mVmConfig;
SpnOverride mSpnOverride;
- //***** Cached SIM State; cleared on channel close
+ // ***** Cached SIM State; cleared on channel close
String imsi;
boolean callForwardingEnabled;
@@ -88,7 +86,7 @@
String pnnHomeName = null;
- //***** Constants
+ // ***** Constants
// Bitmasks for SPN display rules.
static final int SPN_RULE_SHOW_SPN = 0x01;
@@ -113,7 +111,7 @@
private static final int CPHS_SST_MBN_MASK = 0x30;
private static final int CPHS_SST_MBN_ENABLED = 0x30;
- //***** Event Constants
+ // ***** Event Constants
private static final int EVENT_SIM_READY = 1;
private static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 2;
@@ -143,9 +141,7 @@
private static final int EVENT_SIM_REFRESH = 31;
private static final int EVENT_GET_CFIS_DONE = 32;
- private static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
-
- //***** Constructor
+ // ***** Constructor
SIMRecords(GSMPhone p) {
super(p);
@@ -188,7 +184,7 @@
msisdn = null;
voiceMailNum = null;
countVoiceMessages = 0;
- mncLength = 0;
+ mncLength = UNINITIALIZED;
iccid = null;
// -1 means no EF_SPN found; treat accordingly.
spnDisplayCondition = -1;
@@ -453,79 +449,16 @@
* provided the SIM card. Returns null of SIM is not yet ready
*/
String getSIMOperatorNumeric() {
- if (imsi == null) {
+ if (imsi == null || mncLength == UNINITIALIZED || mncLength == UNKNOWN) {
return null;
}
- if (mncLength != 0) {
- // Length = length of MCC + length of MNC
- // length of mcc = 3 (TS 23.003 Section 2.2)
- return imsi.substring(0, 3 + mncLength);
- }
-
- // Guess the MNC length based on the MCC if we don't
- // have a valid value in ef[ad]
-
- int mcc;
-
- mcc = Integer.parseInt(imsi.substring(0,3));
-
- return imsi.substring(0, 3 + MccTable.smallestDigitsMccForMnc(mcc));
+ // Length = length of MCC + length of MNC
+ // length of mcc = 3 (TS 23.003 Section 2.2)
+ return imsi.substring(0, 3 + mncLength);
}
- /**
- * If the timezone is not already set, set it based on the MCC of the SIM.
- * @param mcc Mobile Country Code of the SIM
- */
- private void setTimezoneFromMccIfNeeded(int mcc) {
- String timezone = SystemProperties.get(TIMEZONE_PROPERTY);
- if (timezone == null || timezone.length() == 0) {
- String zoneId = MccTable.defaultTimeZoneForMcc(mcc);
-
- if (zoneId != null && zoneId.length() > 0) {
- // Set time zone based on MCC
- AlarmManager alarm =
- (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE);
- alarm.setTimeZone(zoneId);
- }
- }
- }
-
- /**
- * If the locale is not already set, set it based on the MCC of the SIM.
- * @param mcc Mobile Country Code of the SIM
- */
- private void setLocaleFromMccIfNeeded(int mcc) {
- String language = MccTable.defaultLanguageForMcc(mcc);
- String country = MccTable.countryCodeForMcc(mcc);
-
- phone.setSystemLocale(language, country);
- }
-
- /**
- * If the number of allowed wifi channels has not been set, set it based on
- * the MCC of the SIM.
- * @param mcc Mobile Country Code of the SIM
- */
- private void setWifiChannelsFromMccIfNeeded(int mcc) {
- int wifiChannels = MccTable.wifiChannelsForMcc(mcc);
-
- if (wifiChannels != 0) {
- Context context = phone.getContext();
- // only set to this default if the user hasn't manually set it
- try {
- Settings.Secure.getInt(context.getContentResolver(),
- Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS);
- } catch (Settings.SettingNotFoundException e) {
- WifiManager wM = (WifiManager)
- context.getSystemService(Context.WIFI_SERVICE);
- // don't persist
- wM.setNumAllowedChannels(wifiChannels, false);
- }
- }
- }
-
- //***** Overridden from Handler
+ // ***** Overridden from Handler
public void handleMessage(Message msg) {
AsyncResult ar;
AdnRecord adn;
@@ -564,14 +497,25 @@
}
Log.d(LOG_TAG, "IMSI: " + imsi.substring(0, 6) + "xxxxxxxxx");
- ((GSMPhone) phone).mSimCard.updateImsiConfiguration(imsi);
+
+ if (mncLength == UNKNOWN) {
+ // the SIM has told us all it knows, but it didn't know the mnc length.
+ // guess using the mcc
+ try {
+ int mcc = Integer.parseInt(imsi.substring(0,3));
+ mncLength = MccTable.smallestDigitsMccForMnc(mcc);
+ } catch (NumberFormatException e) {
+ mncLength = UNKNOWN;
+ Log.e(LOG_TAG, "SIMRecords: Corrupt IMSI!");
+ }
+ }
+
+ if (mncLength != UNKNOWN && mncLength != UNINITIALIZED) {
+ // finally have both the imsi and the mncLength and can parse the imsi properly
+ MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength));
+ }
((GSMPhone) phone).mSimCard.broadcastIccStateChangedIntent(
SimCard.INTENT_VALUE_ICC_IMSI, null);
-
- int mcc = Integer.parseInt(imsi.substring(0, 3));
- setTimezoneFromMccIfNeeded(mcc);
- setLocaleFromMccIfNeeded(mcc);
- setWifiChannelsFromMccIfNeeded(mcc);
break;
case EVENT_GET_MBI_DONE:
@@ -769,39 +713,58 @@
case EVENT_GET_AD_DONE:
- isRecordLoadResponse = true;
+ try {
+ isRecordLoadResponse = true;
- ar = (AsyncResult)msg.obj;
- data = (byte[])ar.result;
+ ar = (AsyncResult)msg.obj;
+ data = (byte[])ar.result;
- if (ar.exception != null) {
- break;
+ if (ar.exception != null) {
+ break;
+ }
+
+ Log.d(LOG_TAG, "EF_AD: " +
+ IccUtils.bytesToHexString(data));
+
+ if (data.length < 3) {
+ Log.d(LOG_TAG, "SIMRecords: Corrupt AD data on SIM");
+ break;
+ }
+
+ if (data.length == 3) {
+ Log.d(LOG_TAG, "SIMRecords: MNC length not present in EF_AD");
+ break;
+ }
+
+ mncLength = (int)data[3] & 0xf;
+
+ if (mncLength == 0xf) {
+ mncLength = UNKNOWN;
+ }
+ } finally {
+ if (mncLength == UNKNOWN || mncLength == UNINITIALIZED) {
+ if (imsi != null) {
+ try {
+ int mcc = Integer.parseInt(imsi.substring(0,3));
+
+ mncLength = MccTable.smallestDigitsMccForMnc(mcc);
+ } catch (NumberFormatException e) {
+ mncLength = UNKNOWN;
+ Log.e(LOG_TAG, "SIMRecords: Corrupt IMSI!");
+ }
+ } else {
+ // Indicate we got this info, but it didn't contain the length.
+ mncLength = UNKNOWN;
+
+ Log.d(LOG_TAG, "SIMRecords: MNC length not present in EF_AD");
+ }
+ }
+ if (imsi != null && mncLength != UNKNOWN) {
+ // finally have both imsi and the length of the mnc and can parse
+ // the imsi properly
+ MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength));
+ }
}
-
- Log.d(LOG_TAG, "EF_AD: " +
- IccUtils.bytesToHexString(data));
-
- if (data.length < 3) {
- Log.d(LOG_TAG, "SIMRecords: Corrupt AD data on SIM");
- break;
- }
-
- if (data.length == 3) {
- Log.d(LOG_TAG, "SIMRecords: MNC length not present in EF_AD");
- break;
- }
-
- mncLength = (int)data[3] & 0xf;
-
- if (mncLength == 0xf) {
- // Resetting mncLength to 0 to indicate that it is not
- // initialised
- mncLength = 0;
-
- Log.d(LOG_TAG, "SIMRecords: MNC length not present in EF_AD");
- break;
- }
-
break;
case EVENT_GET_SPN_DONE:
diff --git a/telephony/java/com/android/internal/telephony/gsm/SimCard.java b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
index 6c56682..835cb29 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SimCard.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
@@ -16,9 +16,6 @@
package com.android.internal.telephony.gsm;
-import android.app.ActivityManagerNative;
-import android.content.res.Configuration;
-import android.os.RemoteException;
import android.util.Log;
import com.android.internal.telephony.IccCard;
@@ -50,20 +47,4 @@
return ((GSMPhone)mPhone).mSIMRecords.getServiceProviderName();
}
- public void updateImsiConfiguration(String imsi) {
- if (imsi.length() >= 6) {
- Configuration config = new Configuration();
- config.mcc = ((imsi.charAt(0)-'0')*100)
- + ((imsi.charAt(1)-'0')*10)
- + (imsi.charAt(2)-'0');
- config.mnc = ((imsi.charAt(3)-'0')*100)
- + ((imsi.charAt(4)-'0')*10)
- + (imsi.charAt(5)-'0');
- try {
- ActivityManagerNative.getDefault().updateConfiguration(config);
- } catch (RemoteException e) {
- Log.e(mLogTag, "[SimCard] Remote Exception when updating imsi configuration");
- }
- }
- }
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/SimTlv.java b/telephony/java/com/android/internal/telephony/gsm/SimTlv.java
index 30543c7..497cf5f 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SimTlv.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SimTlv.java
@@ -47,7 +47,6 @@
public boolean nextObject() {
if (!hasValidTlvObject) return false;
-
curOffset = curDataOffset + curDataLength;
hasValidTlvObject = parseCurrentTlvObject();
return hasValidTlvObject;
@@ -88,11 +87,12 @@
private boolean parseCurrentTlvObject() {
// 0x00 and 0xff are invalid tag values
- if (record[curOffset] == 0 || (record[curOffset] & 0xff) == 0xff) {
- return false;
- }
try {
+ if (record[curOffset] == 0 || (record[curOffset] & 0xff) == 0xff) {
+ return false;
+ }
+
if ((record[curOffset + 1] & 0xff) < 0x80) {
// one byte length 0 - 0x7f
curDataLength = record[curOffset + 1] & 0xff;
diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
index 93721ff..569cf25 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
@@ -337,7 +337,7 @@
* Returns null on encode error.
*/
public static SubmitPdu getSubmitPdu(String scAddress,
- String destinationAddress, short destinationPort, byte[] data,
+ String destinationAddress, int destinationPort, byte[] data,
boolean statusReportRequested) {
SmsHeader.PortAddrs portAddrs = new SmsHeader.PortAddrs();
diff --git a/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java b/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java
new file mode 100644
index 0000000..d27f240
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony.gsm;
+
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+import com.android.internal.telephony.AdnRecord;
+import com.android.internal.telephony.AdnRecordCache;
+import com.android.internal.telephony.IccConstants;
+import com.android.internal.telephony.IccUtils;
+import com.android.internal.telephony.PhoneBase;
+
+import org.apache.harmony.luni.lang.reflect.ListOfTypes;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class implements reading and parsing USIM records.
+ * Refer to Spec 3GPP TS 31.102 for more details.
+ *
+ * {@hide}
+ */
+public class UsimPhoneBookManager extends Handler implements IccConstants {
+ private static final String LOG_TAG = "GSM";
+ private static final boolean DBG = true;
+ private PbrFile mPbrFile;
+ private Boolean mIsPbrPresent;
+ private PhoneBase mPhone;
+ private AdnRecordCache mAdnCache;
+ private Object mLock = new Object();
+ private ArrayList<AdnRecord> mPhoneBookRecords;
+ private boolean mEmailPresentInIap = false;
+ private int mEmailTagNumberInIap = 0;
+ private ArrayList<byte[]> mIapFileRecord;
+ private ArrayList<byte[]> mEmailFileRecord;
+ private Map<Integer, ArrayList<String>> mEmailsForAdnRec;
+
+ private static final int EVENT_PBR_LOAD_DONE = 1;
+ private static final int EVENT_USIM_ADN_LOAD_DONE = 2;
+ private static final int EVENT_IAP_LOAD_DONE = 3;
+ private static final int EVENT_EMAIL_LOAD_DONE = 4;
+
+ private static final int USIM_TYPE1_TAG = 0xA8;
+ private static final int USIM_TYPE2_TAG = 0xA9;
+ private static final int USIM_TYPE3_TAG = 0xAA;
+ private static final int USIM_EFADN_TAG = 0xC0;
+ private static final int USIM_EFIAP_TAG = 0xC1;
+ private static final int USIM_EFEXT1_TAG = 0xC2;
+ private static final int USIM_EFSNE_TAG = 0xC3;
+ private static final int USIM_EFANR_TAG = 0xC4;
+ private static final int USIM_EFPBC_TAG = 0xC5;
+ private static final int USIM_EFGRP_TAG = 0xC6;
+ private static final int USIM_EFAAS_TAG = 0xC7;
+ private static final int USIM_EFGSD_TAG = 0xC8;
+ private static final int USIM_EFUID_TAG = 0xC9;
+ private static final int USIM_EFEMAIL_TAG = 0xCA;
+ private static final int USIM_EFCCP1_TAG = 0xCB;
+
+ public UsimPhoneBookManager(PhoneBase phone, AdnRecordCache cache) {
+ mPhone = phone;
+ mPhoneBookRecords = new ArrayList<AdnRecord>();
+ mPbrFile = null;
+ // We assume its present, after the first read this is updated.
+ // So we don't have to read from UICC if its not present on subsequent reads.
+ mIsPbrPresent = true;
+ mAdnCache = cache;
+ }
+
+ public void reset() {
+ mPhoneBookRecords.clear();
+ mIapFileRecord = null;
+ mEmailFileRecord = null;
+ mPbrFile = null;
+ mIsPbrPresent = true;
+ }
+
+ public ArrayList<AdnRecord> loadEfFilesFromUsim() {
+ synchronized (mLock) {
+ if (!mPhoneBookRecords.isEmpty()) return mPhoneBookRecords;
+ if (!mIsPbrPresent) return null;
+
+ // Check if the PBR file is present in the cache, if not read it
+ // from the USIM.
+ if (mPbrFile == null) {
+ readPbrFileAndWait();
+ }
+
+ if (mPbrFile == null) return null;
+
+ int numRecs = mPbrFile.mFileIds.size();
+ for (int i = 0; i < numRecs; i++) {
+ readAdnFileAndWait(i);
+ readEmailFileAndWait(i);
+ }
+ // All EF files are loaded, post the response.
+ }
+ return mPhoneBookRecords;
+ }
+
+ private void readPbrFileAndWait() {
+ mPhone.getIccFileHandler().loadEFLinearFixedAll(EF_PBR, obtainMessage(EVENT_PBR_LOAD_DONE));
+ try {
+ mLock.wait();
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Interrupted Exception in readAdnFileAndWait");
+ }
+ }
+
+ private void readEmailFileAndWait(int recNum) {
+ Map <Integer,Integer> fileIds;
+ fileIds = mPbrFile.mFileIds.get(recNum);
+ if (fileIds == null) return;
+
+ if (fileIds.containsKey(USIM_EFEMAIL_TAG)) {
+ int efid = fileIds.get(USIM_EFEMAIL_TAG);
+ // Check if the EFEmail is a Type 1 file or a type 2 file.
+ // If mEmailPresentInIap is true, its a type 2 file.
+ // So we read the IAP file and then read the email records.
+ // instead of reading directly.
+ if (mEmailPresentInIap) {
+ readIapFileAndWait(fileIds.get(USIM_EFIAP_TAG));
+ if (mIapFileRecord == null) {
+ Log.e(LOG_TAG, "Error: IAP file is empty");
+ return;
+ }
+ }
+ // Read the EFEmail file.
+ mPhone.getIccFileHandler().loadEFLinearFixedAll(fileIds.get(USIM_EFEMAIL_TAG),
+ obtainMessage(EVENT_EMAIL_LOAD_DONE));
+ try {
+ mLock.wait();
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Interrupted Exception in readEmailFileAndWait");
+ }
+
+ if (mEmailFileRecord == null) {
+ Log.e(LOG_TAG, "Error: Email file is empty");
+ return;
+ }
+ updatePhoneAdnRecord();
+ }
+
+ }
+
+ private void readIapFileAndWait(int efid) {
+ mPhone.getIccFileHandler().loadEFLinearFixedAll(efid, obtainMessage(EVENT_IAP_LOAD_DONE));
+ try {
+ mLock.wait();
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Interrupted Exception in readIapFileAndWait");
+ }
+ }
+
+ private void updatePhoneAdnRecord() {
+ if (mEmailFileRecord == null) return;
+ int numAdnRecs = mPhoneBookRecords.size();
+ if (mIapFileRecord != null) {
+ // The number of records in the IAP file is same as the number of records in ADN file.
+ // The order of the pointers in an EFIAP shall be the same as the order of file IDs
+ // that appear in the TLV object indicated by Tag 'A9' in the reference file record.
+ // i.e value of mEmailTagNumberInIap
+
+ for (int i = 0; i < numAdnRecs; i++) {
+ byte[] record = null;
+ try {
+ record = mIapFileRecord.get(i);
+ } catch (IndexOutOfBoundsException e) {
+ Log.e(LOG_TAG, "Error: Improper ICC card: No IAP record for ADN, continuing");
+ break;
+ }
+ int recNum = record[mEmailTagNumberInIap];
+
+ if (recNum != -1) {
+ String[] emails = new String[1];
+ // SIM record numbers are 1 based
+ emails[0] = readEmailRecord(recNum - 1);
+ AdnRecord rec = mPhoneBookRecords.get(i);
+ if (rec != null) {
+ rec.setEmails(emails);
+ } else {
+ // might be a record with only email
+ rec = new AdnRecord("", "", emails);
+ }
+ mPhoneBookRecords.set(i, rec);
+ }
+ }
+ }
+
+ // ICC cards can be made such that they have an IAP file but all
+ // records are empty. So we read both type 1 and type 2 file
+ // email records, just to be sure.
+
+ int len = mPhoneBookRecords.size();
+ // Type 1 file, the number of records is the same as the number of
+ // records in the ADN file.
+ if (mEmailsForAdnRec == null) {
+ parseType1EmailFile(len);
+ }
+ for (int i = 0; i < numAdnRecs; i++) {
+ ArrayList<String> emailList = null;
+ try {
+ emailList = mEmailsForAdnRec.get(i);
+ } catch (IndexOutOfBoundsException e) {
+ break;
+ }
+ if (emailList == null) continue;
+
+ AdnRecord rec = mPhoneBookRecords.get(i);
+
+ String[] emails = new String[emailList.size()];
+ System.arraycopy(emailList.toArray(), 0, emails, 0, emailList.size());
+ rec.setEmails(emails);
+ mPhoneBookRecords.set(i, rec);
+ }
+ }
+
+ void parseType1EmailFile(int numRecs) {
+ mEmailsForAdnRec = new HashMap<Integer, ArrayList<String>>();
+ byte[] emailRec = null;
+ for (int i = 0; i < numRecs; i++) {
+ try {
+ emailRec = mEmailFileRecord.get(i);
+ } catch (IndexOutOfBoundsException e) {
+ Log.e(LOG_TAG, "Error: Improper ICC card: No email record for ADN, continuing");
+ break;
+ }
+ int adnRecNum = emailRec[emailRec.length - 1];
+
+ if (adnRecNum == -1) {
+ continue;
+ }
+
+ String email = readEmailRecord(i);
+
+ if (email == null || email.equals("")) {
+ continue;
+ }
+
+ // SIM record numbers are 1 based.
+ ArrayList<String> val = mEmailsForAdnRec.get(adnRecNum - 1);
+ if (val == null) {
+ val = new ArrayList<String>();
+ }
+ val.add(email);
+ // SIM record numbers are 1 based.
+ mEmailsForAdnRec.put(adnRecNum - 1, val);
+ }
+ }
+
+ private String readEmailRecord(int recNum) {
+ byte[] emailRec = null;
+ try {
+ emailRec = mEmailFileRecord.get(recNum);
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+
+ // The length of the record is X+2 byte, where X bytes is the email address
+ String email = IccUtils.adnStringFieldToString(emailRec, 0, emailRec.length - 2);
+ return email;
+ }
+
+ private void readAdnFileAndWait(int recNum) {
+ Map <Integer,Integer> fileIds;
+ fileIds = mPbrFile.mFileIds.get(recNum);
+ if (fileIds == null) return;
+
+ mAdnCache.requestLoadAllAdnLike(fileIds.get(USIM_EFADN_TAG),
+ fileIds.get(USIM_EFEXT1_TAG), obtainMessage(EVENT_USIM_ADN_LOAD_DONE));
+ try {
+ mLock.wait();
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Interrupted Exception in readAdnFileAndWait");
+ }
+ }
+
+ private void createPbrFile(ArrayList<byte[]> records) {
+ if (records == null) {
+ mPbrFile = null;
+ mIsPbrPresent = false;
+ return;
+ }
+ mPbrFile = new PbrFile(records);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ AsyncResult ar;
+
+ switch(msg.what) {
+ case EVENT_PBR_LOAD_DONE:
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ createPbrFile((ArrayList<byte[]>)ar.result);
+ }
+ synchronized (mLock) {
+ mLock.notify();
+ }
+ break;
+ case EVENT_USIM_ADN_LOAD_DONE:
+ log("Loading USIM ADN records done");
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ mPhoneBookRecords.addAll((ArrayList<AdnRecord>)ar.result);
+ }
+ synchronized (mLock) {
+ mLock.notify();
+ }
+ break;
+ case EVENT_IAP_LOAD_DONE:
+ log("Loading USIM IAP records done");
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ mIapFileRecord = ((ArrayList<byte[]>)ar.result);
+ }
+ synchronized (mLock) {
+ mLock.notify();
+ }
+ break;
+ case EVENT_EMAIL_LOAD_DONE:
+ log("Loading USIM Email records done");
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ mEmailFileRecord = ((ArrayList<byte[]>)ar.result);
+ }
+
+ synchronized (mLock) {
+ mLock.notify();
+ }
+ break;
+ }
+ }
+
+ private class PbrFile {
+ // RecNum <EF Tag, efid>
+ HashMap<Integer,Map<Integer,Integer>> mFileIds;
+
+ PbrFile(ArrayList<byte[]> records) {
+ mFileIds = new HashMap<Integer, Map<Integer, Integer>>();
+ SimTlv recTlv;
+ int recNum = 0;
+ for (byte[] record: records) {
+ recTlv = new SimTlv(record, 0, record.length);
+ parseTag(recTlv, recNum);
+ recNum ++;
+ }
+ }
+
+ void parseTag(SimTlv tlv, int recNum) {
+ SimTlv tlvEf;
+ int tag;
+ byte[] data;
+ Map<Integer, Integer> val = new HashMap<Integer, Integer>();
+ do {
+ tag = tlv.getTag();
+ switch(tag) {
+ case USIM_TYPE1_TAG: // A8
+ case USIM_TYPE3_TAG: // AA
+ case USIM_TYPE2_TAG: // A9
+ data = tlv.getData();
+ tlvEf = new SimTlv(data, 0, data.length);
+ parseEf(tlvEf, val, tag);
+ break;
+ }
+ } while (tlv.nextObject());
+ mFileIds.put(recNum, val);
+ }
+
+ void parseEf(SimTlv tlv, Map<Integer, Integer> val, int parentTag) {
+ int tag;
+ byte[] data;
+ int tagNumberWithinParentTag = 0;
+ do {
+ tag = tlv.getTag();
+ if (parentTag == USIM_TYPE2_TAG && tag == USIM_EFEMAIL_TAG) {
+ mEmailPresentInIap = true;
+ mEmailTagNumberInIap = tagNumberWithinParentTag;
+ }
+ switch(tag) {
+ case USIM_EFEMAIL_TAG:
+ case USIM_EFADN_TAG:
+ case USIM_EFEXT1_TAG:
+ case USIM_EFANR_TAG:
+ case USIM_EFPBC_TAG:
+ case USIM_EFGRP_TAG:
+ case USIM_EFAAS_TAG:
+ case USIM_EFGSD_TAG:
+ case USIM_EFUID_TAG:
+ case USIM_EFCCP1_TAG:
+ case USIM_EFIAP_TAG:
+ case USIM_EFSNE_TAG:
+ data = tlv.getData();
+ int efid = data[0] << 8 | data[1];
+ val.put(tag, efid);
+ break;
+ }
+ tagNumberWithinParentTag ++;
+ } while(tlv.nextObject());
+ }
+ }
+
+ private void log(String msg) {
+ if(DBG) Log.d(LOG_TAG, msg);
+ }
+}
diff --git a/test-runner/android/test/IsolatedContext.java b/test-runner/android/test/IsolatedContext.java
index 4bd9528..5c66169 100644
--- a/test-runner/android/test/IsolatedContext.java
+++ b/test-runner/android/test/IsolatedContext.java
@@ -4,6 +4,7 @@
import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdatedListener;
+import android.accounts.Account;
import android.content.ContextWrapper;
import android.content.ContentResolver;
import android.content.Intent;
@@ -101,6 +102,10 @@
Handler handler, boolean updateImmediately) {
// do nothing
}
+
+ public Account[] getAccounts() {
+ return new Account[]{};
+ }
}
@Override
public File getFilesDir() {
diff --git a/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java b/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java
index 02af547..98d4c25 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/CdmaSmsTest.java
@@ -32,12 +32,10 @@
import android.util.Log;
-import java.util.Iterator;
-
-import java.lang.Integer;
+import java.util.ArrayList;
public class CdmaSmsTest extends AndroidTestCase {
- private final static String LOG_TAG = "CDMA";
+ private final static String LOG_TAG = "XXX CdmaSmsTest XXX";
@SmallTest
public void testCdmaSmsAddrParsing() throws Exception {
@@ -530,29 +528,19 @@
@SmallTest
public void testNumberOfMessages() throws Exception {
+ // Note that the message text below does not properly reflect
+ // the message count. The author of these messages was
+ // apparently unaware that the values are bcd encoded, and the
+ // values being tested against (not the ones in the message
+ // text) are actually correct.
String pdu1 = "000310409001124896a794e07595f69f199540ea759a0dc8e00b0163";
BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
assertEquals("Test Voice mail 99", bd1.userData.payloadStr);
- assertEquals(99, bd1.numberOfMessages);
+ assertEquals(63, bd1.numberOfMessages);
String pdu2 = "00031040900113489ea794e07595f69f199540ea759a0988c0600b0164";
BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
assertEquals("Test Voice mail 100", bd2.userData.payloadStr);
- assertEquals(100, bd2.numberOfMessages);
- }
-
- @SmallTest
- public void testNumberOfMessagesFeedback() throws Exception {
- BearerData bearerData = new BearerData();
- bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
- bearerData.messageId = 0;
- bearerData.hasUserDataHeader = false;
- UserData userData = new UserData();
- userData.payloadStr = "test message count";
- bearerData.userData = userData;
- bearerData.numberOfMessages = 27;
- byte []encodedSms = BearerData.encode(bearerData);
- BearerData revBearerData = BearerData.decode(encodedSms);
- assertEquals(bearerData.numberOfMessages, revBearerData.numberOfMessages);
+ assertEquals(64, bd2.numberOfMessages);
}
@SmallTest
@@ -766,7 +754,6 @@
public void testDisplayMode() throws Exception {
String pdu1 = "0003104090010c485f4194dfea34becf61b8400f0100";
BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
- //Log.d(LOG_TAG, "bd1 = " + bd1);
assertEquals(bd1.displayMode, BearerData.DISPLAY_MODE_IMMEDIATE);
String pdu2 = "0003104090010c485f4194dfea34becf61b8400f0140";
BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
@@ -830,4 +817,30 @@
BearerData revBearerData = BearerData.decode(encodedSms);
assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
}
+
+ @SmallTest
+ public void testFragmentText() throws Exception {
+ // Valid 160 character ASCII text.
+ String text1 = "123456789012345678901234567890123456789012345678901234567890" +
+ "1234567890123456789012345678901234567890123456789012345678901234567890" +
+ "12345678901234567890123456789[";
+ TextEncodingDetails ted = SmsMessage.calculateLength(text1, false);
+ assertEquals(ted.msgCount, 1);
+ assertEquals(ted.codeUnitCount, 160);
+ assertEquals(ted.codeUnitSize, 1);
+ ArrayList<String> fragments = android.telephony.SmsMessage.fragmentText(text1);
+ assertEquals(fragments.size(), 1);
+ // Valid 160 character GSM text -- the last character is
+ // non-ASCII, and so this will currently generate a singleton
+ // EMS message, which is not necessarily supported by Verizon.
+ String text2 = "123456789012345678901234567890123456789012345678901234567890" +
+ "1234567890123456789012345678901234567890123456789012345678901234567890" +
+ "12345678901234567890123456789\u00a3"; // Trailing pound-currency sign.
+ ted = SmsMessage.calculateLength(text2, false);
+ assertEquals(ted.msgCount, 1);
+ assertEquals(ted.codeUnitCount, 160);
+ assertEquals(ted.codeUnitSize, 1);
+ fragments = android.telephony.SmsMessage.fragmentText(text2);
+ assertEquals(fragments.size(), 1);
+ }
}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java b/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java
index 875376a..b2f1ded 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/MccTableTest.java
@@ -16,7 +16,7 @@
package com.android.unit_tests;
-import com.android.internal.telephony.gsm.MccTable;
+import com.android.internal.telephony.MccTable;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
diff --git a/tests/BrowserPowerTest/Android.mk b/tests/BrowserPowerTest/Android.mk
new file mode 100644
index 0000000..f2c07b3
--- /dev/null
+++ b/tests/BrowserPowerTest/Android.mk
@@ -0,0 +1,30 @@
+# Copyright 2008, The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+# Include all test java files.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := BrowserPowerTests
+
+#LOCAL_INSTRUMENTATION_FOR := browserpowertest
+
+include $(BUILD_PACKAGE)
diff --git a/tests/BrowserPowerTest/AndroidManifest.xml b/tests/BrowserPowerTest/AndroidManifest.xml
new file mode 100644
index 0000000..43eeaad
--- /dev/null
+++ b/tests/BrowserPowerTest/AndroidManifest.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.browserpowertest">
+
+ <!-- We add an application tag here just so that we can indicate that
+ this package needs to link against the android.test library,
+ which is needed when building test cases. -->
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <activity android:name="PowerTestActivity" android:label="Power">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+ </application>
+ <!--
+ This declares that this app uses the instrumentation test runner targeting
+ the package of browserpowertest. To run the tests use the command:
+ "adb shell am instrument -w com.android.browserpowertest/.PowerTestRunner"
+ -->
+ <instrumentation android:name=".PowerTestRunner"
+ android:targetPackage="com.android.browserpowertest"
+ android:label="Test runner for Browser Power Tests."
+ />
+
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.WRITE_SDCARD" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+</manifest>
diff --git a/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerMeasurement.java b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerMeasurement.java
new file mode 100644
index 0000000..74ac865f
--- /dev/null
+++ b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerMeasurement.java
@@ -0,0 +1,51 @@
+package com.android.browserpowertest;
+
+import android.content.Intent;
+import android.app.Instrumentation;
+import android.os.Handler;
+import android.os.Message;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import junit.framework.*;
+
+public class PowerMeasurement extends ActivityInstrumentationTestCase2<PowerTestActivity> {
+
+ private static final String LOGTAG = "PowerMeasurement";
+ private static final String PKG_NAME = "com.android.browserpowertest";
+ private static final String TESTING_URL = "http://www.espn.com";
+ private static final int TIME_OUT = 2 * 60 * 1000;
+ private static final int DELAY = 0;
+
+ public PowerMeasurement() {
+ super(PKG_NAME, PowerTestActivity.class);
+ }
+
+ public void testPageLoad() throws Throwable {
+ Instrumentation mInst = getInstrumentation();
+ PowerTestActivity act = getActivity();
+
+ Intent intent = new Intent(mInst.getContext(), PowerTestActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ long start = System.currentTimeMillis();
+ PowerTestActivity activity = (PowerTestActivity)mInst.startActivitySync(
+ intent);
+ activity.reset();
+ //send a message with the new URL
+ Handler handler = activity.getHandler();
+ Message msg = handler.obtainMessage(
+ PowerTestActivity.MSG_NAVIGATE, TIME_OUT, DELAY);
+ msg.getData().putString(PowerTestActivity.MSG_NAV_URL, TESTING_URL);
+ msg.getData().putBoolean(PowerTestActivity.MSG_NAV_LOGTIME, true);
+
+ handler.sendMessage(msg);
+ boolean timeoutFlag = activity.waitUntilDone();
+ long end = System.currentTimeMillis();
+ assertFalse(TESTING_URL + " failed to load", timeoutFlag);
+ boolean pageErrorFlag = activity.getPageError();
+ assertFalse(TESTING_URL + " is not available, either network is down or the server is down",
+ pageErrorFlag);
+ Log.v(LOGTAG, "Page is loaded in " + activity.getPageLoadTime() + " ms.");
+
+ activity.finish();
+ }
+}
diff --git a/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java
new file mode 100644
index 0000000..77e390b
--- /dev/null
+++ b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestActivity.java
@@ -0,0 +1,253 @@
+package com.android.browserpowertest;
+
+import android.app.Activity;
+import android.app.ActivityThread;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.webkit.WebChromeClient;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.webkit.WebSettings.LayoutAlgorithm;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+
+public class PowerTestActivity extends Activity {
+
+ public static final String LOGTAG = "PowerTestActivity";
+ public static final String PARAM_URL = "URL";
+ public static final String PARAM_TIMEOUT = "Timeout";
+ public static final int RESULT_TIMEOUT = 0xDEAD;
+ public static final int MSG_TIMEOUT = 0xC001;
+ public static final int MSG_NAVIGATE = 0xC002;
+ public static final String MSG_NAV_URL = "url";
+ public static final String MSG_NAV_LOGTIME = "logtime";
+
+ private WebView webView;
+ private SimpleWebViewClient webViewClient;
+ private SimpleChromeClient chromeClient;
+ private Handler handler;
+ private boolean timeoutFlag;
+ private boolean logTime;
+ private boolean pageDone;
+ private Object pageDoneLock;
+ private int pageStartCount;
+ private int manualDelay;
+ private long startTime;
+ private long pageLoadTime;
+ private PageDoneRunner pageDoneRunner = new PageDoneRunner();
+
+ public PowerTestActivity() {
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Log.v(LOGTAG, "onCreate, inst=" + Integer.toHexString(hashCode()));
+
+ LinearLayout contentView = new LinearLayout(this);
+ contentView.setOrientation(LinearLayout.VERTICAL);
+ setContentView(contentView);
+ setTitle("Idle");
+
+ webView = new WebView(this);
+ webView.getSettings().setJavaScriptEnabled(true);
+ webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
+ webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
+
+ webViewClient = new SimpleWebViewClient();
+ chromeClient = new SimpleChromeClient();
+ webView.setWebViewClient(webViewClient);
+ webView.setWebChromeClient(chromeClient);
+
+ contentView.addView(webView, new LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
+
+ handler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_TIMEOUT:
+ handleTimeout();
+ return;
+ case MSG_NAVIGATE:
+ manualDelay = msg.arg2;
+ navigate(msg.getData().getString(MSG_NAV_URL), msg.arg1);
+ logTime = msg.getData().getBoolean(MSG_NAV_LOGTIME);
+ return;
+ }
+ }
+ };
+
+ pageDoneLock = new Object();
+ }
+
+ public void reset() {
+ synchronized (pageDoneLock) {
+ pageDone = false;
+ }
+ timeoutFlag = false;
+ pageStartCount = 0;
+ chromeClient.resetJsTimeout();
+ }
+
+ private void navigate(String url, int timeout) {
+ if(url == null) {
+ Log.v(LOGTAG, "URL is null, cancelling...");
+ finish();
+ }
+ webView.stopLoading();
+ if(logTime) {
+ webView.clearCache(true);
+ }
+ startTime = System.currentTimeMillis();
+ Log.v(LOGTAG, "Navigating to URL: " + url);
+ webView.loadUrl(url);
+
+ if(timeout != 0) {
+ //set a timer with specified timeout (in ms)
+ handler.sendMessageDelayed(handler.obtainMessage(MSG_TIMEOUT),
+ timeout);
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ Log.v(LOGTAG, "onDestroy, inst=" + Integer.toHexString(hashCode()));
+ webView.clearCache(true);
+ webView.destroy();
+ }
+
+ private boolean isPageDone() {
+ synchronized (pageDoneLock) {
+ return pageDone;
+ }
+ }
+
+ private void setPageDone(boolean pageDone) {
+ synchronized (pageDoneLock) {
+ this.pageDone = pageDone;
+ pageDoneLock.notifyAll();
+ }
+ }
+
+ private void handleTimeout() {
+ int progress = webView.getProgress();
+ webView.stopLoading();
+ Log.v(LOGTAG, "Page timeout triggered, progress = " + progress);
+ timeoutFlag = true;
+ handler.postDelayed(pageDoneRunner, manualDelay);
+ }
+
+ public boolean waitUntilDone() {
+ validateNotAppThread();
+ synchronized (pageDoneLock) {
+ while(!isPageDone()) {
+ try {
+ pageDoneLock.wait();
+ } catch (InterruptedException ie) {
+ //no-op
+ }
+ }
+ }
+ return timeoutFlag;
+ }
+
+ public Handler getHandler() {
+ return handler;
+ }
+
+ private final void validateNotAppThread() {
+ if (ActivityThread.currentActivityThread() != null) {
+ throw new RuntimeException(
+ "This method can not be called from the main application thread");
+ }
+ }
+
+ public long getPageLoadTime() {
+ return pageLoadTime;
+ }
+
+ public boolean getPageError() {
+ return webViewClient.getPageErrorFlag();
+ }
+
+ class SimpleWebViewClient extends WebViewClient {
+
+ private boolean pageErrorFlag = false;
+
+ @Override
+ public void onReceivedError(WebView view, int errorCode, String description,
+ String failingUrl) {
+ pageErrorFlag = true;
+ Log.v(LOGTAG, "WebCore error: code=" + errorCode
+ + ", description=" + description
+ + ", url=" + failingUrl);
+ }
+
+ @Override
+ public void onPageStarted(WebView view, String url, Bitmap favicon) {
+ pageStartCount++;
+ Log.v(LOGTAG, "onPageStarted: " + url);
+ }
+
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ Log.v(LOGTAG, "onPageFinished: " + url);
+ // let handleTimeout take care of finishing the page
+ if(!timeoutFlag)
+ handler.postDelayed(new WebViewStatusChecker(), 500);
+ }
+
+ // return true if the URL is not available or the page is down
+ public boolean getPageErrorFlag() {
+ return pageErrorFlag;
+ }
+ }
+
+ class SimpleChromeClient extends WebChromeClient {
+
+ private int timeoutCounter = 0;
+
+ public void resetJsTimeout() {
+ timeoutCounter = 0;
+ }
+
+ @Override
+ public void onReceivedTitle(WebView view, String title) {
+ PowerTestActivity.this.setTitle(title);
+ }
+ }
+
+ class WebViewStatusChecker implements Runnable {
+
+ private int initialStartCount;
+
+ public WebViewStatusChecker() {
+ initialStartCount = pageStartCount;
+ }
+
+ public void run() {
+ if (initialStartCount == pageStartCount && !isPageDone()) {
+ handler.removeMessages(MSG_TIMEOUT);
+ webView.stopLoading();
+ handler.postDelayed(pageDoneRunner, manualDelay);
+ }
+ }
+ }
+
+ class PageDoneRunner implements Runnable {
+
+ public void run() {
+ Log.v(LOGTAG, "Finishing URL: " + webView.getUrl());
+ pageLoadTime = System.currentTimeMillis() - startTime;
+ setPageDone(true);
+ }
+ }
+}
diff --git a/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestRunner.java b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestRunner.java
new file mode 100644
index 0000000..4857209
--- /dev/null
+++ b/tests/BrowserPowerTest/src/com/android/browserpowertest/PowerTestRunner.java
@@ -0,0 +1,31 @@
+package com.android.browserpowertest;
+
+import android.test.InstrumentationTestRunner;
+import android.test.InstrumentationTestSuite;
+
+import junit.framework.TestSuite;
+
+
+/**
+ * Instrumentation Test Runner for all browser power tests.
+ *
+ * Running power tests:
+ *
+ * adb shell am instrument \
+ * -w com.android.browserpowertest/.PowerTestRunner
+ */
+
+public class PowerTestRunner extends InstrumentationTestRunner {
+ @Override
+ public TestSuite getAllTests() {
+ TestSuite suite = new InstrumentationTestSuite(this);
+ suite.addTestSuite(PowerMeasurement.class);
+ return suite;
+ }
+
+ @Override
+ public ClassLoader getLoader() {
+ return PowerTestRunner.class.getClassLoader();
+ }
+
+}
diff --git a/tests/DumpRenderTree/assets/run_layout_tests.py b/tests/DumpRenderTree/assets/run_layout_tests.py
index c056de5..c3e6b5b 100755
--- a/tests/DumpRenderTree/assets/run_layout_tests.py
+++ b/tests/DumpRenderTree/assets/run_layout_tests.py
@@ -175,7 +175,7 @@
# Count crashed tests.
crashed_tests = []
- timeout_ms = '5000'
+ timeout_ms = '30000'
if options.time_out_ms:
timeout_ms = options.time_out_ms
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
index 2eecef8..e4c8716 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
@@ -16,6 +16,7 @@
package com.android.dumprendertree;
+import com.android.dumprendertree.TestShellActivity.DumpDataType;
import com.android.dumprendertree.forwarder.AdbUtils;
import com.android.dumprendertree.forwarder.ForwardServer;
@@ -149,6 +150,8 @@
static final String HTTP_WML_TESTS_PREFIX = "/sdcard/android/layout_tests/http/tests/wml/";
+ static final String DEFAULT_TEST_HOST = "android-browser-test.mtv.corp.google.com";
+ static final String FORWARD_HOST_CONF = "/sdcard/drt_forward_host.txt";
private ForwardServer fs8000, fs8080, fs8443;
private MyTestRecorder mResultRecorder;
@@ -160,12 +163,7 @@
public LayoutTestsAutoTest() {
super("com.android.dumprendertree", TestShellActivity.class);
- int addr = -1;
- try {
- addr = AdbUtils.resolve("android-browser-test.mtv.corp.google.com");
- } catch (IOException ioe) {
- Log.e(LOGTAG, "failed to resolve server address.", ioe);
- }
+ int addr = getForwardHostAddr();
if(addr != -1) {
fs8000 = new ForwardServer(8000, addr, 8000);
fs8080 = new ForwardServer(8080, addr, 8080);
@@ -173,6 +171,38 @@
}
}
+ private int getForwardHostAddr() {
+ int addr = -1;
+ String host = null;
+ File forwardHostConf = new File(FORWARD_HOST_CONF);
+ if (forwardHostConf.isFile()) {
+ BufferedReader hostReader = null;
+ try {
+ hostReader = new BufferedReader(new FileReader(forwardHostConf));
+ host = hostReader.readLine();
+ Log.v(LOGTAG, "read forward host from file: " + host);
+ } catch (IOException ioe) {
+ Log.v(LOGTAG, "cannot read forward host from file", ioe);
+ } finally {
+ if (hostReader != null) {
+ try {
+ hostReader.close();
+ } catch (IOException ioe) {
+ // burn!!!
+ }
+ }
+ }
+ }
+ if (host == null || host.length() == 0)
+ host = DEFAULT_TEST_HOST;
+ try {
+ addr = AdbUtils.resolve(host);
+ } catch (IOException ioe) {
+ Log.e(LOGTAG, "failed to resolve server address", ioe);
+ }
+ return addr;
+ }
+
// This function writes the result of the layout test to
// Am status so that it can be picked up from a script.
private void passOrFailCallback(String file, boolean result) {
@@ -313,6 +343,7 @@
}
public void timedOut(String url) {
+ Log.v(LOGTAG, "layout timeout: " + url);
}
});
@@ -398,7 +429,8 @@
if (resume)
resumeTestList();
- TestShellActivity activity = (TestShellActivity) getActivity();
+ TestShellActivity activity = getActivity();
+ activity.setDefaultDumpDataType(DumpDataType.DUMP_AS_TEXT);
// Run tests.
int addr = -1;
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index e342efb..663df83 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.app.AlertDialog;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
@@ -47,6 +48,8 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Vector;
public class TestShellActivity extends Activity implements LayoutTestController {
@@ -107,6 +110,8 @@
mEventSender = new WebViewEventSender(mWebView);
mCallbackProxy = new CallbackProxy(mEventSender, this);
+ mWebView.addJavascriptInterface(mCallbackProxy, "layoutTestController");
+ mWebView.addJavascriptInterface(mCallbackProxy, "eventSender");
setupWebViewForLayoutTests(mWebView, mCallbackProxy);
contentView.addView(mWebView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT, 0.0f));
@@ -620,7 +625,10 @@
// allow it's content to execute and be recorded by the test
// runner.
- WebView newWindowView = new WebView(TestShellActivity.this);
+ HashMap<String, Object> jsIfaces = new HashMap<String, Object>();
+ jsIfaces.put("layoutTestController", mCallbackProxy);
+ jsIfaces.put("eventSender", mCallbackProxy);
+ WebView newWindowView = new NewWindowWebView(TestShellActivity.this, jsIfaces);
setupWebViewForLayoutTests(newWindowView, mCallbackProxy);
WebView.WebViewTransport transport =
(WebView.WebViewTransport) resultMsg.obj;
@@ -630,6 +638,12 @@
}
};
+ private static class NewWindowWebView extends WebView {
+ public NewWindowWebView(Context context, Map<String, Object> jsIfaces) {
+ super(context, null, 0, jsIfaces);
+ }
+ }
+
private void resetTestStatus() {
mWaitUntilDone = false;
mDumpDataType = mDefaultDumpDataType;
@@ -659,9 +673,6 @@
settings.setDomStorageEnabled(true);
settings.setWorkersEnabled(false);
- webview.addJavascriptInterface(callbackProxy, "layoutTestController");
- webview.addJavascriptInterface(callbackProxy, "eventSender");
-
webview.setWebChromeClient(mChromeClient);
webview.setWebViewClient(mViewClient);
}
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 95a2384..3cf6a71 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -984,7 +984,7 @@
while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
if (code == ResXMLTree::END_TAG) {
- if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) {
+ if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) {
break;
}
}
@@ -2364,13 +2364,12 @@
String8 region(config.string(), 2);
if (configSet.find(region) == configSet.end()) {
if (configSet.count(defaultLocale) == 0) {
- fprintf(stdout, "aapt: error: "
+ fprintf(stdout, "aapt: warning: "
"*** string '%s' has no default or required localization "
"for '%s' in %s\n",
String8(nameIter->first).string(),
config.string(),
mBundle->getResourceSourceDirs()[0]);
- err = UNKNOWN_ERROR;
}
}
}
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
index 6daa0d2..d4d2a45c 100644
--- a/tools/aapt/XMLNode.cpp
+++ b/tools/aapt/XMLNode.cpp
@@ -219,7 +219,12 @@
}
spanStack.pop();
- if (empty) {
+ /*
+ * This warning seems to be just an irritation to most people,
+ * since it is typically introduced by translators who then never
+ * see the warning.
+ */
+ if (0 && empty) {
fprintf(stderr, "%s:%d: warning: empty '%s' span found in text '%s'\n",
fileName, inXml->getLineNumber(),
String8(spanTag).string(), String8(*outString).string());